LinuxのACLを知らずにファイル権限問題で半日格闘した話|getfacl・setfaclを覚えて変わった権限設計の考え方

HOME > リナックスマスター.JP 公式ブログ > Linux学習ガイド > LinuxのACLを知らずにファイル権限問題で半日格闘した話|getfacl・setfaclを覚えて変わった権限設計の考え方
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「chmodで644や755を設定しているのに、特定のユーザーだけがファイルにアクセスできない……」

このセリフ、私が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指定漏れ


LinuxのACLを知らずにファイル権限問題で半日格闘した話|getfacl・setfaclを覚えて変わった権限設計の考え方
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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::rwx`は所有者(apache)の権限、`group::rwx`はグループ(developers)の権限、`other::---`はその他の権限だ。これらは通常のchmodで設定した値と対応している。

注目すべきは`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::---

`default:user:deploy:rwx`という行がデフォルトACLの設定だ。このディレクトリ以下に作成される新しいファイルやディレクトリには、自動的に`user:deploy`のACLエントリが引き継がれる。

実務でよく使う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::---

ただし`-R`で再帰的にACLを設定するときは、ファイルに実行権限(x)を付けたくない場合がある。その場合は`X`(大文字)を使うと、ディレクトリには実行権限を付けて、通常ファイルには実行権限を付けないという区別ができる。

・`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サーバー構築の「型」を体系的に身につけたい方へ、権限管理・ACL・セキュリティ設定をハンズオンで学べる「Linux Master Pro Seminar」のご案内はこちらをご確認ください。
>> Linuxサーバー構築セミナー(2日間ハンズオン)の詳細を見る

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

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

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

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

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

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

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

この記事を書いた人

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

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

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