suima8のメモ

メモです

memo

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