capability で権限を与える
rawsocket を使ったアプリを作成した際に、動作に sudo
を使っていた。
ナンセンスなので capability
を使う。
rawsocket の capability
sudo setcap cap_net_raw=ep ./hoge
p : permitted
- スレッドの継承可能ケーパビリティに関わらず、そのスレッドに自動的に 認められるケーパビリティ
e : effective
- このビットがセットされていると、 execve(2) 実行中に、そのスレッドの新しい許可ケーパビリティが全て 実効ケーパビリティ集合においてもセットされる。 このビットがセットされていない場合、 execve(2) 後には新しい許可ケーパビリティのどれも新しい実効ケーパビリティ集合 にセットされない。
i : inheritable
- このセットと、スレッドの継承可能ケーパビリティセットとの 論理積 (AND) がとられ、 execve(2) の後にそのスレッドの許可ケーパビリティセットで有効となる 継承可能ケーパビリティが決定される
exec
で呼んだ子プロセスに capability
を継承させるのには ambient capabilities
を使う。
inheritable
で継承されるには条件があるっぽい、が良く調べていない。
setcap
で制御しているのはプロセスでなく、スレッド単位で渡しているので、子スレッドに権限を渡したい場合に inheritable
をセットする。
getcap
で調べる
正しく権限が与えられたか確認する。
$ getcap ./hoge hoge = cap_net_raw+ep
capability
を削除する
setcap -r ./hoge