setfaclコマンドでLinuxのACL権限を設定する方法|ユーザー単位の細かいアクセス制御やgetfaclの確認も


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > setfaclコマンドでLinuxのACL権限を設定する方法|ユーザー単位の細かいアクセス制御やgetfaclの確認も
「特定のユーザーだけに、このディレクトリへの書き込みを許可したい」
「chmodでは所有者・グループ・その他の3区分しか指定できなくて困っている」
現場のLinuxサーバー運用では、こうした細かい権限制御を求められる場面が本当に多いです。

この記事では、Linuxのアクセス制御リスト(ACL:Access Control List)をsetfaclコマンドとgetfaclコマンドで設定・確認する方法を、実行例とトラブルシュートを交えて解説します。
RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みの手順です。

この記事のポイント

・setfacl -m u:ユーザー名:rwx ファイル で個別ユーザーにACL権限を付与できる
・getfacl ファイル でACLの設定状況を確認できる
・ls -l の末尾の「+」マークがACL付きの目印
・デフォルトACL(d:)を使えばディレクトリ配下の新規ファイルにも権限が自動継承される


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

なぜchmodではなくACLが必要なのか

従来のLinuxパーミッション(chmod)で指定できるのは、所有者・所有グループ・その他の3区分だけです。
たとえば「共有ディレクトリに読み書きできるのはAさんとBさんだけ、Cさんは読み取りのみ」といった要件は、chmodだけでは実現できません。

ACL(アクセス制御リスト)を使うと、chmodの3区分とは別枠で、ユーザーごと・グループごとに個別の権限を追加できます。
共有フォルダ運用、Webサイトの複数ユーザー管理、バックアップ領域のアクセス制限など、実務で避けて通れない機能です。

setfaclとgetfaclの基本構文

setfaclは権限を「設定する」コマンド、getfaclは権限を「表示する」コマンドです。

setfacl:Set File ACLの略。ACLを追加・変更・削除する
getfacl:Get File ACLの略。ACLを確認する

# 基本の文法 setfacl -m [u|g]:[ユーザー名|グループ名]:[権限] ファイル名 # 確認 getfacl ファイル名

オプションは以下のとおりです。

-m:modify。ACLエントリを追加・変更する
-x:remove。指定したACLエントリを削除する
-b:全てのACLエントリを削除する(標準パーミッションへ戻す)
-R:ディレクトリ配下を再帰的に適用
-d:default ACL。ディレクトリ配下の新規ファイルに自動継承させる

基本的な使い方(最頻出の手順)

1. ACLが有効かを確認する

多くのディストリビューションでは、ext4・xfsとも標準でACLが有効になっています。
念のためマウントオプションを確認します。

# マウント状況を確認 $ mount | grep " / " /dev/mapper/rhel-root on / type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,sunit=512,swidth=512,noquota) # xfsはデフォルトでACL有効。ext4でもrw,relatimeがあれば有効

ACLが無効な場合は /etc/fstab のマウントオプションに「acl」を追加し、再マウントします。最近のディストリビューションでは通常、追加設定は不要です。

2. 特定ユーザーに読み書き権限を付与する

共有ディレクトリ /var/share に、ユーザー「tanaka」だけに読み書き実行権限を与える例です。

# 事前の状態を確認 $ ls -ld /var/share drwxr-x--- 2 root root 4096 Apr 18 10:00 /var/share # tanakaに読み書き実行(rwx)を付与 $ sudo setfacl -m u:tanaka:rwx /var/share # 結果を確認 $ ls -ld /var/share drwxr-x---+ 2 root root 4096 Apr 18 10:00 /var/share

注目するのは末尾の「+」マークです。これがACL設定済みの目印です。
lsで一覧表示しても「+」があれば追加権限が入っていると判断できます。

3. getfaclで設定内容を確認する

$ getfacl /var/share # file: var/share # owner: root # group: root user::rwx user:tanaka:rwx group::r-x mask::rwx other::---

`user:tanaka:rwx` という行が追加されました。これが今回付与したACLエントリです。
maskは「グループとユーザーACLの実効最大権限」を示す重要な値で、後述します。

4. グループ単位で権限を付与する

ユーザー単位ではなく、グループ「developers」に読み取り実行だけ与える場合は、プレフィックスをgに変えます。

$ sudo setfacl -m g:developers:rx /var/share # 確認 $ getfacl /var/share # file: var/share # owner: root # group: root user::rwx user:tanaka:rwx group::r-x group:developers:r-x mask::rwx other::---

5. ACLエントリを削除する

個別のエントリだけ削除する場合は -x を使います。

# tanakaのエントリだけ削除 $ sudo setfacl -x u:tanaka /var/share # 全エントリを削除して通常パーミッションへ戻す $ sudo setfacl -b /var/share

応用・実務Tips

デフォルトACLで新規ファイルに権限を自動継承する

共有ディレクトリを運用していて、「新規ファイルを置くたびに毎回setfaclするのは面倒」という悩みは現場でよく聞きます。
その場合はデフォルトACL(d:プレフィックス)を使います。

# ディレクトリ配下の新規ファイルにtanakaの書き込みを自動継承 $ sudo setfacl -d -m u:tanaka:rwx /var/share # 確認 $ getfacl /var/share # file: var/share # owner: root # group: root user::rwx user:tanaka:rwx group::r-x mask::rwx other::--- default:user::rwx default:user:tanaka:rwx default:group::r-x default:mask::rwx default:other::---

これでこのディレクトリ内に作成される新規ファイルには、自動でtanakaの権限が付与されます。

既存ファイルにも再帰的に適用する

デフォルトACLは「これから作られるファイル」にしか効きません。既存ファイルにまとめて適用するには -R オプションを併用します。

# ディレクトリ配下の既存ファイル全てにtanakaの権限を付与 $ sudo setfacl -R -m u:tanaka:rwx /var/share

実運用では「-d(新規用)」と「-R(既存用)」を両方実行して初めて、完全な権限継承環境が整います。この組み合わせは覚えておく価値があります。

設定内容をバックアップ・リストアする

getfaclの出力はsetfaclで読み込める形式です。移行や復旧のために保存しておくのが実務の定石です。

# ACL設定をファイルへ保存 $ getfacl -R /var/share > /tmp/share_acl.txt # 別サーバーや復旧時にリストア $ sudo setfacl --restore=/tmp/share_acl.txt

chmodでは表現できない複雑な権限構造を、テキスト1枚で持ち運べるのは大きな強みです。
Linuxの基本コマンドに立ち返って全体像を押さえたい場合はls コマンドの基本オプションと併せて確認してください。

「Operation not supported」が出た時の対処法

setfacl実行時に「Operation not supported」と表示される場合、ファイルシステム側でACLが無効になっている可能性が高いです。

$ sudo setfacl -m u:tanaka:rwx /mnt/extdisk/share setfacl: /mnt/extdisk/share: Operation not supported

対処手順は以下の流れです。

1. mountコマンドで対象のマウントオプションを確認する
2. /etc/fstabのオプション欄に「acl」を追加する
3. `sudo mount -o remount /mnt/extdisk` で再マウントする

fstabの書き方や再マウントの具体的な手順はmount コマンドの使い方の記事も参照してください。古いext3環境やNFSマウントでは特に発生しやすいトラブルです。

「Permission denied」が出た時の対処法

setfaclはファイルの所有者かroot権限で実行する必要があります。

$ setfacl -m u:tanaka:rwx /var/share setfacl: /var/share: Operation not permitted # sudoを付けて再実行する $ sudo setfacl -m u:tanaka:rwx /var/share

所有者以外がACLを変更するにはsudoが必要です。実運用ではroot権限での作業ログを残すのが基本です。

maskの挙動に注意する

ACLには「mask(実効最大権限)」という概念があります。これはユーザーACL・グループACLに与えられる権限の上限値です。

# rwxを付与しているのに、maskがr-xだと実効はr-xになる $ getfacl /var/share user:tanaka:rwx #effective:r-x mask::r-x

setfacl -m u:user:rwx と書いた後に chmod g-w を実行すると、maskがr-xへ下がり、tanakaの実効権限もr-xに落ちます。これは20年以上Linuxを運用してきた中でも、ACL絡みのトラブルで最も見かけるハマりどころです。
明示的にmaskを戻すには次のコマンドを使います。

$ sudo setfacl -m m::rwx /var/share

本記事のまとめ

setfaclコマンドを使えば、chmodでは対応できないユーザー・グループ単位のきめ細かい権限制御が可能になります。実運用で押さえておきたい操作を一覧にまとめます。
やりたいこと コマンド
ユーザーに権限を付与する setfacl -m u:ユーザー名:rwx ファイル名
グループに権限を付与する setfacl -m g:グループ名:rx ファイル名
ACLを確認する getfacl ファイル名
特定エントリを削除する setfacl -x u:ユーザー名 ファイル名
全ACLを削除する setfacl -b ファイル名
既存ファイルへ再帰適用する setfacl -R -m u:ユーザー名:rwx ディレクトリ
新規ファイルに継承させる setfacl -d -m u:ユーザー名:rwx ディレクトリ
ACL設定をバックアップする getfacl -R /path > acl.txt
ACL設定をリストアする setfacl --restore=acl.txt
maskを明示的に戻す setfacl -m m::rwx ファイル名
chmodだけで苦労していた共有ディレクトリ運用も、setfaclを使いこなせば一気に楽になります。ls -l の末尾に「+」が付いたら、getfaclで中身を確認する習慣を付けておくと、後任者の引き継ぎも格段にスムーズになります。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。