SELinuxのexampleはexampleではない [Linux]
最近SELinuxを調査しているのだが、どうにも腑に落ちないことが多い。
例えばExampleがdocフォルダの中にあり、しかもろくに説明がない。
しかしMakefile.exampleをMakefileに変更してみると簡単にビルドが通る。
exampleはmyapp用のルールなので、試しにmyappを/usr/local/binに突っ込んで
example.fc修正して、restoreconしてsetenforce 1して実行してみると
見事に「許可がありません」と出る。
そもそもexampleが/usr/sbin/myappってなんでそんなところをターゲットにしているのか
じゃあ、他のアプリはどうなってるんだとソースを眺めてみる。
一番宣言が少なそうなwm.teを見てみると、実行型しか定義していない。
これでいいんだろうか。
2番目に小さいuserhelper.teを見てみると、なんかサポート型みたいになっている。
別の所で使っているのだろうか。
3番目に小さいada.teを見てみるとこれは割とまともだった。
型を定義して、実行型とドメインがある。その二つを結びつけるのにapplication_domainを呼び出し、さらにそのドメインとロールを結びつけている。
type ada_t;
type ada_exec_t;
application_domain(ada_t, ada_exec_t)
role system_r types ada_t;
その後、ドメインにアクセス権を付与している。
allow ada_t self:process { execstack execmem };
userdom_use_user_terminals(myapp_t)
optional_policy(`
unconfined_domain(ada_t)
')
1個目はよくわからない。自身に実行メモリを許す?
2個目はターミナルに出力するのに便利なマクロだろう。多分。
注意書きを読んでみたら、Terminalでインタラクティブな受け答えをするならいれろとある。しかし、これはセキュリティホールにもなるのでそういうのが必要ないならいれるなとあった。
3番目はドメイン自体をunconfined_tと同じようなゆるい一般ユーザレベルのアクセス権を与えるものだと思う。
と、思ったらまったく逆で、完全に信頼のおけるドメインだけに付与しろとある。
とりあえずハローワールドを/usr/local/bin/におき、exampleをadaの上の部分だけにして、ロールは自分自身がstaff_rなのでstaff_rに付与させた。この状態でmake reload して、setenforce 1してmyappを実行する。
やっと動いた。多分ドメイン遷移してちゃんと動くアプリはこういうものなんだろう。しかしサンプルのひどさはどうにかならないものだろうか。
あとSELinuxはC言語でいえばマクロだけでプログラムやるようなもので、マクロがマクロを読んでいて、欲しいマクロがどこにあるのかわからないし、そのマクロで本当にいいのかもわからない。
ベーシックな関数のリストとかそういうのが見当たらない。探し方がわるいだけだろうか。
make install-docsやってみたら /usr/share/doc/refpolicy-xxx/htmlにHTMLが大量に作成された。が、今はLinuxとWindowsのやり取りできるプロトコルがSSHのみなので途方に暮れる。
例えばExampleがdocフォルダの中にあり、しかもろくに説明がない。
しかしMakefile.exampleをMakefileに変更してみると簡単にビルドが通る。
exampleはmyapp用のルールなので、試しにmyappを/usr/local/binに突っ込んで
example.fc修正して、restoreconしてsetenforce 1して実行してみると
見事に「許可がありません」と出る。
そもそもexampleが/usr/sbin/myappってなんでそんなところをターゲットにしているのか
じゃあ、他のアプリはどうなってるんだとソースを眺めてみる。
一番宣言が少なそうなwm.teを見てみると、実行型しか定義していない。
これでいいんだろうか。
2番目に小さいuserhelper.teを見てみると、なんかサポート型みたいになっている。
別の所で使っているのだろうか。
3番目に小さいada.teを見てみるとこれは割とまともだった。
型を定義して、実行型とドメインがある。その二つを結びつけるのにapplication_domainを呼び出し、さらにそのドメインとロールを結びつけている。
type ada_t;
type ada_exec_t;
application_domain(ada_t, ada_exec_t)
role system_r types ada_t;
その後、ドメインにアクセス権を付与している。
allow ada_t self:process { execstack execmem };
userdom_use_user_terminals(myapp_t)
optional_policy(`
unconfined_domain(ada_t)
')
1個目はよくわからない。自身に実行メモリを許す?
2個目はターミナルに出力するのに便利なマクロだろう。多分。
注意書きを読んでみたら、Terminalでインタラクティブな受け答えをするならいれろとある。しかし、これはセキュリティホールにもなるのでそういうのが必要ないならいれるなとあった。
3番目はドメイン自体をunconfined_tと同じようなゆるい一般ユーザレベルのアクセス権を与えるものだと思う。
と、思ったらまったく逆で、完全に信頼のおけるドメインだけに付与しろとある。
とりあえずハローワールドを/usr/local/bin/におき、exampleをadaの上の部分だけにして、ロールは自分自身がstaff_rなのでstaff_rに付与させた。この状態でmake reload して、setenforce 1してmyappを実行する。
やっと動いた。多分ドメイン遷移してちゃんと動くアプリはこういうものなんだろう。しかしサンプルのひどさはどうにかならないものだろうか。
あとSELinuxはC言語でいえばマクロだけでプログラムやるようなもので、マクロがマクロを読んでいて、欲しいマクロがどこにあるのかわからないし、そのマクロで本当にいいのかもわからない。
ベーシックな関数のリストとかそういうのが見当たらない。探し方がわるいだけだろうか。
make install-docsやってみたら /usr/share/doc/refpolicy-xxx/htmlにHTMLが大量に作成された。が、今はLinuxとWindowsのやり取りできるプロトコルがSSHのみなので途方に暮れる。
コメント 0