jumble

アクセスカウンタ

zoom RSS SELinuxと格闘 その1

<<   作成日時 : 2012/03/18 20:16   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

SELinuxと格闘 その1


しばらくLinuxでごたごたしたのだが、結局Fedora 16に関しては、SELinuxを無効にすれば全て解決した。
(正確に言うとpermissiveという、拒否はしないが情報は記録するというモードにしてある)
この記事この記事参照。
とはいうものの、やっぱりいつまでもSELinuxから逃げている訳にもいかない。
ということで、SELinuxに挑戦することにした。
とはいっても、何から始めればいいのかすらよく分からない。
とにかく情報が少ない。
見つかる情報の大半は、SELinuxを無効にする方法だ。
さらに、仕様が頻繁に変わっているように見える。
根幹の考え方はそうでもないかもしれないが、実装方法や操作のやり方が頻繁に変わっているようだ。
よって、せっかく見つけた情報もすでに通用しなかったりすることが多い。
でも、操作方法が分からなければ、実質何もできないじゃないか。
基本的な概念についてはこのサイトなどが参考になる。
他にも参考になりそうなサイトはあるにはある。
でも、具体的な操作が書いてあるサイトが少ないし、載っている情報が古かったりするのが悩みのタネだ。

さて、この記事の最後で、/var/log/messagesに出ている情報について触れているが、これが解決の糸口になる。
具体的には次のような出力だ。

SELinux is preventing /bin/bash from read access on the directory ini. For complete SELinux messages. run sealert -l fb561a87-1d44-4726-9431-bc681808edb0

上記のうち、"ini"というのは自分のカスタマイズで作成したディレクトリ。
これが絶対パスでないところが、分かりにくいところだ。
調べるうちに、こんなサイトを見つけた。
ふむふむ、この"fb561a87-1d44-4726-9431-bc681808edb0"が何らかの識別番号であり、それを指定してsealertコマンドを実行しろと。
ということで、次のように実行してみた。

$ sealert -l fb561a87-1d44-4726-9431-bc681808edb0

結果は次のようになった。

SELinux is preventing /bin/bash from read access on the ディレクトリ ini.

***** プラグイン catchall_labels (83.8 confidence) が提案しています ********************

もし、 bash が ini directory の read アクセスを持つことを許可したい
そして、ini のラベルを変更する必要があります
行ってください
# semanage fcontext -a -t FILE_TYPE 'ini'
この FILE_TYPE 以下のどれかです: pam_var_run_t, rpm_var_lib_t, xdm_var_lib_t, ...
...

次にこれを実行してください:
restorecon -v 'ini'


***** プラグイン catchall (17.1 confidence) が提案しています ***************************

もし、bash に、 ini directory の read アクセスがデフォルトで許可されるべきです。
そして、これをバグをして報告すべきです。
このアクセスを許可するために、ローカルポリシーモジュールを生成することができます。
行ってください
このアクセスを一時的に許可するには、以下を実行してください。:
# grep gdm /var/log/audit/audit.log | audit2allow -M mypol
# semodule -i mypol.pp

何だこの日本語は。
実はこのコマンドは次のように英語で実行した方が、はるかによく分かる。

$ LANG=C sealert -l fb561a87-1d44-4726-9431-bc681808edb0

まあ、それはいいとして。
でも、この情報だけだとほとんど何もできない。
上の情報からは、bashがiniディレクトリを読み込む権限がないと取れるが、そんな事はないのだ。
実際、"ps -eZ | grep bash"では次のように出力される。

unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1874 pts/0 00:00:00 bash
...

で、"ls -dZ /ext/ini"では次の出力。

drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /ext/ini

よく分からないが使えるはず。
試しに/ext/iniに置いたシェルスクリプトをbashで実行してみたが何の問題もない。
恐らく、起動時にbashが実行される場合、上記で出力されたものとは異なるドメインで動いているのだろう。
それが分からないと話にならない。
上記sealertコマンドの出力の最初の方には、iniディレクトリのタイプを変更しろと書いているようだ。
その候補として山のような数のタイプが続いている。
そのうちの一体どれに変えればいいんだ?
で、テキストログインでは起こらないことを考えると、xdmの関係なのかなという気がした。
実はこの推論はずばり当たっていることが後で判明する。
でも確証が得られないし、xdmが付くものは複数ある。
で、参考にしたサイトをよく見ると、"setroubleshoot"なるものをインストールしている。
さっそくyumでインストールしてみた。
すると、sealertコマンドで出力される情報が増える。
その中に、まさに自分が知りたい情報があった。
以下、sealertを英語で実行した結果の抜粋。
上記の出力に追加された部分だ。

・・・(上記と同じ内容)

Additional Information:
Source Context system_u:system_r:xdm_t:s0-s0:c0.c1023
Target Context unconfined_u:object_r:default_t:s0
Target Objects ini [ dir ]
Source gdm
Source Path /bin/bash
Port <Unknown>
Host localhost.localdomain
Source RPM Packages bash-4.2.10-4.fc16
Target RPM Packages
Policy RPM selinux-policy-3.10.0-46.fc16
Selinux Enabled True
Policy Type targeted
Enforcing Mode Permissive
Host Name localhost.localdomain
Platform Linux localhost.localdomain 3.1.0-7.fc16.x86_64 #1
SMP Tue Nov 1 21:10:48 UTC 2011 x86_64 x86_64
Alert Count 1
First Seen Wed Mar 14 19:59:24 2012
Last Seen Wed Mar 14 19:59:24 2012
Local ID fb561a87-1d44-4726-9431-bc681808edb0

Raw Audit Messages
type=AVC msg=audit(1331722764.602:37): avc: denied { read } for pid=890 comm="gdm" name="ini" ...


type=SYSCALL msg=audit(1331722764.602:37): arch=x86_64 syscall=openat success=yes ...

Hash: gdm,xdm_t,default_t,dir,read

audit2allow

#============= xdm_t ==============
allow xdm_t default_t:dir read;

audit2allow -R

#============= xdm_t ==============
allow xdm_t default_t:dir read;

実はsetroubleshootをインストールしなくても、GUI上でSELinuxトラブルシューターを起動すれば同じ情報を得ることができる。
でも、それが判明したのは少し後のことだ。
GUI上でしか使えないというのは不安なものがあるし、インストールして損はないと思う。

さて、上記をみると何となく様子が理解できる。
gdmというプログラムがbashを呼び出し、それがiniディレクトリを読みにいって拒否された。
bashが動作していたプロセスのドメインはxdm_tということだろう。
なるほど。
で、どうやって解決するか?
おおまかに、方法は次の2つがありそうだ。

(1) iniディレクトリのタイプを変更して、xdm_tドメインから使用できるようにする。
(2) xdm_tドメインがiniを使用できるようにする。

(1)の方が簡単な上にセキュリティが緩くならずに済みそうなので、まず(1)の方法でやってみた。

/var/log/messagesには、iniだけでなくその配下のファイルに対しても出力されていた。
よって、ディレクトリとその配下のファイルに対してタイプを変更する必要がある。
ということで、次のように実行した。

# semanage fcontext -a -t xdm_t '/ext/ini(/.*)?'
# restorecon -R /ext/ini

なお、ファイルに付加するタイプは追加することはできず、あくまで変更である。
要するに複数のタイプは持てないようだ。
そんな基本的なこともやってみるまで知らなかった。
一応、"ls -dZ /ext/ini"や"ls -Z /ext/ini"で確認すると、タイプがxdm_tに変更されている。
よし。
で、/var/log/messagesを削除して、再起動して、確認してみた。
上記のエラーメッセージは出てなさそうだ。
ということで、改めてSELinuxを有効(enforcing)にして再起動してみる。
おお、フリーズしないではないか!
めでたし、めでたし。

と言いたい所だが、もちろんそう簡単にはいかないのである。
すぐ後に、この設定ではうまくいかないことが判明する。

次に続く

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
venuspoor.com
SELinux_i, __P jumble/EFu_u_O ...続きを見る
venuspoor.com
2017/01/11 19:53

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
SELinuxと格闘 その1 jumble/BIGLOBEウェブリブログ
文字サイズ:       閉じる