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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(ページの作成:「Category:セキュリティ en:Access Control Lists ru:Access Control Lists アクセス制御リスト ('''A'''ccess '''C'''ontrol '''L'''ist, ACL) はファ...」)
 
 
(3人の利用者による、間の7版が非表示)
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]] の依存パッケージであるため、にインストールされているはずです。
+
{{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''
   
  +
外部ドライブの場合、{{ic|/etc/fstab}} のエントリではなくデフォルトのマウントオプションを使うと非常に便利です。なぜなら、そのようなパーティションは他の Linux マヒンでも {{ic|acl}} オプションでマウントされるからです。すべてのマシンで {{ic|/etc/fstab}} を編集する必要は無くなります。
Using the default mount options instead of an entry in {{ic|/etc/fstab}} is very useful for external drives, such partition will be mounted with {{ic|acl}} option also on other Linux machines. There is no need to edit {{ic|/etc/fstab}} on every machine.
 
   
 
{{Note|
 
{{Note|
  +
* ext2/3/4 ファイルシステムの作成時に {{ic|acl}} はデフォルトのマウントオプションとして指定されます。この設定は {{ic|/etc/mke2fs.conf}} から変えられます。
* {{ic|acl}} is specified as default mount option when creating an ext2/3/4 filesystem. This is configured in {{ic|/etc/mke2fs.conf}}.
 
* The default mount options are not listed in {{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: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 エントリを削除:
Remove all extended ACL entries:
 
  +
 
# setfacl -b abc
 
# setfacl -b abc
  +
Check permissions
 
  +
パーミッションを確認:
  +
 
{{hc|# getfacl abc|
 
{{hc|# getfacl abc|
 
# file: abc
 
# file: abc
97行目: 135行目:
   
 
=== ls コマンドの出力 ===
 
=== ls コマンドの出力 ===
  +
You will notice that there is an ACL for a given file because it will exhibit a {{ic|'''+'''}} (plus sign) after its Unix permissions in the output of {{ic|ls -l}}.
 
  +
特定のファイルに ACL が存在するかどうかは {{ic|ls -l}} の出力で Unix のパーミッションの後に {{ic|'''+'''}} (プラス記号) があるかどうかで見分けられます。
   
 
{{hc|$ ls -l /dev/audio|
 
{{hc|$ ls -l /dev/audio|
115行目: 154行目:
 
}}
 
}}
   
  +
=== プライベートなファイルに実行権限を付与する ===
== ウェブブラウザのセキュリティを向上 ==
 
You can now add permissions to our home directory and/or site directory only to nobody user any anyone else - without "whole world" to increase your security.
 
   
  +
[[ウェブサーバー]]などのプロセスに、ユーザのホームディレクトリにあるファイルへのアクセス権を与える方法を以下で説明します (システム全体に対してアクセス権を与えてセキュリティを犠牲にしたりはしません)。
Add permissions '''+x''' for nobody user on your home directory via ACL:
 
# setfacl -m "u:nobody:--x" /home/homeusername/
 
Now you can remove whole world rx permissions:
 
# chmod o-rx /home/homeusername/
 
Check our changes:
 
 
# file: username/
 
# owner: username
 
# group: users
 
user::rwx
 
user:nobody:--x
 
group::r-x
 
mask::r-x
 
other::---
 
   
  +
このセクションでは、ウェブサーバは {{ic|http}} ユーザとして実行していて、{{ic|geoffrey}} のホームディレクトリ {{ic|/home/geoffrey}} へのアクセスを与えたいと仮定します。
As we can see others do not have any permissions but user nobody have "x" permission so they can "look" into users directory and give access to users pages from their home directories to www server. Of course if www server work as nobody user. But - whole world except nobody - do not have any permissions.
 
  +
  +
まず、{{ic|http}} ユーザに実行権限を与えます:
  +
  +
# setfacl -m "u:http:--x" /home/geoffrey
  +
  +
{{Note|ディレクトリに対する実行権限は、プロセスがディレクトリのコンテンツを確認できるようにするために必要です。}}
  +
  +
これで {{ic|http}} ユーザが {{ic|/home/geoffrey}} 内のファイルにアクセスできるようになったので、{{ic|other}} にアクセス権は必要ありません:
  +
  +
# chmod o-rx /home/geoffrey
  +
  +
{{ic|getfacl}} を使って変更を確認してください:
  +
  +
{{hc|$ 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::---
  +
}}
  +
  +
上記の出力で、{{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]
* 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 を編集する必要は無くなります。

ノート:
  • 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 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。