第7回静岡ITPro勉強会インフラ部にてSELinux界のスーパースターSELinuxで著名な石川さん(@ishikawa84g)をお呼びして 「SELinuxハンズオン」を行いました。部長も興奮しています。 開催日の3/31はかなりの暴風雨に見まわれ、 予定していた部長のお迎えがなくなり、私が迎えに行くことに。 SELinuxは運用まで行くとまぁ色々あるんだろうなぁと思い 泣きながらDisabledにしていました。※石川さんごめんなさい。 ハンズオンがあったお陰で、すっかりSELinuxが怖くなくなりました。 というよりSELinuxを悪者だと誤解していたようです。 資料と重複しますが、おさらいも兼ねて、ブログに残しておきます。 Fedora16を準備して行ったのですが 手元のCentOSでは結構コマンドが違いましたのでご注意を。キャーイシカワサーン #shizuinfra
— kazuto_andoさん (@ando_ando_ando) 3月 31, 2012SELinuxの歴史Linux Kernel2.6.x から標準オプションになっていて 実際このころから「ヒャホー2.6インスコしたぜぇー」ってやって Apache起動したら「ん?なんぞ?動かん」って感じになった記憶がある。 海外の映画とかドラマで地味に出てくる「NSA」が開発して、 最近ではSEAndroidというものも現れてきている。これもNSAらしい。 政府、金融機関等の調達基準をLinuxで満たす為に生まれたらしい。リファレンスモニタシステムコールが発生して、システムリソースに到達するまでに セキュリティポリシーを読み込んでそれを判定をしている仕組み。 わかりやすいので資料から拝借。 こんな感じ。 私が想像していたよりKernelに近い部分にいるんだなぁ~と感じた。DACとMACDACはUNIX系OSで用いられる制御方式。 読み書き実行をオーナー、グループ、その他で制御する方式ですね。 これはご存知のように結局rootだと何でもできるわけです。 それに対してMACはセキュリティポリシーの適用してブロックする方式で、 rootだろうがポリシーに合っているかだけで判断する。 SELinuxはDACでアクセス権限を評価したのち、MACのアクセス権限を評価しています。 SELinuxを適用している場合、 rootを乗っ取られたとしてもポリシー以外の事はできなくなる。 これが一番大きいですね。 実際CVEにも載っているようなコードを 実行さえできればかなりあっさりしたコードで乗っ取りが可能なわけなので システムを乗っ取りに対して最小限の被害に抑える事ができるようになる。SELinuxの状態SELinuxの状態は
- Enforcing
- Permissive
- Disabled
- $ getenforce
- $ sestatus
- SELinux status: enabled
- SELinuxfs mount: /sys/fs/selinux
- Current mode: permissive
- Mode from config file: enforcing
- Policy version: 26
- Policy from config file: targeted
- $ setenforce 0 → Permissiveに設定
- $ setenforce 1 → Enforcingに設定
コマンドにZオプション!
Zをつければ怖くない。 #shizuinfra
— kazuto_andoさん (@ando_ando_ando) 3月 31, 2012
これは全く知らなかった!
様々なコマンドにZオプションをつけるとそれぞれのリソースが
どのようなタイプかがわかります。
- $ ls -Z
- -rw-r--r--. root root system_u:object_r:selinux_config_t:s0 config
- ・・・
- $ ps -Z
- system_u:system_r:httpd_t:s0 17718 ? 00:00:00 httpd
- ・・・
SELinuxが悪さをした(守ってくれた)場合
これが一番勉強になったというか、なるほどとそういう事かと思った。
「アプリが動かん!SELinuxをDisabled。動いたー」
という悪魔の囁きを無視し、行儀よくする方法を教わった。
ハンズオンではApacheを利用してファイルへのアクセスを試しました。
アプリが動かない!となって「SELinuxかな?」と感じたら
まずsetenforceコマンドで「Permissive」状態に切り替えます。でアプリを動かしてみる。
で、アプリが動いたとなると
「SELinuxが止めてくれている。石川さんありがとう(´ω`)」
と東京の方向を向いてお辞儀をする。
でログを見ます。
ログは「/var/log/audit/audit.log」に出力されます。
※auditが停止中は「/var/log/message」に出力されるそうです。
これがEnforcingの状態では実際にアクセスをストップさせ、
Permissiveモードの時はログだけを吐き出してくれる。
アクセスが停止される原因は「denied」と記述してあるので
ログをgrepすると
- $ /var/log/audit/audit.log | grep denied
- type=AVC msg=audit(1333866553.014:218): avc:
- denied { open } for pid=17721 comm="httpd" name="1.html" dev="dm-1"
- ino=2621442 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file
- $ restorecon -FRv パス
感想
SELinuxが原因かな?と感じたら
- Permissiveで原因の切り分け
- ログの確認
- ポリシーに合わせる、再利用する、作成する(※)
- 動作させる
0 件のコメント:
コメントを投稿