ケイパビリティ
ケイパビリティ (POSIX 1003.1e, capabilities(7)) はスーパーユーザー権限の細かい制御を提供することで、root ユーザーの使用を減らすことができます。ソフトウェアの開発者はシステムバイナリの強力な setuid 属性を最小セットのケイパビリティで置き換えることが推奨されています。多数のパッケージがケイパビリティを利用しており、例えば CAP_NET_RAW は iputils に含まれている ping
バイナリで使われています。これによって (setuid と同じように) 通常ユーザーで ping
を実行することができ、同時に、ping
の脆弱性によるセキュリティ上の影響を緩和することが可能となっています。
目次
要件
setcap ユーティリティを使って、拡張属性であるファイルケイパビリティを設定するには libcap をインストールする必要があります。
実装
Linux ではケイパビリティは security 名前空間の拡張属性 (man 7 xattr
) を使って実装されています。拡張属性は Ext2, Ext3, Ext4, Btrfs, JFS, XFS, Reiserfs など全ての主要な Linux ファイルシステムでサポートされています。以下の例では getcap
を使って ping のケイパビリティを出力してから、getfattr
を使ってエンコードされた同じデータを出力しています:
$ getcap /bin/ping /bin/ping = cap_net_raw+ep $ getfattr -d -m "^security\\." /bin/ping # file: bin/ping security.capability=0sAQAAAgAgAAAAAAAAAAAAAAAAAAA=
cp -a
を使うと拡張属性は自動的にコピーされますが、プログラムによっては特殊なフラグが必要な場合もあります: rsync -X
。
ケイパビリティは Arch のパッケージのインストールスクリプトによって設定されます (例: iputils.install
)。
管理とメンテナンス
パッケージのケイパビリティが過度に権限を与えている場合はバグと考えられます。ここに記載するのではなくバグとして報告してください。root アクセスと同等 (CAP_SYS_ADMIN) または root アクセスの許可と同等 (CAP_DAC_OVERRIDE) なケイパビリティはバグではありません。Arch は MAC/RBAC システムをサポートしていないためです。
ケイパビリティを利用できる他のプログラム
以下のパッケージには setuid 属性が設定されたファイルがありませんが、実行するには root 権限を必要とします。ケイパビリティを有効にすることで、権限昇格を行わなくても通常ユーザーでプログラムを使うことが可能になります。
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
便利なコマンド
setuid-root ファイルを検索:
$ find /usr/bin /usr/lib -perm /4000 -user root
setgid-root ファイルを検索:
$ find /usr/bin /usr/lib -perm /2000 -group root
参照
- Man ページ: capabilities(7) setcap(8) getcap(8)
- DeveloperWiki:Security#Replacing setuid with capabilities
- Grsecurity Appendix: Capability Names and Descriptions
- The Linux Kernel Archives: SECure COMPuting with filters