九回目の投稿です。今回は、Linuxにおけるファイルのアクセス制御リスト(ACL)に
ついて紹介します。インフラ業務に従事していると、ファイルのパーミッションを設定
する機会はたくさんあります。そのようなとき、今回紹介するACLに関する理解が
あると、より柔軟なパーミッション設定を実現することができます。
◆ 準備
ACLの設定について紹介する前に、Linuxにおけるファイルのパーミッションについて
説明します。Linuxにおけるファイルのパーミッションとは、平たく言えばファイルに
対するアクセス権のことであり、lsコマンドやstatコマンドなどで確認できます。
例:
$ ls -l sample.out
total 24
-rwxr-x--- 1 parallels infra 80344 Jun 4 22:54 sample.out
これは、ファイル「sample.out」に対するlsコマンドの実行結果であり、ファイルの
属性(サイズや所有者、パーミッションといった情報)が確認できます。特に、
パーミッションについては、次のとおり設定されていることが分かります。
・所有者は「parallels」であり、「parallels」は読み書き実行できる
・所有グループは「infra」であり、「infra」に属するユーザは読みと実行のみできる
・その他のユーザ(所有者でなく、所有グループにも属さないユーザ)は何もできない
ファイルのパーミッションを変更するには、chmodやchown、chgrpといったコマンドを
使います。上の例の場合、例えば所有グループを「infra」から「app」に変更すると
appに属するユーザに読みと実行の権限が付与されます。
なお、ファイルのパーミッションについては、細かいところで言えばSUIDやSGID、
スティッキービットといったものもあります。
◆アクセス制御リストの概要
前節では、ファイルのパーミッションの意味とそれらの確認/変更方法を説明しました。
chmodなどのコマンドでファイルのパーミッションを変更できることが分かりましたが、
これらのコマンドでは、あるユーザに特例的にアクセス権を付与するといった設定は
できません。具体的には次のとおりです。
例:
実行ファイル「sample.out」は、その所有者「parallels」とその所有グループ「infra」
のみ実行でき、それ以外のユーザは実行できない。ただし、特例的に、infraに所属
しないユーザ「bob」に対しても実行権限を付与したい。
上述の例の場合、bobはinfraに属さないその他のユーザに分類されるため、bobは
sample.outを実行できません。しかし、ファイルにACLを設定することで、このような
アクセス制御を柔軟に実現できます。ACLを設定する際に用いるコマンドを以下に
記載します。
・setfacl: ファイルにACLを設定(追加や削除)するためのコマンドです
・getfacl: ファイルに設定されたACLを表示するためのコマンドです
両コマンドの使い方は次節にて紹介します。それぞれ多くのオプションが用意されて
いますが、詳細については参考1が分かりやすいです。
◆アクセス制御リストの設定例
先ほどの例を実現するようなアクセス権を、実行ファイル「sample.out」に付与する
方法を紹介します。まずは、グループ「infra」に属するユーザ「alice」では実行でき、
属さないユーザ「bob」では実行できないことを確認します。なお、パーミッションを
確認する際に、lsに加えてgetfaclを用いています(現時点でACLは設定していないことが
分かります)。
上図から、bobではsample.outを実行できないことが分かります。実行できるように
するためには「bobをinfraに所属させる」といった方法もありますが、今回はinfraに
所属させることなく、次のコマンドにてACLを設定することで実行権限を付与します。
# setfacl -m u:bob:x sample.out
setfaclのオプションや書式について補足すると、「-m」はACLを設定するためのもので、
「u:bob:x」は、ユーザ「bob」に実行権限を付与するためのものです。このコマンドの
実行後、bobがsample.outを実行できるようになることを確認します。
setfaclコマンドの実行後、getfaclコマンドにてACLを確認すると、bobに実行権限が
付与されていることが分かります。また、sample.outが実行できるようになっている
ことも確認できました。ちなみに、ACLが付与されているファイルをlsで参照すると、
パーミッションの末尾に「+」が表示されます(OSやディストリビューションにより
表示は異なります)。
◆ 感想など
一口にアクセス制御といっても、それを実現する方法は様々あります(参考2)。
今後の運用業務を通して「どのアクセス制御方式をどの場面/状況で用いるべきか」
といった判断を下せられるよう、更に理解を深めていきたいです。
◆ 参考
・【参考1】https://atmarkit.itmedia.co.jp/ait/articles/1808/23/news026.html
・【参考2】https://hana-shin.hatenablog.com/entry/2022/05/31/221357
以上です。