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