この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
このセリフ、私がSE時代(2001年~2006年)に客先常駐で働いていた頃、後輩エンジニアから言われた言葉だ。最初は「chmodで755ならグループメンバーは読み書きできるはず」と思ったが、`ls -la`で確認してもrwxr-xr-xと正しく表示されている。それなのにそのユーザーだけ弾かれる。半日近く試行錯誤したあと、ようやく原因がわかった。以前に誰かがACL(Access Control List、アクセス制御リスト)を使ってそのユーザーだけ明示的に「読み取り禁止」を設定していたのだ。
ACLを知らなかった私は、その存在を完全に見落としていた。20年以上サーバーを運用してきた経験から言うと、このACLの盲点にハマるエンジニアは今でも多い。chmod・chownだけ覚えた段階では、必ずどこかでこの壁にぶつかる。
この記事では、ACLの基本的な仕組みからgetfacl・setfaclコマンドの実際の使い方、実務でよく使うパターン、そして「ACLが効かない・反映されない」というトラブルへの対処法まで、実体験をベースに解説する。
この記事のポイント
・chmodとchownだけでは複数ユーザーへの個別権限設定に対応できない場面がある
・getfaclで現在のACL設定を確認し、setfaclで特定ユーザーへ個別に権限を付与できる
・デフォルトACLを設定するとディレクトリ以下の新規ファイルに権限が自動継承される
・「ACLが効かない」原因の多くはマウントオプションのacl指定漏れ
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
chmodとchownだけでは対応できない場面がある
Linuxの権限管理を学ぶとき、最初に覚えるのはchmodとchownだ。ファイルには「所有者」「グループ」「その他」の3種類の対象に対して、それぞれ「読み取り(r)」「書き込み(w)」「実行(x)」の権限を設定できる。これはLinuxの基本中の基本で、たいていのケースはこれで事足りる。しかし現場ではこんなシーンが出てくる。
・ディレクトリの所有グループはdevelopersだが、deployユーザー(別グループ)だけにそのディレクトリへの書き込みを許可したい
・Webサーバーのhttpdユーザーだけにログディレクトリの読み取りを許可したい(ownerはrootのまま)
・特定のユーザーだけをファイルのアクセスから明示的に除外したい
chmod・chownで解決しようとすると、「グループを増やしてusermodで追加」「ファイルの所有者を変更」など複雑な操作が必要になる。そのたびに設定が増え、半年後には誰も全体像を把握できなくなる。
そこで使うのがACLだ。ACLを使うと「このファイルについては、deployユーザーには書き込みを許可する」という細かい粒度の設定を、所有者・グループとは独立して追加できる。
ACL(アクセス制御リスト)とは何か
ACL(Access Control List)は、標準のLinux権限モデル(所有者・グループ・その他の3者)を拡張して、任意のユーザーやグループに対して個別に権限を設定できる仕組みだ。標準権限と並列で動作するものだと思えばよい。`ls -la`で表示されるrwxr-xr--という通常の権限はそのままで、それに加えて「このユーザーには特別にこの権限を与える」という設定を重ねることができる。
ACLが設定されているファイルやディレクトリは、`ls -la`の出力で権限文字列の末尾に「+」が付く。たとえばdrwxr-x---+のように表示されたら、そのディレクトリにはACLが設定されているというサインだ。
ACLを操作するコマンドは2つ覚えれば十分だ。
・getfacl:ファイルやディレクトリの現在のACL設定を確認するコマンド
・setfacl:ファイルやディレクトリにACL設定を追加・変更・削除するコマンド
なお、ACLを使うにはファイルシステム側でACLのサポートが必要だ。ext4・XFSなど現在の主要なファイルシステムはデフォルトでACLをサポートしている。ただし古い環境や特定の設定によってはマウントオプションに`acl`の指定が必要なケースもある(後述のトラブル対処法で解説する)。
getfaclとsetfaclの基本的な使い方
1. getfaclで現在のACL設定を確認する
まずはgetfaclでACL設定を確認する方法から始めよう。ACLのトラブルに遭遇したときは、まず`getfacl`でACLの現状を把握するのが最初のステップだ。# getfacl でACL設定を確認する(ACLが設定されていないファイル) # getfacl /var/www/html/index.html [root@server ~]# getfacl /var/www/html/index.html # file: var/www/html/index.html # owner: apache # group: apache user::rw- group::r-- other::r-- # getfacl でACL設定を確認する(ACLが設定されているディレクトリ) # getfacl /var/www/html/shared/ [root@server ~]# getfacl /var/www/html/shared/ # file: var/www/html/shared/ # owner: apache # group: developers user::rwx user:deploy:rwx user:guest_user:--- group::rwx mask::rwx other::---
注目すべきは`user:deploy:rwx`と`user:guest_user:---`の行だ。これがACLで個別設定された権限で、deployユーザーには読み書き実行すべて許可、guest_userには何も許可しない(明示的拒否)という設定になっている。
`mask::rwx`はACLの実効権限の上限を表す。後述するが、この値がACLの効き方に影響することがある。
2. setfaclで特定ユーザーに権限を追加する
次は、setfaclを使って実際にACLを設定する方法だ。最もよく使うのは特定のユーザーに読み書き権限を追加するパターンだ。# setfacl でユーザーにACL権限を付与する # setfacl -m u:ユーザー名:権限 対象ファイルまたはディレクトリ # deployユーザーに/var/log/app/app.logの読み書き権限を付与する [root@server ~]# setfacl -m u:deploy:rw- /var/log/app/app.log # 設定後にgetfaclで確認する [root@server ~]# getfacl /var/log/app/app.log # file: var/log/app/app.log # owner: root # group: root user::rw- user:deploy:rw- group::r-- mask::rw- other::--- # ACLを削除するときは -x オプションを使う [root@server ~]# setfacl -x u:deploy /var/log/app/app.log # ACLを全削除するときは -b オプションを使う [root@server ~]# setfacl -b /var/log/app/app.log
・-m(modify):ACLエントリを追加または変更する
・-x(remove):指定したACLエントリを削除する
・-b(remove all):すべてのACLエントリを削除して通常の権限のみに戻す
・u:ユーザー名:権限:ユーザーへの権限設定(グループは`g:グループ名:権限`)
権限の書き方はchmodの記号指定と同じだ。`rw-`は読み書き可・実行不可、`r--`は読み取りのみ、`---`は全拒否を意味する。
3. デフォルトACLでディレクトリ以下に権限を自動継承させる
実務でよく使うのがデフォルトACLだ。ディレクトリに「デフォルトACL」を設定しておくと、そのディレクトリ以下に新規作成されたファイルやサブディレクトリに自動的に同じACLが引き継がれる。共有作業ディレクトリを運用する場面でこれを知っているかどうかで、管理コストがまったく変わってくる。
# デフォルトACLを設定する(d: プレフィックスをつける) # setfacl -m d:u:ユーザー名:権限 ディレクトリ # /var/www/html/shared/ にdeployユーザーのデフォルトACLを設定する [root@server ~]# setfacl -m d:u:deploy:rwx /var/www/html/shared/ # 設定確認 [root@server ~]# getfacl /var/www/html/shared/ # file: var/www/html/shared/ # owner: apache # group: developers user::rwx group::rwx other::--- default:user::rwx default:user:deploy:rwx default:group::rwx default:mask::rwx default:other::--- # デフォルトACLが設定されているディレクトリ以下に新規ファイルを作成する [root@server ~]# touch /var/www/html/shared/newfile.txt # 新規ファイルに自動的にACLが引き継がれている [root@server ~]# getfacl /var/www/html/shared/newfile.txt # file: var/www/html/shared/newfile.txt # owner: root # group: developers user::rw- user:deploy:rw- group::rw- mask::rw- other::---
実務でよく使うACLの活用パターン
セミナーで3,100名以上を指導してきた中で、ACLの使いどころとして最も多く質問されるパターンが3つある。それぞれ具体例を交えて解説する。パターン1:Webサーバーのhtdocsをデプロイユーザーだけが書き込めるようにする
Webサーバーのドキュメントルート(/var/www/html/)は通常、所有者がapache(またはwww-data)でグループもapacheだ。デプロイ処理を実行するdeployユーザーには書き込み権限を与えたいが、chownでapacheからdeployに変更するとWebサーバーの読み取りに影響が出るおそれがある。
このケースでは`setfacl -m u:deploy:rwx /var/www/html/`でACLを設定するのが正解だ。apacheユーザーの権限はそのまま維持しつつ、deployユーザーだけに追加の書き込み権限を与えられる。
パターン2:ログファイルを監視ツールのユーザーだけが読める設定
ログ監視ツール(FluentdやPromtailなど)を専用ユーザー(例:fluentd)で動作させる場合、アプリのログファイルはrootまたはappユーザーが書き出しているが、fluentdユーザーにも読み取り権限を与えたい、というケースだ。ACLで`setfacl -m u:fluentd:r-- /var/log/app/`とすればよい。chmodでotherをr--にするより権限を絞れて安全だ。
パターン3:一部のユーザーだけをグループ権限から除外する
冒頭の体験談のケースだ。グループdevelopersにはrwxを与えているが、そのグループに所属するguest_userには読み取りだけ許可したい、あるいはアクセスを完全に禁止したい場面だ。`setfacl -m u:guest_user:---`のようにACLで明示的に拒否を設定すれば、グループ権限よりも個別のユーザーACLが優先される。
「ACLが動かない・反映されない」エラーと対処法
実務でACLを設定しようとして「なぜか効かない」という状況に陥ることがある。よくある原因と対処法を整理する。トラブル1:setfaclを実行したが「Operation not supported」エラーが出る
最も多いのがこのエラーだ。ファイルシステムのマウントオプションにACLのサポートが指定されていない場合に発生する。
まず`mount | grep /dev/sda`などでマウントオプションを確認する。`acl`がオプションに含まれているか確認しよう。ext4の場合は`/etc/fstab`に`acl`オプションを追加して再マウントする。XFSはデフォルトでACLをサポートしているのでこのエラーは出にくい。最近のRHEL8以降・Ubuntu 18.04以降ではext4もデフォルトでACL有効なので、この問題はほぼ発生しない。ただしNFSマウントされたディレクトリでは依然としてACLが無効なことがある。
トラブル2:setfaclで権限を付与したのに実際のアクセスができない
`getfacl`でACLの設定は確認できるが、実際にファイルにアクセスするとPermission deniedになる場合は、`mask`(マスク値)が疑わしい。
ACLには「mask」という実効権限の上限を決めるエントリがある。たとえばmaskが`r--`になっていると、`setfacl -m u:deploy:rwx`で書き込み権限を付与しても、実際の実効権限は`r--`(読み取りのみ)に制限される。
maskはchmodで権限を変更すると自動的に更新されることがある。`setfacl -m m::rwx /path/to/dir`でmaskを明示的に設定しておくか、ACL設定後にchmodを使わないように注意する。
トラブル3:ディレクトリのACLは設定できたが、中のファイルには反映されない
ACLを特定のファイルやディレクトリに設定しても、すでに存在していた子ファイル・子ディレクトリには自動的には引き継がれない。デフォルトACLが有効なのは設定後に新規作成されたファイルだけだ。
既存のファイルにも一括でACLを設定したい場合は、`-R`オプション(再帰的適用)を使う。
# -R オプションでディレクトリ以下のすべてのファイルに再帰的にACLを設定する # setfacl -R -m u:deploy:rwX /var/www/html/shared/ [root@server ~]# setfacl -R -m u:deploy:rwX /var/www/html/shared/ # 確認:ディレクトリ内のファイルにACLが設定されているか確認 [root@server ~]# getfacl /var/www/html/shared/subdir/config.conf # file: var/www/html/shared/subdir/config.conf # owner: apache # group: developers user::rw- user:deploy:rw- group::rw- mask::rw- other::---
・`rwx`(小文字x):すべてのファイルとディレクトリに読み書き実行権限を付与
・`rwX`(大文字X):ディレクトリと既に実行権限のあるファイルにのみ実行権限を付与(テキストファイルには実行権限を付けない)
まとめ
ACLはchmod・chownだけでは対応できない細かい権限設定を実現する強力な仕組みだ。知っているかどうかで、複雑な権限問題の解決にかかる時間がまったく変わってくる。私がSE時代にACLの存在を知っていれば、あの半日の無駄を省けていた。現役講師として今のセミナーでは必ずACLを扱う理由はここにある。
権限管理の基礎であるchmodコマンドの詳細な使い方(記号指定・数値指定・一括変更)はchmodコマンドでパーミッションを変更する方法で解説している。また、ユーザー・グループ管理の基礎についてはgroupaddコマンドでグループを追加する方法を参照してほしい。
| やりたいこと | コマンド |
|---|---|
| 現在のACL設定を確認する | getfacl /path/to/file |
| 特定ユーザーにACL権限を付与する | setfacl -m u:ユーザー名:rwx /path/to/dir |
| 特定グループにACL権限を付与する | setfacl -m g:グループ名:rw- /path/to/dir |
| ACLエントリを削除する | setfacl -x u:ユーザー名 /path/to/file |
| すべてのACLを削除する | setfacl -b /path/to/file |
| デフォルトACLを設定する | setfacl -m d:u:ユーザー名:rwx /path/to/dir |
| ディレクトリ以下に再帰的にACLを設定する | setfacl -R -m u:ユーザー名:rwX /path/to/dir |
>> Linuxサーバー構築セミナー(2日間ハンズオン)の詳細を見る
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:LinuxのSELinuxを「邪魔者」と決めつけて無効化し続けた話|現役講師が語るsetenforce 0 に頼らない実務の作法
- この記事の属するカテゴリ:Linux学習ガイドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます