「ケイパビリティ」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(同期)
 
(4人の利用者による、間の4版が非表示)
1行目: 1行目:
 
[[Category:セキュリティ]]
 
[[Category:セキュリティ]]
 
[[en:Capabilities]]
 
[[en:Capabilities]]
  +
[[pt:Capabilities]]
  +
[[ru:Capabilities]]
 
[[zh-hans:Capabilities]]
 
[[zh-hans:Capabilities]]
'''ケイパビリティ''' (POSIX 1003.1e, capabilities(7)) はスーパーユーザー権限の細かい制御を提供することで、root ユーザーの使用を減らすことができます。ソフトウェアの開発者はシステムバイナリの強力な [[wikipedia:ja:Setuid|setuid]] 属性を最小セットのケイパビリティ置き換えることが推奨されています。多数のパッケージがケイパビリティを利用しており、例えば CAP_NET_RAW は {{pkg|iputils}} に含まれている {{ic|ping}} バイナリで使われています。これによって ('''setuid''' と同じように) 通常ユーザーで {{ic|ping}} を実行することができ、同時に、{{ic|ping}} 脆弱性によるセキュリティ上の影響を緩和することが可能となっています。
+
ケイパビリティ (POSIX 1003.1e, {{man|7|capabilities}}) はスーパーユーザー権限の細かい制御を提供することで、root ユーザーの使用を減らすことができます。ソフトウェアの開発者はシステムバイナリの強力な [[wikipedia:ja:Setuid|setuid]] 属性を、より低限のケイパビリティのセットに置き換えることが推奨されています。多数のパッケージがケイパビリティを利用しており、例えば {{ic|CAP_NET_RAW}} {{Pkg|fping}} バイナリで使われています。これによって ('''setuid''' と同じように) 通常ユーザーで {{ic|fping}} を実行することができ、それと同時に、{{ic|fping}} 脆弱性があった場合のセキュリティ上の影響を緩和することができます。
 
== 要件 ==
 
 
''setcap'' ユーティリティを使って、拡張属性であるファイルケイパビリティを設定するには {{Pkg|libcap}} を[[pacman|インストール]]する必要があります。
 
   
 
== 実装 ==
 
== 実装 ==
   
Linux ではケイパビリティは ''security'' 名前空間の''[[ファイルのパーミッションと属性#拡張属性|拡張属性]]'' ({{ic|man 7 xattr}}) を使って実装されています。拡張属性は Ext2, Ext3, Ext4, Btrfs, JFS, XFS, Reiserfs など全ての主要な Linux ファイルシステムでサポートされています。以下の例では {{ic|getcap}} を使って ping のケイパビリティを出力してから、{{ic|getfattr}} を使ってエンコードされた同じデータを出力しています:
+
Linux ではケイパビリティは[[拡張属性]] ({{man|7|xattr}}) の ''security'' 名前空間を使って実装されています。拡張属性は Ext2Ext3Ext4BtrfsJFSXFS、そして Reiserfs など全ての主要な Linux [[ファイルシステム]]でサポートされています。以下の例では {{ic|getcap}} を使って fping のケイパビリティを出力し、さらに {{ic|getfattr}} を使ってエンコードされた同じデータを出力しています:
   
$ getcap /bin/ping
+
{{hc|$ getcap /usr/bin/fping|2=
/bin/ping = cap_net_raw+ep
+
/usr/bin/fping cap_net_raw=ep
  +
}}
$ getfattr -d -m "^security\\." /bin/ping
 
  +
# file: bin/ping
 
  +
{{hc|$ getfattr -d -m "^security\\." /usr/bin/fping|2=
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
 
  +
# file: usr/bin/fping
  +
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
  +
}}
   
 
{{ic|cp -a}} を使うと拡張属性は自動的にコピーされますが、プログラムによっては特殊なフラグが必要な場合もあります: {{ic|rsync -X}}。
 
{{ic|cp -a}} を使うと拡張属性は自動的にコピーされますが、プログラムによっては特殊なフラグが必要な場合もあります: {{ic|rsync -X}}。
   
ケイパビリティは Arch のパッケージのインストールスクリプトによって設定されます (例: {{ic|iputils.install}})。
+
Arch ではケイパビリティはパッケージのインストールスクリプトによって設定されます (例: {{ic|fping.install}})。
   
 
== 管理とメンテナンス ==
 
== 管理とメンテナンス ==
   
パッケージケイパビリティが過度に権限与えている場合はバグと考えられます。ここに記載するのではなくバグとして報告してください。root アクセスと等 (CAP_SYS_ADMIN) または root アクセスの許可と同等 (CAP_DAC_OVERRIDE) なケイパビリティはバグではありません。Arch は MAC/RBAC システムをサポートしていないためです
+
パッケージが過度に強力なケイパビリティを持っている場合はバグと考えられます。なので、ここに記載するのではなくバグとして報告してください。Arch は [[セキュリティ#強制アクセス制御|MAC/RBAC]] システムをサポートしていないため、root アクセスと本質的に価なケイパビリティ ({{ic|CAP_SYS_ADMIN}}) root アクセスを容易にするケイパビリティ ({{ic|CAP_DAC_OVERRIDE}}) はバグではありません。
   
{{Warning|特権昇格が可能になるケイパビリティは多数あります。詳しい例や説明は Brad Spengler による [http://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271 False Boundaries and Arbitrary Code Execution] を参照してください。}}
+
{{Warning|1=特権昇格が可能になるケイパビリティは多数あります。詳しい例や説明は Brad Spengler による [https://forums.grsecurity.net/viewtopic.php?f=7&t=2522&sid=c6fbcf62fd5d3472562540a7e608ce4e#p10271 False Boundaries and Arbitrary Code Execution] を参照してください。}}
   
 
== ケイパビリティを利用できる他のプログラム ==
 
== ケイパビリティを利用できる他のプログラム ==
   
 
以下のパッケージには setuid 属性が設定されたファイルがありませんが、実行するには root 権限を必要とします。ケイパビリティを有効にすることで、権限昇格を行わなくても通常ユーザーでプログラムを使うことが可能になります。
 
以下のパッケージには setuid 属性が設定されたファイルがありませんが、実行するには root 権限を必要とします。ケイパビリティを有効にすることで、権限昇格を行わなくても通常ユーザーでプログラムを使うことが可能になります。
  +
  +
ケイパビリティの末尾の {{ic|+ep}} は "実効許可 (effective permitted)" を意味します。詳細は {{man|7|capabilities|File capabilities}} で見られます。
   
 
=== beep ===
 
=== beep ===
47行目: 50行目:
   
 
# setcap cap_net_admin+ep /usr/bin/mii-tool
 
# setcap cap_net_admin+ep /usr/bin/mii-tool
  +
  +
=== mtr ===
  +
  +
# setcap cap_net_raw+ep /usr/bin/mtr-packet
  +
  +
=== nethogs ===
  +
  +
# setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs
  +
  +
=== wavemon ===
  +
  +
# setcap cap_net_admin+ep /usr/bin/wavemon
   
 
== 便利なコマンド ==
 
== 便利なコマンド ==
   
 
setuid-root ファイルを検索:
 
setuid-root ファイルを検索:
  +
 
$ find /usr/bin /usr/lib -perm /4000 -user root
 
$ find /usr/bin /usr/lib -perm /4000 -user root
   
 
setgid-root ファイルを検索:
 
setgid-root ファイルを検索:
  +
 
$ find /usr/bin /usr/lib -perm /2000 -group root
 
$ find /usr/bin /usr/lib -perm /2000 -group root
  +
  +
== ケイパビリティを一時的に付与してプログラムを実行する ==
  +
  +
{{man|1|capsh}} を使うと、バイナリの拡張属性を変更せずに、特定のケイパビリティを持たせてプログラムを実行することができます。
  +
以下の例では、{{ic|CAP_SYS_PTRACE}} ケイパビリティを使って、[[GDB]] を使ってプロセスにアタッチする方法を示しています:
  +
  +
$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>
  +
  +
[[netcat]] を使って低いポートにバインドする例:
  +
  +
$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
  +
Listening on 0.0.0.0 123
   
 
== 参照 ==
 
== 参照 ==
   
* Man ページ: capabilities(7) setcap(8) getcap(8)
+
* Man ページ: {{man|7|capabilities}}、{{man|8|setcap}}、{{man|8|getcap}}
  +
* [[Wikibooks:Grsecurity/Appendix/Capability Names and Descriptions]]
* [[en2:DeveloperWiki:Security#Replacing setuid with capabilities|DeveloperWiki:Security#Replacing setuid with capabilities]]
 
  +
* [https://docs.kernel.org/userspace-api/seccomp_filter.html Seccomp BPF (SECure COMPuting with filters)]
* [https://en.wikibooks.org/wiki/Grsecurity/Appendix/Capability_Names_and_Descriptions Grsecurity Appendix: Capability Names and Descriptions]
 
  +
* [https://www.kernel.org/doc/Documentation/prctl/seccomp_filter.txt The Linux Kernel Archives: SECure COMPuting with filters]
 
  +
{{TranslationStatus|Capabilities|2023-05-11|760131}}

2023年5月11日 (木) 21:00時点における最新版

ケイパビリティ (POSIX 1003.1e, capabilities(7)) はスーパーユーザー権限の細かい制御を提供することで、root ユーザーの使用を減らすことができます。ソフトウェアの開発者は、システムバイナリの強力な setuid 属性を、より最低限のケイパビリティのセットに置き換えることが推奨されています。多数のパッケージがケイパビリティを利用しており、例えば CAP_NET_RAWfping バイナリで使われています。これによって (setuid と同じように) 通常ユーザーで fping を実行することができ、それと同時に、fping に脆弱性があった場合のセキュリティ上の影響を緩和することができます。

実装

Linux ではケイパビリティは拡張属性 (xattr(7)) の security 名前空間を使って実装されています。拡張属性は Ext2、Ext3、Ext4、Btrfs、JFS、XFS、そして Reiserfs など全ての主要な Linux ファイルシステムでサポートされています。以下の例では getcap を使って fping のケイパビリティを出力し、さらに getfattr を使ってエンコードされた同じデータを出力しています:

$ getcap /usr/bin/fping
/usr/bin/fping cap_net_raw=ep
$ getfattr -d -m "^security\\." /usr/bin/fping
# file: usr/bin/fping
security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=

cp -a を使うと拡張属性は自動的にコピーされますが、プログラムによっては特殊なフラグが必要な場合もあります: rsync -X

Arch ではケイパビリティはパッケージのインストールスクリプトによって設定されます (例: fping.install)。

管理とメンテナンス

パッケージが過度に強力なケイパビリティを持っている場合はバグと考えられます。なので、ここに記載するのではなくバグとして報告してください。Arch は MAC/RBAC システムをサポートしていないため、root アクセスと本質的に等価なケイパビリティ (CAP_SYS_ADMIN) や root アクセスを容易にするケイパビリティ (CAP_DAC_OVERRIDE) はバグではありません。

警告: 特権昇格が可能になるケイパビリティは多数あります。詳しい例や説明は Brad Spengler による False Boundaries and Arbitrary Code Execution を参照してください。

ケイパビリティを利用できる他のプログラム

以下のパッケージには setuid 属性が設定されたファイルがありませんが、実行するには root 権限を必要とします。ケイパビリティを有効にすることで、権限昇格を行わなくても通常ユーザーでプログラムを使うことが可能になります。

ケイパビリティの末尾の +ep は "実効許可 (effective permitted)" を意味します。詳細は capabilities(7) § File capabilities で見られます。

beep

# setcap cap_dac_override,cap_sys_tty_config+ep /usr/bin/beep

chvt

# setcap cap_dac_read_search,cap_sys_tty_config+ep /usr/bin/chvt

iftop

# setcap cap_net_raw+ep /usr/bin/iftop

mii-tool

# setcap cap_net_admin+ep /usr/bin/mii-tool

mtr

# setcap cap_net_raw+ep /usr/bin/mtr-packet

nethogs

# setcap cap_net_admin,cap_net_raw+ep /usr/bin/nethogs

wavemon

# setcap cap_net_admin+ep /usr/bin/wavemon

便利なコマンド

setuid-root ファイルを検索:

$ find /usr/bin /usr/lib -perm /4000 -user root

setgid-root ファイルを検索:

$ find /usr/bin /usr/lib -perm /2000 -group root

ケイパビリティを一時的に付与してプログラムを実行する

capsh(1) を使うと、バイナリの拡張属性を変更せずに、特定のケイパビリティを持たせてプログラムを実行することができます。 以下の例では、CAP_SYS_PTRACE ケイパビリティを使って、GDB を使ってプロセスにアタッチする方法を示しています:

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_sys_ptrace+eip" --keep=1 --user="$USER" --addamb="cap_sys_ptrace" --shell=/usr/bin/gdb -- -p <pid>

netcat を使って低いポートにバインドする例:

$ sudo -E capsh --caps="cap_setpcap,cap_setuid,cap_setgid+ep cap_net_bind_service+eip" --keep=1 --user="$USER" --addamb="cap_net_bind_service" --shell=/usr/bin/nc -- -lvtn 123
Listening on 0.0.0.0 123

参照

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