タイプ継承を可能にする SELinux ポリシーコンパイラの拡張 平成 17 年 6 月 2 日 NECLinux 推進センター 海外浩平
Today s s Agenda SELinux の概要と考え方 セキュリティポリシーの記述方法と問題点 タイプ継承に基づくセキュリティポリシー SELinux ポリシーコンパイラの拡張 タイプ継承を利用したポリシーの記述 まとめ 2
はじめに ~SELinux の概要 ~ Linux2.6.x 用のセキュリティ強化モジュール万が一 侵入を許しても 何もさせない アプローチ FW IDS のような水際作戦とは異なる SELinux が有効なケース アプリ脆弱性を突いた侵入 不正な権限昇格 ウィルス ワーム トロイの木馬 目的外の機密情報の参照 アプリケーションには不必要な権限が多すぎる セキュリティホール経由で これらの権限を悪用される BOF からシェルを実行されて ファイルを改ざんされたり SELinux は攻撃者の手足を縛ってしまう 3
SELinux における考え方 アプリケーションを必要最小権限で動作させるアプリケーションには不必要な権限が盛りだくさん粒度の細かいアクセス制御 ( 約 200 種類!) 仮に脆弱性が存在しても 想定の範囲内 の行動しか許可されない UNIX モデルでは root 権限を取られたら無条件降伏 セキュリティポリシーによる一括設定アプリケーションが やっていいこと を予め列挙しておく全てのユーザ プロセスはセキュリティポリシーに従う 誰が 誰に 何をできる かを列挙したもの セキュリティポリシーの記述に反する事は一切許さない 正しい セキュリティポリシーが SELinux の生命線 4
セキュリティポリシーのいろは 基本は 誰が 誰に 何をする 誰が?: ほとんどがプロセス 誰に?: ファイル ソケット 共有メモリ 何をする : ディレクトリに対するエントリの追加 親プロセスへのシグナルの送信 TCP ソケットに対するパケットの送信 共有メモリの書き込み可能マップ PostgreSQL データベールファイル を定義する TYPEpostgresql_db_t,file_type,sysadmfile; Apache が Web コンテンツを ファイルとして読み込む ALLOWhtpd_thtpd_sys_content_t:fileread; 俳優 は脚本通りに演技しなければならない 脚本 俳優 脚本 SELinux のセキュリティポリシーはこのような記述 ( 脚本 ) の集合 タイプ アクセス許可 5
誰が 誰に 何をする 構文 登場人物の宣言 TYPE 構文 TYPE< タイプ名 >[ALIAS< 別名 >][,< 属性名 >,.]; [ 使用例使用例 ] TYPEhtpd_sys_content_t,file_type; TYPEhtpd_t,domain; [ 意味 ]] ]] htpd_sys_content_t の名前のタイプを定義し file_type 属性を付与する htpd_t という名前のタイプを定義し domain 属性を付与する 脚本の執筆 ALLOW 構文 ALLOW< タイプ名 (Subject)>< タイプ名 (Object)> :< クラス名 >< パーミッション >; [ 使用例使用例 ] ALLOWhtpd_thtpd_sys_content_t:file{getatrreadlockioctl}; [ 意味 ] Apache(htpd_t) が が Web コンテンツ (htpd_sys_content_t) の の ファイルに対して getatr/read/ioctl/lock の操作を行うことを許可 6
セキュリティポリシー記述の課題 複数のアプリケーションに関連する設定が複雑 FTP/Samba/Apache から共通にアクセスされるファイルに対するアクセス権の設定をどのように行うか? アプリケーションの組み合わせが増えるほど煩雑 冗長になる PHP/CGI スクリプトが PostgreSQL へ接続するための設定は どこの設定ファイルに記述すればよいのか? ポリシーの相互依存関係が強くなりすぎる インターフェース 的 なものを明確に定義することが必要 細かすぎる パーミッションの粒度 直感的に把握可能なものに抽象化することが必要 セキュリティポリシーの記述に高いスキルを要求される 大量のポリシーを一貫性を持ったまま記述しなければならない アプリケーション間の依存関係を理解している必要がある 7
FTP/Samba/Apache の例 /var/www/html/* (httpd_sys_content_t) Execute Apache サーバ (httpd_t) /var/www/cgi-bin/* (httpd_sys_script_exec_t) Append /var/log/httpd/* (httpd_log_t) FTP サーバ (ftpd_t) /home/foo/* (user_home_t) /var/log/samba/* (var_log_t) Append /home/foo/public_html (httpd_user_content_t) Samba サーバ (httpd_t) 8
PHP/CGI とPostgreSQL の例 (1) htpd_t postgresql_t ドメイン Apache サーバ PostgreSQL サーバ 接続 Create CGI の実行 PHP スクリプト (mod_php.so) htpd_sys_script_t CGI スクリプト [htpd_sys_script_t] UNIX ドメインソケット DB ファイル postgres_db_t アクセス許可を設定しているのは PostgreSQL の設定ファイル htpd_t が postgresql_t に UNIX ソケット経由での通信を許可 FedoraCore3/RedHatEL4 の設定 Apache のポリシーと PostgreSQL のポリシーが強く依存している PostgreSQL に接続可能なタイプ を抽象化する仕組みが必要 9
PHP/CGI とPostgreSQL の例 (2) test.cgi PostgreSQL に接続する CGI #!/usr/bin/perl usedbi; $conn=dbi->connect("dbi:pg: dbname=test;user=test;"); $SQL="select*fromtesttbl"; $res=$conn->prepare($sql); $code=$res->execute(); : 独立のCGI として実行 (htpd_sys_script_t) mod_perl 経由で実行 (htpd_t) アクセス拒否ログ audit(1115774411.448:0):avc: denied {write}forpid=20243exe=/usr/bin/perl name=.s.pgsql.5432dev=sda2ino=2205106 scontext=root:system_r:httpd_sys_script_t tcontext=root:object_r:postgresql_tmp_t tclass=sock_file 10
タイプ継承に基づくセキュリティポリシー タイプ間に親子関係を定義 権限を継承させることができる 多重継承を許し タイプは複数の親を持つことができる タイプ継承がない場合 データベースサーバ ファイル A ファイル B ファイル C データベース Socket Execute Execute Connect Connect Connect アプリケーション α アプリケーション β アプリケーション γ 11
タイプ継承に基づくセキュリティポリシー タイプ間に親子関係を定義 権限を継承させることができる 多重継承を許し タイプは複数の親を持つことができる タイプ継承がある場合 データベースサーバ ファイル B データベース Socket Connect// ファイル A ファイル C DB 接続可能アプリ Execute アプリケーション α アプリケーション β アプリケーション γ 12
セキュリティポリシーの生成フロー /etc/selinux/targeted/src/policy/* セキュリティポリシーのソースファイル群 マクロ アクセス許可 基本構造 タイプ定義 アプリ設定 m4 マクロプロセッサ ( マクロを展開して 1 ファイルに統合 ) checkpolicy コマンド (SELinux ポリシーコンパイラ ) policy.conf 中間生成ファイル policy.xx ( バイナリポリシー ) load_policy コマンド ( バイナリポリシーのロード ) Linux カーネル SELinux モジュール 13
SELinux ポリシーコンパイラの拡張 継承関係を定義するための構文 TYPE< タイプ名 >EXTENDS< 親タイプ >[,.]; 例 ) TYPEchild_tEXTENDSparent_t; child_t は parent_t を親タイプに持つ 継承を意識したアクセス許可を与えるための拡張タイプ名に対する @ プレフィクスの追加 親とその子孫がタイプ指定の範囲となる タイプの定義 TYPEparent_t; TYPEchild_tEXTENDSparent_t; parent_t child_t ALLOWanyone_tparent_t:fileread; anyone_t は parent_t のファイルのみ 可能 ALLOWanyone_t@parent_t:fileread; anyone_t は parent_t/child_t のファイルを 可能 14
従来のポリシーコンパイラとの互換性 セキュリティポリシー ソースレベル互換性 EXTENDS のないタイプ宣言は継承関係を定義しない @ を付与しない権限の付与は 従来通りに認識される EXTENDS や @ を使用しない従来の構文の解釈は全く変わらない セキュリティポリシー バイナリレベル互換性 タイプ間の親子関係を内部的に展開してコンパイルする バイナリ形式は従来のものを一切変更していない 既存のポリシー分析ツールなどをそのまま使用することができる parent_t child1_t child2_t grandchild_t @parent_t {parent_tchild1_tchild2_tgrandchild_t} @child2_t {child2_tgrandchild_t} @parent_t-@child2_t {parent_tchild1_t} ALLOWanyone_t@parent_t:file{readwrite}; ALLOWanyone_t{parent_tchild1_tchild2_t grandchild_t}:file{readwrite}; 15
FTP/Samba/Apache の例 /var/www/html/* (httpd_sys_content_t) Execute Apache サーバ (httpd_t) /var/www/cgi-bin/* (httpd_sys_script_exec_t) Append /var/log/httpd/* (httpd_log_t) FTP サーバ (ftpd_t) /home/foo/* (user_home_t) /var/log/samba/* (var_log_t) Append /home/foo/public_html (httpd_user_content_t) Samba サーバ (httpd_t) 16
FTP/Samba/Apache の例 FTP/Apache/Samba が共通のファイルにアクセス /var/www/html/ /var/www/cgi-bin/ /var/log/htpd/ Apache Execute Append FTP / / Samba /var/log/samba/ /home/foo/ / / /home/foo/public_html / / 17
継承を使った FTP/Samba/Apache の例 Samba サーバ (smbd_t) / smbd_share_t /home/foo/* (user_home_t) Append /var/log/samba/* (var_log_t) / 各アプリ毎の設定をクローズドにできる FTP サーバ (ftpd_t) /home/foo/public_html (httpd_user_content_t) ftpd_file_rw_t ftpd_file_ro_t /var/www/html/* (httpd_sys_content_t) Apache サーバ (httpd_t) Execute Append /var/www/cgi-bin/* (htpd_sys_script_exec_t) /var/log/httpd/* (httpd_var_log_t) 18
継承を使った PHP/CGI とPostgreSQL の例 Apache 用の設定 PostgreSQL 用の設定 Apache サーバ [htpd_t] PostgreSQL サーバ [postgresql_t] CGI 実行 PHP PHP スクリプト PHPスクリプト CGI プログラム [htpd_sys_script_t] 継承 継承 継承 接続許可 PostgreSQL 接続用抽象タイプ [postgresql_connectable_t] メールサーバ用の設定 メール管理用抽象タイプ [mailadmin_domain_t] DB ファイル postgresql_db_t 再起動 設定ファイル メールサーバ 細かすぎる権限を集約して付与することが可能になる 各アプリケーションのポリシー記述の独立性が向上 19
継承を利用したポリシーの記述 (1) 継承 される 側に必要な設定 インターフェースとなるタイプの定義 アプリケーション ~ インターフェース間のアクセス権の定義 FTP/Samba の合成タイプの例 FTP と Samba から共通にアクセスしたいファイルタイプの定義 FTP のみ /Samba のみのファイルタイプの定義を利用する typesamba_share_t; typeftpd_file_ro_t; typeftpd_file_rw_t; #Samba 共用ファイル用タイプ #FTP 読み取り専用タイプ #FTP 読み書き可能タイプ allowsmbd_t@samba_share_t:filecreate_file_perms; allowsmbd_t@samba_share_t:dir create_file_perms; allowftpd_t@ftpd_file_rw_t:filecreate_file_perms; allowftpd_t@ftpd_file_rw_t:dir create_dir_perms; allowftpd_t@ftpd_file_ro_t:filer_file_perms; allowftpd_t@ftpd_file_ro_t:dir r_dir_perms; 20
継承を利用したポリシーの記述 (2) 継承 する側 に必要な設定 インターフェースとして提供されたタイプを継承する Samba/FTP の合成タイプの例 継承を使用した場合 typesamba_ftpd_file_ro_textends samba_share_t,ftpd_file_ro_t; typesamba_ftpd_file_rw_textends samba_share_t,ftpd_file_rw_t; Samba が読み書き可能で FTP は -Only 又は / 可能 同様の記述を繰り返すことに FTP の設定なのか Samba の設定なのか不明確 継承を使用しない場合 allowsmbd_tsamba_ftpd_file_ro_t:filecreate_file_perms; allowftpd_tsamba_ftpd_file_ro_t:filer_file_perms; allowsmbd_tsamba_ftpd_file_rw_t:filecreate_file_perms; allowftpd_tsamba_ftpd_file_rw_t:filecreate_file_perms; : 21
継承を利用したポリシーの記述 (3) サーバアプリケーションに接続可能なタイプの定義 PostgreSQL へ接続可能なインターフェース タイプを定義 PostgreSQL 側の設定 typepostgresql_connectable_t; allow@postgresql_connectable_tpostgresql_tmp_t :sock_filerw_file_perms; allow@postgresql_connectable_tpostgresql_t :unix_stream_socketconnectto; Apache 側の設定 typeextendshttpd_textends postgresql_connectable_t; 中間にインターフェースとなるタイプを挟むことで PostgreSQL の設定と Apache の設定を分離できる 22
継承を利用したポリシーの記述 (3) サーバアプリケーションに接続可能なタイプの定義 PostgreSQL へ接続可能なインターフェース タイプを定義 PostgreSQL 側の設定 typepostgresql_connectable_t; ifdef(`apache.te',` allow@postgresql_connectable_tpostgresql_tmp_t allowhttpd_tpostgresql_tmp_t :sock_filerw_file_perms; :sock_filerw_file_perms; allowhttpd_tpostgresql_t allow@postgresql_connectable_tpostgresql_t :unix_stream_socketconnectto; ') :unix_stream_socketconnectto; Apache 側の設定 typeextendshttpd_textends postgresql_connectable_t; 中間にインターフェースとなるタイプを挟むことで PostgreSQL の設定と Apache の設定を分離できる 23
まとめ タイプ継承によって可能になったこと複数アプリケーションが共有するリソースへの権限付与インターフェース タイプを継承することで 個別アプリケーション毎の設定の独立性を高くできる 既存の構文より少ない記述で一貫性のある設定が可能にこれからの課題 継承される ことを意識したセキュリティポリシーの記述 今までの蓄積もあるので大変 SELinux はまだまだ始まったばかりの技術プログラミング言語で言えば アセンブリ言語時代 高級言語 的 なものが求められている タイプ継承も これらのアプローチの一つ 24
ご静聴ありがとうございました NEC Linux 推進センター 海外浩平 (kaigai@ak.jp.nec.com) 25