SELinuxは,米国家安全保障局(NSA=The National Security Agency)がGNU GPL(General Public License)で配布している,オープンソースのセキュアOSである。Linuxディストリビューションの「Fedora Core 2*1」にはSELinuxが取り込まれているため,Fedora Core 2を使えば簡単にSELinuxを使用できる。

 しかし,SELinuxの機能をきちんと理解し,正しい設定を施してから使用しないと,SELinuxの機能が無駄になりかねない。今回はSELinuxの機能を解説する。

ユーザーのアクセス権限やプロセスの動作権限をきめ細かく制御

 SELinuxは,Linuxカーネルのセキュリティ強化モジュールとして提供されている。LinuxカーネルにSELinuxを組み込むことにより,Linuxカーネルのアクセス制御機能が大幅に強化される。具体的には,次の4つの機能が新たに実装される。

機能1: MAC ――――― アクセス制御の徹底
機能2: TE ―――――― プロセスに最小限の権限を付与
機能3: ドメイン遷移 ―― 権限の付与と昇格防止
機能4: RBAC ――――― ユーザーに最小限の権限を付与

図1●通常のLinuxのセキュリティ上の弱点と対応するSELinuxの機能
 通常のLinuxは,セキュリティ上,図1[拡大表示]で示したような弱点を持つ(詳しくは,連載第1回を参照)。この弱点を克服するために,上記4機能がSELinuxには実装されている。これらの機能により,例え攻撃者がSELinuxを用いたシステムに侵入できたとしても,大きな被害を与えることはできない仕組みになっている。

 それでは,4機能を詳しく見ていこう。

機能1:MAC アクセス制御の徹底

 MACはMandatory Access Controlの略であり,日本語に訳すと強制アクセス制御となる。通常のLinuxでは,ファイルやディレクトリなどに関するアクセス制御(パーミッション)については所有者が自由に設定できる。言い換えれば,ファイルやディレクトリのアクセス制御は所有者任せとなる。こうしたアクセス制御方式をDAC(Discretionary Access Control,任意アクセス制御)と言う。

 これに対してMACでは,アクセス制御の設定は「セキュリティ・ポリシー・ファイル(単に「ポリシー・ファイル」とも言う)」と呼ぶ設定ファイルに基づいて集中的に管理される。このセキュリティ・ポリシー・ファイルはセキュリティ管理者のみが設定・変更できる。SELinuxを用いたシステムでは,MACの機能により,管理者が定めたアクセス制御の設定をシステム全体に徹底できる。

機能2:TE プロセスに最小限の権限を付与

 TEはType Enforcementの略であり,プロセスごとのアクセス制御を司る機能である。SELinuxが提供する最も重要な機能だ。TEにより,プロセスがアクセス可能なリソース(ファイルやデバイスやネットワーク・インタフェースなどのシステム資源)を必要最小限に制限できる。このため,攻撃者にプロセスを乗っ取られた場合でも,被害を最小限に抑えられる。

 TEは,「ドメイン」と「タイプ」という属性情報を用いて,プロセスのアクセス制御を行う。SELinuxを用いたシステムでは,すべてのプロセスにドメインと呼ぶ属性情報が与えられる。このドメインは,「プロセスに与えられる権限の名前」と考えられる。一方,タイプは,システム資源に与えられる属性情報である。例えば,ファイルやディレクトリやネットワーク・インタフェースごとに特定のタイプが与えられる。

 よく利用するアプリケーションやシステム資源用のドメインやタイプは,あらかじめSELinuxに用意されている。また,管理者が独自のドメインやタイプを設定することもできる。

 あらかじめ用意されているドメインやタイプには次のものがある。例えば,Webサーバー・ソフトのApache HTTP Server(以下,Apache)には「httpd_t」,メール・サーバー・ソフトのSendmailには「sendmail_t」というドメインが用意されている。また,タイプの例では,Webページに用いるファイル用の「httpd_sys_content_t」やパスワード・ファイル用の「shadow_t」などがある。ファイル以外のシステム資源にもタイプが用意されている。例えば,TCPの80番ポートには「http_port_t」というタイプが設けられている。

ドメインとタイプで実行可能な動作を制限

 SELinuxでは,どのドメインがどのタイプにどのようなアクセスが可能かをあらかじめ設定しておくことにより,きめ細かなアクセス制御が可能になる。

図2●Webサーバーの動作に必要な設定
 設定例を図2[拡大表示]に示す。これは一般的なWebサーバーの動作,つまり,httpのプロセスが,Webページを読み込み,80番ポートを使って通信するための設定を図示したものだ。

 ここでは,httpデーモンには「httpd_t」というドメインが付与されている。また,Webページのファイルには「httpd_sys_content_t」タイプが,TCPの80番ポートには「http_port_t」というタイプがそれぞれ付与されている。その上で,「httpd_t」ドメインは「httpd_sys_content_t」を「read(読み込み)」でき,同時に「http_port_t」を「name_bind(ポートの利用)」できるというように設定されている。

 この設定では,httpのプロセスに対して必要最小限の権限しか与えられていないため,万が一httpのプロセスを乗っ取られた場合でも,その権限ではWebページを読み込むぐらいしか行えないことになる。

 なお,アクセス制御可能な操作は,「アクセス・ベクター」と呼ばれる。このアクセス・ベクターは,システム資源の種別(これをオブジェクト・クラスと呼ぶ)ごとに用意されている。例えば,ファイルに対しては「read(読み込み)」「write(書き込み)」といったアクセス・ベクターが用意されている。また,TCPソケットに対しては,「connect(接続)」などのアクセス・ベクターが用意されている。

機能3:ドメイン遷移 権限の付与と権限の昇格防止

 上で述べたプロセスへのドメイン割り当ては,TEの機能の一部である「ドメイン遷移」により実現されている。このドメイン遷移は,あるプロセスが子プロセスを起動したときのドメインの割り当てを制御し,新規プロセスが不必要に大きな権限を持たないようにする。

 ここで,親プロセスが子プロセスを起動した場合を考えてみよう。SELinuxの標準設定では,子プロセスは親プロセスのドメインを継承する。つまり,親プロセスと同じ権限を持つ。しかし,これでは不都合が生じる場合があるため,子プロセスのドメインをより権限が少ないものに変更することができるようになっている。

図3●ドメイン遷移の例と設定内容
 例えば,Apacheのプロセス(/usr/sbin/httpd)は,「/etc/rc.d/init.d/httpd」というスクリプトにより起動される。このスクリプトのドメインは「initrc_t」である。このドメインは比較的大きな権限を備えるため,これをそのままApacheのプロセスに与えるのは好ましくない。そのため,Apacheのプロセスは「initrc_t」ドメインより小さな権限しか持たない「httpd_t」ドメインで動作するように,ポリシー・ファイル内で設定されている(図3[拡大表示])。ポリシー・ファイルには,図のように,「親プロセスのドメイン」「実行ファイルのタイプ」「起動したプロセスに割り当てるドメイン」が記述されているのである。

機能4:RBAC ユーザーに最小限の権限を付与

 通常のLinuxでは,root権限を持っているユーザーはシステムに対してあらゆる操作が行える。これに対して,SELinuxを用いたシステムでは,root権限取得者を含むすべてのユーザーに「ロール」と呼ばれる役割を設定することで,システム管理に必要な権限を分割して付与できる。この仕組みは「RBAC(Role Based Access Control,役割ベースのアクセス制御)」と呼ばれる。

 例えば,システム管理用に「sysadm_r」というロールを用意したとしよう。また,Webページ管理用には「webmaster_r」というロールを用意する。この場合,「sysadm_r」ロールにはシステム管理だけに必要な権限を与える。

 例えば,システム・ログの読み込みは可能だが,Webページ・ファイルの読み書きなどは不可にしておく。一方,「webmaster_r」ロールでは,Webページ・ファイルの読み書きおよびWebサーバーのログの読み込みを可能にしておく。このように各種権限を分割して付与することで,不正侵入や内部犯行によるシステムの被害を最小限に抑えることが可能になる。

写真1●RBACを設定したときのログイン画面
 RBACを設定した場合のログイン画面を写真1[拡大表示]に示す。ユーザー名とパスワードを入力した後,[1]root:sysadm_r:sysadm_t,[2]root:webmaster_r:webmaster_tといった選択画面が表示される。これらの行の真ん中の要素「…_r」がロールである。この例では「sysadm_r」「webmaster_r」の2つが選択可能になっている。このように,特定のユーザーに対して,異なるロールを割り当てて選択可能にすることもできる。ただし,特定のユーザーに対して複数のロールを割り当てると権限分割の意味が薄れるので注意する。

 ログイン画面でロールを選択すると,ロールに応じたドメインを持ったユーザー・シェルが起動する。例えば,「webmaster_r」を選択すると,ユーザー・シェルが「webmaster_t」というドメインで動作する。このwebmaster_tは,Webページの管理に必要な権限だけが付与されたドメインである。

ポリシー・ファイルがアクセス制御のカギを握る

図4●ポリシー・ファイルの内容例
 SELinuxの機能を利用してアクセス制御を行うためには,ポリシー・ファイル(図4[拡大表示])を作成する必要がある。

 ポリシー・ファイルの記述内容により,SELinuxを用いたセキュリティ対策の成否が決まるといっても過言ではない。例えば,httpd_tドメインがWebページのファイルを読み書き可能な設定にしたとする。これでは,httpd_tドメインの権限を奪取されてしまった場合には,Webページの改ざんを許す恐れがある。したがってポリシー・ファイルの記述には細心の注意を払うようにする。

 次回(6月1日公開予定)は,Fedora Core 2でのSELinuxの導入方法などを紹介する予定である。


著者紹介
中村 雄一(なかむら ゆういち)氏
日立ソフトウェアエンジニアリング技術開発本部研究部所属。SELinux関連の研究・開発を行っている。SELinuxの普及活動も行う。講演・執筆に加えて,コミュニティにも積極的に参加。パッチ・プログラムやインストール・パッケージなども開発している。著書に「SELinux徹底ガイド」(日経BP社)がある。書籍や記事のサポート・ページも開設している。日本オープンソース推進機構(JOSAO)のSELinux専門委員会委員長を務める。