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 [email protected] [email protected]
© Copyright 2024 Paperzz