【セキュアOS SELinux入門】第7回 SELinuxの限界と留意点

 SELinuxを使うことによりシステムを格段に安全に運用できるものの,100%の安全性を確保できるわけではない。 セキュリティ担当者は,SELinuxの限界をきちんと把握した上で,システム全体の堅ろう性を確立する必要がある。 例えば,Fedora Core 2に付属するポリシー・ファイルでも,そのままでは危ないと思われる個所がある。 今回は,SELinuxの限界を踏まえた上で,これまで紹介した方法よりも安全に設定できる方法を具体的に紹介する。

SELinuxだけで安心はできない

 SELinuxを用いたシステムでは,攻撃者に侵入された場合でも被害を最小限に食い止められる。 しかし,SELinuxを使っているからといって,それだけで安心できるわけではない。 セキュリティ担当者は,次のことに気を付ける必要がある。
(1)設定はきちんと行う
 SELinuxにより得られる安全性は,「プロセスやユーザーが余計な権限を持っていないこと」が大前提になる。 当然のことながら,運用に当たっては,ポリシー・ファイルをきちんと設定しておく必要がある。
(2)なりすましに気を付ける
SELinuxを使っていたとしても,セキュリティ担当者のパスワードが単純だと,簡単になりすまされてしまう。 パスワードの管理はきちんと行うようにする。遠隔管理をしている場合には特に気を付ける。
(3)カーネルのセキュリティ・ホールに気を付ける
 SELinuxの適用は,カーネル・レベルのセキュリティ対策である。カーネル自体にセキュリティ・ホールが存在した場合には, SELinuxでは対処できない。カーネルをアップデートするなど速やかに対処する必要がある。
(4)侵入攻撃以外には別途対処する
 SELinuxは侵入攻撃に対処するものであり,その他の攻撃,例えばDos攻撃などには対処できない。 SELinuxでは防げない攻撃には,ファイアウオールやルーターで対処する必要がある。
(5)最小権限の悪用に注意する
 SELinuxでは,プロセスやユーザーは最小限の権限で動作する。しかし,その最小限の権限を利用した攻撃もあり得る。 特に,Webアプリケーションが問題になりがちだ。例えば,ログインした会員に応じて,データベースに問い合わせる Webアプリケーションを考えてみよう。当然Webアプリケーションは,データベースに問い合わせる権限を持つ。 そのため,Webアプリケーションに不具合が存在すると,第三者がそれを突いてデータベースに不正な問い合わせを行う可能性がある。  このように,SELinuxを導入した場合でも,すべての攻撃に対処できるわけではない。 SELinuxで対処できる攻撃と対処できない攻撃を切り分け,対処できない部分についてはSELinux以外の対策をバランスよく 組み合わせることが重要である。以下,具体的な設定を解説する。
 

設定についての留意点
 前述のように,Fedora Core 2では,ポリシー・ファイルがあらかじめ用意されている。 しかし,そのまま使うと危ないと思われる個所がいくつか存在する。
(1)タイプの完全性
 ファイルへのタイプ付け(タイプ付与)の設定が意図したように行われない場合がある。タイプ付与が不適切だと,ファイルが保護されない,プロセスが急に動作しなくなる,といった問題が発生しかねない。  ファイルとタイプの関連付けは,/etc/security/selinux/file_contextsファイルに記述されている。しかし,新規に作成されたファイルについては,file_contextsファイルの内容が反映されないため,不適切なタイプが付与される場合がある。新規作成ファイルには,file_contextsファイルの内容とは無関係に,ディレクトリと同じタイプが付与される。  特に注意すべきなのは,Emacsエディタでのファイル編集である。Emacsエディタは,ファイルを上書き保存する場合に,ファイルを一度消去してから同じ名前のファイルを新規作成している。その際に不適切なタイプが付与される可能性がある。viエディタを使った場合は特に問題は生じないため,ファイルの編集にはviエディタを使ったほうがよい*1。このため,ファイルのタイプ付けの設定は,定期的に反映し直すべきである。
# fixfiles relabel

と入力することで,全ファイルのタイプをfile_contextsファイルの設定通りに付け直せる。  Fedora Core 2でSELinuxを利用していて,プロセスが動作しなくなった場合は,まずはファイルのタイプが適切かどうかを疑い,file_contextsファイルの内容を反映するようにしよう*2。
(2)設定のチューニング
 ポリシー・ファイルは,SELinux独自の設定言語で記述されている。この設定言語を知らなくとも,/etc/security/selinux/src/policy/tunable.teファイルを使えば,ポリシー・ファイルの大まかなカスタマイズが可能だ。  

tunable.teには,

define('チューニング要素')

という記述が並んでいる。任意の行をコメントアウト*3することで,設定の有効と無効を切り替えられる。主なチューニング要素を表1に示す。例えば,「define('user_can_mount')」という行をコメントアウトすると,「sysadm_rロール以外でもmountコマンドを利用できる」という設定が無効になる。

表1●tunable.teファイルの主なチューニング要素


チューニング要素 意味 デフォルト
unrestricted_admin sysadm_tドメインがほとんど何でもできる 有効
sh_sysadm_login s sshd_tから直接sysadm_tにドメイン遷移可能(ssh経由で,newroleを使わずに,直接sysadm_rロールでログインできる) 有効
xdm_sysadm_login グラフィカル・ログインで,newroleを使わずに直接sysadm_rでログインできる 有効
llow_user_dmesg asysadm_rロール以外で,dmesgコマンドを利用できる 有効
user_canbe_sysadm 一般ユーザーでもsysadm_rロールになれる 有効
user_can_mount sysadm_rロール以外でもmountコマンドを利用できる 有効
unlimitedUsers ログイン・ユーザーがほとんどすべての操作を行える コメントアウト


 tunable.teファイルを利用することにより,設定の安全性を“調整”することも可能だ。今回はその例として,ユーザー関連の設定をより安全にする方法を示す。
デフォルトでは危険なsshdの設定
 Fedora Core 2のデフォルト(初期設定)では,「sshd(sshd_tドメイン)が/bin/sh(shell_exec_tタイプ)を実行すると,/bin/shはsysadm_tドメインで起動する」というドメイン遷移が起こるようになっている。この設定は非常に危険である。なぜなら,攻撃者がsshdを乗っ取ってシェルを起動すると,ほとんどの管理権限を持ったsysadm_tドメインで起動してしまうからだ。  この問題は,先に紹介したtunable.teファイルを用いて解決できる。tunable.teファイルを見てみると,

define('ssh_sysadm_login')

という記述がある。表1によると,この行によって,問題のドメイン遷移が可能になっている。この行をコメントアウトすれば,危険なドメイン遷移が起こらなくなる。

dnl define('ssh_sysadm_login')

このようにしてコメントアウトしたら,設定を反映しよう。

# cd /etc/security/selinux/src/policy
# make reload

 同様に,tunable.teファイル中の

define('user_canbe_sysadm')

もコメントアウトしておくことが望ましい。一般ユーザーがsysadm_rロールになれることは,セキュリティ上望ましくないからだ。

(3)audit2allowで追加した設定をチューニングする

 連載第6回で紹介した,audit2allowコマンドを使った設定追加法は手軽だが,安全面では最適ではない。
第6回では,audit2allowを使って次のような設定を追加した。

allow ftpd_t var_t:dir { read };
allow ftpd_t var_t:file { getattr read }; …(※)

追加した設定を見てみると,ftpd_tドメインが,var_tタイプのファイルやディレクトリにアクセスできるようになっている。しかし,「ls -Z」を実行してみると分かるように,var_tは/varディレクトリ以下の多くのファイルやディレクトリに付与されているタイプである。

 従って,vsftpd(ftpd_tドメイン)は/varディレクトリ以下の多くのファイルやディレクトリを読み込める。しかし,vsftpdの動作だけをみれば,/var/ftpのみにアクセスできればよい。従って,(※)の設定では,余計なファイルにアクセスできてしまうことになる。このように,ログに基づいて単純に設定しただけだと,余計なアクセス権限を与えてしまうことがある。

 より安全な設定にするためには,/var/ftpに対して新たなタイプを付与すればよい。今回は,新たなタイプ「ftp_pub_t」を「/var/ftp」ディレクトリ以下に付与し,必要最小限の権限を与える方法を解説する。

 ここでは,ホーム・ディレクトリは/etc/security/selinux/src/policyであると想定して話を進める。また,以下を試す場合には,連載第6回で追加した設定は削除しておく。

/var/ftpにftp_pub_tを付与する

 新規のタイプを使う場合は,そのことを宣言する必要がある。次のようにして宣言する。

type <タイプ>,file_type,sysadm_file;

今回の例では,domains/program/ftpd.teファイルに

type ftp_pub_t,file_type,sysadmfile;

と追加する*4

 ファイルにタイプを付与する設定は,file_contextsディレクトリ以下の拡張子が「.fc」というファイルに,

<ファイル名> system_u:object_r:<タイプ>

という書式で記述する。ディレクトリ以下のファイルにタイプを付与する場合は,

<ディレクトリ>(/.*)? system_u:object_r:<タイプ>

というように記述する。今回は,file_contexts/program/ftpd.fcファイルに次の設定を追加しよう。

/var/ftp(/.*)? system_u:object_r:ftp_pub_t

 これらの設定は次のようにして反映する。

# make reload
# setfiles file_contexts/file_contexts /var

  • 「make reload」だけでは,ファイルのタイプ付けは反映されない。setfilesコマンドにより,ファイルのタイプ付けを別途行う必要がある。このコマンドで,/varディレクトリ以下のタイプを付与し直している。lsコマンドを使って/var/ftpのタイプを確認しよう。

    # ls -Z /var
    drwxr-xr-x root root system_u:object_r:ftp_pub_t ftp

    これで,確かにftp_pub_tタイプが付与されていることが分かる。

  • ftp_pub_tに対するアクセス権限を与える

     この後は連載第6回で紹介した手順と同様に,permissiveモードに切り替えてからvsftpdを試験的に動作させる。それから,audit2allowコマンドを使って設定を追加する。audit2allowでは,次のような設定が出力される。

    # audit2allow -d -l;
    allow ftpd_t ftp_pub_t:dir { getattr read search };
    allow ftpd_t ftp_pub_t:file { getattr read };

    この設定をdomains/program/ftpd.teファイルに追加し,設定を反映すれば,vsftpdは正常に動作する。最後にenforcingモードに戻すことを忘れないようにしよう。

     以上で,vsftpdは/var/ftpディレクトリだけにアクセスできるようになった。このように,実際にアクセスするファイルだけにタイプを付与してからaudit2allowで設定を行うようにすると,ドメインのアクセス権限をより限定できる。