LIDS新バージョンについて

LIDS新バージョンについて
面@LIDS-JP
LIDS新バージョンについて
●
●
●
新バージョン開発までの経緯
今後の機能拡張予定
まとめ
新バージョン開発までの経緯
LIDSと開発チーム
●
●
●
●
LIDS覚えていますか?
1999年に公開(SELinuxより古い!!)
2.6カーネルにも対応
LIDS開発チーム
–
–
–
–
Xie Huagang(LIDS作成者/メイン開発者)
Yusuf Wilajati Purna(2.4カーネル版開発者)
Sander Klein(ドキュメント/ML/その他色々)
Kazuki Omo(ドキュメント/Fedora Kernel Package)
LIDSを導入すると
通常のLinuxの権限がチェックされた後に、
もう一度LIDSでの権限がチェックされる
プログラム
drwxr-xr-x
READONLY
drwxr-x---
WRITE
READONLY
drwxr-x--dr-xr-x---
Linux rwxの判定
DENY
LIDS ACLの判定
例えば
/var
READONLY
/root
WRITE
.bashrc
READONLY
/etc
DENY
LIDS ACLの判定
ACLの作り方
lidsconfコマンドで作成
●
ファイルに対するデフォルトACL
lidsconf -A -o /var -j READONLY
lidsconf -A -o /root -j WRITE
lidsconf -A -o /root/.bashrc -j READONLY
lidsconf -A -o /etc -j DENY
例えば
/sbin/hogehoge
/var
READONLY
読みたい!!
/root
WRITE
.bashrc
READONLY
/etc
DENY
LIDS ACLの判定
ACLの作り方
lidsconfコマンドで作成
●
プログラムを指定したACL
lidsconf -A -s /sbin/hogehoge -o /etc -j READONLY
ケーパビリティ
port80番を使う
Networkを設定する
モジュールのロード
RAWソケット
特権
httpd
ケーパビリティ
CAP_NET_BIND_SERVICE: port80番を使う
httpd
CAP_NET_ADMIN: Networkを設定する
いらない
CAP_SYS_MODULE: モジュールのロード
CAP_NET_RAW: RAWソケット
最小特権をケーパビリティ単位で実現している
ACLの作り方
lidsconfコマンドで作成
●
ケーパビリティ
ケーパビリティバウンディングセットを作って、
その後、各プロセスに必要なケーパビリティを
加えていく
lidsconf -A -s /usr/sbin/httpd -o CAP_NET_BIND_SERVICE 80,443 -j GRANT
ACLの作り方
ACLはBOOT/POSTBOOT/SHUTDOWNの3ステートに
分けて記載が可能
起動時には/etc/mtabに書き込み出来る、など
柔軟なACLを書ける
●
ACL_DISCOVERYモード
SELinuxのpermissiveみたいなもの。
このモードのログを参考にACLを自動生成
するPerlスクリプトもある
●
使われている所
どこで使われているのか?
●
フランスで使われている所があるらしい
lids-MLから引用( 2005-06-09 05:00:09)
「I am working for a small company in France and we provide our customer with some
firewall, MX, proxy, web servers on a Linux Distribution we maintain and with LIDS
included in it (we do not activate LIDS on every server we configure).
I've started to use LIDS in 2001 (on 2.2.X kernels).
By now, we do have more than 200 servers running LIDS without any problem.
」
●
組み込みでも使われている
(Sophia Systems(http://www.sophia.com/) Sandgate W-SIM Phone)
●
ディストロもある(Cytrun Linux)
–
based on the Slackware, possesss Kernel 2.6.13 + LIDS, Snort Inline(A modified
version of Snort that accepts packets from iptables). Servers: WEB, EMAIL, SQL,
PROXY, SSH, DHCP and DNS, Interface of Remote Administration based on Webmin.
LIDS新バージョン公開までの経緯
●
そもそも2006年5月まで遡ります
●
ちょうど「LSM不要論」で揺れていた時だった
●
昔からLSM対応してたので「メインラインに入れよう」活動していた
●
4/22/2006のメールを境にXie氏失踪!!
最後のメール
「Agree, I think we should submit it rather than wait for the new
development. The submitting procedure will be tought, but I
think we should be able to learn something from it, good or
bad. so let's do it. I will prepare a list of patch and put it
into a series and send it to the list for review. 」
そうこうしているうちに
●
そうこうしているうちに色々ありました
–
–
–
–
AppArmorがLSM-MLに突入 -> 過激なバトルに
日本ではTOMOYOがブレイク -> LIDS忘れられる orz
カーネルバージョンどんどん上がる
SELinuxもどんどん機能が上がる
LIDSは死んだと言う人も・・・
「TOMOYOでこれだけ簡単に出来るし、ガチガチのセキュリティは
SELinuxがあるから、LIDSの存在意義が無くなって来てる」(by 某氏)
LIDS-JPとしては
●
とりあえず、地道に対処はして来ましたよ
–
–
–
カーネルパッケージはリアルタイムであげて来たし
講演/執筆で盛り上げようとはしたし
本家ML/Forumでも色々書き込んだし
でも、新バージョンが出なくちゃねぇ
orz
更に悶々としてるときに
●
●
●
●
●
LIDS ForumがSPAMの温床になる
LIDS MLもSPAMの温床になる
LIDSで殆んどお呼びが掛からなくなる
TOMOYO/AppArmorますます優位
LIDS-JPも空中分解
モチベーションもなくなるよねぇ
-> Sander Kleinと連絡を取り合う
開発者スカウトへ
●
Sander :「日本で開発者をスカウトしてくれ!!」( ゚д゚)σ
●
OMO: (>Д<)ゝ”ラジャー!!
●
OMO: 「開発者募集!!」 щ(゚д゚щ)カモーン
●
OMO: 「皆出来ないって言ってるよぉー」。・゚・(ノД`)・゚・。
しゃぁない。オレがやるか
( ゚д゚)y−~~
でもオレ、「Hellow World!」レベルじゃん (|| ゚Д゚)ガーン!!
そうこうしていると
某IBMの宗藤さんに
「2.6.18->2.6.19でLSMずいぶん変わったけど
LIDSホントに対応してるの?」と言われた
●
しょうがない、じゃあとりあえずLSM周りから
調べてみようか
( ゚д゚)、ペッ
systemcall <-> security関数対応表
●
systemcallとsecurity_XXX関数の対応を追ってみた
●
lxr(Webブラウザでソースを追っかけていける)を駆使
●
某仕事で9時間ソウル空港でヒマしてた
–
ソウル空港の喫茶店で(観光もせず)7時間ぐらい
バッテリー取り換えながらソース追ってましたよ
その甲斐あって、一ヵ月後(本業があったからね)に
対応表完成(2.6.20カーネル)
-> LIDS-JPサイトにアップ。Excelシート
(見せるよ)
さあ、それじゃいよいよ
●
●
じゃあ、いよいよ2.6.20対応版のLIDS開発だ
とりあえず、2.6.14のバージョンで少し修正
–
LIDS独自のケーパビリティが2.6.XX以降では競合
●
●
●
●
CAP_PROTECTED (29) -> CAP_AUDIT_WRITE
CAP_KILL_PROTECTED (30) -> CAP_AUDIT_CONTROL
まず、このCAPを何とかしなきゃ
思考ゲームをしながらソースを眺めると、ext_capの文字
LIDS_EXECとかと同様に、拡張ケーパビリティに
しちゃえば良いんじゃん!! (σ ゚Д゚)σゲッツ!!
で、2.6.14+LIDSソースを眺めて
●
●
ソースを眺めて、ext_capの使われ方を勉強
参考URL: Linux Kernel Hack Japan (LKH-jp)
–
●
最初にLIDS_EXECを設定するも動かない
–
–
●
●
大変お世話になりました m(__)m
LIDS_EXEC: 自分自身以外のプログラムのEXECは拒否
昔からあったが、今まで使った事無かった
良く見りゃ、LIDS_EXECの条件判断とかも
ちょっとおかしい -> 修正をいれる
LIDS_EXECが動いたのでいよいよCAPを移植
–
–
LIDS_CAP_PROTECTED
LIDS_CAP_KILL_PROTECTED
更に眺めて
●
その後思考錯誤でLIDS_CAP_PROTECTEDが動いた!!
●
その他、色々な人のパッチも一緒にしちゃえ
IBM 宗藤さんのパスワードパッチ
– Toshiba 矢野さんのshrinkパッチ
じゃあ、次は2.6.20に移植だ!!
–
●
–
–
–
など
File構造体、crypto関数など諸処がかなり変わってる
一個一個丹念に直していく(LKHJP様様)
全部修正は終った。。。じゃあ、動かしてみよう
カーネルパニック!
(ノ ゚Д゚)ノ ==== ┻━━┻
全然動かない
●
カーネルパニックで全然動かない
●
mixiで「初心者による開発」日記をライブ実況
●
某会合で会った際の宍道さんの発言に救われる
–
「いきなり上げるからハマる。少しずつ上げたら?」
–
●
じゃあ、2.6.18 -> 2.6.19 -> 2.6.20で上げていこう
●
2.6.18ではno problem、 2.6.19で一箇所ハマリ
●
2.6.20でもう一箇所ハマリ
–
ハマる箇所はわかったので、丹念に直していく
動いた!!
●
●
●
●
●
●
2.6.20で動いた!! (´Д⊂グスン
LIDS_CAP_PROTECTED/LIDS_EXECも動作
SHRINKも動作(一部修正に手間取る)
SMPの時にハマッていたけれど、直した
lidstoolsも修正(LIDS_CAP_PROTECTED対応)
さあ、公開だ!!
遂に公開
●
lids-2.2.3rc1-2.6.21として公開
公開直前で2.6.21が出ちゃったので対応しました
Sanderに連絡
–
●
–
XieにもCC:して、「開発したよ」と連絡
–
何故かXie 一年ぶりに復活!!
● 「生きてたんだぁ 。゚(゚´Д`゚)゚。」
● LIDS本家サイトのアップデートへ
今後の予定
さて今後の予定
●
今回の事でLIDSの開発が手なれて来たので、次の機能へ
●
lids-2.2.3(正式版)の機能予定
–
–
–
–
–
ネットワーク周り(NF_MARK+iptables/iproute2)
SOCKET_CREATEなどの制御
TPE/TDEの実装(ココが一番メンドクサイ)
ACL数の増加
● 1024がmaxってのはさすがにアレだろう
LFS部分も手を加えたい
● 設定が横から見えるのはちょっと問題
Trusted Path Executionとは
/bin/lsはREADONLYで保護 -> 実行可能
/tmpはWRITEになっているので、
# cp -p /bin/ls /tmp/ls
として、/tmp/lsを実行
-> TPEのエラーが出る。
Trusted Domain Enforcementとは
/etc/httpd: READONLY
/var/log/apache:
APPEND
CAP_NET_ADMIN
CAP_NET_RAW
CAP_NET_ADMIN
CAP_NET_RAW
剥奪
プロセス
保護されていない
(悪用できる)
データ
/etc/httpd: READONLY
/var/log/apache:
APPEND
例)
IPアドレスが列記されているファイルを指定されると、
そのファイルのIPアドレスにpingをうつCGIスクリプト
(CAP_NET_RAWが与えられている)
1. /root/hostsはREADONLYなので、pingが打てる
2. /var/tmp/hostsはWRITEなので、CAP_NET_RAWが剥奪される
現在の段階
●
lids-2.2.3rc2に向けて済んでいる所
–
–
ネットワーク周り(NF_MARK+iptables/iproute2)
LIDS_SOCKET_CREATEなどでのSOCKET制御
あとは、どの辺りでrc2として公開するか
拡張機能4
NFMARKとiptables/iproute2の連係
LIDS-1系列では、NFMARK機能をサポートしており、
特定のプロセスがソケットを生成した際にMARKフィールドに
MARKを付けることができる
-> iptables: mangleテーブルの「MARK」
iproute2: ip ruleの「fwmark」
と連係させて、トラフィックを制御できる
拡張機能4
外部(DMZ)に露出しているサーバを管理ネットワークからバックアップ/管理を行う際に、
万が一DMZに露出したサーバがクラックされたとしても、管理ネットワークを通して
その他のマシンに攻撃を展開していくことを防ぐ事が出来る
Internet
管理ネットワーク用端末を
経由しての被害の拡散を防止
DMZ
Server A
SSH
Server B
管理ネットワーク
rsyncはOK
今後の妄想
●
ラベルも実装してみたいな
ラベルとパス名の同居ってのはどうだろ?
– ラベル優先/パス名サブとかで
デフォルトALLOWなのがLIDSの売り(ACL少なくなるし)
●
●
でも、セキュリティ的にはどうかな
● カーネルスイッチでデフォルトALLOW/DENYを切替え
られるようにしてみよう
アクセス権をもっと細かく分けよう
●
●
–
–
DENY/READONLY/APPEND/WRITEだけってのはねぇ
CREATEとかEXECUTEとか、色々ある。。。
更に妄想は進む
●
メモリやあちこちの制御もしたいな
–
●
xattrに設定を持っていっても良い
–
●
昔のLIDSはやってたんだし、できるはず
昔のLIDSでは、一時期xattrで実装してたから可能
Stateもちょっといじってみたいな
プロセス単位でステートを変化できると面白い
● 起動時にだけ必要なACLは起動したら手放す
– まさに最小権限じゃん!!
●
まとめ
ということでまとめ
●
LIDS、開発も結構簡単です
–
–
–
–
–
開発初心者でも何とかなったぐらいだし
ソースのサイズも小さいし
誰も手を出さないからやりたい放題だし
一応(?)過去の知名度は利用できるし(黒ッ)
今出せば世界標準だし(日本とか本家云々じゃない)
なので、LIDSの開発者募集中です!!
併せて、意見(こんな機能実装してとか)も募集中!!
連絡先
●
●
●
●
http://www.selinux.gr.jp/LIDS-JP
日本SELinuxユーザ会ML
omok@honto.info
k-omo@sios.com