SystemdのCapabilityBoundingSet/AmbientCapabilitiesの挙動
SystemdのCapabilityを調べた時の雑多なメモです。
メモなので結論とかオチとかは全くないです。
更新履歴
2018-10-28 CapInh/CapPrm/CapEff/CapBnd/CapAmbについて調べた内容を追記。
概要
SystemdのserviceファイルにCapabilityBoundingSet/AmbientCapabilitiesをつけた時とそうでない時の
/proc/${pid}/status
の中身の違いを調べてみました。
対象のサービスは8080ポートで起動し、ユーザは一般ユーザで起動しています。
CapabilityBoundingSetとAmbientCapabilitiesの違いってなんだ?
っていうのが気になって調べてみました。
参考サイト
- Linux Capability - ケーパビリティについての整理 - ローファイ日記
- 明日使えない Linux の capabilities の話 - @nojima's blog
- capabilities(7) - Linux manual page
Serviceファイル
実際のサービスファイルは下記のような感じです。
[Unit] Description=Go Crud Application After=network.target After=local-fs.target [Install] WantedBy = multi-user.target [Service] ExecStart=/usr/lib/go-crud/crud -c=/usr/lib/go-crud/conf -s=/usr/lib/go-crud/static/ -p=8080 User=app
CapabilityBoundingSetありの場合は下記を追加します。
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilitiesありの場合は下記を追加します。
AmbientCapabilities=CAP_NET_BIND_SERVICE
実行結果
それぞれの/proc/${pid}/status
の中身です。
[Capabilityなし]
CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000001fffffffff CapAmb: 0000000000000000
[CapabilityBoundingSet]
CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000000000000400 CapAmb: 0000000000000000
[AmbientCapabilities]
CapInh: 0000000000000400 CapPrm: 0000000000000400 CapEff: 0000000000000400 CapBnd: 0000001fffffffff CapAmb: 0000000000000400
設定ごとにこの辺が変わるようです。
それぞれの設定値は以下のようです。 (ドキュメントを読んで書いてはいますが正確に把握できていないです。)
CapInh
このプロセスから新たにプロセスを作成する場合に継承されるセキュリティビットのようです。
CapPrm
Permittedなのでこのプロセスに許可されたセキュリティビットです。
CapEff
最終的に有効となったセキュリティビットのです。
対象のケーパビリティのビットが0の場合は権限なしとして扱われるようです。
CapBnd
CapInhとCapEffで設定されたセキュリティビットに対してマスクをかけるセキュリティビットのです。
起動ユーザのCapInh/CapPrmに設定されものからマスクされ、
CapEffにはマスクされた結果が反映されるようです。
CapAmb
特権を持たない一般ユーザに許可を与えるためのセキュリティビットです。
ここの設定値は連鎖してCapInh/CapPrmに設定されるようです。
おまけ
[Capabilityなし、rootユーザ起動]
CapInh: 0000000000000000 CapPrm: 0000001fffffffff CapEff: 0000001fffffffff CapBnd: 0000001fffffffff CapAmb: 0000000000000000
[CapabilityBoundingSet、rootユーザ起動]
audit.logの権限がないと言われてエラー
[AmbientCapabilities、rootユーザ起動]
CapInh: 0000000000000400 CapPrm: 0000001fffffffff CapEff: 0000001fffffffff CapBnd: 0000001fffffffff CapAmb: 0000000000000400