「アクセス制御リスト」の版間の差分
(→プライベートなファイルへの実行権限を付与する: 戻す) |
|||
(3人の利用者による、間の5版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category:セ |
+ | [[Category:アクセス制御]] |
[[en:Access Control Lists]] |
[[en:Access Control Lists]] |
||
+ | [[es:Access Control Lists]] |
||
+ | [[pt:Access Control Lists]] |
||
[[ru:Access Control Lists]] |
[[ru:Access Control Lists]] |
||
+ | [[zh-hans:Access Control Lists]] |
||
− | アクセス制御リスト ('''A'''ccess '''C'''ontrol '''L'''ist, ACL) はファイルシステムに柔軟性のあるパーミッション機構を追加します。{{ic|UNIX}} のファイルパーティションを補助する形で設計されています。ACL を使うことであらゆるディスクリソースのパーミッションをあらゆるユーザーやグループに与えることが可能です。 |
||
+ | [[Wikipedia:ja:アクセス制御リスト|アクセス制御リスト]] (Access control list; ACL) は[[ファイルシステム]]により柔軟性のあるパーミッション機構を追加します。ACL は UNIX のファイルパーティションを補助するように設計されています。ACL を使うことで、任意のユーザやグループに任意のディスクリソースへのパーミッションを与えることができます。 |
||
== インストール == |
== インストール == |
||
− | + | {{Pkg|acl}} パッケージは [[systemd]] の依存パッケージであるため、すでにインストールされているはずです。 |
|
− | == |
+ | == ACL の有効化 == |
+ | ACL を有効化するには、ファイルシステムを {{ic|acl}} オプションでマウントする必要があります。[[fstab]] を使えばオプションを永続化させることができます。 |
||
− | === ACL の有効化 === |
||
− | + | ファイルシステムのデフォルトマウントオプションによっては {{ic|acl}} オプションが既に有効になっているかもしれません。[[Btrfs]] と Ext2/[[Ext3|3]]/[[Ext4|4]] ファイルシステムでは、すでに有効になっています。以下のコマンドを使うことで、ext2/3/4 でフォーマットされたパーティションのオプションを確認できます: |
|
+ | {{hc|# tune2fs -l /dev/sd''XY'' {{!}} grep "Default mount options:"| |
||
− | ファイルシステムのデフォルトマウントオプションによっては {{ic|acl}} オプションが既に有効になっているかもしれません。[[Btrfs]] ではデフォルトで有効であり、ext ファイルシステムでも有効になっていることがあります。以下のコマンドを使って ext* でフォーマットするときのパーティションのオプションを確認してください: |
||
+ | Default mount options: user_xattr '''acl''' |
||
− | |||
− | {{hc|# tune2fs -l /dev/sd''XY'' <nowiki>|</nowiki> grep "Default mount options:"| |
||
− | Default mount options: user_xattr acl |
||
}} |
}} |
||
− | + | また、デフォルトのマウントオプションがオーバーライドされていないことも確認してください。{{ic|/proc/mounts}} の関連する行に {{ic|noacl}} とある場合、ACL が無効化されています。 |
|
− | ファイルシステムのデフォルトマウントオプションは {{ic|tune2fs -o '' |
+ | ファイルシステムのデフォルトマウントオプションは、コマンド {{ic|tune2fs -o ''オプション'' ''パーティション''}} で設定できます。例えば: |
# tune2fs -o acl /dev/sd''XY'' |
# tune2fs -o acl /dev/sd''XY'' |
||
− | + | 外部ドライブの場合、{{ic|/etc/fstab}} のエントリではなくデフォルトのマウントオプションを使うと非常に便利です。なぜなら、そのようなパーティションは他の Linux マヒンでも {{ic|acl}} オプションでマウントされるからです。すべてのマシンで {{ic|/etc/fstab}} を編集する必要は無くなります。 |
|
{{Note| |
{{Note| |
||
32行目: | 33行目: | ||
* デフォルトのマウントオプションは {{ic|/proc/mounts}} には記載されません。 |
* デフォルトのマウントオプションは {{ic|/proc/mounts}} には記載されません。 |
||
}} |
}} |
||
+ | |||
+ | == 使用法 == |
||
=== ACL の設定 === |
=== ACL の設定 === |
||
− | ACL を修正するには {{ic|setfacl}} コマンドを使います。パーミッションを追加するには {{ic|setfacl -m}} を使います。 |
||
+ | ''setfacl'' コマンドで ACL を変更できます。 |
||
− | ユーザーにパーミッションを追加: |
||
− | # setfacl -m "u:username:permissions" |
||
− | または: |
||
− | # setfacl -m "u:uid:permissions" |
||
+ | {{Tip| |
||
− | グループにパーミッションを追加: |
||
+ | * {{ic|--test}} フラグを追加すれば、パーミッションを変更せずに (つまり、ドライラン) ファイル/ディレクトリのパーミッションの変更を一覧表示できます。 |
||
− | # setfacl -m "g:groupname:permissions" |
||
+ | * すべてのファイルやディレクトリに再帰的に操作を適用するには、{{ic|-R}}/{{ic|--recursive}} を引数に追加してください。 |
||
− | または: |
||
+ | }} |
||
− | # setfacl -m "g:gid:permissions" |
||
− | す |
+ | ユーザに対するパーミッションを設定する ({{ic|''user''}} はユーザ名あるいはユーザ ID): |
− | # setfacl -b |
||
+ | # setfacl -m "u:''user:permissions''" <file/dir> |
||
− | 個別のエントリを削除: |
||
− | # setfacl -x "entry" |
||
− | パーミッションを |
+ | グループに対するパーミッションを設定する ({{ic|''group''}} はグループ名あるいはグループ ID): |
+ | |||
− | # getfacl filename |
||
+ | # setfacl -m "g:''group:permissions''" <file/dir> |
||
+ | |||
+ | その他に対するパーミッションを設定する: |
||
+ | |||
+ | # setfacl -m "other:''permissions''" <file/dir> |
||
+ | |||
+ | すべての''新しく作成される''ファイルやディレクトリが親ディレクトリのエントリを継承するようにする (これは、そのディレクトリに''コピーされる''ファイルには影響しません): |
||
+ | |||
+ | # setfacl -dm "''entry''" <dir> |
||
+ | |||
+ | 特定のエントリを削除する: |
||
+ | |||
+ | # setfacl -x "''entry''" <file/dir> |
||
+ | |||
+ | デフォルトのエントリを削除する: |
||
+ | |||
+ | # setfacl -k <file/dir> |
||
+ | |||
+ | すべてのエントリを削除する (所有者、グループ、そしてその他のユーザのエントリは保持されます): |
||
+ | |||
+ | # setfacl -b <file/dir> |
||
+ | |||
+ | {{Accuracy|{{ic|--mask}} オプションに関する以前のノート ({{man|1|setfacl}} から引用されたもの) は不正確であると判断されました。しかし、以下の新しいノートも正しくないようです。詳細は、この問題に関する [[:en:Talk:Access Control Lists#ACL mask entry|英語版の議論ページ]] を参照してください。}} |
||
+ | |||
+ | {{Note|''setfacl'' のデフォルトの挙動では、{{ic|--mask}} エントリが明示的に与えられない限り、ACL マスクエントリが再計算されます。マスクエントリは、ユーザ (所有者以外) とグループに対して許可される最大のパーミッションを示します。明示的に設定されていない限り、これはデフォルトグループのパーミッションと一致します。これが何を意味するかを明確にするために、あるディレクトリを所有するグループが {{ic|r-x}} パーミッションを持つと仮定しましょう。{{ic|rwx}} パーミッションを持つ ACL ユーザやグループを追加すると、このユーザあるいはグループの''実効'' (''effective'') パーミッションは {{ic|r-x}} となります。その理由は、ACL をサポートしないシステムから来たファイルが、ACL をサポートするシステム上で利用可能になったとしても、問題が生じないようにするためです。}} |
||
+ | |||
+ | === ACL の表示 === |
||
+ | |||
+ | パーミッションを表示するには、以下を実行してください: |
||
+ | |||
+ | # getfacl <file/dir> |
||
== サンプル == |
== サンプル == |
||
+ | |||
− | "abc" という名前のファイルに対するユーザー johny のパーミッションを設定: |
||
+ | {{ic|abc}} という名前のファイルに対するユーザ {{ic|johnny}} のパーミッションを設定: |
||
− | # setfacl -m "u:johny:rwx" abc |
||
+ | |||
− | パーミッションの確認: |
||
+ | # setfacl -m "u:johnny:rwx" abc |
||
+ | |||
+ | パーミッションを確認: |
||
+ | |||
{{hc|# getfacl abc| |
{{hc|# getfacl abc| |
||
# file: abc |
# file: abc |
||
64行目: | 96行目: | ||
# group: someone |
# group: someone |
||
user::rw- |
user::rw- |
||
− | user: |
+ | user:johnny:rwx |
group::r-- |
group::r-- |
||
mask::rwx |
mask::rwx |
||
70行目: | 102行目: | ||
}} |
}} |
||
− | ユーザ |
+ | ユーザ {{ic|johnny}} のパーミッションを変更: |
+ | |||
− | # setfacl -m "u:johny:r-x" abc |
||
+ | # setfacl -m "u:johnny:r-x" abc |
||
+ | |||
パーミッションを確認: |
パーミッションを確認: |
||
+ | |||
{{hc|# getfacl abc| |
{{hc|# getfacl abc| |
||
# file: abc |
# file: abc |
||
78行目: | 113行目: | ||
# group: someone |
# group: someone |
||
user::rw- |
user::rw- |
||
− | user: |
+ | user:johnny:r-x |
group::r-- |
group::r-- |
||
mask::r-x |
mask::r-x |
||
84行目: | 119行目: | ||
}} |
}} |
||
− | + | すべての ACL エントリを削除: |
|
+ | |||
# setfacl -b abc |
# setfacl -b abc |
||
+ | |||
− | パーティションを確認: |
||
+ | パーミッションを確認: |
||
+ | |||
{{hc|# getfacl abc| |
{{hc|# getfacl abc| |
||
# file: abc |
# file: abc |
||
97行目: | 135行目: | ||
=== ls コマンドの出力 === |
=== ls コマンドの出力 === |
||
+ | |||
特定のファイルに ACL が存在するかどうかは {{ic|ls -l}} の出力で Unix のパーミッションの後に {{ic|'''+'''}} (プラス記号) があるかどうかで見分けられます。 |
特定のファイルに ACL が存在するかどうかは {{ic|ls -l}} の出力で Unix のパーミッションの後に {{ic|'''+'''}} (プラス記号) があるかどうかで見分けられます。 |
||
115行目: | 154行目: | ||
}} |
}} |
||
− | == |
+ | === プライベートなファイルに実行権限を付与する === |
− | ウェブサーバーなどのプロセスに、ユーザーのホームディレクトリにあるファイルへのアクセス権を与える方法を以下で説明します。全てのファイルにアクセスする権限を与えるのではなく制限をかけることでセキュリティを担保しています。 |
||
+ | [[ウェブサーバー]]などのプロセスに、ユーザのホームディレクトリにあるファイルへのアクセス権を与える方法を以下で説明します (システム全体に対してアクセス権を与えてセキュリティを犠牲にしたりはしません)。 |
||
− | このセクションでは、例として、ウェブサーバーを実行するユーザーは {{ic|webserver}} で、アクセスできるようにするのは {{ic|geoffrey}} のホームディレクトリである {{ic|/home/geoffrey}} と仮定します。 |
||
− | + | このセクションでは、ウェブサーバは {{ic|http}} ユーザとして実行していて、{{ic|geoffrey}} のホームディレクトリ {{ic|/home/geoffrey}} へのアクセスを与えたいと仮定します。 |
|
+ | |||
− | # setfacl -m "u:webserver:--x" /home/geoffrey |
||
+ | まず、{{ic|http}} ユーザに実行権限を与えます: |
||
− | ''注意'': ディレクトリの中身をプロセスが確認するにはディレクトリに実行権限が必要です。 |
||
+ | |||
+ | # setfacl -m "u:http:--x" /home/geoffrey |
||
+ | |||
+ | {{Note|ディレクトリに対する実行権限は、プロセスがディレクトリのコンテンツを確認できるようにするために必要です。}} |
||
+ | |||
+ | これで {{ic|http}} ユーザが {{ic|/home/geoffrey}} 内のファイルにアクセスできるようになったので、{{ic|other}} にアクセス権は必要ありません: |
||
− | {{ic|webserver}} から {{ic|/home/geoffrey}} のファイルにアクセスできるようになったので、{{ic|other}} は権限が必要ありません: |
||
# chmod o-rx /home/geoffrey |
# chmod o-rx /home/geoffrey |
||
− | {{ic|getfacl}} を使 |
+ | {{ic|getfacl}} を使って変更を確認してください: |
− | $ getfacl /home/geoffrey |
||
− | getfacl: Removing leading '/' from absolute path names |
||
− | # file: home/geoffrey |
||
− | # owner: geoffrey |
||
− | # group: geoffrey |
||
− | user::rwx |
||
− | user:webserver:--x |
||
− | group::r-x |
||
− | mask::r-x |
||
− | other::--- |
||
+ | {{hc|$ getfacl /home/geoffrey| |
||
− | 上記の出力で、{{ic|other}} にはもはや権限がなく、{{ic|webserver}} がファイルにアクセスできることが確認でき、セキュリティが確かに向上しています。 |
||
+ | getfacl: Removing leading '/' from absolute path names |
||
+ | # file: home/geoffrey |
||
+ | # owner: geoffrey |
||
+ | # group: geoffrey |
||
+ | user::rwx |
||
+ | user:http:--x |
||
+ | group::r-x |
||
+ | mask::r-x |
||
+ | other::--- |
||
+ | }} |
||
+ | |||
+ | 上記の出力で、{{ic|other}} は如何なるパーミッションも持っていませんが、{{ic|http}} ユーザは依然として (ホームディレクトリ下の) ファイルにアクセスできることが分かります。ゆえに、セキュリティが向上したはずです。 |
||
+ | |||
+ | 特定のディレクトリやファイルへの書き込みアクセス権を {{ic|http}} ユーザに与えたい場合は、以下を実行してください: |
||
+ | |||
+ | # setfacl -dm "u:http:rwx" /home/geoffrey/project1/cache |
||
== 参照 == |
== 参照 == |
||
− | * |
+ | * {{man|1|getfacl}} |
− | * |
+ | * {{man|1|setfacl}} |
+ | * [https://www.usenix.org/legacy/publications/library/proceedings/usenix03/tech/freenix03/full_papers/gruenbacher/gruenbacher_html/main.html POSIX Access Control Lists on Linux] |
||
− | * An old but still relevant (and thorough) [http://www.vanemery.com/Linux/ACL/linux-acl.html guide] to ACL |
||
+ | * [https://unix.stackexchange.com/questions/1314/how-to-set-default-file-permissions-for-all-folders-files-in-a-directory How to set default file permissions for all folders/files in a directory?] |
||
+ | |||
+ | {{TranslationStatus|Access Control Lists|2023-05-10|704836}} |
2023年5月10日 (水) 16:52時点における最新版
アクセス制御リスト (Access control list; ACL) はファイルシステムにより柔軟性のあるパーミッション機構を追加します。ACL は UNIX のファイルパーティションを補助するように設計されています。ACL を使うことで、任意のユーザやグループに任意のディスクリソースへのパーミッションを与えることができます。
目次
インストール
acl パッケージは systemd の依存パッケージであるため、すでにインストールされているはずです。
ACL の有効化
ACL を有効化するには、ファイルシステムを acl
オプションでマウントする必要があります。fstab を使えばオプションを永続化させることができます。
ファイルシステムのデフォルトマウントオプションによっては acl
オプションが既に有効になっているかもしれません。Btrfs と Ext2/3/4 ファイルシステムでは、すでに有効になっています。以下のコマンドを使うことで、ext2/3/4 でフォーマットされたパーティションのオプションを確認できます:
# tune2fs -l /dev/sdXY | grep "Default mount options:"
Default mount options: user_xattr acl
また、デフォルトのマウントオプションがオーバーライドされていないことも確認してください。/proc/mounts
の関連する行に noacl
とある場合、ACL が無効化されています。
ファイルシステムのデフォルトマウントオプションは、コマンド tune2fs -o オプション パーティション
で設定できます。例えば:
# tune2fs -o acl /dev/sdXY
外部ドライブの場合、/etc/fstab
のエントリではなくデフォルトのマウントオプションを使うと非常に便利です。なぜなら、そのようなパーティションは他の Linux マヒンでも acl
オプションでマウントされるからです。すべてのマシンで /etc/fstab
を編集する必要は無くなります。
使用法
ACL の設定
setfacl コマンドで ACL を変更できます。
ユーザに対するパーミッションを設定する (user
はユーザ名あるいはユーザ ID):
# setfacl -m "u:user:permissions" <file/dir>
グループに対するパーミッションを設定する (group
はグループ名あるいはグループ ID):
# setfacl -m "g:group:permissions" <file/dir>
その他に対するパーミッションを設定する:
# setfacl -m "other:permissions" <file/dir>
すべての新しく作成されるファイルやディレクトリが親ディレクトリのエントリを継承するようにする (これは、そのディレクトリにコピーされるファイルには影響しません):
# setfacl -dm "entry" <dir>
特定のエントリを削除する:
# setfacl -x "entry" <file/dir>
デフォルトのエントリを削除する:
# setfacl -k <file/dir>
すべてのエントリを削除する (所有者、グループ、そしてその他のユーザのエントリは保持されます):
# setfacl -b <file/dir>
ACL の表示
パーミッションを表示するには、以下を実行してください:
# getfacl <file/dir>
サンプル
abc
という名前のファイルに対するユーザ johnny
のパーミッションを設定:
# setfacl -m "u:johnny:rwx" abc
パーミッションを確認:
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- user:johnny:rwx group::r-- mask::rwx other::r--
ユーザ johnny
のパーミッションを変更:
# setfacl -m "u:johnny:r-x" abc
パーミッションを確認:
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- user:johnny:r-x group::r-- mask::r-x other::r--
すべての ACL エントリを削除:
# setfacl -b abc
パーミッションを確認:
# getfacl abc
# file: abc # owner: someone # group: someone user::rw- group::r-- other::r--
ls コマンドの出力
特定のファイルに ACL が存在するかどうかは ls -l
の出力で Unix のパーミッションの後に +
(プラス記号) があるかどうかで見分けられます。
$ ls -l /dev/audio
crw-rw----+ 1 root audio 14, 4 nov. 9 12:49 /dev/audio
$ getfacl /dev/audio
getfacl: Removing leading '/' from absolute path names # file: dev/audio # owner: root # group: audio user::rw- user:solstice:rw- group::rw- mask::rw- other::---
プライベートなファイルに実行権限を付与する
ウェブサーバーなどのプロセスに、ユーザのホームディレクトリにあるファイルへのアクセス権を与える方法を以下で説明します (システム全体に対してアクセス権を与えてセキュリティを犠牲にしたりはしません)。
このセクションでは、ウェブサーバは http
ユーザとして実行していて、geoffrey
のホームディレクトリ /home/geoffrey
へのアクセスを与えたいと仮定します。
まず、http
ユーザに実行権限を与えます:
# setfacl -m "u:http:--x" /home/geoffrey
これで http
ユーザが /home/geoffrey
内のファイルにアクセスできるようになったので、other
にアクセス権は必要ありません:
# chmod o-rx /home/geoffrey
getfacl
を使って変更を確認してください:
$ getfacl /home/geoffrey
getfacl: Removing leading '/' from absolute path names # file: home/geoffrey # owner: geoffrey # group: geoffrey user::rwx user:http:--x group::r-x mask::r-x other::---
上記の出力で、other
は如何なるパーミッションも持っていませんが、http
ユーザは依然として (ホームディレクトリ下の) ファイルにアクセスできることが分かります。ゆえに、セキュリティが向上したはずです。
特定のディレクトリやファイルへの書き込みアクセス権を http
ユーザに与えたい場合は、以下を実行してください:
# setfacl -dm "u:http:rwx" /home/geoffrey/project1/cache