Linux ACL:ユーザーごとの「超詳細な」権限設定方法(chmod 777の代替)

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

従来のchmodでは不十分な場合

午前2時。私のスマートフォンは15件の不在着信で鳴り続けていました。電話に出ると、リードエンジニアが慌てた様子で言いました。「大変です!ソースコードのフォルダの権限設定がめちゃくちゃになっています。新人の開発者がファイルを編集できないし、かといってchmod 777に設定すると、マーケティングチームにデータベースのパスワードが入った.envファイルまで見られてしまいます。助けてください!」

システム管理者なら、このような状況に一度は直面したことがあるでしょう。Linuxの伝統的な権限管理(所有者・グループ・その他)は非常に強力ですが、柔軟性に欠ける面があります。基本的に一つのグループに対してしか権限を付与できません。しかし、現実はもっと複雑です。ユーザーAには読み書きが必要、ユーザーBは読み取りのみ、QCグループはログの閲覧は必要だが削除は厳禁、そして外部の人間には何も見せたくない、といった具合です。

駆け出しの頃、私はchownchgrpを駆使して何とかしようと何時間も格闘しましたが、結局行き詰まってしまいました。その時、プロとしてやっていくならAccess Control Lists (ACL)を使いこなす必要があると悟ったのです。

chmodを「一般入場券」とするなら、ACLは「VIPゲストリスト」のようなものです。リストに名前がある人だけが入場でき、それぞれが独立した個別の権限を持ち、互いに干渉することはありません。一時的なアクセスのために、グループを何重にも入れ子にする必要はもうありません。

戦いに挑む前の「武器」チェック

Ubuntu 22.04+、CentOS 8+、AlmaLinuxなどのモダンなディストリビューションの多くは、デフォルトでACLが有効になっています。しかし、念のため確認しておきましょう。「コマンドが見つかりません」というエラーで足止めされないためです。

ACLツールパッケージは、以下のコマンド一つでインストールできます。

# Ubuntu/Debian の場合
sudo apt update && sudo apt install acl -y

# RHEL/CentOS/AlmaLinux の場合
sudo dnf install acl -y

ちょっとしたコツですが、mount | grep -i aclを実行して、ディスクパーティションがこのオプションをサポートしているか確認してください。現在主流のEXT4やXFS形式では、ACLは通常カーネルに統合されているので、安心して進めて大丈夫です。

ACLの設定:命を救うコマンドたち

権限エラーが起きている/data/project_Xフォルダに戻りましょう。主に使用するツールは、getfacl(確認用)とsetfacl(設定用)の二つです。

特定のユーザーへの権限付与

例えば、tuan_anhというユーザーがconfig.phpを編集する必要があるとします。通常ならファイルの所有者をtuan_anhに変更する必要がありますが、それではWebサーバーwww-data)の実行権限に支障が出るかもしれません。ACLを使えば、非常にスマートに解決できます。

# ユーザー tuan_anh だけに読み取りと書き込み権限(rw-)を付与
sudo setfacl -m u:tuan_anh:rw /data/project_X/config.php

ここで、-mはmodify(変更)、u:tuan_anh:rwは「ユーザーtuan_anhに読み書き権限を与える」という意味です。これで完了です!ファイルの所有者はrootのまま、Webサーバーも正常に動作し、かつtuan_anhもしっかり仕事ができるようになります。

特定のグループへの権限付与

マーケティングチーム(グループ名 mkt_team)が、記事作成のために/data/docs内のドキュメントを閲覧したいとします。彼らには読み取り権限だけが必要で、編集や削除はさせたくありません。

sudo setfacl -m g:mkt_team:r /data/docs

このコマンドを使えば、グループの中にグループを作るような複雑で頭の痛い管理をせずに、システムをクリーンに保つことができます。

デフォルトACL:一度設定すればずっと効く秘策

これは私のお気に入りの機能です。通常、tuan_anhが新しいファイルを作成すると、他のメンバーはそのファイルにアクセスできません。これを根本的に解決するには、デフォルトACLを使用します。

# 今後作成される子ファイルやフォルダに dev_team の権限を自動適用
sudo setfacl -d -m g:dev_team:rwx /data/project_X

-d(default)オプションを付けることで、project_X内で新しく作成されるすべてのファイルが、自動的にdev_teamグループの権限を継承します。これで、月曜日の朝に「ファイルにアクセスできない」という苦情の電話を受けることもなくなるでしょう。

モニタリング:「+」マークに騙されるな

コマンド実行後、ls -lで確認すると、パーミッション文字列の最後に注目してください。

-rw-rw-r--+ 1 root root 1024 Apr 24 02:15 config.php

最後にある小さな「+」マークが見えますか?これがACLが適用されているサインです。この時点でのls -lの表示は、実際の権限を完全には反映していない可能性があるため、鵜呑みにしてはいけません。getfaclを使って全体像を確認しましょう。

getfacl /data/project_X/config.php

結果には、誰がどの権限を持っているかが明快に表示されます。特にmaskের行に注目してください。これはACLで許可される最大権限(天井)です。もしmaskをr--に設定すると、ユーザーにrwxを付与していても、実際には読み取りしかできなくなります。これは権限の与えすぎを防ぐための、最後のセキュリティチェックポイントです。

ACLをすべてクリアして最初からやり直したい場合は、以下のコマンドを使います。

# すべてのACLを削除し、ファイルを通常のLinux権限状態に戻す
sudo setfacl -b /data/project_X/config.php

おわりに

ACLは決して高度すぎて手が出ない知識ではありませんが、アマチュアのシステム管理者とプロを分ける境界線となります。リスクの高いchmod 777でその場をしのぐのではなく、5分かけてACLを設定しましょう. それだけでシステムはより安全になり、そして何より、あなた自身の夜の眠りが安らかなものになるはずです。

Share: