「アクセス制御リスト」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「http://unix.stackexchange.com/」を「https://unix.stackexchange.com/」に置換)
(同期)
1行目: 1行目:
[[Category:セキュリティ]]
+
[[Category:Access control]]
 
[[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]] の依存パッケージであるため、にインストールされているはずです。
+
{{Pkg|acl}} パッケージは [[systemd]] の依存パッケージであるため、すでにインストールされているはずです。
   
== 設定 ==
+
== ACL の有効化 ==
   
  +
ACL を有効化するには、ファイルシステムを {{ic|acl}} オプションでマウントする必要があります。[[fstab]] を使えばオプションを永続化させることができます。
=== ACL の有効化 ===
 
   
ACL を有効にするには、ファイルシステム {{ic|acl}} オプションでマウントす必要があり。[[fstab]] を使えばオプションを永続化させることができます
+
ファイルシステムのデフォルトマウントオプションによっては {{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}} と記述されていればオプション変更されています。
+
また、デフォルトのマウントオプションがオーバーライドされていないことも確認してください。{{ic|/proc/mounts}} の関連する行に {{ic|noacl}} とある場合、ACL 無効化されています。
   
ファイルシステムのデフォルトマウントオプションは {{ic|tune2fs -o ''option'' ''partition''}} コマンドを使って設定できます例えば:
+
ファイルシステムのデフォルトマウントオプションは、コマンド {{ic|tune2fs -o ''オプション'' ''パーティション''}} 設定できます例えば:
   
 
# tune2fs -o acl /dev/sd''XY''
 
# tune2fs -o acl /dev/sd''XY''
   
特に外部ドライブに設定するときは、他 Linux マシンからも {{ic|acl}} オプションを使ってパーティションをマウントすることがある場合、{{ic|/etc/fstab}} エントリを記述するよりもデフォルトマウントオプションを使うほうが便利です。全てのマシンの {{ic|/etc/fstab}} を編集する必要がなくなります。
+
外部ドライブの場合、{{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"
 
  +
{{Tip|
または:
 
  +
* {{ic|--test}} フラグを追加すれば、パーミッションを変更せずに (つまり、ドライラン) ファイル/ディレクトリのパーミッションの変更を一覧表示できます。
# setfacl -m "u:uid:permissions"
 
  +
* すべてのファイルやディレクトリに再帰的に操作を適用するには、{{ic|-R}}/{{ic|--recursive}} を引数に追加してください。
  +
}}
  +
  +
ユーザに対するパーミッションを設定する ({{ic|''user''}} はユーザ名あるいはユーザ ID):
  +
  +
# setfacl -m "u:''user:permissions''" <file/dir>
  +
  +
グループに対するパーミッションを設定する ({{ic|''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>
  +
  +
{{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 をサポートするシステム上で利用可能になったとしても、問題が生じないようにするためです。}}
グループにパーミッションを追加:
 
# setfacl -m "g:groupname:permissions"
 
または:
 
# setfacl -m "g:gid:permissions"
 
   
  +
=== ACL の表示 ===
すべてのパーミッションを削除:
 
# setfacl -b
 
   
  +
パーミッションを表示するには、以下を実行してください:
個別のエントリを削除:
 
# setfacl -x "entry"
 
   
  +
# getfacl <file/dir>
パーミッションを確認するには、次を使用:
 
# getfacl filename
 
   
 
== サンプル ==
 
== サンプル ==
  +
"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:johny:rwx
+
user:johnny:rwx
 
group::r--
 
group::r--
 
mask::rwx
 
mask::rwx
70行目: 102行目:
 
}}
 
}}
   
ユーザ johny のパーミッションを変更:
+
ユーザ {{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:johny:r-x
+
user:johnny:r-x
 
group::r--
 
group::r--
 
mask::r-x
 
mask::r-x
84行目: 119行目:
 
}}
 
}}
   
ての拡張 ACL エントリを削除:
+
すべての 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|webserver}} に与え {{ic|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 ページ - {{ic|man getfacl}}
+
* {{man|1|getfacl}}
* Man ページ - {{ic|man setfacl}}
+
* {{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]
* 古いが関連性のある ACL の [http://vanemery.net/Linux/ACL/linux-acl.html ガイド]
 
 
* [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?]
 
* [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:49時点における版

アクセス制御リスト (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 を編集する必要は無くなります。

ノート:
  • ext2/3/4 ファイルシステムの作成時に acl はデフォルトのマウントオプションとして指定されます。この設定は /etc/mke2fs.conf から変えられます。
  • デフォルトのマウントオプションは /proc/mounts には記載されません。

使用法

ACL の設定

setfacl コマンドで ACL を変更できます。

ヒント:
  • --test フラグを追加すれば、パーミッションを変更せずに (つまり、ドライラン) ファイル/ディレクトリのパーミッションの変更を一覧表示できます。
  • すべてのファイルやディレクトリに再帰的に操作を適用するには、-R/--recursive を引数に追加してください。

ユーザに対するパーミッションを設定する (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>
この記事またはセクションの正確性には問題があります。
理由: --mask オプションに関する以前のノート (setfacl(1) から引用されたもの) は不正確であると判断されました。しかし、以下の新しいノートも正しくないようです。詳細は、この問題に関する 英語版の議論ページ を参照してください。 (議論: トーク:アクセス制御リスト#)
ノート: setfacl のデフォルトの挙動では、--mask エントリが明示的に与えられない限り、ACL マスクエントリが再計算されます。マスクエントリは、ユーザ (所有者以外) とグループに対して許可される最大のパーミッションを示します。明示的に設定されていない限り、これはデフォルトグループのパーミッションと一致します。これが何を意味するかを明確にするために、あるディレクトリを所有するグループが r-x パーミッションを持つと仮定しましょう。rwx パーミッションを持つ ACL ユーザやグループを追加すると、このユーザあるいはグループの実効 (effective) パーミッションは r-x となります。その理由は、ACL をサポートしないシステムから来たファイルが、ACL をサポートするシステム上で利用可能になったとしても、問題が生じないようにするためです。

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

参照

翻訳ステータス: このページは en:Access Control Lists の翻訳バージョンです。最後の翻訳日は 2023-05-10 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。