This tutorial details access control lists on Linux, what they are used for and how to manage them.
システム管理者として、あなたはおそらくシステム上のユーザーやグループのパーミッションを設定するのにかなりの時間を使っていることでしょう。
しかし、フォルダーやファイルに権限を与えるより正確な方法が必要な場合はどうしたらよいでしょうか。
ファイルの現在の所有者ではない特定のユーザーまたはグループに、ファイルへのアクセスを許可したい場合はどうしたらよいでしょうか。
これはまさに、アクセス制御リスト (ACL) が Linux システム上で解決することです。
今日のチュートリアルでは、アクセス制御リストについて、それらが何であり、Linux システムを適切に構成するためにどのように使用されるかを詳しく見ていきましょう。
目次
- What You Will Learn
- Access Control Lists Basics on Linux
- アクセス制御リストのリスト化
- Creating access control lists on Linux
- Checking ACL packages installation
- setfaclを使用してアクセス制御リストを設定する
- Listing access control lists using getfacl
- アクセス制御リストのマスクを使用する
- Creating access control lists defaults on directories
- ディレクトリのデフォルトアクセス制御リストの削除
- まとめ
What You Will Learn
If you are learned about this tutorial until end:
- What access control lists are and how they can be read from ls command;
- How to setfacl command using a file basic permissions on the setting of the basic permission is the setfacl command.最後まで、このチュートリアルに従っていれば、次のテーマが習得できるでしょう:
- アクセス制御リストとは何か、そして、それらを ls コマンドで読むことができるか?
- アクセス制御リストを getfacl コマンドで読み取る方法;
- アクセス制御リストマスクとは何か、それをどう読み取るべきか;
- アクセス制御リストのデフォルトとは何か、それをどう有効に使うか
これはかなり長いプログラムなので、これ以上は説明せずに、アクセス制御リストとは何かを簡単に定義することから始めてみよう。
Access Control Lists Basics on Linux
Linux では、ユーザーやグループに対してパーミッションを設定する方法として、通常のファイルパーミッションとアクセス制御リストの 2つがあります。 ACL は、ファイルの所有者または特権ユーザーが、特定のユーザーまたは特定のグループに権限を付与することを可能にします。
Linux では、おそらくご存知のように、パーミッションは 3 つのカテゴリに分けられます: ファイルの所有者のためのもの、グループのためのもの、その他のためのものです。
しかしながら、いくつかのケースでは、特定のユーザーにディレクトリへのアクセス(例えば実行権限)を、そのユーザーがファイルのグループに入らなくても許可したい場合があります。
これはまさに、アクセス制御リストが最初に発明された理由です。
アクセス制御リストのリスト化
Linux では、ホスト上に新しいファイルやディレクトリを作成しても、アクセス制御リストは有効になりません(親ディレクトリに何らかの ACL が事前に定義されている場合は除きます)。
アクセス制御リストがファイルまたはディレクトリに対して定義されているかどうかを確認するには、ls コマンドを実行し、許可行の最後にある「+」文字を探します。
$ ls -l
違いを示すために、最小インスタンスのファイルをリストした場合の違いを以下に挙げます。
アクセス制御リストについての基礎知識を得たので、ファイルおよびディレクトリの基本的な ACL を作成する方法を説明します。
Creating access control lists on Linux
ACL コマンドを始める前に、ホスト上にパッケージをインストールすることが重要です。
Checking ACL packages installation
最小限のサーバーを実行することを選択した場合はそうではないかもしれません。
setfacl 関連のヘルプを次のコマンドを実行して確認することから始めてください
$ setfacl --help
お使いのホストに setfacl コマンドが見つからない場合、ACL 管理に必要なパッケージがインストールされているかどうか確認します。
$ sudo apt-get install acl -y
Debian 10 では、このコマンドを実行するには sudo 権限が必要なことに注意してください。
setfacl コマンドを実行し、今度はヘルプ コマンドを表示できるようにしたことを確認します。
setfaclを使用してアクセス制御リストを設定する
アクセス制御リストには、覚えておく必要がある2つの主要なコマンドがあります:setfaclとgetfaclです。
この章では、getfaclはかなり自明なのでsetfaclコマンドを見てみることにします。
setfacl コマンドは Linux でファイルまたはディレクトリのアクセス制御リストを作成、変更、削除するために使用します。
setfacl は次の構文です
$ setfacl {-m, -x} {u, g}:<name>: <file, directory>
ここで中括弧は次のオプションのいずれかを、通常の括弧は 1 つまたは複数のアイテムを意味します。
- -m : ファイルまたはディレクトリの一つまたは複数の ACL エントリを修正することを意味します。
- -x : ファイルまたはディレクトリの一つまたは複数の ACL エントリを削除することを意味します。
- {u, g} : ユーザーまたはグループの ACL を修正したい場合です。
- name : これはオプションのパラメータで、ホスト上のすべてのユーザまたはすべてのグループの ACL エントリを設定したい場合は省略できます。
- : ファイルまたはディレクトリの読み取り、書き込み、実行権限を設定するためです。
例えば、ファイルに対してあるユーザーの特定の書き込み権限を設定するには、次のコマンドを記述します
$ setfacl -m u:user:w <file, directory>
ホスト上のすべてのユーザーに対して実行権限を設定するには、次のコマンドを記述します。 ホスト上の特定のグループにフルパーミッションを設定するには、次のコマンド
$ setfacl -m u::x <file, directory>
のようにsetfaclを記述します
$ setfacl -m g:group:rwx <file, directory>
さて、ファイルからACLエントリを削除したいとします。
ファイルからユーザー固有のエントリを削除するには、x オプションを指定します。
注意: 1 つの ACL エントリから特定の権限を削除することはできません。つまり、ACL の読み取り権限を有効にして、書き込み権限を削除することはできないということです。
$ setfacl -x u:<user> <file, directory>
同様に、ホスト上のグループに関連する ACL を削除するには、次のコマンドを記述します。
$ setfacl -x g:<group> <file, directory>
さて、Linux でアクセス制御リストを簡単に作成する方法を見てきましたが、次はファイルやディレクトリの既存のアクセス制御リストを確認する方法です。
Listing access control lists using getfacl
getfacl コマンドは Linux でファイルまたはディレクトリのすべての通常のパーミッションとアクセス制御リストのパーミッションの完全なリストを表示するために使用されます。
getfacl は以下の構文で使用できます。
$ getfacl <file, directory>
getfacl コマンドは複数のカテゴリに分かれています :
- ファイル名、オーナーとグループ:
- ユーザー権限 : 最初に、所有ユーザーとも呼ばれる通常のユーザー権限が表示され、その後にユーザー固有の ACL エントリ (指名ユーザーと呼ばれます) が表示されます。
- Mask : ACL エントリに与えられる権限を制限するもので、マスクについては次のセクションで詳しく説明します。
アクセス制御リストのマスクを使用する
最後のスクリーンショットでご覧になったように、名前付きグループとその他のアクセス許可の間にマスク エントリがあります。
ACL マスクはファイル作成マスク (umask) とは異なり、ファイルまたはディレクトリに存在する既存の ACL エントリを制限するために使用されます。
As always, a diagram speaks a hundred words.
ACL マスクは -n flag で更新しないことを指定しない限り、setfacl コマンドを実行するたびに更新されます。
マスクを更新しないようにするには、次のコマンドで setfacl を実行します
$ setfacl -n -m u:antoine:rwx <file, directory>
この例でわかるように、ユーザー “antoine” がファイルのフルパーミッションを持つように設定しました。
マスクは、権限を読み取りと書き込み権限に制限するように設定されています。
結果として、このユーザーに対してこのファイルに設定された「有効な権限」は読み取りと書き込み権限で、実行権限は付与されていません。
注意: アクセス権の最大セットがマスク エントリと異なる場合、使用される ACL エントリの「実際の」セットを計算する有効行が表示されます。
Creating access control lists defaults on directories
この記事で既に述べたように、ディレクトリに ACL エントリを作成することは可能で、それらはファイル アクセス制御リストと同じ方法で機能します。
ただし、ディレクトリに関しては、アクセス制御リストのデフォルトを作成するオプションがあるという小さな違いがあります。
アクセス制御リストのデフォルトは、ファイルやサブディレクトリなどのこのディレクトリ内のオブジェクトに継承される、ディレクトリ上の ACL エントリを作成するために使用します。
- このディレクトリに作成されたファイルは、親ディレクトリで指定された ACL エントリを継承します
- このディレクトリに作成されたサブディレクトリは、親ディレクトリのデフォルト ACL エントリと同様に ACL エントリを継承します
デフォルト ACL エントリを作成するには、 setfacl コマンドによる ACL 設定で -d オプションを指定します。
$ setfacl -d -m {u, g}:<name>: <directory>
たとえば、あるディレクトリに作成されたすべてのファイルに読み取り権限を割り当てるには、次のコマンドを実行します
$ setfacl -d -m u::r directory
これで、この acl-directory でファイルを作成すると、そのファイルに対してデフォルト ACL エントリが適用されることが確認されます。
同様に、ディレクトリが acl-directory に作成されると、親ディレクトリで指定されたデフォルト ACL エントリを継承します。
3 つのカテゴリすべて (user, group および other) に対してデフォルト権限を指定することが推奨されることに注意してください。
実際、3 つのエントリの 1 つを指定すると、ファイル作成マスクに関連するパーミッションで残りの 2 つを作成します。
ディレクトリのデフォルトアクセス制御リストの削除
ディレクトリにあるデフォルト既存アクセス制御リストを削除するには、 setfacl コマンドで -k flag を使用します。
$ setfacl -k <directory>
先ほどの例で、デフォルトのエントリを削除する方法を示します
$ setfacl -k acl-directory
親ディレクトリからACLエントリを削除しても、その親ディレクトリに含まれるファイルやディレクトリのACLエントリは削除しないことに注意してください。
あるディレクトリとすべてのサブディレクトリのデフォルト ACL エントリを削除するには、recursive オプション (-R)
$ setfacl -kR <directory>
まとめ
このチュートリアルでは、Linux のアクセス制御リストと getfacl および setfacl コマンドについて学びました。
アクセス制御リストのマスクと、親ディレクトリに含まれるファイルやサブディレクトリに ACL エントリを作成するためにデフォルト ACL がどのように使用されるかについて詳しく学びました。