LinuxでACL(アクセス制御リスト)を使ってファイル権限を細かく制御する方法
Linuxには、ファイルやディレクトリへのアクセスを柔軟に制御できる「アクセス制御リスト(Access Control Lists/ACL)」という非常に便利な機能があります。本記事では、ACLがどのように機能し、ファイルのパーミッションを制御するのかを詳しく解説します。
注意:ACLの仕組みをしっかりと理解するため、まず実際のLinuxシステム上に複数のユーザーとグループを作成します。以下の演習は、Kali Linuxが稼働する仮想マシン上で実施しています。rootユーザーには、新規ユーザーの追加やグループへの割り当てを行う権限があります。
ユーザーとグループの作成
まずrootとしてログインし、次の表に従ってユーザーを作成し、それぞれ対応するグループに所属させます。概念を分かりやすくするため、ユーザーにはシンプルな名前を付けています。
| ユーザー | グループ |
|---|---|
| john1 john2 john3 |
johns |
| jane1 jane2 |
janes |
新しいユーザーをシステムに追加するには、adduserコマンドを使用します。

idコマンドを実行すると、作成したばかりのユーザーの詳細情報を確認できます。ユーザーID(uid)、グループID(gid)、グループ名(groups)が表示されます。ユーザーを作成すると、自動的にユーザー名と同じ名前のグループに追加され、そのユーザーはそのグループ唯一のメンバーとなります。

同様に、「john2」と「john3」も作成します。
adduser john2 adduser john3
3人のユーザーを作成したら、idコマンドでそれぞれのユーザーIDとグループIDを確認しましょう。

この時点で、3人のユーザーはそれぞれ固有のグループ(1000、1001、1002)に属しています。しかし冒頭の表のとおり、本来は3人とも同じ「johns」グループに所属させる必要があります。このグループはまだ存在しないため、groupaddコマンドで作成します。
groupadd -g <new_group_ID> <group_name>

ここでは新しいグループIDとして5000を指定しています。-gオプションを省略した場合は、システムが自動的に空いているグループIDを割り当てます。新しいグループ名は「johns」です。続いて、「john1」「john2」「john3」の3人をこのグループのメンバーとして登録します。この作業にはusermodコマンドを使用します。
usermod -g <group_name> <user_name>
usermodコマンドにより、指定した「user_name」が「group_name」グループに追加されます。下の図では、まずグループ変更前の「john1」のuidとgidを表示し、その後usermodコマンドの実行に成功すると、「john1」がgid 5000の「johns」グループに追加された様子を確認できます。

同じ手順を「john2」と「john3」にも適用します。
usermod -g johns john2 usermod -g johns john3
最後に、idコマンドを使って、「johns」グループに属する3人のユーザー情報を確認できます。

これで3人のユーザーを作成し、同じグループに所属させることに成功しました。
同じように、「jane1」と「jane2」を作成し、gid 6000の「janes」グループに追加します。詳細は以下のようにidコマンドで確認できます。

なぜアクセス制御リスト(ACL)が必要なのか?
ここで、ユーザー「john1」がログインし、

ホームディレクトリに新しいファイルを作成し、

そこに何らかの内容を書き込んだとします。

lsコマンドでファイルのメタデータを確認してみましょう。

出力の先頭にある -rw-r--r-- のような文字列がパーミッション情報です。これを分解して見てみましょう。
| - | rw- | r-- | r-- |
|---|---|---|---|
| ファイルタイプ | 所有者john1が持つ権限 | johnsグループのメンバーが持つ権限 | johnsグループ以外のその他のユーザーに与えられる権限 |
ファイルパーミッションの基礎については、別記事でも詳しく解説していますので参考にしてください。
ここで問題です。ファイルの所有者である「john1」が、「john2」と「jane1」にだけ追加で書き込み権限を与えたい一方で、「john3」と「jane2」には読み取り権限のみを維持したい場合はどうすればよいでしょうか?
| rw- | r-- |
|---|---|
| john1 john2 jane1 |
john3 jane2 |
一つの方法としては、「john1」「john2」「jane1」用に読み書き可能な新しいグループを作り、「john3」と「jane2」用には読み取り専用の別グループを作ることが考えられます。しかし、john1が今後さらにメンバーごとの権限を調整したい場合には、そのたびに新しいグループが必要になり、多数のグループを作成・管理する負担がシステム管理者にのしかかります。
代わりに活用したいのが「アクセス制御リスト(ACL)」です。ACLをファイルに設定すれば、どのユーザーがそのファイルに対してどんな操作を行えるのかを明確に定義できます。
ファイルにACL(アクセス制御リスト)を作成する方法
すべてのファイルは作成時にすでにACLが割り当てられています。効率的に活用するには、既存のACLを修正するだけです。ACLを変更できるのは、ファイルの所有者とrootユーザーのみです。
既存のACLを確認するには、getfaclコマンドを使用します。
getfacl <file_name>

#で始まる行はコメント行です。実際の情報は出力の最後の3行にあり、これは先ほど確認したパーミッション文字列に相当します。「user」行はファイル所有者「john1」に割り当てられた権限を示し、「group」行は「johns」グループの他のメンバーに割り当てられた権限を示します。そしてご想像のとおり、「other」行はグループ外の全ユーザーに対する権限を表します。
それでは、setfaclコマンドを使ってファイルのACLを変更してみましょう。
setfacl -m entity:name:permissions <file_name>
| entity(対象種別) | name(名前) | permissions(権限) |
|---|---|---|
| ACLエントリの対象を示します。user(u)/group(g)/others(o)のいずれかを指定します | ACLエントリの対象となるユーザー名またはグループ名 | 読み取り・書き込み・実行の各権限は、それぞれ r・w・x の文字で表します |
まず「john2」にファイルの読み取り・書き込み権限を与えます。

続いて「jane1」にも同様に権限を設定します。

更新後の「secretfile」のACLを確認してみましょう。

「john2」と「jane1」に読み取り・書き込み権限が割り当てられていることが分かります。
ACLの動作検証
まず、「john2」がファイルを読み取れること、そして書き込めることを確認します。

「john2」が入力した新しい情報がファイルに追記されました。

同様に「jane1」にも、読み取り権限と書き込み権限の両方が有効になっています。

一方、同じグループに属する「john3」はファイルに書き込むことができません。

また、「others(その他)」に該当する「jane2」も同様に書き込みは不可能です。

まとめ
今回紹介した手順は、そのままディレクトリにも応用できます。アクセス制御リスト(ACL)を活用することで、システム管理者はファイルやディレクトリへのアクセスをきめ細かく、かつ効率的に管理できるようになります。従来の所有者・グループ・その他という3段階の権限モデルでは実現できない個別ユーザー単位の制御が可能になるため、実務環境での権限設計にぜひ役立ててください。
-
LinuxでZipファイルを解凍する方法|GUIとコマンドラインの使い方を徹底解説
Zipファイルは、ダウンロード速度が遅く1バイトでも節約が重要だった時代ほど頻繁には使われなくなりました。それでも今なお広く普及しているファイル形式の一つであり、いずれ開く必要に迫られることもあるでしょう。使用しているディストリビューションにもよりますが、Zipアーカイブの展開自体は比較的簡単です。とはいえ、より高度な操作方法や応用的なテクニックを知っておけば、いざというときにきっと役立ちます。GUIを使ってZipファイルを解凍する多くのLinuxデスクトップ環境では、Zipファイルの解凍は非常に簡単です。ファイルを右クリックすると複数のオプションが表示され、通常は「ここで展開」や「ここに解凍
-
LinuxでZsyncを使ってファイルの差分だけをダウンロード・更新する方法
ISOイメージのような大容量ファイルのダウンロードは、本当にストレスがたまる作業です。インターネット回線の速度によってはダウンロードに長時間かかり、ハードディスクの容量も大量に消費します。さらに厄介なのは、更新版が必要になったときに、同じダウンロード作業を最初からやり直さなければならない点です。 しかし、そんな悩みを解決してくれるツールがあります。それがZsyncです。ZsyncはLinux向けのファイル同期ツールで、ファイル全体を再ダウンロードすることなく、変更された部分だけを更新できるのが最大の特徴です。 Zsyncは、ファイルやディレクトリの同期でおなじみの人気ツールrsyncをベース