Capability

Userのnamespaceは後発なので権限を制限する仕組みの中核にいるのはCapabilityです。Capabilityはrootが持っている権限をバラして、rootの持つすべての権限を付与せず必要な権限のみを付与できるようにしたものです。37種類あります。

Capabilityはファイルに対して指定する方法と、スレッドに対して指定する方法があります。

ファイルに指定する方法は従来からあるSet-User-IDやSet-Group-IDに似たイメージで実行ファイルに権限を付与します。Set-User-IDが付与されている実行ファイルの例はpasswdで、この実行ファイルはrootユーザーが実行しなくてもパスワードの変更の際に必要なファイルアクセスができます。

# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /bin/passwd

ファイルにCapabilityが指定されている例はpingでCAP_NET_RAWが付与されています。

# getcap /bin/ping
/bin/ping = cap_net_raw+ep

一般ユーザーが実行しても/etc/shadowをみれるcatを作ってみましょう。DAC(任意アクセス制御)をバイパスしてアクセスするためのCapabilityはCAP_DAC_READ_SEARCHです。

$ sudo mkdir /ubuntu
$ sudo cp /bin/cat /ubuntu/cat 
$ /ubuntu/cat /etc/shadow # /ubuntu/cat: /etc/shadow: Permission denied
$ sudo setcap cap_dac_read_search=+ep /ubuntu/cat
$ /ubuntu/cat /etc/shadow # こっちは成功する

前述したようにファイル Capabilityではそのファイルを実行するユーザーが誰であっても権限を与えた状態で利用することができてしまいますこの状況を回避するためにファイルではなくプロセスにCapabilityを付与できます。systemdにはそのための仕組みがあるので、これを使って確認していきましょう。

作業場所とログの書き出し先を作り、Capabilityの動きを確認するのに使うcatコマンドをコピーします。

$ sudo rm /ubuntu/cat
$ sudo cp /bin/cat /ubuntu/cat
$ sudo chmod a+w /ubuntu/cat.log

systemdから実行するスクリプト/ubuntu/cat.shを用意します。

#!/bin/bash
/ubuntu/cat /etc/shadow > /ubuntu/cat.log

まずはCapabilityの設定をしないで動かすとどうなるのか確認してみます。

/etc/systemd/system/cat.service


[Unit]
Description=cat shadow

[Service] ExecStart=/ubuntu/cat.sh User=ubuntu Group=ubuntu

[Install] WantedBy=multi-user.target

権限がないので、Permission deniedがsyslogに出力されました。


Nov 28 03:46:32 i-17100000215267 systemd[1]: Started cat shadow.
Nov 28 03:46:32 i-17100000215267 cat.sh[1530]: /ubuntu/cat: /etc/shadow: Permission denied

今度は、AmbientCapabilitiesにCAP_DAC_READ_SEARCHを追加してみます。

/etc/systemd/system/cat.service


[Unit]
Description=cat shadow

[Service] ExecStart=/ubuntu/cat.sh User=ubuntu Group=ubuntu AmbientCapabilities=CAP_DAC_READ_SEARCH

[Install] WantedBy=multi-user.target

エラーにならずに成功しました。/ubuntu/cat.logの中身が/etc/shadowと同じものになっていることも確認できます。


Nov 28 03:45:02 i-17100000215267 systemd[1]: Started cat shadow.
Nov 28 03:45:02 i-17100000215267 systemd[1]: cat.service: Succeeded.

著者プロフィール


野村総合研究所(NRI) 湯川勇太(ゆかわ ゆうた)


前職で大手家電量販店のECモールの立ち上げとECサイトの刷新プロジェクトを経験。NRI入社後は製造業の商品検索システムを担当した。現在は大手物流企業向けの基幹システムの方式設計や技術検証、トラブル対応を行っている。