Download as pdf or txt
Download as pdf or txt
You are on page 1of 61

1 章◆ SELinux とは?/中村雄一/才所秀明 ..................................................................................................

22
2 章◆これで完璧! SELinux のインストール/基本操作/才所秀明 ..................................................33
3 章◆ SELinux 設定方法の基礎∼ポリシファイル編集法/中村雄一...................................................40
4 章◆ SELinux 徹底活用 セキュアな Web サーバ構築&管理マニュアル/中村雄一 ...........................51
Appendix ①◆セキュリティの基礎はここから LSM を理解する/中村雄一 ..............................................59
Appendix ②◆ SELinux の最新動向/中村雄一 ........................................................................................64
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介/面和毅 .............................................................................68
Appendix ③◆ FreeBSD のセキュリティ機能∼ jail の紹介/籠谷和男...............................................79
特集● SELinux 大全

日本 SELinux ユーザ会準備委員会 中村雄一 NAKAMURA Yuichi ● ynakam@selinux.gr.jp


日立ソフトウェアエンジニアリング㈱ 才所秀明 SAISHO Hideaki ● saisho@hitachisoft.jp

導入部となる本章では,SELinux の基本について解説します.後半部では,SELinux のしくみな


ど,技術的な側面を取り上げます.

SELinux の基本
●中村雄一 NAKAMURA Yuichi E-mail : ynakam@selinux.gr.jp

SELinux とは? Linux の脆弱性

SELinux とは,アメリカの NSA(National そもそも,なぜ SELinux のようなものが必要に


Security Agency,国家安全保障局)を中心として なるのでしょうか? その背景としては,Linux と
開発された,オープンソースのセキュア OS です. いう OS自体の脆弱性が挙げられます.
とは言っても,SELinux というディストリビューシ
Linux の脆弱性
ョンがあるわけではなく,Linux カーネルのセキュ
リティ強化モジュールの名称です.SELinux は, コンピュータをひとたびネットワークに接続す
OS のパーミッションチェックを大幅に強化し,プ ると,さまざまな不正アクセスにさらされます.
ロセス/ユーザを最小限の権限で動作させます. 不正アクセスの手順は図 1 のようになります.
攻撃者が不正侵入したとしても大きな権限を得る
①攻撃者は,セキュリティホールを突いてデーモ
ことができないため,被害を与えることは極めて
ンを乗っ取ったり,ユーザになりすましたりす
困難です.
ることで,システムに侵入し,システムのアク
現在の SELinux 採用状況 セス権限を得ます.
②侵入段階で得たアクセス権限を悪用し,悪意の
SELinux は,Linux カーネル 2.6 の標準オプション
あるアクセス要求を行います.たとえば,重要
として採用され,ディストリビューションでの対
データに対する書き込み/読み込みアクセスな
応も進んでいることもあり,注目を集めています.
どです.
現在のところ,Fedora Core 2 では SELinux が完全
③悪意のあるアクセス要求が実行され,データが
に取り込まれています.

22 - Software Design
1 章◆ SELinux とは?

●図 1 不正アクセスの流れ ●図 2 不正アクセス対策

ネットワーク ネットワーク ネットワークレベルの対策


ファイアウォール,IDSなど
①侵入 ①侵入
攻撃者 攻撃者
アプリケーションレベルの対策
アプリケーション アプリケーション
パッチ当てなど
②悪意のあるアクセス要求 ②悪意のあるアクセス要求
OS OS OSレベルの対策
(カーネル) (カーネル) SELinuxのようなセキュアOS
③盗難/破壊 ③盗難/破壊
✗ ✗
データ データ

Linuxマシン Linuxマシン

昇格することができてしまいます.
盗難/破壊されます.その結果,Web ページ改
ざん,システム破壊,バックドア/トロイの木 現在のセキュリティ対策
馬の設置など,さまざまな被害が発生します. と SELinux
このような不正アクセスを阻止するために,さ
● root 権限を取られると まざまな対策が試みられています.主要な不正ア
しかし,Linux は OS としては,このような不正 クセス対策を,図 2 に示します.ネットワーク/ア
アクセスに対して十分な機能を提供していません. プリケーション/ OS それぞれのレベルでの対策が
Linux には万能の root 権限が存在するため,ひとた 存在します.
び root 権限を取られると,非常に大きな被害を受 ネットワーク/アプリケーション
けてしまいます. レベルでの対策
たとえば,ssh デーモンは root 権限で動作してい ファイアウォール,IDS,パッチ当てといった,
るため,ssh デーモンにセキュリティホールがある ネットワーク/アプリケーションレベルの対策は,
と,攻撃者は root 権限を得ることができます.こ 図 2 の「①侵入」の段階で防御する対策です.しか
うなると攻撃者は root 権限を悪用し,やりたい放 し,侵入の原因となるセキュリティホールは次々
題になってしまいます. と発見されますので,これらすべてに対処するこ
とは事実上不可能です.1 つでも対策を忘れ,そこ
●「SUID=0」の脆弱性 から root 権限を取られてしまうと,大きな被害を
最近の Linux のデーモンは,一般ユーザ権限で動 こうむってしまいます.
作することが多くなっています.しかし,SUID=0 このように,いくらセキュリティに配慮したシ
のプログラムを使って root 権限に昇格する抜け道 ステムを構築しても,脆弱な OS の上ではたった 1
が存在するため,一般ユーザ権限を取られただけ つのほころびから大きな被害につながります.
でも危険です. SELinux による
SUID=0のプログラムは,root権限で動作します注1. OS レベルでの対策
もし,このような SUID=0 のプログラムにセキュリ そこで重要になってくるのは,OS レベルのセキ
ティホールがあると,一般ユーザからrootユーザに ュリティ対策,つまり SELinux のようなセキュア

注 1)SUID=0 のプログラムの例としては,passwd コマンドがあります.passwd コマンドはroot 権限で動作しますので,本来 root ユーザ


でしか扱えないパスワードファイルを,一般ユーザでも編集することができます.

Oct. 2004 - 23
●図 3 SELinux の機能構成要素 能の利用を徹底できなければ意味がありません.
強制アクセス制御は,アクセス制御の設定をシス
強制アクセス制御(MAC)
セキュアOSとしての テム全体に徹底させるための機能です.
TE
基本機能
最小特権 RBAC 従来の Linux のアクセス制御モデルである「任意
ドメイン遷移
ア ク セ ス 制 御 ( DAC : Discretionary Access
監査ログ
Control)
」では,ファイルの所有者がパーミッショ
ンの設定を行います.そのため,ファイルのセキ
OS です.セキュア OS では,OS のアクセス制御を ュリティは所有者任せです.また,root ユーザは
強化し,
「②悪意あるアクセス要求」を拒否します. パーミッションチェックを回避可能です.このよ
こうしておけば,図 2 で「①侵入」されたとして うな状況では,セキュリティの設定を徹底させる
も,②以降の段階に進むことはできないため,攻 ことは困難です.
撃者は悪事ができません.たとえ,セキュリティ それに対して強制アクセス制御(MAC :
ホールの対策を忘れたとしても効果があるわけで Mandatory Access Control)では,プロセスがどん
す. なリソースにアクセスできるか,といったアクセ
SELinux のアクセス制御機能は,図 3 のような要 ス制御の設定は「ポリシファイル」と呼ばれる設
素から成り立っています.おもな要素は強制アク 定ファイルで集中管理されます.ポリシファイル
セス制御と最小特権です.これらはセキュア OS 注 2 の編集は,セキュリティ管理者のみが行うことが
の基本機能でもあります. できます.そしてその設定は,すべてのプロセ
ス/ユーザに例外なく適用されます.これにより,
●強制アクセス制御とは セキュリティ管理者が定めたセキュリティの設定
どんなに優れたセキュリティ機能でも,その機 を徹底することができます.

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

セキュア OS とは

●セキュアOS の定義 SELinux と LIDS というセキュア OS を例にとると,


セキュアOS は,OS レベルでセキュリティを強化する SELinux はセキュリティ重視で,LIDS は扱いやすさ重視
もので,オープンソース/商用とさまざまなものがリリー という特徴があります.
スされています.情報ネットワーク法学会に所属するセキ
ュアOS 研究会(http://in-law.jp/secure-os/)で策定中の ●商用のセキュアOS について
「セキュアOS」の定義によると,
「強制アクセス制御およ また,商用セキュアOS では,強制アクセス制御/最小
び最小特権という2 つの機能を備えたOS」とされていま 特権という基本機能以外に,侵入を防止するための機能
す. を備えていることもあります.たとえば,バッファオーバ
ーフロー攻撃という侵入段階でひんぱんに用いられる攻撃
●各セキュアOS の違い を防御する機能を備えているものが多いです.
最小特権の詳しい実装は,セキュアOS の種類によって なお,バッファオーバーフロー攻撃防御のための機能
特徴が出てくるところです.一般に,より細かく権限を は,無償のものでもexec-shield というものがあり,Fedora
細分化できるほどセキュリティは高いですが,セキュリテ Core 2 ではSELinux に同梱されています.
ィポリシの設定が面倒になってきます.今回紹介する

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

注 2)セキュアOS の意味については,コラムを参照してください.

24 - Software Design
1 章◆ SELinux とは?

●最小特権とは ュリティポリシに記述します.これらの権限は,
従来の Linux では,root 権限が全権を掌握してい 普通の Linux の一般ユーザ権限よりもはるかに小さ
るため,root 権限を取られてしまうとおしまいで な権限です.こうしておけば,たとえば Apache に
す.SELinux では,root のような絶対の権限をなく セキュリティホールがあり,侵入を許したとして
し,プロセスやユーザに必要最低限の権限を割り も,攻撃者は Apache 権限しか得ることができない
当てます.これを最小特権と呼びます. ため,実質的な被害を及ぼすことはできません.
たとえば,Web サーバ Apache に対しては, SELinux の最小特権は,TE / RBAC /ドメイン
「httpd_t ドメイン」という独自の権限を割り当て, 遷移という機能によって実現されています.以下,
ホームページへの読み込み権限のみを与え,関係 これらの機能を含め,SELinux の機能の詳細につい
ないファイルへのアクセスはできないよう,セキ て解説します.

SELinux の機能詳細
●才所秀明 SAISHO Hideaki E-mail : saisho@hitachisoft.jp

では,強制アクセス制御と最小特権およびログ root でも回避できないセキュリティチェックを実


監査の機能について詳しく見ていきましょう. 現するメカニズムです注 3.SELinux はセキュア OS
モジュールとして,
「セキュリティ管理者のみが設

強制アクセス制御 定できるセキュリティポリシ」と,そのセキュリ
ティポリシに従ったセキュリティチェックを実装
SELinux の機能概要で説明したように強制アク しています.
セス制御は,
「セキュリティ管理者のみが設定でき
るセキュリティポリシ」を「すべてのユーザ/プ 最小特権
ロセスに強制する」ことです.SELinux では,
LSM(Linux Security Module :図 4 の③)を利用す 最小特権は TE(Type Enforcement)とドメイン
ることで,
「すべてのユーザ/プロセスに強制する」 遷移,RBAC(Role-Based Access Control)で実現
ことを実現しています. されています.これらについて順に説明していき
LSM を簡単に説明すると,カーネル内において, ます.

●図 4 LSM のしくみ

プロセス

①アクセス要求
セキュリティ管理者のみが
②Linuxパーミッション Linuxカーネル 設定可能
 チェック

④セキュリティ
 チェック依頼
⑤セキュアOS
③LSM
 モジュール
⑥チェック結果
セキュリティポリシ
⑦アクセス
rootでも回避できない
リソース セキュリティチェック

注 3)LSM の詳細は本特集 Appendix.1 を参照してください.

Oct. 2004 - 25
SELinux では,リソースの種類ごとに,オブジェ
TE について
クトクラスと呼ばれるものが定義されています.
●基本的な考え方 また各オブジェクトクラスには,設定可能なアク
最小特権の機能を実現するメインとなるのが, セス権限が定義されています.このアクセス権限
プロセスごとのアクセス制御を行う TE です.図 5 はアクセスベクタと呼ばれます.
に,Web サーバとしてよく使われる Apache を例と では,このオブジェクトクラスとアクセスベク
した TE の概念図を示しておきます.TE の基本的 タの定義の実例を見てみましょう.オブジェクト
な考え方は非常に簡単で,次のようにまとめるこ クラスとアクセスベクタの定義は,
「/etc/security/
とができます. selinux/src/policy/flask」以下の security_classes フ
ァイルと access_vectors ファイルにあります注 4.フ
①プロセスとリソースにラベルを付ける
ァイルに関連するオブジェクトクラスの一部をリ
②プロセスのラベルとリソースのラベルの間にア
スト 1 に示します.ファイルやディレクトリのクラ
クセス権限を設定する
スは,ファイル関連の共通設定を継承していて,
③設定に基づいて,プロセスとリソースの間でア
多くのアクセスベクタが定義されています.
クセス制御を行う
通常の Linux では,ファイルに対して read,
write,execute の 3 つしかアクセス権限を設定でき
●用語説明 ませんでした.しかし SELinux では,リスト 1 のよ
TE で利用する用語を説明します.
●リスト1 オブジェクトクラスとアクセスベクタの
定義例(access_vectors)
¡オブジェクトクラスとアクセスベクタ
common file ←ファイル関連(共通の設定)
通常の Linux では,アクセス権限を設定できるリ {
ioctl
ソースはファイルとディレクトリだけでしたが, read
write
SELinux ではソケットや共有メモリなど,約 30 種 create
getattr
類のリソースに対してアクセス権限を設定できる setattr
lock
ようになっています. relabelfrom
←ファイル関連共通のアクセスベクタ
relabelto
その際,設定可能なアクセス権限の種類は,リ append
unlink
ソースの種類によって異なるはずです.たとえば, link
rename
ファイルには read や write などのアクセス権限が考 execute
swapon
えられますが,ソケットには connect や listen とい quotaon
mounton
うアクセス権限の設定が必要となるでしょう. }
中略
class dir ←ディレクトリのクラス
●図 5 Apache を例としたTE の概念図 inherits file ←ファイル関連共通設定を継承する
{
プロセス パーミッション リソース add_name
(サブジェクト) (アクセスベクタ) (オブジェクト) remove_name
reparent ←ディレクトリのアクセスベクタ
search
②アクセス権限の設定 /var/www/
httpdプロセス rmdir
read }

class file ←ファイルのクラス


③アクセス制御 inherits file ←ファイル関連共通設定を継承する
ドメイン: タイプ: {
httpd_t httpd_sys_content_t execute_no_trans
←ファイルのアクセスベクタ
entrypoint
①ラベル付け }

注 4)本章で解説しているファイルの位置などは,Fedora Core 2 でpolicy-source パッケージをインストールしている場合です.インスト


ール方法は本特集 2 章で説明します.

26 - Software Design
1 章◆ SELinux とは?

うに追記だけを許可する append など,さまざまな もわかりやすいファイル/ディレクトリのタイプ


アクセス権限が設定可能となっています.このよ 付けの実例を見てみましょう.
うに,SELinux ではフレキシビリティの高いアクセ ファイル/ディレクトリのタイプ付け設定は,
ス権限設定が可能となっています. 「/etc/security/selinux/src/policy/file_contexts」以下
の「*.fc」ファイルで行われます.たとえば,リスト
¡ドメイン 2 は Apache に関連するファイル/ディレクトリの設
プロセスに対して付けるラベルはドメインと呼 定の一部です.リスト中の枠囲み部分で,
ばれます.SELinux では,すべてのプロセスにドメ 「/var/www/」の設定が行われています.タイプ付け
インが付けられています.
「基本的な考え方」の項 設定の変更については,あとで詳しく説明します.
で説明したように,ドメインとリソースに付けら
れたラベルの間にアクセスベクタを設定し,その ●設定記述方法
設定を元にアクセス制御が行われます.したがっ さて,今まで解説してきた用語を用いて「基本
て,ドメインを権限の単位そのものと考えること 的な考え方」の箇条書き部分を書き直すと,以下
もできます. のようになります.
図5ではApacheのプロセスである「httpd」に対し,
qプロセスにドメインを,リソースにタイプを付
「httpd_t」というドメインが付けられています.プロ
ける
セスにドメインを付ける設定方法については,のち
wドメインとタイプの間でアクセスベクタを設定
ほど「ドメイン遷移について」の項で説明します.
する

¡タイプ qについては用語説明の中で触れましたので,
リソースに付けるラベルはタイプと呼ばれます. wについて実際の記述方法を見てみましょう.図 5
SELinux では,このタイプによってリソースを識別 の設定はリスト 3 のような記述で行います.
し,先に述べたオブジェクトクラスと併せて,ア これは「ドメイン httpd_t を付けられたプロセス
クセス制御を行っています. に対し,オブジェクトクラス file または dir でタイ
図 5 では,公開したい html ファイルを含むディ プ httpd_contents_t を付けられたリソースへ,アク
レクトリ「/var/www/」に「httpd_sys_content_t」 セスベクタ read の権限を与える」という意味です.
というタイプが付けられています. このような設定は,「/etc/security/selinux/src/
リソースへのタイプ付けの設定方法は,オブジ policy/domains」以下の「*.te」ファイルで行われ
ェクトクラスによって異なります.ここでは,最 ます.

●リスト2 ファイルのタイプ付け定義例

# apache
HOME_DIR/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_ROLE_content_t
/var/www(/.*)? system_u:object_r:httpd_sys_content_t
/var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
/usr/lib(64)?/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
/var/www/perl(/.*)? system_u:object_r:httpd_sys_script_exec_t
/var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t
/etc/httpd -d system_u:object_r:httpd_config_t
/etc/httpd/conf.* system_u:object_r:httpd_config_t

●リスト3 TE 設定記述の例

allow httpd_t httpd_contens_t:{ file dir } { read }

ドメイン タイプ オブジェクトクラス アクセスベクタ

Oct. 2004 - 27
●設定の特徴 インが起動先のプロセスに割り当てられます.し
SELinux では,上記のように「ドメインに対して かし,起動元ドメインとは異なるドメインを割り
リソースへのアクセス権限を与える」という設定 当てなければならない場合もあります.
を行っていきます.逆に,設定されていないアク わかりやすい例としては,OS 起動時です.図 6
セスはすべて許されません.このため,セキュリ は OS 起動時に起こるプロセス起動の簡略図です.
ティ管理者がセキュリティ設定を忘れたりサボっ このようにカーネル起動から次々とプロセスが起
たりしても,セキュリティ上問題になることはあ 動し,それぞれのプロセスに異なるドメインを割
りません.ただし,必要な設定を行わないとプロ り当てる必要があります.
セスが動作しなくなります.
セキュリティ設定を忘れるとプロセスが動作し ●設定記述方法
ないという特徴は,やや面倒に思われるかもしれ ドメイン遷移を行うには,リスト 4 に示すような
ません.しかし,セキュリティの観点から言えば, 記述注 5 を用いて,ドメイン遷移設定を行います.
安全でない設定が行いづらければ,結果として安 こ れ は ,「 ド メ イ ン i n i t r c _ t の プ ロ セ ス が ,
全な設定になるので,良い特徴と言えます. httpd_exec_t タイプの実行ファイルでプロセスを起
動した際には,起動したプロセスに httpd_t ドメイ
ドメイン遷移について
ンを割り当てる」という意味です.このような設
●必要性 定は,アクセス権限の設定と同様に「/etc/
ドメイン遷移は,プロセスにドメインを割り当 security/selinux/src/policy/domains」以下の「*.te」
てるメカニズムです.ドメインを権限の単位と考 ファイルで行われます.
えれば,プロセスに権限を割り当てるメカニズム
と言っても良いでしょう. ●ドメイン遷移の効果
SELinux では,あるプロセスが別のプロセスを起 SELinux では,ドメイン遷移設定を行わないとド
動する際,基本的に起動元のプロセスと同じドメ メイン遷移が起こりません.これはセキュリティ

●図 6 OS 起動時のプロセス起動の簡略図

カーネル
kernel_t ドメイン

/sbin/init 実行ファイル
init_exec_t タイプ
/etc/rc.d/rc.sysinit /sbin/httpd
initプロセス initrc_exec_t httpd_exec_t
init_t
initスクリプト httpデーモン
/sbin/mingetty initrc_t httpd_t
getty_exec_t
/sbin/login
login_exec_t
getty ログインプロンプト
getty_t Local_login_t

●リスト4 ドメイン遷移設定記述の例

domain_auto_trans(initrc_t,httpd_exec_t,httpd_t)

起動元のドメイン 実行ファイルのタイプ 遷移先ドメイン

注 5)このドメイン遷移の記述は,実はマクロを利用した記述です.実際には,マクロ展開されたものがセキュリティチェックに利用されま
す.SELinux では,このようなマクロが数多く定義されていて,セキュリティポリシ設定では,多くのマクロを利用して設定を記述し
ます.詳細は本特集 3 章の「③タイプに対するアクセス許可の記述」の項を参照してください.

28 - Software Design
1 章◆ SELinux とは?

上非常に大きな意味を持っています. を例に図 7 を用いて簡単に説明します.


従来の Linux に対する侵入攻撃では,SUID=0 の
プログラムを使って root 権限に昇格する抜け道が ①管理権限を作成
利用されていました.一方,SELinux では権限の単 まず,Web 管理者の管理権限を作成します.
位であるドメインの遷移を制限することで,この RBAC ではこの管理権限をロールと呼びます.
ような権限昇格の抜け道を未然に防ぐことができ たとえば Web 管理者用のロールとして
るのです. webmaster_r を作成します.
②ユーザシェルのドメインを設定
RBAC について
次にそのロールに対応するユーザシェルのドメイ
● RBAC の必要性 ンを設定し,そのドメインに対し Web 管理に必要
ここまで説明してきた TE とドメイン遷移はプロ な設定を行います.ドメインという用語からわか
セスの最小特権を実現するものでした.これに対し, るように,この設定は TE を用います.たとえば,
RBACはユーザの最小特権を実現するものです. webmastar_t というドメインを設定し,
従来の Linux では,root ユーザがすべての管理権 webmastar_tにはWeb管理に必要なリソースのタイ
限を持っていました.より正確に表現すれば, プに対して必要なアクセスベクタを設定します.
「root ユーザは,パーミッションチェックを回避で ③選択可能なロールを設定
きるため,事実上すべての管理権限を持っていた」 さらに,ユーザ対して,選択可能なロールを設
ということです.このため,Web ページ管理者や 定します.
グループを作成しても,root ユーザは何でもでき
てしまいました. ●ユーザログイン時の動作と効果
また,特定の管理しかしないユーザに root ユー ユーザはログイン時にロールを選択します.た
ザのパスワードを教えるという運用がなされ,そ とえば Web 管理ロールである webmaster_r を選択
れらのユーザの操作ミスや悪意のある操作が原因 すると,webmaster_r に対応したユーザシェルが起
で,システム全体に被害が及んでしまうこともあ 動します.
りました.
このような運用が行われてしまう原因は,単に ●図 7 RBAC の実例
セキュリティ意識が足りなかったというだけでは
ありません.これまでのユーザやグループの単位 ユーザ
saisho
の設定では,必要な管理権限の分割が困難もしく ③ユーザが選択可能なロールを設定
は不可能だったのです. qログイン時にロール選択

Web管理ロール
● RBAC の効果 webmaster_r
①Web管理者用のロールを作成
SELinux では,RBAC によって管理権限を完全に
wロールに応じたユーザシェル起動
分割することができます.たとえ root ユーザにな
ってもすべての管理権限を持つことはできません. ユーザシェル
したがって,管理者のミスや悪意のある操作によ webmaster_t
ドメイン
る被害を最小化することができます.
②(a)webmaster_rに対応する
  ユーザシェルのドメインを設定
● RBAC のしくみ ②(b)Web管理に必要なアクセス権限を設定
では,RBAC のしくみについて,Web 管理権限

Oct. 2004 - 29
このシェルには,TE を用いて必要なアクセス権 います.3 ∼4 行目は,httpd プロセスのドメインや,
限が設定されているので,ミスや悪意のある操作 実行しようとした実行ファイル sh のタイプなどを
によって Web 管理に必要のないリソースに被害を 示しています.
及ぼすことはできません.逆に,Web 管理のみに このログ機能により,攻撃者の痕跡を見ること
使われるアクセス権限,たとえば Web の設定ファ ができます.
イルへの書き込みなどは,あえて設定しない限り,
監査ログ機能
ほかのロールが持つことはありません.
また,アクセス権限設定のフレキシビリティが高 SELinux では,さらに許可されたアクセスに対し
いTEを用いているため,ロールに必要な権限をきち てログを書き出すこともできます.これが監査ロ
んと設定することができます.このため RBAC によ グ機能です.
り,従来のLinuxとは違ってrootパスワードを複数の リスト 6 は webmaster ユーザが Web ページを更
人に与えるような運用を行う必要がなくなります. 新した際のログです.1 行目の枠囲み部分は,write
(書き込み)が granted(許可)されたことを示し

監査ログ ています.2 行目の枠囲み部分は,書き込まれたフ


ァイルが,/var/www/html/index.html であること
を示しています.
アクセス違反ログ機能
3 行目の枠囲み部分は,webmaster というユーザ
TE の項で説明したように,
「allow ∼」という記 が webmaster_r というロールで書き込みを行ったこ
述でアクセス設定を行っています.そして,この とを示しています.4 行目の枠囲み部分は,書き込
アクセス設定に違反するアクセスが行われた際に まれた/var/www/html/index.html のタイプとセキ
は,ログに書き出します. ュリティクラスを示しています.このようなログ
リスト 5 は Apache を乗っ取った攻撃者がシェル の書き出しは,リスト 3 の「allow ∼」という記述
の起動に失敗したときのログです.1 行目の白枠で と同様の形式で,リスト 7 の「auditallow ∼」とい
囲んだ部分は,execute(実行)が denied(拒否) う記述で設定できます.
されたことを示しています.2 行目の枠囲み部分は, この監査ログ機能では,権限内で行われる悪意
httpd がシェル sh を実行しようとしたことを示して のある操作を防止することはできませんが,ログ
が残るので抑止効果があります.

●リスト5 設定違反時のログ
SELinux の効果と
audit(xxxxxxxxxx:xxx:0): avc: denied
pid=987 exe=/usr/sbin/httpd
denied {{ execute
/usr/sbin/httpd path=/bin/sh
execute }
} for
/bin/sh dev=08:01 ino=962840 限界
scontext=system_u:system_r:httpd_t
tcontext=system_u:object_r:shell_exec_t class=file
SELinux の効果

●リスト6 監査用のログ ●強制アクセス制御と最小特権の効果


audit(xxxxxxxxxx:xxx:0): avc: granted { write } for これまで説明してきたように,
/var/www/html/index.html dev=08:01
pid=987 exe=/bin/vi path=/var/www/html/index.html
ino=962840 scontext=webmaster:webmaster_r:webmaster_t
webmaster:webmaster_r SELinux では強制アクセス制御と最小
tcontext=system_u:object_r:httpd_sys_content_t
httpd_sys_content_t tclass=file
file
特権を実現しています.そのため,攻
撃者がアプリケーションのセキュリテ
●リスト7 監査ログ出力用の設定 ィホールを利用して侵入しても,攻撃
auditallow webmaster_t httpd_contens_t file:{ write } 者の行動は,設定されたドメインのア
ドメイン タイプ オブジェクトクラス アクセスベクタ

30 - Software Design
1 章◆ SELinux とは?

クセス権限に縛られます. ●効果のまとめ
たとえば Apache のセキュリティホールを利用し このように SELinux は,侵入攻撃による実質的
て侵入しても,先に説明したように Web ページに な被害の防止やユーザの不正な操作を発見すると
read のアクセスベクタしか設定されていなければ, いう直接的な効果があります.前者の効果により,
Web ページを改ざんされることはありません.ま セキュリティホールへの対策をリアルタイムに行
た,普通に設定すればシェルの起動すらできない わなくても良くなります.
ので,ファイルなどにアクセスすることすら困難 また,最小特権が実現されているので,1 つのマ
でしょう. シン上で Web や DNS,メールなどのサーバアプリ
ケーションを動作させても,別々のマシン上で動
●効果の実例 作させた場合と同等以上のセキュリティ強度を保
Slapper ワーム攻撃の例(図 8)を見てみましょ ちながらサーバ集約が可能となります.
う.Slapper ワーム攻撃では,図中の①∼⑤のステ
SELinux の限界
ップを踏んで,バックドア設置と他マシンへの攻
撃を行います. しかし,SELinux を入れればセキュリティ上万全
SELinux では,通常の設定であればデーモンはシ というわけではありません.SELinux で対処できな
ェルやコンパイラ,未知のプログラムに対する実 いものには,たとえば表 1 に挙げるようなものがあ
行権限を持ちません.したがって,②,④,⑤の ります.
ステップが実行できません.また,③のステップ
における書き込みを許可しない設定も可能でしょ ●アクセス制御に関係ない攻撃
う.このため,Slapper ワーム攻撃を受けても, SELinux は強制アクセス制御と最小特権というア
SELinux で通常の設定を行っていれば,実際の被害 クセス制御を実現しているに過ぎません.したが
に至りません. って,アクセス制御に関係ない攻撃には何の効果
もありません.
●監査ログの効果
また,監査ログの機能で説明したように,セキ ¡バッファオーバーフロー攻撃自体
ュリティ設定で許可されたアクセスに対してもロ たとえばバッファオーバーフロー攻撃自体には
グを取ることができます.このため,あるロール 対処できません.あくまでバッファオーバーフロ
のユーザが行う操作,たとえば Web ページ管理者 ー攻撃で侵入されても被害が最小になるようにア
による Web ページの更新などを監査することがで クセス権限を設定できるだけです.しかし,バッ
き,不正な操作に対する抑止効果があります. ファオーバーフロー攻撃は,次で説明する権限内

●図 8 Slapper ワーム攻撃に対するSELinux の効果

ワーム感染マシン Linuxマシン
SELinuxでは…
…xx/bin/sh…xx… ②シェル起動 シェル起動不可
③/tmpに攻撃プログラム書き込み 書き込み制限
④攻撃プログラムをコンパイル コンパイラ実行不可
①Apacheに接続,攻撃コードを送信 ⑤攻撃プログラムを実行 攻撃プログラム実行不可

実際の被害に至らない

バックドア設置,ほかのマシンに攻撃

Oct. 2004 - 31
での攻撃につながる恐れがあります.したがって, ン管理不備によるなりすまし攻撃などには対処で
exec-shield などの直接的な対策も同時に適用すべ きません.SELinux は,Web アプリケーションが
きでしょう. 利用できるリソースを制限できますが,Web アプ
リケーションがそれらのリソースを正しく利用し
¡DoS 攻撃 ているかどうかをチェックしているわけではない
また,DoS 攻撃なども SELinux で対処すること のです.
はできません.DoS 攻撃はネットワークや CPU, このような攻撃は,与えられた権限内でリソー
メモリなどのリソースの負荷を上げ,サービスを スを不正に利用するものです.対策としては,セ
停止させることが目的です.リソースへの不正な キュアなプログラミングを行うなどの必要があり
アクセスを目的としているわけではありませんの ます.
で,基本的に SELinux のアクセス制御で対処でき
る攻撃ではありません.このような DoS 攻撃は, ¡悪意のある管理者
ハードウェアやソフトウェアで対策する必要があ さらに,RBAC のところで説明しましたが,管理
ります. 者による悪意のある操作は,監査ログを取ることで
抑止効果を図る以上のことは望めません.したがっ
●与えられた権限内での攻撃 て,定期的なログ監査や管理者に対するセキュリテ
すでに説明したように,SELinux ではプロセスや ィ教育など運用でカバーする必要があります.
ユーザに必要最小限のアクセス権限を与えること
ができます.そのため,たとえ乗っ取られたり, ● OS 自体のセキュリティホール
悪意のある操作が行われても,アクセス権限を越 SELinux はカーネル,とくに LSM を基盤として
えるような攻撃はできません.しかし,裏を返せ います.このため,SELinux のセキュリティは,こ
ばアクセス権限内での攻撃や悪意のある操作は可 れらに依存していると言えます.たとえば,強制
能なわけです. アクセス制御の基盤である LSM のセキュリティホ
ールなどで,セキュリティチェックの回避が可能
¡アプリケーションの不備 であった場合,その攻撃には SELinux では対処で
たとえば,Web アプリケーションにおけるクロ きません.したがって,OS 自体のセキュリティホ
スサイトスクリプティングの脆弱性や,セッショ ール対策は必要不可欠でしょう.s

●表 1 SELinux の限界

SELinux では… ほかの対策方法

■アクセス制御に関係ない攻撃

バッファオーバーフロー攻撃自体 アクセス制御による被害の最小化 exec-shield など

Dos 攻撃 − ハード/ソフトウェアでの対策

■与えられた権限内での攻撃

クロスサイトスクリプティング − セキュアなプログラミング

セッション管理不備によるなりすまし攻撃 − セキュアなプログラミング

管理者による悪意のある操作 監査ログによる抑止 セキュリティ教育や監査など

■ OS 自体のセキュリティホール

LSM のセキュリティホール − セキュリティパッチ

32 - Software Design
特集● SELinux 大全

日立ソフトウェアエンジニアリング㈱ 才所秀明 SAISHO Hideaki ● saisho@hitachisoft.jp

本稿では,SELinux を Fedora Core 2 にインストールする方法や,SELinux を使用するうえ


で理解しておくべきこと,基本的な操作方法について解説します.とくに「SELinux 機能のモード」
「ロール」に関しては,このあとの章でも出てきますので,しっかりと理解してください.

SELinux 機能のモードについて説明します.

SELinux 機能について SELinux 機能には「permissive モード」と


「enforcing モード」の 2 種類あります.
Fedora Core 2(以下 FC2)の SELinux に関連す
るパッケージは,表 1 の 6 つです.このうち,OS ● permissive モード
のインストールと同時にデフォルトでインストー permissive モードは,セキュリティポリシ設定に
ルされるのは,上の 4 つです.デフォルトインス 違反するアクセスを,ログを出力したうえで実行
トールでは,セキュリティポリシ設定の変更はで します.このモードは,セキュリティポリシの設
きませんが,デフォルトのセキュリティポリシ設 定を変更したときや,デフォルトの設定がないア
定に基づいた SELinux 機能を利用できます. プリケーションの設定を作成したとき,アプリケ
ただし,デフォルトインストールでは SELinux ーションが動作しないなどの障害が発生したとき
機能が無効となっています. 用いられます.セキュリティポリシの変更につい
ては後で詳しく述べますが,基本的に permissive
SELinux 機能のモード
モードで出てきたログをベースにセキュリティポ
SELinux 機能を有効にする方法を説明する前に, リシの変更を行います.

●表 1 SELinux 関連のパッケージ

パッケージ名 解説

kernel SELinux が組み込まれたカーネル

libselinux SELinux API デフォルトでイ


ンストールされ
policy デフォルトのセキュリティポリシ(バイナリ形式で直接編集は困難) るパッケージ

policy-coreutil セキュリティポリシを扱うためのコマンド群

policy-source デフォルトのセキュリティポリシのソースファイル(テキスト形式)

checkpolicy セキュリティポリシのソースファイルをバイナリ形式に変換するツール

Oct. 2004 - 33
● enforcing モード ② OS インストール後に有効にする方法
enforcing モードは,セキュリティポリシ設定に 「/etc/sysconfig/selinux」ファイルに OS 起動時の
違反するアクセスに対して,ログを出力してアク SELinux 機能の設定が書かれています.OS インス
セスを実行しません.あたりまえですが通常運用 トール時に有効にしていないと「SELinux=disable」
時には,この enforcing モードを利用しなければ, となっています.SELinux を有効にするためには,
不正なアクセスから PC を守ることはできません. モードに対応して「SELinux=enforcing」もしくは
「SELinux=permissive」に変更します.
SELinux 機能の有効化と 次に,ファイルのタイプ付けを行う「fixfiles
初期化操作 relabel」コマンドを実行し,その後リブートします.
◆◆◆
SELinux 機能の有効化
SELinux 機能を次回の OS 起動時から無効化する
では,SELinux 機能を有効にする方法を説明し ことも簡単です.
「/etc/sysconfig/selinux」ファイ
ましょう.有効にする方法は非常に簡単で,OS イ ルで「SELinux=disable」に戻してリブートすれば
ンストール時に有効にする方法と,OS インストー 無効化します.この無効化を行うとファイルのタ
ル後に有効にする方法の 2つがあります. イプ付けがすべて失われます.したがって,再度
有効化を行う場合には②と同様「fixfiles relabel」
① OS インストール時に有効にする方法 コマンドの実行も必要です.
インストーラ起動時に「linux selinux」と入力し
初期化操作
て起動します(図 1).すると「ファイヤーウォー
ル設定画面」(図 2)で SELinux のオプションを設 SELinux 機能の有効化は以上で完了ですが,これ
定できるようになります.このオプションの意味 だけでは X 関連のタイプ付けが不十分で,X がうま
は,
「アクティブ」が「enforcing モード」に,
「警 く動作しません.そこで,再度タイプ付けを行う
告」が「permissive モード」に対応しています.ま には,以下の手順を踏む必要があります.
た,「ファイアウォールを無効にする」は誤訳で
「SELinux を無効にする」が正しいです.このオプ ①テキストログインにします.GUI のログイン画
ションは SELinux 機能を無効にしてインストール 面で ö + ú +!を押したり,ブートパ
することを意味します.とりあえず,
「アクティブ」 ラメータを変更するなどしてください.
でインストールを進めましょう. ② root ユーザでログインします.ロールについて
は後ほど説明しますが,ここではデフォルトの

●図 1 FC2 インストーラの起動画面 ●図 2 「ファイヤーウォール設定」画面

34 - Software Design
2 章◆これで完璧! SELinux のインストール/基本操作

「sysadm_r」を選択してください.多くのメッセ を作成する場合には,専用のロールを作ることが
ージが出る場合もありますが,• で飛ばし 重要です.
てしまって良いです.
選択可能なロール
③再度「fixfiles relabel」コマンドを実行します.②
の警告メッセージが操作の支障になる場合は, FC2 では,ユーザが選択可能なロール設定が甘
ö + ú + # で別の端末に切り替えま くなっていて,root ユーザは「sysadm_r」と
しょう. 「staff_r」が,一般ユーザは「sysadm_r」と
④リブートします. 「user_r」が選択可能になっています.どちらも
「sysadm_r」の選択が可能となっているのは,使い
以上で,X も正常に動作するようになります.ど やすさのためです.
うしてもインストールがうまくいかない場合は, 一般ユーザに「sysadm_r」ロールを選択可能に
カーネルのブートパラメータに「enforcing=0」と することは,通常の Linux で root 権限を与えること
入力してブートしてください.すると,permissive と同じで,非常に危険と思われるかもしれません
モードでブートされます.次に「/etc/sysconfig/ が,実はそれほど危険ではありません.
selinux」ファイルの内容を確認して,「fixfiles 本特集 1 章の図 4 を思い出してください.LSM は
relabel」コマンドを実行してください.最後にリ rootでも回避できないセキュリティチェックを実現
ブートします. していますが,パーミッションチェックをなくし
ているわけではなく,パーミッションチェックは
デフォルトのロールに 依然として有効です.したがって「sysadm_r」の
ついて 一般ユーザは,
「sysadm_r」の root ユーザより弱い
FC2 では,policy パッケージによって,通常利用 権限しかありません.ただし,su コマンドで root
に問題ない程度のデフォルトのセキュリティポリ ユーザになると同じ権限を持つようになります.
シ設定がなされています.そこで基本操作を説明
する前に,デフォルトのロール設定について説明 基本操作
します.

デフォルトで用意されているロール ログインとロール確認/変更

FC2 では「staff_r」
「user_r」
「sysadm_r」の 3 つ では,実際にログインしてみましょう.
のロールがデフォルトで用意されています.
「staff_r」と「user_r」は一般ユーザ用のロールで ●ログイン
す.ただし,「staff_r」は「user_r」が起動したプ ¡テキストログイン
ロセスの停止権限など,
「user_r」より強い権限を テキストログインでは,ログイン時にロール選
持っています. 択ができるようになっています(図 3)

「sysadm_r」はシステム管理者用のロールで,ほ
とんどすべて管理が可能となっています.セキュ ●図 3 テキストログイン時のロール選択
リティポリシ設定の変更などシステム全体の管理 Localhost login: root
Password:
が必要な場合に利用します.
Your default context is root:sysadm_r:sysadm_t

ただし,
「sysadm_r」は非常に強い権限を持って Do you want to choose a different one? y
[2] root:staff_r:staff_t

いますので,当然乱用するのは良くありません.
Enter number of choice:
Web サイト管理者やメーリングリスト管理者など 何も入力せずに •を押すと nとして実行される

Oct. 2004 - 35
●図 4 ロールの確認と変更 ●図 5 プロセスのドメイン確認
#getcon # ps -eZ ②ドメイン
root:staff_r:staff_t ① PID CONTEXT COMMAND
# newrole -r sysadm_r 1 system_u:system_r:init_t init [5]
Authenticating root. ② 2 system_u:system_r:kernel_t [ksoftirqd/0]
Password: 3 system_u:system_r:kernel_t [events/0]
# getcon 4 system_u:system_r:kernel_t [kblockd/0]

root:sysadm_r:sysadm_t …

①プロセスのセキュリティコンテキスト

① root でログインすると,デフォルトのロール以 たとえば,グラフィカルログイン,ssh ログイン


外を選択したいかを聞いてきます.デフォルト したときの状態で「newrole -r sysadm_r」を実行し
のロールで良い場合は,n もしくは • を押 てみましょう.するとパスワードが要求されます
せば,デフォルトのロールでログインします. ので,ログインしたときのユーザ(ここでは root
② y を押すとほかに選択できるロールが表示され ユーザ)のパスワードを入力してください(図 4 ②)

ます.なお,テキストログインでのデフォルト 以上でロールの変更が終了します.
のロールは,root ユーザが「sysadm_r」
,一般ユ ロール変更がされていることを「getcon」コマ
ーザが「user_r」となっています. ンドで確認してみましょう.図 4 ③のように変更さ
れていることがわかります.root ユーザは
¡グラフィカルログイン,ssh ログイン 「sysadm_r」と「staff_r」が選択可能ですが,ふだ
グラフィカルログインや ssh ログインでは,ログ んは「staff_r」を使い,管理時に「sysadm_r」を利
イン時にロール選択ができません.デフォルトの 用すれば,操作ミスによる被害を抑えることがで
ロールはグラフィカルログインや ssh ログインで きます.
は,rootユーザが「staff_r」
,一般ユーザが「user_r」
ドメインとタイプの確認
となっています.
本特集 1 章の TE の説明で,「プロセスにはドメ
●ロールの確認 インを,ファイルなどのリソースにはタイプを付
ログイン中の画面表示は,どのロールを選択し ける」と説明しました.ここでは実際どんなドメ
ても同じなので,現在のロールを知ることはでき インやタイプが付けられているかを確認してみま
ません.試しに,テキストログインにして,root しょう.
ユーザの「staff_r」を選択してログインしてみてく SELinux では,この確認のために「ps」や「ls」
ださい. コマンドが拡張されています.ドメインやタイプ
現在のロールを確認ために,
「getcon」コマンド の確認には「-Z」オプションを付けます.
が用意されています.
「getcon」コマンドを実行す では「ps -eZ」を実行してみましょう(図 5)
.「-
ると,ユーザ名/ロール名/ユーザシェルのドメ Z」オプションを付けると,図 5 ①の情報が出力さ
イン名が出力されます.root ユーザで「staff_r」を れます.これは,プロセスのセキュリティコンテ
選択してログインした後では,図4 ①のように表示 キストと呼ばれるもので,
「起動元のユーザ:起動
されます. 元のロール:ドメイン」で構成されています.シ
ステムが立ち上げたプロセスは,起動元のユーザ
●ロールの変更 が「system_u」
,起動元のロールが「system_r」と
次に,ロールの変更をしてみましょう.ロール なります.プロセスのドメインは図 5 ②に出力され
変更には「newrole」コマンドが用意されています. ています.
使い方は,
「newrole -r [ロール名]」です. 次に,
「ls -Z」を実行してみましょう(図 6)
.「ps」

36 - Software Design
2 章◆これで完璧! SELinux のインストール/基本操作

●図 6 ファイル/ディレクトリのタイプ確認
#ls -Z /etc/ ②タイプ


-rw-r--r-- root root system_u:object_r:adjtime_t adjtime
drwxr-xr-x root root system_u:object_r:etc_t aep
-rw-r--r-- root root system_u:object_r:etc_t aep.conf
-rw-r--r-- root root system_u:object_r:etc_t aeplog.conf
drwxr-xr-x root root system_u:object_r:etc_t alchemist
-rw-r--r-- root root system_u:object_r:etc_aliases_t aliases
-rw-r----- root smmsp system_u:object_r:etc_aliases_t aliases.db


①ディレクトリやファイルのセキュリティコンテキスト

●図 7 モードの確認と変更
コマンドのときと同様に,図 6 ①の情報が出力され
# getenforce
ます.これは,ファイルやディレクトリのセキュ enforcing ①
# setenforce 0
リティコンテキストです.SELinux では,ドメイン ②
setenforce: setenforce() failed
# newrole -r sysadm_r
もタイプも同じように扱うので,起動元のユーザ Authenticating root. ③
Password:
と起動元のロールにダミーの値が入っています. # setenforce 0 ④
# getenforce
ファイルやディレクトリのタイプは図6 ②に出力さ ⑤
permissive

れています.
更していないのでエラーが返されます.モード
モードの確認と変更
変更のためには,
「/selinux/enforce」を書き換え
●モードの確認方法 る権限が必要となります.この権限は,root ユ
現在動作している SELinux 機能のモードが, ーザで,かつ「sysadm_r」ロールでなければな
「permissive モード」と「enforcing モード」のどち りません.そのため,
「sysadm_r」でも一般ユー
らなのかという情報は「/selinux/enforce」ファイ ザの場合は同じようにエラーとなります.
ルに記述されています.この内容が 0 なら ③「sysadm_r」になります.
「permissive モード」で 1 なら「enforcing モード」 ④「setenforce」コマンドを実行します.今度はエ
です. ラーになりません.
したがって,このファイルを more コマンドなど ⑤モードを確認してみると,「permissive モード」
見ることでモードを確認できますが,
「getenforce」 になっていることがわかります.
コマンドでも確認できます.また,モード変更も 緊急時の起動モード変更と
「/selinux/enforce」を書き換えるという方法もあり SELinux の無効化
ますが,「setenforce」コマンドが用意されていま ● OS 起動時にモードを変更する方法
す. 先ほどは起動中のモード変更を説明しましたが,
OS 起動時にモードを変更して起動したい場合もあ
●実際にモードを変更してみる るでしょう.たとえば,
「enforcing モード」でうま
では,enforcing モードで起動し,root ユーザの く起動しないため「permissive モード」で起動した
「staff_r」でログインして,実際のモード確認とモ い場合などです.この場合は GRUB の起動画面で
ード変更を行ってみましょう(図 7)
. ブートパラメータに「enforcing=0」と付け加える
ことで,permissive モードで起動させることができ
①「getenforce」コマンドで現在のモードが出力さ ます.
れます.
②試しに「setenforce」コマンドで「permissive モ ● SELinux の無効化
ード」に変更しようとしています.ロールを変 また,SELinux 機能を無効化し,普通の Linux と

Oct. 2004 - 37
●図 8 ログの例
①時刻 ② denied(拒否)or ③アクセスベクタ
granted(許可)
1089957396.658
audit(1089957396.658:0): avc: denied { read
read } for
pid=2299 exe=/bin/bash name=log dev=hda2 ino=9617430 ④プロセスやリソースの情報
scontext=root:staff_r:staff_t ⑤ドメイン
tcontext=system_u:object_r:var_log_t tclass=dir ⑥タイプとクラス

して起動させることもできます.この場合は ことができます.
GRUB の起動画面でブートパラメータに 先ほどの「less /var/log/message」の実行に対し
「selinux=0」と付け加えることで,SELinux を無効 て図 8 のようなログが含まれていることが確認でき
化することができます. るでしょう.

●注意点 ①ログが記録された時刻(カーネル時刻)です.
これら起動時の SELinux 機能モード変更や無効 ②ログの意味です.図 8 の例では,拒否されたた
化は,一時的なものです.次回以降も同じように めのログであることを示しています.
起動させるためには,
「SELinux 機能の有効化」の ③ログの対象となったアクセスベクタです.ここ
項で説明したように「/etc/sysconfig/selinux」を編 では,ログの対象が読み込みのアクセスベクタ
集する必要があります. read であったことを示しています.
また,ブートパラメータで SELinux を無効化し ④アクセス元のプロセスやアクセス先のリソース
た場合でも,
「/etc/sysconfig/selinux」の設定で無 の情報です.プロセス ID やプロセスの元となっ
効化した場合と同様に,ファイルやディレクトリ た実行ファイル名,アクセス先のリソース名な
のタイプ付けが失われてしまいます.そのため, どが含まれます.この例では,「/bin/bash」が
後で SELinux 機能を有効にする場合には,
「fixfiles 「log」に対してアクセスしようとしたことなどを
relabel」コマンドを実行することを忘れないでく 示しています.この部分は,表示される情報が
ださい. ログによって異なる場合があり,完全ではない
ですが,プロセスやリソースを特定するために
SELinux のログの見方
役に立ちます.
SELinux のログについては,本特集 1 章「監査ロ ⑤アクセス元のプロセスのドメインを含むセキュ
グ」の項でも触れましたが,もう少し詳しく見て リティコンテキストです.この例では「staff_t」
いきましょう. SELinux のログは,ほかのシステ ドメインであることを示しています.「staff_r」
ムログと同様に「/var/log/message」に保存され でログインしたので,「/bin/bash」が「staff_t」
ます.SELinux のログを見るためには,このファイ ドメインで動いていたことがわかります.
ルを直接見ても良いですし,
「dmesg」コマンドを ⑥アクセス先のリソースタイプを含むセキュリテ
利用しても良いでしょう. ィコンテキストとクラスです.
「var_log_t」タイ
プで dir クラスにアクセスしようとしたことを示
●実際にログを見てみる しています.
では,root ユーザの「staff_r」でログインし, ファイルの新規作成/変更と
「less /var/log/message」でログを見てみましょう. タイプ付け
といっても「staff_r」では,直接ファイルを見るこ ●タイプ付けの特徴と問題
とはできません.しかし,root ユーザの「staff_r」 新規作成されたファイルは,ディレクトリと同
でも,
「dmesg」コマンドを使うことでログを見る じタイプが付けられます.この特徴がファイルを

38 - Software Design
2 章◆これで完璧! SELinux のインストール/基本操作

●図 9 ファイル変更時のタイプ
# ls -Z named.conf

-rw-r--r--+ root root system_u:object_r:named_conf_t named.conf
# emacs named.conf ②
# ls -Z named.conf
-rw-r--r--+ root root root:object_r:etc_t named.conf ③
# chcon system_u:object_r:named_conf_t named.conf ④
# ls -Z named.conf
-rw-r--r--+ root root system_u:object_r:named_conf_t named.conf ⑤

新規作成する際に問題になることはほとんどあり 最後の方法は,タイプ付け変更コマンドである
ません. 「chcon」コマンドを使う方法です.先ほどの図 9
しかし,ファイルを変更する際に,この特徴が をご覧ください.
問題になります.Emacs などの通常のエディタで
ファイルを変更すると,ファイルの消去と新規作 ④「chcon」コマンドでファイルのタイプを元に戻
成と見なされ,ファイルのタイプがディレクトリ しています.
と同じものになります. ⑤タイプが元に戻っていることがわかります.
たとえば,
「/etc/named.conf」の変更を行ってい ◆◆◆
る図 9 で見てみましょう. 1 つのファイルのタイプ付けを変更する場合には
「chcon」コマンドが有効でしょう.
①変更前のタイプが「named_conf_t」であること このように,ファイルのタイプ付けを正しくす
がわかります. ることはできますが,ファイル変更時にいちいち
② emacs コマンドで適当な変更を行い,保存して ファイルのタイプ付けを気にするのは非常に大変
みましょう. です.
③先ほどと同じように見てみると,タイプが etc_t そこで,FC2 の vi コマンドはタイプ付けが保存
となっていることが分かります. されるように拡張されています.ファイル変更に
◆◆◆ はvi コマンドを利用するほうが効率的でしょう.
このようにタイプが変更されてしまうと,TE で
の設定が正しく動作しなくなります. 最後に

●タイプ付け問題の解決方法 以上が,SELinux 機能の有効化と基本的な操作


変更したファイルのタイプを戻すにはいくつか です.セキュリティポリシ設定の変更を行わない
方法があります. で使う場合には,これだけ知っていれば十分でし
1 つは,
「fixfiles relabel」コマンドを行う方法で ょう.
す.これにより,すべてのファイルが正しいタイ セキュリティポリシ設定の変更では,
プ付けに戻ります.ただし,この処理には非常に 「permissive モード」と「sysadm_r」を使うことに
時間がかかります. なるので,本稿で紹介したモードやロールの変更
もう 1 つの方法は,一部のファイルにラベル付け 方法は覚えておきましょう.
を行う「setfiles」コマンドを利用する方法です. また,
「タイプ付け問題の解決方法」の項で述べ
コマンドの詳細は省略しますが,このコマンドも たように,ファイルの変更には vi コマンドを使う
多くのファイルのラベル付けを行うコマンドであ ほうが良いです.vi コマンドに慣れていない人も,
り,1 つのファイルを変更したときに利用するには これを機に使ってみてはいかがでしょうか.s
適切ではありません.

Oct. 2004 - 39
特集● SELinux 大全

日本 SELinux ユーザ会準備委員会 中村雄一 NAKAMURA Yuichi ● ynakam@selinux.gr.jp

SELinux の動作は,ポリシファイルに書かれている設定に依存しています.SELinux を使ってセ


キュアなシステムを構築できるか否かは,ポリシファイルの設定記述にかかっています.本章では,
SELinux のポリシファイルと,実用上必要なポリシ記述の基礎知識を解説します.

policy.17 とは独立して,file_contexts ファイルに記

ポリシファイルについて 述されています.このファイルはテキスト形式で
すが,編集内容が保持されないため,通常は編集
しません.
ポリシファイルの用意

SELinux 上のプロセスは,デフォルトでは何も ポリシのソースファイル


権限を持っておらず,必要な権限を 1 つ 1 つ許可す
ることで設定します.システムを正常に動作させ 設定を編集するためには,ポリシのソースファ
るために必要な設定項目は,数万∼数十万にもお イルと呼ばれるファイルが必要になります.ソー
よび,このような膨大な設定をゼロから行ってい スファイルを編集した後,ソースファイルを後ほ
ては,とても SELinux は使えません. ど紹介する方法で policy.17, file_contexts に変換し,
ポリシのサンプルを入手し,そのサンプルをカ 設定を反映します.今後「ポリシ」と言った場合
スタマイズして使用するのが一般的です.幸いに はとくに断りがない限り,こちらのソースファイ
して,Fedora Core 2 にはポリシファイルも一緒に ルを指すことにします.
添付されているので,大きな設定変更の必要なく ポリシのソースファイルを
使用できます. インストールする
ポリシのソースファイルはデフォルトではイン
ポリシファイルの本体
ストールされていないため,以下の2 つのパッケー
ポリシファイルの本体は,
「/etc/security/selinux」 ジをインストールします.
ディレクトリに格納されている「policy.17」と
¡policy-sources
「file_contexts」の 2 つです.policy.17 ファイルは,
ポリシのソースファイル
TE / RBAC /ドメイン遷移の設定が記述されてい
¡checkpolicy
ます.このファイルはバイナリ形式であるため,
ソースファイルをバイナリ形式のポリシ
直接編集することはできません.
(policy.17)に変換するコマンド
ファイルにどんなタイプを付与するかの設定は,

40 - Software Design
3 章◆ SELinux 設定方法の基礎∼ポリシファイル編集法

これらは,Fedora Core 2 のインストールメディ 張子のファイルが設定ファイルで,表1 のように分


アに入っていますので,図 1 のようにインストール 割して格納されています.これらのファイルは,
します. 通称「te ファイル」と呼ばれます.
とくに重要なのが program ディレクトリの中の
ポリシの構造
「アプリケーション名.te」というファイルです.た
ポリシのソースをインストールすると, とえば,apache.te というファイルでは Apache に関
「/etc/security/selinux/src/policy」というディレク 連する設定が行われています.
トリが新たに生成されています.このディレクト
リ下には複数のディレクトリ/ファイルがあり, ● file_contexts ディレクトリと fc ファイル
ここに設定が記述されています. このディレクトリの下にあるファイルで,ファ
これらのうち,設定を行ううえで最も重要なも イルにどのようなタイプを与えるかの設定が行わ
のは「domains ディレクトリ」と「file_contexts デ れています.
「fc」という拡張子のファイルに,表
ィレクトリ」です. 2 のように格納されています.types.fc ファイルと,
program 以下の「アプリケーション名.fc」ファイル
● domains ディレクトリと te ファイル が重要で,よく編集します.これらのファイルは
このディレクトリの中のファイルで,TE /ドメ 通称「fc ファイル」と呼ばれます.
イン遷移の設定が行われています.
「te」という拡 ◆◆◆
なお,file_contexts/program 以下
●図 1 ポリシのソースファイルをインストール
の fc ファイルは,domains/program
#rpm -ivh policy-sources-1.11.3-3.noarch.rpm checkpolicy-1.10-1.i386.rpm
または 以下に存在する te ファイルと対にな
#yum install policy-sources checkpolicy
っています.たとえば,
●表 1 domains ディレクトリの構造 hoge.fc というファイル
ファイル/ディレクトリ 意味 を file_contexts/program
user_r,staff_r ロールのシェルに対するドメイン user_t, に作成した場合,同時に
user.te
staff_t に関する設定が行われています hoge.te ファイルを
sysadm_r ロールのシェルに対するドメイン sysadm_t の domains/program に作成
admin.te
設定が行われています しないと,設定反映時に
カーネル用のドメイン kernel_t の設定が行われていますが, エラーになります.
misc
このディレクトリの存在意義は薄れてきています

このディレクトリ下の「アプリケーション名.te」という 設定の反映
program
ファイルで,アプリケーションに関連する設定が行われています
ポリシを編集しただけ
●表 2 file_contexts ディレクトリの構造 では,設定は反映されま
ファイル/ディレクトリ 意味 せん.設定を反映する操

すべての fc ファイルを 1 つにまとめたものです.設定反映時に 作を行う必要がありま


file_contexts 動的に生成されるため,このファイルを編集しても編集内容は す.設定の反映は
反映されません
¡ポリシをカーネルに読
misc 使われていません
み込ませる
types.fc システムファイルに関連のタイプ付けが記述されています
¡ファイルのタイプ付け
「アプリケーション名.fc」というファイルに,アプリケーション
program を反映する
に関連したファイルのタイプ付けが記述されています

Oct. 2004 - 41
という 2 段階になっています.設定を反映する場合 定されているとおりに付与しなおします.
は,root ユーザかつ sysadm_r ロールでログインし ただし,fc ファイルを編集するたびに全ファイ
ます. ルのタイプを付与しなおすのは時間がかかります.
作業ディレクトリは,必ずポリシのディレクト そこで,次のように setfiles コマンドを使えば,タ
リ(/etc/security/selinux/src/policy)とします. イプ付けを変えたディレクトリに対してのみ,設
定反映を行うことができます注 1.
# cd /etc/security/selinux/src/policy
# setfiles file_contexts/file_contexts
以下,断りがない限り,カレントディレクトリは
(タイプを変更したディレクトリ) (実際は 1 行)
このディレクトリであるとします.

●ポリシをカーネルに読み込ませる 設定が必要な場合
# make reload
domains ディレクトリ,file_contexts ディレクト
と実行することによって,te ファイルの内容を 1 つ リの下には,多くのアプリケーションに関するポ
にまとめ,バイナリ形式のポリシ policy.17 に変換 リシが用意されていますが,すべてのアプリケー
し,ポリシをカーネルに読み込ませます.te ファ ションに対するポリシが用意されているわけでは
イルのみ編集した場合は,これだけで設定を反映 なく,ポリシの整備状況がアプリケーションによ
できます. ってばらつきがあります.ポリシの整備状況によ
って,必要な設定が異なってきます.表3 にポリシ
●ファイルのタイプ付けを反映する の整備状況を示します.
fc ファイルを編集し,ファイルのタイプ付けを そのまま使用できる
変更した場合は,make reload だけでは設定は反映 アプリケーション
されません.make reload を行った後, 表 3a のアプリケーションについては,とくに
何も設定せずに動作します.つまり,プロセスに
# make relabel
はドメイン遷移により適切なドメインが割り当て
または
られ,ドメインの権限設定も揃っています.たと
# fixfiles relabel
えば,Apache(/usr/sbin/httpd)は,
「httpd_t」ド
を実行し,全ファイルのタイプを fc ファイルに設 メインを付与され,必要なファイルにきちんとア

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

make relabel と fixfiles の注意点

make relabel やfixfiles コマンドを使うと,/tmp を消去 さらに,これらのコマンドを使った後は,一度ログアウ


してしまいます.とくにX を使っている場合はX が動作し トして再度ログインする必要があります※.なお,setfiles
なくなりますので注意が必要です. コマンドの場合は,これらの問題は起こりません.

※端末ファイルのタイプが書き換えられるため,コマンドがコンソールにアクセスできなくなり,アクセス拒否ログが出力されます.
そこで,ログアウトすることで端末ファイルのタイプをリセットしています.

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

注 1)setfiles を使う場合は,あらかじめmake reload をする必要があります.

42 - Software Design
3 章◆ SELinux 設定方法の基礎∼ポリシファイル編集法

クセスできるような設定が施されています. とした場合に相当します.設定が揃っていないと,

そのままでは動作しない アプリケーション起動時にドメイン遷移が起きず,
アプリケーション アプリケーションに対応したドメインが付与され
しかし,表 3b ∼ d のアプリケーションを動作 ません.その場合は,起動スクリプトのドメイン
させようとすると,設定が必要になります.設定 「initrc_t」または,ユーザシェルのドメイン
が必要になる理由は,大きく以下の2 つに分けられ (sysadm_t,user_t,staff_t)をそのまま引き継いで
ます. アプリケーションが動作します.
アプリケーションによっては,これらのドメイ
q適切なドメインが割り当てられるが, ンで正常に動作する場合もあります.しかし,こ
アプリケーションが動作しない れらのドメインは,大きな権限を持っています.
表 3b のアプリケーションを動作させようとし とくに,initrc_t,sysadm_t はシステムに致命的な
た場合に相当します.アプリケーションに適切な 被害を及ぼしうる権限を持っています.このよう
ドメイン注 2 が割り当てられても,必要なリソース な大きな権限でアプリケーションを動作させてし
へのアクセス権限がなければ,アプリケーション まっては,
「プロセスは最小限の権限で動作するた
は正常に動作しません. め,侵入されても被害は最小限」という SELinux
たとえば,vsftpdはftpd_tドメインで動作していま の恩恵を受けられなくなってしまいます注 3.
す.しかし,ftpd_tドメインは,FTP公開ディレクト
今回紹介する設定方法
リへのアクセス権限を持っていないため,当然
vsftpd は動作しません.このような場合は,拒否さ 本特集では,qの場合に,SELinux 上でアプリケ
れたアクセスを許可する設定をする必要があります. ーションを正常に動作させるための設定方法を紹
介します.今回紹介する設定方法だけで,Web サ
wアプリケーションに適切なドメインが ーバ/ FTP サーバ/ネームサーバ/メールサーバ
割り当てられない のような主要なサーバアプリケーションをセキュ
表 3c ∼ d のアプリケーションを動作させよう アに動作させることができます.

●表 3a ポリシが整備されているアプリケーション ●表 3b 簡単な設定追加が必要なアプリケーション

アプリケーション 設定ファイル アプリケーション 設定ファイル

Apache apache.te,apache.fc CGI,PHP apache.te,apache.fc

sendmail sendmail.te,sendmail.fc vsftpd ftpd.te,ftpd.fc

BIND named.te,named.fc Postfix postfix.te,postfix.fc

OpenSSH ssh.te,ssh.fc

Samba samba.te,samba.fc

canna canna.te,canna.fc ●表 3d ポリシが用意されて


いないおもなアプリケーション

●表 3c 大きな設定変更が必要なアプリケーション アプリケーション

アプリケーション 設定ファイル FreeWnn

PostgreSQL postgresql.te,postgresql.fc IIIMF

MySQL mysqld.te,mysqld.fc Tomcat

注 2)ここで言う「適切なドメイン」とは,アプリケーションに関連した名前のドメインが割り当てられている場合のことを言います.
注 3)これらのドメインで動作している場合でも,ローカルコマンドなら問題ありません.

Oct. 2004 - 43
●wの対処法
③アクセス拒否ログを元に「自動的に」設定を追
ただし,wについては,今回の方法でとりあえ
加します.簡単ですが安全性は落ちます
ずは動作させることができますが,大きな権限で
④アクセス拒否ログを元に「手動で」設定を追加
動作することになるため安全ではありません.安
します.より安全性を高める場合はこちらを選
全性が低くなることを承知して動作させるか,ア
びます
プリケーションを使わないことを検討する必要が
あります.
本来は,適切なドメインが割り当てられるよう vsftpd を設定してみる
に設定を記述する必要があります.しかし,この
作業は高度な知識を必要とするため,本特集では ここでは,vsftpd の設定を例として,この流れに
紹介しません.コミュニティからポリシが公開さ 沿って設定をします.SELinux上での,vsftpdはFTP
れるのを待つのが得策です.たとえば, 公開ディレクトリにファイルを公開できません.
PostgreSQL を動作させるためのポリシは, まず,FTP 公開ディレクトリにファイルを公開
SELinux ユーザーズメーリングリストに公開され できないことを確認します.ダミーの公開ファイ
注4
ています .また,Tomcat についても,完全では ル hoge.txtを作成します.
注5
ないものの,動作方法が公開されています .
# echo "hoge" > /var/ftp/pub/hoge.txt

一般的な設定追加方法 vsftpdを起動します.

# /etc/rc.d/init.d/vsftpd start
では,アプリケーションがうまく動作しない場
合の設定方法を見てみましょう.設定の追加の手 FTP サーバにアクセスし,ユーザ名 Anonymous,
順は図 2 のようになります. パスワードなしでログインします.すると,ログイ
ンは成功しますが,公開ディレクトリにあるはずの
①アプリケーションが動作しない原因が SELinux
ファイル「hoge.txt」を見つけることができません.
の設定にあるかどうかを切り分けます
②アプリケーションが動作しない原因が SELinux 問題切り分け
であった場合,ログをチェックし,どんな権限
ポリシのディレクトリに移動します.
が足りないのかを調べます.実際の設定作業に
ついては,安全性と簡単さのどちらを重視する # cd /etc/security/selinux/src/policy
かで 2 通りの方法があります
以下,このディレクトリがカレントディレクト
●図 2 設定の追加手順
リであるとして話を進めていきます.
まずは,SELinux の設定の問題であるか否か,問
①問題切り分け
題の切り分けを行います.切り分けポイントは以
下の 2 ヵ所です.
②動作テストおよび
ログのチェック

●アプリケーション自体の問題なのか確認
③簡易設定 ④安全な設定 まずは,SELinux が無効の状態でアプリケーショ
ンが正しく動作することを確認します.permissive

注 4)http://www.selinux.hitachi-sk.co.jp/selinux-users-ml/200407.month/399.html
注 5)http://www.selinux.gr.jp/documents/FC2-SELinuxmemo.html

44 - Software Design
3 章◆ SELinux 設定方法の基礎∼ポリシファイル編集法

モードにして,アプリケーションの動作テストを を実行し,すべてのファイルのタイプを正しく付
行い,正しく動作することを確認します. 与しなおし,再度動作確認します.
permissive モードならば,SELinux のアクセス制御 今回の vsftpdの場合は,fixfiles relabel をしても公
機能は無効になっています. 開ファイルにアクセスできませんので,ファイル
のタイプ問題には関係ないことがわかります.
# setenforce 0
動作テストおよびログのチェック
再び FTP サーバにアクセスし,ユーザ名 Anony
mous,パスワードなしでアクセスすると,今度は 以上の問題切り分けを行っても,アプリケーシ
hoge.txt をダウンロードすることができます.これ ョンが動作しない場合,正常に動作するための権
で,vsftpd 自体には問題なく,問題は SELinux の設 限が足りない可能性が高いです.アプリケーショ
定にあることがわかりました. ンを動作させるための設定をポリシファイルに記
permissive モードは安全ではないですので,動作 述する必要があります.
確認の後は, どんな権限が足りないのかを調査するためには,
permissiveモードでアプリケーションをテスト動作さ
#setenforce 1
せます.テストの間出力されたログを見ることによ
にて,enforcing モードに戻しておきます. って,どんな権限が足りないのかをチェックします.
今回の vsftpd の場合は,
「アプリケーション自体
●ファイルのタイプをチェック の問題であるかどうか確認」のところで,
今まで動作していたアプリケーションが突然動 permissive モードで動作テストをしていますので,
作しなくなった場合,設定をいじる前にまずはフ このときに出力されたログをチェックします.
ァイルのタイプが適切に付与されているかどうか さきほどの動作テストで出力されたログをリス
を疑う必要があります.なぜなら,本特集2 章で紹 ト 1 に示します./var/ftp 以下の読み込みアクセス
介したように,ファイルの上書きなどでファイル が拒否されていることがわかります注 6.以降,こ
タイプの情報が変化することがあり,突然アプリ のログを元にしてこのアクセスを許可する設定を
ケーションが動作しなくなることがあるからです. 追加していきます.
このような場合は, 簡易設定:
ログから設定に単純に変換
#fixfiles relabel
アクセス拒否ログを元に設定を追加する方法は 2

●リスト1 動作テストで出力されたログ

audit(1088910368.044:261902): avc: denied { read } for pid=1708 exe=/usr/sbin


/vsftpd name=ftp dev=sda2 ino=113950 scontext=root:system_r:ftpd_t tcontext=syst
em_u:object_r:var_t tclass=dir
↑意味: vsftpd(ftpd_t ドメイン)の ftp ディレクトリ(var_t)に対する read アクセスが拒否された

audit(1088910370.215:262129): avc: denied { getattr } for pid=1708 exe=/usr/s


bin/vsftpd path=/pub/hoge.txt dev=sda2 ino=114054 scontext=root:system_r:ftpd_t
tcontext=root:object_r:var_t tclass=file
↑意味: vsftpd(ftpd_t ドメイン)の/var/ftp/pub/hoge.txt ファイル(var_t)に対する getattr アクセスが拒否された

audit(1088910374.139:262326): avc: denied { read } for pid=1708 exe=/usr/sbin


/vsftpd name=hoge.txt dev=sda2 ino=114054 scontext=root:system_r:ftpd_t tcontext
=root:object_r:var_t tclass=file
↑意味: vsftpd(ftpd_t ドメイン)の/var/ftp/pub/hoge.txt ファイル(var_t)に対する read アクセスが拒否された

※/var/ftp/pub ディレクトリへのアクセス拒否ログの出力は抑制されています.詳細はコラム「ログについてのよくあるトラブル」を参照
してください.

注 6)リスト1 のログを見るとわかるように,アクセス拒否されたファイルのフルパスがつねに表示されるとは限りません.
「path=」の後に
はフルパスが表示されますが,「name=」の後にはファイル名のみが表示されます.フルパスを知るには locate コマンドを使ったり,
「rpm -ql vsftpd」として,vsftpd に関連するファイルを表示する方法があります.
Oct. 2004 - 45
つあります.この項では,簡単に設定を追加する ●アクセス拒否ログを allow 文に変換する
方法を解説します. アクセス拒否ログには,ドメイン/タイプ/オ
ブジェクトクラス/アクセスベクタの情報が載っ
● allow 文 ているので,それをそのまま allow 文とすれば,拒
アクセスを許可するためには,「allow 文」とい 否されたアクセスを許可する設定を記述すること
う設定要素を te ファイルに記述します.allow 文の ができます(リスト 2,3)

書式は次のようになります.
● audit2allow コマンドで設定を自動化する
allowドメイン タイプ:オブジェクトクラス { アク
allow 文をいちいち手作業で記述していくのは面
セスベクタ }; (実際は 1 行)
倒なので,アクセス拒否のログを allow 文に自動的
たとえば, に変換するコマンド「audit2allow」を使うと便利で
す.audit2allow は Fedora Core 2 に標準で添付され
allow httpd_t httpd_sys_content_t:file
ています.audit2allow の書式を図 3,オプションを
{ getattr read }; (実際は 1 行)
表 4 に示します.
と記述すると,httpd_t ドメインは,httpd_sys_ では,audit2allow コマンドを使ってみましょう
content_t タイプのファイル(オブジェクトクラス (図4)

file)に getattr(ファイルの属性を得る)/ read dmesg コマンドで出力されるアクセス拒否ログ
(読み込み)アクセスができるようになります. を allow 文に変換しています.ここで出力された設

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

ログについてのよくあるトラブル

設定作業を行う場合,アクセス拒否のログを使って設 図B とします.
定していきますが,アクセス拒否のログはつねに出力され
るわけではないので注意が必要です.次のような原因でロ ③ログの取りこぼし
グが出力されない場合があります. 拒否されたアクセスが多すぎる場合,ログ出力が追い
つかず,ログが捨てられてしまうことがあります.そのた
① permissive モードでのログ出力の抑制 め,ログに対応した設定を追加し再度テストしても,な
permissive モードでは,一度出力されたログと同じロ おもアクセス拒否のログが出てうまく動作しないことがあ
グはしばらくの間出力されません.動作テストを何度も行 ります.このような場合は,正常に動作するまで動作テ
うとログが出力されず,困ることがよくあります.その場 ストと設定追加を繰り返していくしかありません.
合は,enforcing モードに一度戻し,再度permissive モー
ドに切り替えれば,ログが出力されるようになります. ●図 A すべてのアクセス拒否ログを出力
# cd /etc/security/selinux/src/policy
# make enableaudit
②ログが出力されないようになっている場合 # make reload
ホームディレクトリへのアクセスなど特定のアクセス拒
否のログは出力されないようになっています.図A で,す ●図 B 元の出力に戻す

べてのアクセス拒否ログが出力されるようになりますが, # make clean


# make reload
余計なログも出力されるようになります.元に戻すには,

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

46 - Software Design
3 章◆ SELinux 設定方法の基礎∼ポリシファイル編集法

●リスト2 アクセス拒否のログ
アクセスベクタ
read } for pid=1708 exe=/usr/sbin
audit(1088910368.044:261902): avc: denied { read
ftpd_t tcontext=syst
/vsftpd name=ftp dev=sda2 ino=113950 scontext=root:system_r:ftpd_t
em_u:object_r:var_t dir
var_t tclass=dir ドメイン
タイプ オブジェクトクラス

●リスト3 対応するallow 文 ●図 4 audit2allow の使用例

allow ftpd_t var_t


ftpd_t var_t: dir
dir read };
{ read # audit2allow -d -l
allow ftpd_t var_t:dir { read };
ドメイン タイプ オブジェクトクラス アクセスベクタ allow ftpd_t var_t:file { getattr read };
allow lvm_t dri_device_t:dir { read };
allow lvm_t file_t:dir { getattr };

●図 3 audit2allow の書式
audit2allow [-d] [-v] [-l] [-i 入力ファイル] [-o 追記するファイル]

先ほど audit2allow で出力された図 4 の白枠


●表 4 audit2allow のオプション
部分を domians/program/ftpd.te に追加しま
オプション 意味
す.その後,設定を反映します.
-d dmesg のログを入力とする

-v allow 文と一緒に詳しい情報を出力する # make reload

-l 最後に設定を反映した後のログだけを読み込む make reload に時間がかかる場合は,コラム


-i ファイルから入力する 「make reload の時間短縮」を参考にしてくだ
-o ファイルに設定を追記する さい.今回は,fc ファイルを編集していない
ため,make relabel または setfiles の必要はあ
定のうち,リスト 1 のログ(vsftpd がアクセス拒否 りません.
されたログ)に関連した設定は,図の白枠の部分 では,enforcing モードにて,FTP の公開ファイ
です. ルにアクセスしてみましょう.今度はきちんとア
設定反映後,再度 audit2allow をそのまま使うと, クセスできるはずです.
すでに追加した設定まで出力されてしまいます. 安全な設定法:タイプを付与して
ここでは,余計な設定の出力を抑制するために「-l」 直接アクセス権限を記述
オプションを付与しています.すると,設定を反 ●ログを元にした単純設定の問題
映した後に新たに出力されたログのみが読み込ま これまで,audit2allow を使ってログを allow 文に
れますので,余計な設定が出力されません.「-l」 変換して設定を行う方法を紹介しました.しかし,
オプションによる弊害はありませんので,つねに この方法は手軽な反面,余計な権限を与えること
「-l」オプションを付けておくことをお勧めします. があります.
たとえば,先ほどの設定で追加された設定を見
●設定を追加/反映する てみると,
「ftpd_t ドメインは,var_t タイプのディ
では,vsftpd を正しく動作させるために allow 文 レクトリ/ファイルに読み込みアクセスできる」
を追加しましょう.設定を追加する場所ですが, という設定が出力されています.この var_t タイプ
domains ディレクトリ以下の te ファイルのどこに追 は,/var 以下の多くのディレクトリのタイプです
加してもかまいませんが,アプリケーションに関 ので,ftpd_t ドメインは/var 以下の多くのファイル
連した設定ファイルに追加したほうがわかりやす に対してアクセスできるようになっています.
いです. しかし,リスト 1 のログを見てみると,ftpd_t ド

Oct. 2004 - 47
メインは,実際には/var/ftp 以下のディレクトリ/ する前に,簡易設定で追加した設定(図4 の白枠部
ファイルにだけアクセスできれば良いことがわか 分)を,domains/program/ftpd.teから削除します.
ります.
①タイプの宣言
●最小限の権限を与える方法 タイプを使うためには,タイプを使うことを宣
最小限の権限を与えるためには,プロセスがア 言する必要があります.タイプの宣言のためには,
クセスしているファイルに対して独自のタイプを 次のような「type 文」を te ファイルに記述します.
割り当てます.リスト 1 のログを見ると,vsftpdは,
typeタイプ,file_type,sysadmfile;
/var/ftp 以下のディレクトリ/ファイル
(/var/ftp/pub,/var/ftp/pub/hoge.txt)にアクセス 今回は,domains/program/ftpd.teに,
することがわかっています.つまり,/var/ftp 以下
type pub_t,file_type,sysadmfile;
に,「pub_t」というタイプを付与し,「ftpd_t は
pub_t に読み込みアクセスできる」と設定すれば, と記述します.このタイプの宣言を忘れると,設
ftpd_t ドメインは,/var/ftp 以下だけに対するアク 定反映時にエラーになりますので注意してくださ
セス権限だけを持ちます. い.
ただし,すべての場合にタイプを分けるのは煩
雑です.一般的には,etc_t / var_t / var_lib_t のよ ②タイプの付与
うな多くのファイルに付与されているタイプへの タイプを付与するためには,fc ファイルにファ
アクセスがある場合にタイプを分けるのが良いで イルとタイプの関連付けを記述します.書式は次
しょう.とくに,書き込みアクセスがある場合は のとおりです.
タイプを分けることをお勧めします.
ファイル名(正規表現可) system_u:object_r:
実際の設定 タイプ (実際は 1 行)

実際の設定の手順は,①タイプの宣言,②タイ ファイル名の指定で正規表現を使うことで,ま
プの付与,③タイプに対するアクセス許可の記述, とめてタイプを付与することが可能ですが,実用
④設定の反映/テストのようになります.設定を 上は「ディレクトリ(/.*)?」のように,「ディレク

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

make reload の時間短縮

make reload を行うと,policy ディレクトリ以下のポリシ /etc/security/selinux/src/policy/Makefile 内にあるリスト


が,バイナリ形式のポリシ「policy.17」に変換されます. A の2 行の先頭に「#」を付けてコメントアウトすれば,
この変換作業の中で「policy.15」
「policy.16」という2 つ policy.15,policy.16 は生成されなくなり,make reload
のファイルも生成されます.これらのファイルは,カーネ の時間が短縮できます.
ル2.4 ベースのSELinux が使うファイル
ですが,Fedora Core 2 はカーネル2.6 ●リストA policy.15,policy.16 を生成しないようにする
ですので,これら2 つのファイルは必要
$(CHECKPOLICY) -c 15 -o $(INSTALLDIR)/policy.15 policy.conf
ありません. $(CHECKPOLICY) -c 16 -o $(INSTALLDIR)/policy.16 policy.conf

COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN

48 - Software Design
3 章◆ SELinux 設定方法の基礎∼ポリシファイル編集法

トリ以下のすべてのファイルを指定」という正規 マクロをよく使います.
表現を覚えておけば十分でしょう. どんなマクロを使うべきかは,アクセス拒否ロ
vsftpd に関連した fc ファイルは file_contexts/ グを見て,どんなアクセスベクタが拒否されてい
program/ftpd.fcですので,このファイルに るのかを目安にします.どんなマクロを使うのか
の目安も併せて表 5 に示します.
/var/ftp(/.*)? system_u:object_r:pub_t
今回の例では,リスト 1 のログを見てみると,
と記述します.これは,/var/ftp 以下のディレクト /var/ftp 以下の read,getattr が拒否されています.
リ/ファイルに pub_t タイプを付与する設定です. そこで,表 5 を見ると「r_dir_file」マクロを使えば
良いことがわかります.
③タイプに対するアクセス許可の記述 したがって,domains/program/ftpd.teに,
ファイル/ディレクトリにタイプを付与する設
r_dir_file(ftpd_t,pub_t)
定を記述したところで,今度は,ドメインがタイ
プにアクセスできるようにする設定を記述します. と記述し,ftpd_t が pub_t タイプのファイル/ディ
allow 文で設定を記述しても良いのですが,マクロ レクトリを読み込めるようにします.
と呼ばれる設定を使うと便利です.
マクロとは,複数の設定をまとめて行うための ④設定の反映/テスト
しくみです. では,設定を反映しましょう(図 5)

例として,
「r_dir_file」というマクロを見てみまし
①今回は,ファイルに新たなタイプを付与している
ょう.これは,ドメインにファイル/ディレクト
ので,make reload だけでなく setfiles も必要です
リを読み込む権限を与えるために使います.
②/var/ftp に pub_t タイプが付与されていることを確
r_dir_file(hoge_t,foo_t) 認します
③ enforcing モードであることを確かめます
と記述すると,リスト 4(hoge_t が foo_t のディレ
クトリ/ファイル/シンボリックリンクを読み込 vsftpd が本当に動作するか,もう一度テストして
むことができるという意味)のような設定をした みましょう.もしも足りない権限があれば,適宜
のと同じになります.このほかにも,表5 のような 追加します.

●リスト4 r_dir_file 展開後の例

allow hoge_t foo_t:dir { read getattr lock search ioctl };


allow hoge_t foo_t:{ file lnk_file } { read getattr lock ioctl };

●表 5 ファイルのアクセス権限を設定するときに利用するマクロ

マクロ 与える権限 目安となるログ中のアクセスベクタ

r_dir_file ディレクトリ/ファイルの読み込み getattr,read

ra_dir_file ディレクトリ/ファイルの追記 append

rw_dir_file ディレクトリ/ファイルの読み書き write

ディレクトリ/ファイルの読み書きに加え, (オブジェクトクラス file の)


rw_dir_create_file
ファイルの生成/消去 create,unlink

ディレクトリ/ファイルの読み書きに加え, (オブジェクトクラス dir の)


create_dir_file
ディレクトリ/ファイルの生成/消去 create,unlink

Oct. 2004 - 49
義する」という意味です.
用途に応じた設定の調整: ポリシファイルの中では,
「allow_user_dmesg が
tunable.te 定義されていれば,一般ユーザ用ドメイン(staff_t,
Fedora Core 2 に添付されているポリシでは, user_t)は dmesg コマンドを使える」といった条件
「tunable.te」というファイルが用意されており,設定 分岐が記述されています.そして,tunable.te で,
を大まかに調整できるできるようになっています. allow_user_dmesg が定義されていますので,一般
用途に応じて,設定を切り替える際に便利です. ユーザ用ドメインで dmesg コマンドを使えます.
たとえば,dmesg コマンドを利用する例を見て 逆に,allow_user_dmesg を定義しないようにす
みましょう.一般ユーザにこのコマンドの利用許 れば,一般ユーザ用ドメインは dmesg を使えなく
可を与えると,ユーザがシステムの状態を知るこ なります.この行を
とができ,障害発生時に迅速な報告が期待できま
# define(`allow_user_dmesg')
す.一方,ユーザにシステムの情報を知られたく
または
ない場合は,dmesg コマンドを使わせないほうが
dnl define(`allow_user_dmesg')
良いでしょう.このような場合に,tunable.te を
使えば「用途によって dmesg を使わせる/使わ のように,行頭に「#」か「dnl」を付与すれば,
せない」といった設定の切り替えが簡単にできま 定義しないようにできます.
す. 編集した後,
「# make reload」で設定を反映すれ
ば,staff_r でログインして,dmesg コマンドを使お
tunable.te の使い方
うとしても,使うことができません.
tunable.te には, そのほかに tunable.te で定義されているおもな要
素を表 6 に示します.これらの要素のうちいくつか
define(`allow_user_dmesg')
は,次章で実際に使ってみます.
のような「define(` 定義要素')」という行が並んで
います.この行の意味は,
「allow_user_dmesg を定 終わりに

図5 設定の反映/テスト 次章では,本章で解説した設定の基礎知識を踏
①設定を反映 まえたうえで,安全な Web サーバ構築方法を解説
# cd /etc/security/selinux/src/policy
# make reload します.s
# setfiles file_contexts/file_contexts /var
②タイプを確認
# ls -Z /var
drwxr-xr-x root root system_u:object_r:pub_t ftp
③モードを確認
# getenforce
enforcing

表6 tunable.te で定義されている要素

定義内容 意味

unrestricted_admin sysadm_t ドメインがほぼ何でもできる

ssh_sysadm_login SSH で直接 sysadm_r ロールでログインできる

allow_user_dmesg sysadm_r ロール以外で,dmesg コマンドを使うことができる

user_canbe_sysadm 一般ユーザでも sysadm_r ロールになれる

user_can_mount sysadm_r ロール以外で mount コマンドを使うことができる

50 - Software Design
特集● SELinux 大全

日本 SELinux ユーザ会準備委員会 中村雄一 NAKAMURA Yuichi ● ynakam@selinux.gr.jp

本章では,前章までの知識を応用し,実際に Web サーバを構築/運用します.SELinux のセキュ


リティ機能をフルに活用し,Apache で静的なコンテンツを公開する方法/ PukiWiki を例に PHP
サイトを構築する方法/リモートから安全に Web サーバを管理する方法を紹介します.

● a の定義の問題点

サーバ用途に設定を調整 a の定義により,一般ユーザでも sysadm_r にな


れますし,一般ユーザが su を使うだけで,root ユ
本特集 3 章で紹介したように,tunable.te を使う ーザかつ sysadm_r になることができます.一般ユ
ことにより,用途に応じた設定の調整が可能です. ーザで sysadm_r になった段階では,uid は一般ユ
Fedora Core 2 では,SELinux をより多くの人に使 ーザですので,通常の Linux のパーミッションチェ
ってもらうため,クライアントマシンとして使い ックが機能し,悪事はできません.
やすいように調整されており,ログインユーザに しかし,
「ローカル exploit」という攻撃手法を使
対する設定が甘くなっています.ですので,この うと,uid を root にすることができます.こうなっ
ままサーバマシンとして使用するのは大変危険を てしまうと,悪意あるユーザが uid「root」かつロ
伴います. ール「sysadm_r」になることができ,悪事のし放
ここでは,Web サーバ用として使うために,よ 題になってしまいます.
り安全性に重点を置いた設定のチューニング方法
を紹介します. ● b の定義の問題点

tunable.te のデフォルト定義が b の定義により,「sshd(sshd_t)が/bin/bash


危険な理由 (shell_exec_t)を実行すると,/bin/bash が
tunable.te のうち,サーバとして使うには望まし sysadm_t で起動する」というドメイン遷移が許可
くない定義は,以下の 2 つです. されていますが,このドメイン遷移は非常に危険
です.
adefine(`user_canbe_sysadm')
というのも,次のように sshd のセキュリティホー
bdefine(`ssh_sysadm_login')
ルを利用して,パスワードを知らない攻撃者が
これらの定義のセキュリティ上の問題点を以下 sysadm_tドメインを乗っ取ることができるからです.
に示します.
① sshd のセキュリティホールを利用し,攻撃者が
sshd を乗っ取ります.

Oct. 2004 - 51
●表 1 tunable.te の調整による設定の変化

調整前 調整後

root ユーザが利用できるロール staff_r,sysadm_r 変更なし

一般ユーザが利用可能なロール user_r,sysadm_r user_r のみ利用可

su の利用 すべてのロールで利用可 staff_r,sysadm_r ロールのみ利用可※

SSH ログイン すべてのロールでログイン可能 staff_r,user_r でログイン可能

※一般ユーザはuser_r ロールにしかなれないので,su も使えなくなります

図1 Apache のドメインを確認
②攻撃者がシェルを実行注 1 します.
# ps -eZ
③ sshd_t からドメイン遷移が起こり, 略
1535 system_u:system_r:httpd_t
httpd_t /usr/sbin/httpd
sysadm_t ドメインでシェルが起動しま 略
す.

攻撃者はこのシェルを使えばやりたい放題でき うにする」で後述します.
ます.

設定を調整
Apache の構築

●コメントアウトする
Web ページの公開
以上の理由により,ab の定義は問題があるこ
とがわかりました.これらの定義を,先頭に「dnl」 では,いよいよ SELinux 上で Apache を動作させて
を付加してコメントアウトすることにより無効に みましょう.Apache に関連する設定は整備されて
します. おり,とくに何も設定しなくとも Apache は動作し
ます.
dnl define(`user_canbe_sysadm')
まず,Apacheを起動します.
dnl define(`ssh_sysadm_login')
# /etc/rc.d/init.d/httpd start
この後,make reload により設定を反映します.
次に,Apache のドメインを確認します(図 1).
●設定の結果 Apache(/usr/sbin/httpd)には,httpd_t というド
tunable.te の調整前後で,どのように設定が変わ メインが割り当てられていることがわかります.
ったのかを表 1 に示します.
一般ユーザは sysadm_r ロールになれません.ま ● httpd_t
た,su コマンドを使うこともできません.なぜな httpd_t は Apache が動作するのに必要な権限を持
ら,表 1 によると su コマンドを使うには staff_r か ったドメインであり,表 2 のような権限を持ってい
sysadm_r ロールになる必要がありますが,一般ユ ます.たとえば,httpd_t は,httpd_sys_content_t タ
ーザは user_r ロールにしかなれないため,su コマ イプを読み込み可能です.このタイプは,Web ペ
ンドを使えないのです. ージに付与されたタイプですから,Apache は Web
ただ,一般ユーザが su を使えないと,リモート ページを読むことができるわけです.
管理のときに困る場合があります.限られた一般
ユーザだけ su を使えるようにする方法は,本章 58 ● Web ページの公開方法
ページの「特定の一般ユーザから root になれるよ Web ブラウザで,SELinux マシンにアクセスす

注 1)厳密に言うと,SELinux 特有のシステムコールを使ってシェルを実行します.

52 - Software Design
4 章◆セキュアな Web サーバ構築&管理マニュアル

●表 2 httpd_t ドメインのおもなアクセス権限

アクセス権限 タイプ タイプが付与されているディレクトリ

読み込み httpd_sys_content_t /var/www(Web ページ)

httpd_config_t /etc/httpd(Apache 設定ファイル)

実行 httpd_sys_script_exec_t /var/www/cgi-bin(CGI ファイル)

httpd_modules_t /usr/lib/httpd(Apache モジュール)

追記 httpd_log_t /var/log/httpd(Apache のアクセスログ)

書き込み httpd_cache_t /var/cache/mod_ssl(SSL の作業ファイル)

リスト1 apache.fc に記述

/var/www/hoge(/.*)? system_u:object_r:httpd_sys_content_t

れば,テストページを問題なく閲覧できます.静 このドメイン遷移が起こるためには,CGI スク
的なコンテンツを配信するだけでしたら, リプトに「httpd_sys_script_exec_t」というタイプ
/var/www/html に HTML ファイルを置くだけで動 が付与されている必要があり,
「/var/www/cgi-bin/」
作します. にはこのタイプが付与されています.これ以外の
ディレクトリに CGI スクリプトを格納する場合に
●別の場所にコンテンツを置くには は,CGI スクリプトに httpd_sys_script_exec_t タイ
/var/www/html 以外の場所,たとえば プを付与する必要があります.
/var/www/hoge にコンテンツを格納する場合は,
「file_contexts/program/apache.fc」にリスト 1 のよ ● PHP
うに記述し,設定を反映します. PHP のスクリプトは,Apache と同じドメイン
「httpd_t」で動作します.本来は,PHP スクリプト
# make reload
に独自のドメインを割り当てるのが望ましいので
# setfiles file_contexts/file_contexts/
すが,PHP の仕様上不可能です.というのも,ド
var/www (実際は 1 行)
メイン遷移を起こすためにはプログラムを「exec
システムコール」を介して実行する必要があるの
動的な Web ページ: CGI と PHP
ですが,PHP は Apache モジュールの内部で処理さ
CGI や PHP による動的な Web ページを見てみま れており,
「exec システムコール」を介さずに実行
しょう.これらは,処理の内容によって必要な権 されています.したがって,PHP スクリプト実行
限が異なるため,設定の追加が必要になってきま 時にはドメイン遷移が起こらず,PHP スクリプト
す.設定の追加は,3 章の図 2 とまったく同じ手順 は親プロセス Apache のドメイン「httpd_t」を引き
で追加します. 継いで動作します.

● CGI
PHP の例: PukiWiki を
CGI スクリプトは,
「httpd_sys_script_t」という
動作させる
ドメインで動作します.Apache が CGI スクリプト ここで,PHP の例として,代表的な Wiki 注 2 とし
を起動するタイミングでドメイン遷移が起き,CGI て知られる「PukiWiki(http://pukiwiki.
スクリプトにドメインが割り当てられます. org/)」 を 動 作 さ せ て み ま し ょ う . 今 回 は ,

注 2)Wiki とは,コンテンツを誰もが自由に共同編集することができるしくみです.Wiki を使ったページの代表例として,Wikipedia


(http://ja.wikipedia.org/wiki/)という百科事典サイトがあります.

Oct. 2004 - 53
PukiWiki 1.4.3を対象にします. せたときのログを調査し,どんな権限が足りない
かを把握します.PukiWiki は PHP スクリプトです
Pukiwiki のインストール
が,Apache(httpd)の内部で処理されているため,
まず,PukiWiki のアーカイブファイル プロセスの名前は「/usr/sbin/httpd」
,ドメインは
(http://pukiwiki.sourceforge.jp/download 「httpd_t」であることに注意してください.すると,
/pukiwiki1.4.3.tar.gz)をダウンロードしまし /var/www/wiki 以下のファイル(httpd_sys_
ょう. content_t)を書き込み/生成(write / create)し
ダウンロードしたら,/var/www/html ディレク ようとして拒否されたログが出力されていること
トリにて,このファイルを展開します. がわかります.

# cp pukiwiki1.4.3.tar.gz /var/www/html 簡易設定では危険


# cd /var/www/html
3 章の図 2 にあるとおり,ポリシファイルの設定
# tar xzvf pukiwiki1.4.3.tar.gz
方法には簡易設定と安全な設定がありました.た
/var/www/html/pukiwiki ディレクトリ以下に, だし,今回のケースでは簡易設定を行うと,セキ
PukiWiki の実体である PHP スクリプトが展開され ュリティ上大きな問題があります.
ます. 簡易設定では,audit2allow で設定を生成していま
この状態で,PukiWiki のフロントページにアク した.今回は図 3 のような設定が出力されます.こ
セスしてみると,エラーが表示され,うまく動作 の設定は非常に危険です.なぜなら,httpd_sys_
しません(図 2)
. content_tは/var/www/html以下のファイルすべての
ファイルのタイプであるので,httpd_t ドメインが,
問題切り分けとログのチェック
/var/www/html以下にあるすべてのファイルに対す
3 章で行ったのと同じく,障害発生時に SELinux る書き込み権限を得てしまうからです.
の問題であるかどうかを切り分けるために, このような設定をし,もし httpd が攻撃者に乗っ
permissiveモードにして動作テストを行ってみます. 取られると,この書き込み権限を利用して Web ペ
試しに「編集」のリンクを辿って,ページを編 ージが改ざんされてしまうおそれがあります.
集してみると問題なく動作しますので,SELinux の
安全な設定の手順
設定の問題であることがわかります.
そこで,permissive モードで PukiWiki を動作さ したがって,今回は簡易設定ではなく,3 章の
「安全な設定法:タイプを付与して直接アクセス権
●図 2 デフォルトではPukiWiki はうまく動作しない
限を記述」
(47 ページ)の項で紹介した手順に従い
ます.

●ログのチェック
実際に,PukiWiki が書き込んでいるファイルを
調査してみると,/var/www/html/pukiwiki だけで
あることがわかります.よって,PukiWiki にはこ

●図 3 今回 audit2allow から出力されるallow 文
# audit2allow -d -l
allow httpd_t httpd_sys_content_t:dir { add_name remove_name write };
allow httpd_t httpd_sys_content_t:file { create unlink write };

54 - Software Design
4 章◆セキュアな Web サーバ構築&管理マニュアル

のディレクトリに対する書き込み権限を与えれば
良いことがわかります. ログの解析 Webalizer

●設定を記述する
Webalizer とは
/var/www/html/pukiwiki 以下のファイルに,
「wiki_write_t」というタイプを割り当て,httpd_t ド Webalizer は,Fedora Core 2 に標準添付されてい
メインが wiki_write_t タイプに書き込めるような設 る,Web サーバのアクセスログ解析ツールです.
定を記述します. アクセス数や,どのアドレスからのアクセスが多
今回の動作テストのログを見てみると,httpd_t いのかなどの情報を,グラフで表示することがで
ドメインが,/var/www/pukiwiki 以下にファイル きます.デフォルトでは cron ジョブ注 3 として 1 日 1
(オブジェクトクラス file)を生成(create)したロ 回動作するようになっています.
グが出力されています.3 章の表 5 を参照すると, Webalizer は,system_crond_t ドメイン注 4 で動作
「rw_dir_create_file」マクロを使い,wiki_write_t の しますが,このままでは system_crond_t ドメイン
タイプが付与されたファイル/ディレクトリへの に権限が足りずに動作しません.これについても,
書き込みおよびファイル生成権限を与えれば良い PukiWikiと同様に設定を追加できます.
ことがわかります.
結局,リスト 2 のような設定を記述することに ●ログのチェック
なります.なお,今回も作業ディレクトリは permissive モードで動作テストをしてみると,
「/etc/security/selinux/src/policy」です. Webalizer(system_crond_t)は,表 3 のようなファ
設定を記述したら,設定を反映します. イル/ディレクトリにアクセスしていることがわ
かります.
# make reload
# setfiles file_contexts/file_contexts /
var/www/html (実際は 1 行)
●リスト2 追加した設定
file_contexts/program/apache.fc に追加
設定を反映したら,enforcing モー
/var/www/html/pukiwiki(/.*)? system_u:object_r:wiki_write_t
ドに戻し,PukiWiki の動作テストを domains/program/apache.te に追加
再度行い,正しく動作することを確 type wiki_write_t,file_type,sysadmfile;
rw_dir_create_file(httpd_t,wiki_write_t)
認します.

●表 3 Webalizer(system_crond_t ドメイン)がアクセスしているディレクトリ/ファイル

アクセス権限 アクセスしている そのディレクトリ/ファイルの


ディレクトリ/ファイル タイプ

読み込み /var/log/httpd httpd_log_t

/var/log/xferlog xferlog_t

書き込み/ファイル生成 /var/lib/webalizer var_lib_t

書き込み/ファイル生成 /var/www/usage httpd_sys_contents_t

注 3)crond をコマンドラインから起動する場合「run_init /etc/rc.d/init.d/crond start」のように,起動コマンドの前に「run_init」を付与


する必要があります.run_init はSELinux 拡張プログラムを起動するために使うコマンドです.crond はSELinux 拡張されているため,
このコマンドを使って起動する必要があります.今のところ,run_init はcrond を起動するときにしか使いません.
注 4)system_crond_t は,cron ジョブのためのデフォルトのドメインです.

Oct. 2004 - 55
ただ,var_lib_t(/var/lib/webalizer のタイプ),
httpd_sys_content_t(/var/www/usage のタイプ)
Web サーバの
に対する書き込みアクセス許可を与えると,これ
リモート管理
らのタイプはほかのファイル/ディレクトリにも コンテンツを更新する場合,リモート管理が必
付与されているため,必要ないファイルへの書き 須になってきます.ここでは,サーバをリモート
込みまで許してしまいます.よって,/var/lib/ から管理する方法を解説します.
webalizer,/var/www/usage には独自のタイプを付
SSH によるリモート管理
与します.
本章冒頭の「サーバ用途に設定を調整」のとこ
●設定を記述する ろで,SSH から直接 sysadm_r になれないようにし
これらを踏まえると,リスト 3 のような設定を追 ています.そのため,SSH ログインする場合は,
加することになります.設定を追加したら, まず root ユーザでログインします.このときのロ
ールはstaff_rです.そのあと,
「newrole -r sysadm_r」
# make reload
でsysadm_rになることで管理を行います.
# setfiles file_contexts/file_contexts /
var (実際は 1 行) SFTP によるコンテンツの転送

にて設定を反映します. コンテンツをアップロードする場合には,FTP
を使うことは望ましくありません.なぜなら,
● webalizer.conf の変更 FTP ではパスワードが平文でやりとりされるため,
これで SELinux 側の設定は終了ですが,Apache パスワード盗聴のおそれがあるからです.そこで
側の設定で,webalizer.conf にリスト 4 の枠囲みの
部分を追加しないと,結果をリモートから閲覧で
●リスト4 リモートからログ解析結果を見るための
きません.また,usage ディレクトリを不特定多数 webalizer.conf の変更箇所
の人に見せたくない場合は Basic 認証をかけておく <Location /usage>
Order deny,allow
と良いでしょう. Deny from all
#Allow from 127.0.0.1
Allow from all

●リスト3 Webalizer を動作させるための設定(file_contexts/program/crond.fc およびdomains/program/crond.te)


file_contexts/program/crond.fc
/var/lib/webalizer(/.*)? system_u:object_r:webalizer_work_t
/var/www/usage(/.*)? system_u:object_r:webalizer_usage_t

domains/program/crond.te
#/var/lib/webalizerへの読み書きファイル生成
type webalizer_work_t,file_type,sysadmfile;
rw_dir_create_file(system_crond_t,webalizer_work_t)

#/var/www/usageへの読み書きファイル生成
type webalizer_usage_t,file_type,sysadmfile;
rw_dir_create_file(system_crond_t,webalizer_usage_t)

#/var/log/xferlog,/var/log/httpdの読み込み
r_dir_file(system_crond_t,xferlog_t)
r_dir_file(system_crond_t,httpd_log_t)

#httpdが/var/www/usageにアクセスできるように
r_dir_file(httpd_t,webalizer_usage_t)

56 - Software Design
4 章◆セキュアな Web サーバ構築&管理マニュアル

今回は,
「SFTP(Secure File Transfer Protocol)
」と したコンテンツを/var/wwwにコピーします.
いう SSH 経由でファイルをアップロードするしく
みを利用します. ●「~/.ssh」についての注意
SSH で,公開鍵を利用した認証を行う場合,ホ
● SFTP の使い方 ームディレクトリの下に「.ssh」というディレクト
Linux クライアントから SFTP を使うには, リを作成し,鍵ファイルを配置します..ssh を新
規作成した時点では,適切なタイプが付与されな
sftp ユーザ名 @ホスト名
いため,sshd は鍵ファイルを閲覧できず,うまく
で,リモートマシンにログインします.ログイン 動作しません..ssh ファイルにタイプを付与しな
した後は,通常の FTPとコマンドは同じです. おすため,
Windows 側のクライアントとしては,WinSCP と
# setfiles file_contexts/file_contexts /
いうソフトが SFTP に対応しています.原稿執筆時
home (実際は 1 行)
は,WinSCP3.6.7 というバージョンが最新バージョ
ンです.http://winscp.sourceforge.net/ とする必要があります.
「WinSCP 3.6.7 installation
eng/download.phpの,
リモート管理をより安全にする
package」をダウンロードし,実行すればインスト
ールできます.日本語対応するには,http://win ここまでの方法で,リモート管理を行うことが
scp.sourceforge.net/eng/translations.php できますが,このままでは不安が残ります.なぜ
の「Japanese」というところから,jp.zip というフ なら,root ユーザの認証情報(パスワードなど)
ァイルを入手/展開し,WinSCP3.jp ファイルを が,第三者に判明してしまったら,第三者に root
WinSCP のインストールフォルダにコピーします. かつ sysadm_r ロールで不正ログインされてしまう
操作も非常に簡単ですので,詳しい使い方は省略 からです.
します. そこで,SELinux 側の設定を工夫し,root ユーザ
で直接ログインできなくすれば,この心配は解消
●コンテンツのアップロード されます注 5.
SFTP でログインすると,ユーザはデフォルトの
ロールでログインし,そのロールに対応した権限 ● root ユーザで直接ログインできなくする
でファイルを転送します.つまり,ユーザ名 root 方法は簡単です.「/etc/security/selinux/
で SFTP ログインした場合,ロールは staff_r ロール src/policy/users」注 6 の,リスト 5(root ユーザは
です.このロールに対応した権限は「staff_t ドメイ staff_r,sysadm_r を使えるという意味)の行から,
ン」ですから,staff_t ドメインの権限でファイルを 枠で囲んである「staff_r」を削ります.これで,
転送できます. rootユーザは staff_rロールが使えなくなります.
ただし,staff_t ドメインは,/var/www へのアク make reload して設定を反映すれば,root で SSH
セス権限を持ちませんので,SFTP で直接コンテン でログインしようとしてもエラーになります.な
ツを/var/www にアップすることはできません.い ぜなら,SSH からは staff_r ロールでしかログイン
ったん,ホームディレクトリにコンテンツを転送 できないようになっていますが,さきほど行った
した後に,SSH で root ユーザ,sysadm_r ロールで 設定により root ユーザは staff_r ロールを使えなく
ログインすることで,ホームディレクトリに転送 なっており,ログインできないからです.

注 5)ssh デーモン側の設定(/etc/ssh/sshd_config)でも,root ユーザでログインできなくすることはできますが,SSH にセキュリティホ


ールがあった場合はroot でログインできない設定が回避されてしまうおそれがあります.
注 6)ユーザがどんなロールを利用可能か記述されているファイルです.

Oct. 2004 - 57
この設定の副作用として,make relabel をする際
setfiles file_contexts/file_contexs /ho
にエラーが出てしまいます.これを回避するため
me/ynakam (実際は 1 行)
には,file_contexts/program/apache.fcから,リスト
6の行を削除するかコメントアウトすればOKです. を実行し,タイプを付け直します.

●特定の一般ユーザから root になれるようにする ●実際の運用方法


root で直接ログインできなくなったので,いっ これで,ユーザ ynakam が,su を使えるようにな
たん一般ユーザでログインした後,su コマンドを ります.ほかの一般ユーザは su を使うことはでき
使って,root ユーザかつ sysadm_r になる必要があ ません.SSH で管理をする場合は,いったんユー
ります.しかし,
「設定を調整」の項で,一般ユー ザ名 ynakam でログインし,su により,rootユーザ,
ザが suコマンドを使えないように設定しています. sysadm_r ロールでログインします(図 4)
.このよ
今 回 は , 遠 隔 管 理 の た め に ,「 一 般 ユ ー ザ うにしておけば,攻撃者が root かつ sysadm_r ロー
ynakam だけは su コマンドを使えるようにする」設 ルで不正ログインするためには,ユーザ ynakam と
定を行います. root のパスワード両方を知る必要があるため,不
一般ユーザは「user_r」ロールでしかログインで 正ログインがより難しくなります.
きませんでした.しかし,表 1 を見るとわかるとお Web ページをアップロードするときは,SFTP で
り,user_r ロールでは su を使えません.su を使う ユーザ名 ynakam でログインし,ファイルを転送し
ためには,staff_r ロールでログインできるようにす た後,SSH で ynakam でログイン,su してから転送
る必要があります. したファイルを/var/wwwにコピーします.
このために,/etc/security/selinux/src/policy/
users に 終わりに
user ynakam roles { staff_r };
SELinux を使った Web サーバ構築方法の解説は
と追加します.これは,「ユーザ ynakam は staff_r ここで終わります.ここまでで解説した知識で,
が利用可能」という意味です. sendmail を使ったメールサーバや BIND を使ったネ
make reload で設定を反映し,さらに/home ディ ームサーバの構築にも応用できますので,ぜひチ
レクトリ以下のタイプも変わっているため ャレンジしてください.s

●リスト5 root ユーザがstaff_r を使用できないようにする

user root roles { staff_r


staff_r sysadm_r ifdef(`direct_sysadm_daemon', `system_r') };
↑ここを削除

●リスト6 apache.fc から以下の行を削除

HOME_DIR/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_ROLE_content_t

●図 4 いったん一般ユーザでログインし,リモート管理を行っている様子
[ynakam@localhost ynakam]$ getcon ユーザ名 ynakam,ロール staff_r でログインしている
ynakam:staff_r:staff_t
[ynakam@localhost ynakam]$ su ynakam は su コマンドを使うことができる
Password: root ユーザのパスワード入力
Your default context is root:sysadm_r:sysadm_t. デフォルトのロールは sysadm_r

Do you want to choose a different one? [n] • で sysadm_r でログイン


[root@localhost ynakam]# getcon
root:sysadm_r:sysadm_t ユーザ名 root,ロール sysadm_r でログインしている

58 - Software Design
特集● SELinux 大全

日本 SELinux ユーザ会準備委員会 中村雄一 NAKAMURA Yuichi ● ynakam@selinux.gr.jp

Linux カーネル 2.6 になり,SELinux はカーネルに取り込まれました.その大きなきっかけとな


ったのが「LSM(Linux Security Modules)
」がカーネル 2.6 へ採用されたことです.ここで
は,Linux のセキュア OS を語るうえで欠かせない LSM を紹介します.

て立ち上げられていた「LSM(Linux Security

LSM 登場の経緯 Modules)


」です.

LSM がカーネルに
セキュア OS を楽に
実装できるように LSM は,さまざまなセキュリティ機能をカーネ
かつての SELinux は,カーネルにパッチを当て ルモジュールとして実装するためのフレームワー
る必要があったため,インストールが大変で,ユ クです注 2.LSM を使用すれば,簡単にセキュア OS
ーザが使うための敷居が高いものでした. を実装することができますし,ユーザは,LSM に
2001 年3 月,Linux Kernel Summit にて,SELinux 準拠したセキュア OS モジュールを好みに応じて選
の開発者が SELinux のプレゼンテーションを行っ 択することができます.
た際,Linux の創始者である Linus Torvalds を交え, その後 LSM は,カーネル 2.6 に取り込まれまし
SELinux を Linux カーネル本流(当時はカーネル た.現在 LSM に従って実装されたセキュア OS に
2.5)に取り込むにはどうしたら良いかという議論 は,
「SELinux」
「LIDS」
「DTE」
「Openwall」などが
注1
が行われました . あります.そして,LSM がカーネル本流に組み込
当時,Linux 上のセキュア OS は SELinux 以外に まれた甲斐あって,SELinux もカーネル 2.6 に取り
もさまざまなものがリリースされていましたが, 込まれました.今後,ほかのセキュア OS も Linux
Linus 氏はどれか 1 つを特別扱いする気はなく,
「さ カーネル本流に取り込まれていくと思われます.
まざまなセキュリティ機能をカーネルモジュール
として実装できるしくみならば Linux カーネル本流 LSM のしくみ
に入れても良い」との意思を表明しました.
そこで注目されたのが,WireX Communications では,LSM を詳しく見ていきましょう.LSM の
(現 Immunix.http://www.wirex.com/)によっ しくみを説明するため,本特集 1 章で掲載した図を

注 1)このときの議論の一部は LSM のメーリングリストのアーカイブに残っています.http://mail.wirex.com/pipermail/linux-security-


module/2001-April/0005.html
注 2)当時の Linux カーネル 2.4 でもセキュア OS をモジュールとして実装することも不可能ではないですが,実装は大変ですし,機能も限
定されます.

Oct. 2004 - 59
●図 1 LSM のしくみ(再掲)

プロセス

①アクセス要求
セキュリティ管理者のみが
②Linuxパーミッション Linuxカーネル 設定可能
 チェック

④セキュリティ
 チェック依頼
⑤セキュアOS
③LSM
 モジュール
⑥チェック結果
セキュリティポリシ
⑦アクセス
rootでも回避できない
リソース セキュリティチェック

再掲します(図 1)
.順を追って LSM の動きを見て
みます. LSM の実装を見る
①プロセスは,リソースにアクセスをする際に,
LSM をさらに深く知るために,LSM の実装をカ
まず,カーネルにアクセス要求を出します.
ーネル 2.6.7 のソースコードを例として紹介します.
②通常のパーミッションチェックが行われます.
カーネルコンパイル時に「Security-Options →
ここまでは普通の Linux と同じです.
Enable different security models(CONFIG_SECUR
③ LSM にアクセス要求が渡ります.
ITY)」を有効にすると,カーネルに LSM が組み込
④ LSM からセキュア OS のモジュールにセキュリ
まれます.LSM による,カーネルの拡張は以下の
ティチェック要求が渡ります.
2 点です.
⑤セキュア OS モジュールの中で,各セキュア OS
独自のセキュリティチェックが行われます. ¡データ構造の拡張
⑥セキュア OS モジュールはセキュリティチェック ¡LSM フック関数の挿入
の結果を返します.
⑦セキュリティチェックが OK のときだけ,リソー データ構造の拡張
スにアクセスをします.
プロセス/リソースに関する構造体の中に,セ
LSM では,④⑥のインターフェースの規定をし キュリティ属性を格納するためのエントリが追加
ています.このインターフェースを統一すること されています.
で,さまざまなセキュア OS を取り込めるようにし
ています. ●プロセス
①のインターフェースは通常の Linux と同じで プロセスに関する情報を格納する構造体
す.このおかげで,通常の Linux 用に作られたプロ 「task_struct」構造体には,
「void *security」という
グラムをセキュア OS 上で動かす場合にも,バイナ エントリがあります(リスト 1).このエントリに
リレベルで互換性があります. は,プロセスに関するセキュリティ属性を格納し
ます.セキュリティ属性には,たとえば SELinux
のドメインがあります.

60 - Software Design
App.1 ◆ LSM を理解する

●リスト1 プロセス情報を格納するtask_struct 構造体 ●リスト2 ファイルに関する情報を格納する inode


(include/linux/sched.h) 構造体(include/linux/fs.h)

struct task_struct { struct inode {


略 struct hlist_node i_hash;
sigset_t *notifier_mask; 略
void *security; atomic_t i_writecount;
struct audit_context *audit_context; void
void *i_security;
*i_security;
/* Thread group tracking */ __u32 i_generation;
u32 parent_exec_id; 略
略 };
};

●リスト3 LSM フック関数(include/linux/security.h)

extern struct security_operations *security_ops; ①

struct security_operations {

int (*inode_mkdir) (struct inode *dir, struct dentry *dentry, int mode);
略 ②
int (*socket_create) (int family, int type, int protocol);

}

●リソース ック関数は,ディレクトリ生成のセキュリティチ
リソースの例として,ファイルに関する情報を ェックを行うために用い,
「socket_create」フック
格納する構造体「inode」構造体を見てみると, 関数は,ソケット生成のセキュリティチェックを
「void *i_security」というエントリが存在します 行うために使います.
(リスト 2)
.このエントリを使うことで,ファイル 関数ポインタの指す先を変えることによって,
にラベル付けすることができます. セキュア OS を切り替えることができます.たとえ
ば,inode_mkdir を SELinux のセキュリティチェッ
●ソケット ク関数を指すようにすれば,ディレクトリ生成時
ソケットに関する構造体 sock にも「void に,SELinux のセキュリティチェックを行うように
*sk_security」というエントリが存在し,ラベル付 なりますし,この関数ポインタの参照先を LIDS の
けすることができます. セキュリティチェック関数にすれば,LIDS のセキ
◆◆◆ ュリティチェックが行われるようになります.
これらの以外にも,プロセス間通信,共有メモ また,リスト 3 ①のように security_operations 型
リにもラベル付けすることができます. の「security_ops」という変数が用意されており,
実際にはこの変数を使って LSM フック関数がシス
LSM フック関数の挿入
テムコールのソースの中に挿入されています.リス
システムコールのソースコードには LSM フック ト4は,LSMフック関数が挿入されている例です.
関数が挿入されており,セキュリティチェックを
拡張できるようになっています.フック関数とは, ●具体例
関数ポインタのことです. リスト 4 は,mkdir システムコール(ディレクト
リを生成するシステムコール)のソースです.シ
●フック関数の種類 ステムコールが呼び出されるとまず,
どんなフック関数が用意されているかは,
①普通の Linux パーミッションチェックが行われま
「security_operations」構造体に記述されています
す.
(リスト 3 ②)
.たとえば,
「inode_mkdir」というフ

Oct. 2004 - 61
●リスト4 LSM フック関数が挿入されている様子(fs/namei.c)

int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)


{
int error = may_create(dir, dentry, NULL); ①
if (error)
return error;

error = security_ops->inode_mkdir (dir, dentry, mode); ②

if (error)
return error;
DQUOT_INIT(dir);
error = dir->i_op->mkdir(dir, dentry, mode); ③

※②は実際には「error = security_inode_mkdir(dir, dentry, mode);」と記述されています.


「security_inode_mkdir」
は include/linux/security.hで定義されているマクロです.②には見やすさのため,マクロを展開したものを記述しています.

●リスト5 SELinux のセキュリティチェック関数


(security/selinux/hooks.c)
登録処理の様子を SELinux を例にして見てみま
static int selinux_inode_mkdir(struct inode *dir,
struct dentry *dentry, int mask) す.SELinux には独自のセキュリティチェック関数
{ ①
return may_create(dir, dentry, SECCLASS_DIR); が用意されており,これらは,security/selinux/
}
hooks.c ファイルの中に記述されています(リスト
struct security_operations selinux_ops = {


5)
.リスト 5 ①は,mkdir システムコールのセキュ
.inode_mkdir = selinux_inode_mkdir, ②
.socket_create = selinux_socket_create,
リティチェックを強化するための,SELinux のセキ


}
ュリティチェック関数です.この中の

※②は, 「may_create」という部分で,SELinux 独自の処理


struct security_operations selinux_ops;
selinux_ops.inode.mkdir = selinux_inode_mkdir;
を行っています.リスト 5 ②は,SELinux のセキュ
selinux_ops.socket_create = selinux_socket_create;
と同じ意味です.
リティチェック関数をまとめて格納する変数
「selinux_ops」です.SELinux のセキュリティチェ
ック関数は必ず,
「selinux_ops-> チェック関数の名
②フック関数を使ってセキュリティチェック関数
前」のようにして呼び出されます.
を呼び出します.inode_mkdir が SELinux のセキ
ュリティチェック関数を指していれば,SELinux
●実際の登録の様子
のセキュリティチェックが呼び出されます.
これらのセキュリティチェック関数は,リスト 6
③これらのチェックが通ると,実際にディレクト
のようにして登録されます.リスト 6 ①は SELinux
リを作る操作が行われます.
の初期化時に呼び出される selinux_init 関数です.

SELinux の この初期化時の register_security 関数の中で,②の


セキュリティチェック関数 ように,LSM フック関数を格納している変数
LSM のフック関数がシステムコールのソースに security_ops が selinux_ops で上書きされます.
挿入されているだけでは意味がなく,そのフック これにより,SELinux のセキュリティチェック関
関数からセキュア OS のチェック処理が呼び出され 数が登録されました.リスト 4 ②の場合に戻ってみ
るようになっている必要があります.そのために てみると,「security_ops->inode_mkdir」が指す先
は,セキュア OS のセキュリティチェック関数を登 は,
「selinux_ops->inode_mkdir」になっています.
録する必要があります. つまり,リスト 5 ①の SELinux 独自のチェック処理

注 3)ちなみに,SELinux を登録する前のsecurity_ops は,何も処理をしないダミーの関数を示すようになっています.

62 - Software Design
App.1 ◆ LSM を理解する

が呼び出されるようになってい ●リスト6 SELinux のセキュリティチェック関数の登録の様子


注3
ます . security/selinux/hooks.c
__init int selinux_init(void){

if (register_security (&selinux_ops)) ①
LSM の課題 panic("SELinux: Unable to register with kernel.\n");

security/security.c
int register_security (struct security_operations *ops){
LKM rootkit 略
security_ops = ops; ②

LSM が Linux 本流に取り込まれ
たことにより,セキュア OS 導入
の敷居が大幅に下がりました.しかし,LSM は良 使っていない場合は LSM のフック関数を使えなく
いことばかりではなく,LKM rootkit 作成を容易に できるようなしくみが必要になってくるでしょう.
してしまう,という問題点があります.rootkit と
LSM モジュール共存の問題
は,攻撃者が不正侵入した際に使うツールのこと
で,バックドア/トロイの木馬/ログ消去ツール LSM によって,セキュア OS の実装が簡単になり
などから構成されています.LKM rootkit とは,カ ましたし,同時に入出力をチェックするようなセ
ーネルモジュールとして機能する rootkit です. キュリティソフトウェアの実装も簡単になってい
ます.今後は,LSM に対応したセキュリティソフ
●比較的簡単に作成できてしまう トウェアの増大も予想されます.実際に,ウィル
LSM のフック関数は,セキュリティ上の要所要 スチェックソフトの中には LSM を使っているもの
所に挿入されています.しかし,LKM rootkit を作 も現れ始めています.
る側から見てみれば,セキュリティの要所要所で こうなってくると,たとえば SELinux とウィル
悪さをできる,ということになります.しかも, スチェックを同時に使いたい,というように複数
LSM のフック関数の指す先を,悪意のある処理を の LSM モジュールを同時に使う場合が発生してき
行う関数にするだけで良いのですから,カーネル ます.しかし,LSM は LSM モジュール共存を十分
モジュールとして簡単に作れてしまいます. にサポートしておらず,このような共存は不可能
です.今後の対応が待たれるところです.
●影響を受ける環境
ただし,このことはセキュア OS を使っている場 終わりに
合は大きな問題にはなりません.セキュア OS はモ
ジュールのインストールを禁止できますので,た LSM を通じて,セキュア OS の実装の骨格を見て
とえ攻撃者が LSM を使った rootkit をインストール みました.本稿を見てわかるように,LSM 自体は
しようとしても,インストールに失敗します. 非常に単純な構造です.独自の LSM モジュールを
問題になる場合は,LSM は有効にしているが, 作ることも,さほど難しいものではありません.
セキュア OS のモジュールを組み込んでいない場合 その際,
「Realtime LSM(http://www.joq.us/
です.Fedora Core 2 のデフォルトの状態がこれに realtime/)」という LSM モジュールは,規模も
当たります. 小さく,参考となると思います.ぜひ LSM モジュ
◆◆◆ ールの作成にチャレンジしてみてください.s
今のところ,LSMを使ったrootkitは出現していま
せん.しかし,カーネル 2.6 の普及とともに出現す
る可能性は十分にあります.今後,セキュア OS を

Oct. 2004 - 63
特集● SELinux 大全

日本 SELinux ユーザ会準備委員会 中村雄一 NAKAMURA Yuichi ● ynakam@selinux.gr.jp

このパートでは,SELinux の最新の動向紹介として,SELinux のコミュニティおよび企業の取り


組みとともに,最新の機能を紹介します.

1 つ目は,開発元の NSA のメーリングリスト

SELinux コミュニティ (http://www.nsa.gov/selinux/)です.こち


らは,SELinux に関する全般的な話題を扱ってお
SELinux の最新動向をウォッチする場合,コミュ り,新機能についての議論やアナウンスが行われ
ニティの動向をチェックするのが一番です.ここ ます.
では,SELinux 開発元のコミュニティと,国内コミ もう 1 つは,fedora-selinux メーリングリスト
ュニティを紹介します. (http://www.redhat.com/mailman/listinfo/
fedora-selinux-list/)です.こちらは,
開発コミュニティ
Fedora Core の SELinux に特化したメーリングリス
SELinux は,元々は NSA,Secure Computing, トですが,最近は Fedora Core で開発された機能が
MITRE,NAI Labs を中心として開発されましたが, 開発元にフィードバックされることも多くなって
現在は NSA と Red Hat,Inc.を中心としたコアメンバ いますので,こちらのメーリングリストに加入し
で開発されています.SELinux はオープンソースな ておくこともお勧めします.
のですが,開発コアメンバはオープンには募集さ
れていないようです.SELinux の開発に関わりたい ●開発コアメンバ
場合は,メーリングリストを通じてパッチやポリ SELinux の開発コアメンバは誰であるのかは,公
シを提出して,コアメンバに承認されるのを待つ 表されていませんが,メーリングリストを見てい
しかないようです. ると,コアメンバが誰であるかを推測することが
できます.
●開発メーリングリスト コアメンバと思われる人たちの中でも,とくに
SELinux の最新動向を知りたいときや,パッチ/ 注目すべき人々を表 1 で紹介します.彼らの発言に
新機能の提案をしたいときは,メーリングリスト 注目しておけば,SELinux の動向を追うのが楽にな
を利用します. ります.また,パッチを提出するときも彼らに CC
SELinux の開発に関するメーリングリストは 2 つ しておくと良いでしょう.
あります.

64 - Software Design
App.2 ◆ SELinux の最新動向

● SELinux 専門委員会
国内 SELinux コミュニティ
NPO 日本オープンソース推進機構(JOSAO,
日本国内での SELinux の普及を目指し,趣味面 http://www.josao.jp/)の中に「SELinux 専門
のコミュニティと,ビジネス面のコミュニティが 委員会」が設立されました.こちらは,SELinux の
設立されています. ビジネス面での普及を目指したコミュニティです.
オープンソース/セキュリティの専門家を中心と
●日本 SELinux ユーザ会 した専門委員が,自治体/企業などのエンドユー
SELinux の普及およびユーザ同士の交流/情報交 ザの立場から,SELinux 普及のための議論を重ねて
換を目指し,非営利/中立の「SELinux ユーザ会」 います.今後は,エンドユーザのための提言や,
が国内で準備中です.こちらは趣味/ボランティ 実証実験などを行っていく予定です.
アベースで運営されているコミュニティです.
Web ページ(http://www.selinux.gr.jp/)と 企業の動向
メーリングリスト(http://www.selinux.
hitachi-sk.co.jp/ml/ml-selinux-users-
国内企業の動向
ml.html)を活動の拠点としています.
オフラインでの活動としては,オフ会/勉強会 国内企業でも,SELinux に関する取り組みが始ま
を不定期に開催しています.SELinux を本格的に使 ってきています.今のところ,SELinux に取り組ん
ってみたい場合は,ぜひメーリングリストに加入 でいるおもな企業は表 2 のとおりです.研究開発が
してみてはいかがでしょうか. 中心ですが,SI や教育のようなビジネスも始まり
つつあります.

●表 1 SELinux 開発コアメンバと思われる人々

メンバ名 おもな担当

SELinux 全般の開発に携わっています.この表のメンバの中では最も古くから SELinux に関


Stephen Smalley 氏
わっています.

SELinux のポリシ周りに注力しています.彼独自のポリシを持っており,彼のポリシに
Russell Coker 氏 パッチが取り込まれると,その後本家に取り込まれる流れになっているようです.ポリシに
関する議論は彼に CC すると話が早いです.

Daniel J Walsh 氏 Red Hat,Inc.の SELinux リーダー.Fedora Core の SELinux に注力しています.

SELinux のカーネル部分を扱っています.SELinux カーネルの新機能は,彼からアナウンス


James Morris 氏
されることが多いです.

●表 2 国内企業の取り組み

企業名 SELinux への取り組み 参考 URL

日立ソフトウェア SELinux 構築/運用ツールの開発/公開,


http://www.selinux.hitachi-sk.co.jp/
エンジニアリング SELinux システム構築サービスの提供

NTT データ SELinux 拡張機能の開発 http://lc.linux.or.jp/lc2004/(講演内容)

日本高信頼システム(JTS) 教育サービスの提供 http://www.jtsl.co.jp/

監査機能強化モジュール LBSM
日本総合研究所(JRI) http://sourceforge.jp/projects/lbsm/
(Linux Basic Security Modules)の開発

Oct. 2004 - 65
そして,それに伴いポリシの格納場所が変更さ
ディストリビューションの動向
れ,
「/etc/selinux/ポリシの種類」というディレク
SELinux がカーネル 2.6 に取り込まれたこともあ トリに格納されるようになっています.
り,ディストリビューションでの取り込みも始ま どのポリシを使うのかは,/etc/sysconfig/selinux
っています.表 3 が SELinux 対応が進んでいるディ に,
「SELINUXTYPE=」という要素で指定します.
ストリビューションです.無償/商用の主要ディ たとえば「SELINUXTYPE=strict」と記述すれば,
ストリビューションで対応が進んでいることがわ 「strict」のポリシを選択したことになり,/etc/
かります.とくに,商用ディストリビューション selinux/strict 以下に格納されたポリシが使われま
でのサポートが始まってくる 2004 年秋∼ 2005 年初 す.
頭になりますと,いよいよ SELinux の本格普及が
ポリシをすばやく切り替える
始まると予想されます.
SELinux のポリシを変更するためには,ポリシフ

最新機能紹介 ァイルの記述を変更し,make reload する必要があ


りましたが,状況に応じて,すばやくポリシを変
SELinux 本家では活発に開発が続いており, 更したい場合もあります.たとえば,攻撃の兆候
Fedora Core 3 などの新しいディストリビューショ がある場合に,リモートからの重要なファイルへ
ンには新機能が取り込まれていくと予想されます. のアクセスを禁止するといった場合です.
その中でも,とくに重要になると思われる新機能
を紹介します. ● Conditional policy extension
「Conditional policy extension」という機能を使う
ポリシの選択
ことにより,すばやくポリシを切り替えることが
現在,ポリシは「/etc/security/selinux/src」以 できます.この機能は,登場してから日が浅く,
下に格納されたポリシ 1 種類しか用意されていま Fedora Core 2 では実験的に使われるに留まってい
せん.しかし,今後は,さまざまなポリシを選べ ます.
るようになります.たとえば,2004 年 7 月 12 日に Conditional policy extension では,フラグを使っ
リリースされた Fedora Core 3 test1 では,
「targeted て,フラグが 1 の場合は設定を有効にし,フラグが
(使いやすさを重視したポリシ)
」と「strict(安全 0の場合は設定を無効にします.Fedora Core 2 の場
性を重視したポリシ)
」という 2 種類のポリシを選 合,
「user_ping」というフラグが用意されています.
べるようになっています. このフラグを使うことにより,「user_r,staff_r ロ

●表 3 SELinux の対応が始まっているディストリビューション

形態 ディストリビューション SELinux 対応状況

Fedora Core Fedora Core 2 で完全に対応済み

無償 Debian GNU/Linux 一部対応.既存パッケージとの依存関係が未解決

Gentoo Linux 多少バグはあるものの,積極的な対応

Red Hat Enterprise Linux 2005 年初頭にリリースされるバージョン 4 で対応を表明

SuSE Linux SuSE Linux 9.1 のカーネルで SELinux 有効.正式なサポートはまだ行っていない


商用
Turbolinux 2004 年秋リリースの新サーバディストリビューション(コードネーム“Celica”

よりサポート予定

66 - Software Design
App.2 ◆ SELinux の最新動向

ールの ping コマンドの利用」を許可/拒否を動的 で「change_bool」コマンドを使います.


に切り替えることができます.
# change_bool user_ping 1
実際に,ポリシファイルの中で user_ping フラグ
が使われている部分をリスト 1 に抜粋します.
「{}」 とすれば,user_ping フラグが 1 になり,user_r,
に囲まれた中で,user_r,staff_r ロールが ping を使 staff_rはping を使うことができます.
うための権限が設定されています.user_ping フラ
# change_bool user_ping 0
グが1の場合は,{}内の設定が有効,つまり user_r,
staff_r が ping を使えるようになります.user_ping で,user_ping フラグが 0 になり,user_r,staff_rで
フラグが 0 の場合は,{}内の設定が無効になり, ping を使おうとしてもエラーになります.
user_r,staff_rはping を使えなくなります. フラグの状態を見るには「show_bools」コマン
ドを使います.s
●フラグの切り替え方
フラグを切り替えるためには,sysadm_r ロール

●リスト1 user_ping フラグが使われている部分

if (user_ping) {
domain_auto_trans(unpriv_userdomain, ping_exec_t, ping_t)
# allow access to the terminal staff_r,user_r ロールが ping
allow ping_t { ttyfile ptyfile }:chr_file rw_file_perms; を使うために必要な権限設定
ifdef(`gnome-pty-helper.te', `allow ping_t gphdomain:fd use;')
}

先生とパソコン
先生とパソコン
好評発売中
政府によるミレニアムプロジェクト「教育の情報化」によ
り,学校教育の現場にも IT 化の波が押し寄せてきました.
『先生とパソコン』は,小中高等学校の先生向けに,授業/
校務でパソコンを活用するためのノウハウをまとめた情報
誌です.パソコンを使った授業のアイディア,授業で使え
るソフトウェアやホームページの紹介,成績処理や事務処
理などに便利なソフトウェアの活用法など,読めばすぐに
役立つ内容を幅広く取り上げています.

【特集】
楽しい授業,役立つ授業
学校でパソコンをもっと活用する
Dが
ルC
【第 2 特集】
, ー
じみ 先生知ってますか?
おな ンスト インターネットの良い点/悪い点 再確認
でも
S D k イな 1 冊!
eaお
【第 3 特集】
q u
S た, 得 授業で使える!すぐに役立つ!
厳選 教育ホームページ紹介
付い
ほか

体裁 : B5 判,192 ページ+ CD-ROM × 1


付録 CD-ROM × 1
定価 : 1,780 円+税
ISBN : 4-7741-2092-8 多言語化 Squeak Ver.6.1 ほか 収録

Oct. 2004 - 67
特集● SELinux 大全

日本 SELinux ユーザ会準備委員会 LIDS 支部 面和毅 OMO Kazuki ● omok@honto.info

本章では,SELinux 以外のセキュア OS として,LIDS を取り上げます.SELinux ほど高度な機


能は持っていませんが,設定が直感的で非常にわかりやすいので,セキュア OS を初めて学ぶ方には
最適だと思います.

最初のバージョンは,'99 年にカーネル 2.2 用とし

LIDS の紹介 て,Xie Huagang 氏と Philippe Biondi 氏によってリ


リースされました.その後,カーネルのバージョ
LIDS(Linux Intrusion Detection System)は, ンアップとともに開発が進み,現在ではカーネル
SELinux と同じく,無償のセキュア OS 実装の 1 種 2.4 用の LIDS-1 系列と,カーネル 2.6 用の LIDS-2 系
です.LIDS は,システムを保護するという機能を 列とに分かれています注 1.
備えながら,設定方法が非常に直感的で簡単であ
るという特色を持っています.この LIDS は, SELinux と LIDS の比較
Linux カーネルにパッチを当てる形で提供されてい
ます. セキュア OS の代表である(おそらく,今一番メ
ジャーな)SELinux と LIDS とは,どう違うのでし
●表 1 LIDS とSELinux との違い
ょうか.比較してみましょう.
■機能面の比較 LIDS SELinux
LIDS と SELinux との違いを表 1 にまとめました.
ファイルの ACL ○ ○
SELinux とのおもな相違点は,
ロールの管理 × ○

プロセスの ACL ○ ◎ ¡ロールがない


ドメイン遷移 ○ ○ ユーザごとにロールを決め,できることを限定
LSM との連携 ○ ○ するような機能がありません.この点は,SELinux

■サポート面の比較 LIDS SELinux に比べてはっきりと弱点になっているところです.

カーネルとの連携 △ ◎
¡設定が簡単
ディストリビューションとの連携 △ ◎
のちほど説明しますが,LIDS でアクセス制限を
情報源 △ ○
設定する方法は「どのプログラムが,どのオブジェ
コミュニティの取り組み ○ ○
クトに対して,どういうパーミッションを持ってい
コミュニティの親密性 ◎ ○
る」という構文のコマンドを並べたリスト形式にな

注 1)カーネル2.2 用のものは,残念ながら開発がストップしました.

68 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介

っているため,非常に直感的です.また,構文が Control List)と呼びます.その ACL の中で,とく


iptablesに似ているため,親しみやすいと思います. にファイルに関してのアクセス制御を書いている
部分を「ファイル ACL」
,特権に関するアクセス制
¡カーネルとの連携 御を書いている部分を「権限 ACL」と呼びます.
カーネル 2.6 に LSM が導入されたことにより, では,それぞれのアクセス制御について見てい
さまざまなセキュリティモデルが組み込めるよう きましょう.
になりました.その中でも,SELinux はカーネル
2.6 に標準で組み込まれていますが,LIDS はまだ組 ①ファイルアクセス制御
み込まれておらず,カーネルにパッチを当てる形
式になっています.
Linux の場合
最近では LIDS も LSM に対応したため,今後は
カーネルに対するパッチではなく,モジュールと LIDS 導入前は,システムは伝統的な UNIX パー
して単独でコンパイルできるようにしようという ミッション(rwx で表される設定です)を用いてア
意見も出ています. クセス制御を行っています(図 1)

LIDS の場合
¡ディストリビューションとの連携
SELinux は,Red Hat Linux や Turbolinux など, これに対し,LIDS を導入すると,システムは伝
さまざまなディストリビューションに取り込まれ 統的なパーミッションによるアクセス制御を行っ
ていますが,LIDS は,まだディストリビューショ た後に,LSM を通じて LIDS 独自のパーミッション
ンに取り込まれていません. によるアクセス制御が行われます(図 2).これに
より,UNIX パーミッションで許可されている書き
¡コミュニティの相違 込み行為を,LIDS のアクセス制御で禁止したりす
LIDS は,完全にコミュニティベースで開発が進 ることができます.
められているため,個人の要望が聞き届けられや
すいと言えます注 2. ● LIDS で作成したパーミッションの特徴
◆◆◆ LIDS で作成したパーミッションに関しては,
以上の点から,LIDS は SELinux に比べて設定が MAC(強制アクセス制御)で,次のような特色を
粗い反面,より直感的でわかりやすい設定方法を 持っています.
提供していると言えます.

LIDS を導入した場合の ●図 1 通常のLinux 上でのプログラムの権限チェック


システムの挙動
プログラム
では,LIDS を導入するとシステムはどう変化す
るのでしょうか.LIDS を導入すると,システム上 動作を許可するか?

では次の 2 種類のアクセス制御が可能になります.
UNIXパーミッション 動作の拒否
-rwxr-xr-x root root
①ファイルに対するアクセス制御 No

②プロセスに対してのアクセス制御 Yes

LIDS では,システム内にすべてのアクセス制御 動作が許可される

を書いたリストがあり,これを ACL(Access

注 2)この点は,SELinux に比べて優位なところです:).

Oct. 2004 - 69
●図 2 LIDS を組み込んだシステムでのプログラムの
権限チェック ●図 3 LIDS を組み込んだシステムでのACL チェックの流れ

プログラム プログラム


動作を許可するか? 動作を許可するか?

UNIXパーミッション デフォルトのACL
動作の拒否 プログラムを指定せずに 動作が許可される
-rwxr-xr-x root root
No 検査する Yes

Yes No

LSM 動作を許可するか? 動作を許可するか?

LIDSでのパーミッション プログラムに対する
動作の拒否 動作が許可される
READONLY,DENY,… ACLを検査する
No Yes

③ No
Yes

動作が許可される 動作の拒否

●ファイル ACL による制限の順番


¡ディレクトリの所有者でもその内容を変更する
ファイル ACL を設定すると,LIDS システム上で
ことはできません.
プログラムがファイルに対してアクセスをする際
¡このパーミッションを変更するためには,シス
に,次のような順番で ACL が参照されます(図 3)

テムを再起動してパラメータを指定して起動し
た後に,root 権限でパーミッションを変更しな ①まず,プログラムを指定しない状態で,その行
くてはなりません. 為が許可されているかどうか ACL を参照します.
¡root でさえも,このパーミッションチェックを回 行為が許可されている場合には,アクセスを許
避する方法はありません.このため,root に対 可します.
しても読み書きなどのアクセス制御を設定する ② ①で行為が許可されていなかった場合には,改
ことができます. めてプログラムを指定してある ACL を参照しま
す.そこで,行為が許可されている場合には,
以上により,root ができることをなるべく少な
アクセスを許可します.
くし,一般ユーザに近いレベルまで下げることが
③ ①②で行為が許可されていなかった場合には,
できます.したがって,システムが攻撃に遭い,
アクセスを拒否します.
root 権限を剥奪されたとしても,被害を最小限に
することが可能です.
●パーミッションの種類
● LIDS でのファイル ACL の設定方法 これらのアクセス制御は,前項で述べたように
LIDS でのファイル ACL の設定は, Linux でのアクセス制御で許可されたものに対して
設定できます.
①すべてのプログラムに対してのデフォルトのフ
では,LIDS ではファイルに対してどのようなパ
ァイル ACL を設定する
ーミッションを与えることが可能なのでしょうか.
②特定のプログラムに対して,個別にできること
LIDS を導入すると,ファイルやディレクトリに対
を設定していく
して表2の4種類のパーミッションが設定できます.
というステップで行っていきます.

70 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介

●表 2 LIDS で設定できるパーミッション

DENY 拒否.ディレクトリ名やファイル名は表示されるが,内部にアクセスすることはできない

READONLY 読み込みのみ.READ はできるが,改変などはできない

APPEND 追記のみ.READ と追記のみはできるが,改変や消去はできない

WRITE 読み込み/書き込み/消去などがすべてできる

●図 4 lidsconf コマンドの書式
lidsconf -A ステート -s プログラム -o ディレクトリ/ファイル -j パーミッション

※ステートに関しては後述の「②ステートフルACL」の項で解説します.

●図 5 iptables の書式 ●図 6 今回設定するアクセス制御


iptables -A INPUT -s 送信元 -d 宛先 -j 行為
/ READONLY ①

etc READONLY
● LIDS 設定の構文 ssh DENY ②

LIDS でこれらのパーミッションを設定するに sshd_config DENY

は,lidsconf コマンドを使用します(図 4)
. var READONLY
log READONLY
「どの“プログラム”が,どの“ディレクトリ/
messages APPEND ③
ファイル”に対して,どのような“パーミッショ
ン”を持っているか」という書き方で,非常に直
感的なものになっています.
① /以下のディレクトリは,すべて READONLY と
また,
“プログラム”を省略した際には,デフォ
しておきます.
ルトのファイル ACL となります.つまり,すべて
② /etc/ssh ディレクトリは,ssh の設定ファイルが
のプログラムは,その“ディレクトリ/ファイル”
入っています.どのプログラムからのアクセスも
に対して,
“パーミッション”に従う」という意味
許可しないほうが良いので,DENY にします.
になります.この記述方法は iptables の書式(図 5)
③ /var/log/messages は,各種のログを書き加えて
に似ているので,覚えやすいでしょう.
いく必要があります.しかし,WRITE パーミッ
ションを与えてしまうと消去や改ざんも可能に
●パーミッションはサブディレクトリにも反映
なってしまうため,追記(APPEND)のみを可
また,LIDS では,親ディレクトリに対してパー
能にします.
ミッションを設定すると,サブディレクトリにも
そのパーミッションが継承されていきます.その これらの ACL を設定するためには,次のコマン
ため,「親ディレクトリ以下を READONLY にして ドを入力するだけで設定が可能になります.
おいて,特定のサブディレクトリを DENY にする」
① lidsconf -A -o / -j READONLY
といった設定方法が可能になっています.
② lidsconf -A -o /etc/ssh -j DENY
③ lidsconf -A -o /var/log/messages -j
●ファイル ACL の例
APPEND (実際は 1 行)
例として,図 6 のような,ファイルやディレクト
リに対してのアクセス制御を行うファイル ACL を しかし,sshd を起動する際には設定ファイルを
設定します. 読み込む必要があります.そのため,sshd に対し
てのみ,/etc/sshd ディレクトリ以下を読み込み可

Oct. 2004 - 71
能(READONLY)に設定します. できます.説明が必要と思われるLinuxケーパビリテ
ィを表4に掲載していますので,参照してください.
lidsconf -A -s /usr/sbin/sshd -o
/etc/sshd -j READONLY (実際は 1 行)
●ケーパビリティバウンディングセット
と設定します. あるプログラムが,特権を与えられた際にどの
ようなケーパビリティを持っているかは,ケーパ

②特権の分割 ビリティバウンディングセットと呼ばれる「どの
ケーパビリティが許可されているかを示す表」に
よって決定されます.
Linux の場合
Linux ケーパビリティを使用する場合には,通常
●通常の Linux このケーパビリティバウンディングセットを修正し
次に,特権の分割について説明します.通常の て,通常のプログラムが特権で起動された際のデフ
Linux 上では,プロセスは ォルトケーパビリティを定義しておきます.そして
その起動したプログラムからケーパビリティを剥ぎ
①ユーザモードで動作する
取っていくという方式で,プログラムのケーパビリ
②特権で動作する
ティを調整していきます.プログラムに対してケー
の 2 種類しかありませんでした. パビリティの追加することはできません.
たとえば図 7 のように,あるプログラムに 1024
LIDS の場合
番以下のポートを使用させたい場合には特権を与
える必要がありますが,それにより不必要な権限 これに対し,LIDS ではプログラムに対して個別
まで与えてしまうという弊害がありました.これ にケーパビリティを追加していく方式を採ります.
は,そのプログラムに脆弱性が発見された場合に, そのため,ケーパビリティバウンディングセット
それらの権限を得られてしまう可能性があること で許可されるケーパビリティを極力少なくしてお
を意味します. き,各プログラムが特権で起動されそうになる際
にケーパビリティを追加していくことになります.
● Linux ケーパビリティ
そのため,カーネル 2.4 系列から Linux ケーパビ ● LIDS での追加ケーパビリティ
リティというものが実装されています.これは, LIDS では,さらに次の 2 種類のケーパビリティ
今までの特権を29種類のLinuxケーパビリティ(表 が追加されています.
3)に分割し,プログラムには,それぞれ必要なも
のだけしか与えないようにしようという考えです. ① CAP_PROTECTED
Linuxケーパビリティを用いて,プロセスに特権を これをプログラムに与えると,起動されたプロ
与えた際に,その特権の「内容」を調整することが グラムを kill コマンドなどを使って停止することが
できなくなります.これにより,侵入されても止
●図 7 通常のLinux では不必要な特権まで与えてしまう
められたくないプロセス,たとえば syslogd や
1024番以下の
ポートを使いたい
snortdなどを停止不可能にします.
プログラム プログラム

特権で動作させる ② CAP_KILL_PROTECTED
弊害:不必要な特権の付与 これをプログラムに与えると,ケーパビリティ
GID/UID変更権
ネットワーク設定変更権 CAP_PROTECTED を与えたプログラムを kill する

72 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介

ことができます.たとえば,これを/etc/init.d/ 用します(図 8)
.「ある特定の“プログラム”に対
syslogd に与えることにより,システムシャットダ して,ある“ケーパビリティ”
(“オプション”
)を
ウン時に CAP_PROTECTED を与えた syslogd を停 付与する」という書き方で,こちらも非常に直感
止させることができます. 的なものになっています.
◆◆◆ このようにして,プログラムと対応する権限
これらのケーパビリティを,必要に応じて各プ (ケーパビリティ)を記述していったリストを「権
ログラムに与えることにより,システムをより強 限ACL」と呼びます.
力に保護することが可能になります.
●ケーパビリティ付与の例
● LIDS でケーパビリティを設定する構文 例として,先ほどと同じ sshd を用いましょう.
LIDSでこれらのケーパビリティを操作するには, sshd は,ポート番号 22 を使用します.そのため,
ファイル ACL のときと同じく lidsconf コマンドを使 sshd に対して 1024 番以下のポートを使用できるケ
ーパビリティを与えま
●表 3 Linux ケーパビリティ一覧 す.
CAP_CHOWN CAP_MKNOD CAP_SYS_CHROOT さらに,セキュリテ
CAP_DAC_OVERRIDE CAP_NET_ADMIN CAP_SYS_MODULE ィ上,付与するものは

CAP_DAC_READ_SEARCH CAP_NET_BIND_SERVICE CAP_SYS_NICE 最小限にしたいので,

CAP_FOWNER CAP_NET_BROADCAST CAP_SYS_PACCT ポート番号 22 のみの


使用権を与えます(リ
CAP_FSETID CAP_NET_RAW CAP_SYS_PTRACE
スト1)

CAP_IPC_LOCK CAP_SETGID CAP_SYS_RAWIO
これにより,sshd
CAP_IPC_OWNER CAP_SETPCAP CAP_SYS_RESOURCE
はポート番号 22 を使
CAP_KILL CAP_SETUID CAP_SYS_TIME
用することが可能にな
CAP_LEASE CAP_SYS_ADMIN CAP_SYS_TTY_CONFIG
ります.
CAP_LINUX_IMMUTABLE CAP_SYS_BOOT

●表 4 一部のLinux ケーパビリティの説明

CAP_CHOWN ファイルの UID と GID を任意に変更することを許可する

CAP_DAC_OVERRIDE ファイルの読み込み/書き込みと実行権限のチェックをバイパスする

CAP_KILL シグナル送信に対する権限チェックをバイパスする

CAP_NET_ADMIN さまざまなネットワークに関係する操作(インターフェースの設定や,ルーティング
テーブルを変更するなど)を許可する

CAP_NET_BIND_SERVICE インターネットドメインで予約されているソケットポート番号(1024 番以下のポート)


へのバインディングを許可する

CAP_SYS_TIME システムクロックの変更を許可する

●図 8 LIDS でケーパビリティを設定するためのlidsconf コマンドの構文


lidsconf -A ステート -s プログラム -o ケーパビリティ (オプション) -j GRANT

※オプションは省略する場合もあります.

●リスト1 sshd にポート番号 22 を使用する権限を与える

lidsconf -A -s /usr/sbin/sshd -o CAP_NET_BIND_SERVICE 22 -j GRANT

Oct. 2004 - 73
●リスト2 孫プロセスまでパーミッションやケーパビリティを継承

# lidsconf -A -s /usr/local/apache/bin/apachectl -o /var/www -i 2 -j READONLY

●リスト3 アクセス違反時のログ

Jul 24 21:28:13 localhost kernel: LIDS: ls (dev 3:1 inode 597994) pid 1564 ppid 1199 uid/gid (0/0) on
(tty1) : attempt to open sshd for reading

●継承レベルの設定方法
パーミッション/ 継承レベルを設定するには,lidsconf コマンドで
ケーパビリティの継承 ACL を設定する際に,リスト 2 のように,-i オプシ
LIDSでは,プログラムに対してパーミッションや ョンを用いて設定します.上の例ですと,継承レ
ケーパビリティを与えたときに,そのプログラムが ベルが 2 ですので,孫プロセスにまでパーミッショ
プロセスとして起動したときの子プロセスに対し ンやケーパビリティを継承させることができます.
て,以下の条件でパーミッションやケーパビリティ 継承レベルを無制限に設定するには,
“-1”を指定
が継承されていきます. します.

①親プロセスと子プロセスが同じプログラムの場
合には,親プロセスのパーミッションやケーパ
LIDS のログの見方
ビリティを無条件で継承する
LIDS で,プログラムが ACL に記述されたアクセ
②親プロセスと子プロセスが異なるプログラムの
ス制御を違反した際のログ注 3 は,リスト 3 のような
場合には,その子プロセスにパーミッションや
ものになります.これは,DENY に設定してある
ケーパビリティを継承させても良いかどうか設
/etc/sshd ディレクトリに対して,
定できる
# ls /etc/sshd
Apache での継承の例
とした際のログです.
「ls プログラムが sshd を読も
Apacheでの継承を例に説明します. うとした」と,拒否された行為のログが出力され
ます.
① httpd に対してパーミッションやケーパビリティ
LIDS では,プログラムが ACL 違反を行った際に
を与えた場合には,接続クライアントが増えて
しか,ログやコンソールに出力を行わず,どの行
子プロセスが起動した際に,親と同じプログラ
為が何時に許可されたかを残しておく監査ログの
ムのため,パーミッションやケーパビリティを
ような機能はありません.監査機能があると非常
無条件で引き継ぐ
に便利だということは開発者たちも認めています
② apachectl に対してパーミッションやケーパビリ
ので,今後,監査機能を付け加えてくれるだろう
ティを与えた場合には,子(httpd)は親と異な
と期待しています.
るプログラムのため,継承させるかどうかを設
定することができる
LIDS の設定ファイル
また,継承には子プロセスまでの継承や,孫プ
ロセスまでの継承など,どの段階まで継承させる
LIDS の設定ファイルの格納場所
かを設定することができます.もちろん,無制限
に継承させることも可能です. LIDS での ACL やケーパビリティなどについて

注 3)Debian GNU/Linux の場合には/var/log/kern.log,Fedora Core の場合には,/var/log/messages です.

74 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介

●表 5 /etc/lids ディレクトリ内部に格納されているファイル

lids.ini ACL DISCOVERY を ON / OFF するファイル

lids.pw ステート変更時や設定変更時に使用するパスワードファイル

lids.conf システムでのデフォルトの ACL とケーパビリティ

lids.cap プログラムへのデフォルトケーパビリティ

lids.boot.conf BOOT ステートの ACL とケーパビリティ

lids.boot.cap BOOT ステートのデフォルトケーパビリティ

lids.boot.acl カーネルが読み込める形にコンパイルされた,BOOT ステートの ACL とケーパビリティのセット

lids.postboot.conf POSTBOOT ステートの ACL とケーパビリティ

lids.postboot.cap POSTBOOT ステートのデフォルトケーパビリティ

lids.postboot.acl カーネルが読み込める形にコンパイルされた,POSTBOOT ステートの ACL とケーパビリティのセット

lids.shutdown.conf SHUTDOWN ステートの ACL とケーパビリティ

lids.shutdown.cap SHUTDOWN ステートのデフォルトケーパビリティ

lids.shutdown.acl カーネルが読み込める形にコンパイルされた,SHUTDOWN ステートの ACL とケーパビリティのセット

●図 9 lids.conf の書式
プログラムの inode:デバイス番号:プログラム:パーミッション:継承レベル:ディレクトリ/ファイルの inode:デバイス番号:時間(Obsolete)

●リスト4 lids.conf の内容


は,/etc/lids ディレクトリ内に格納されています.
#
/etc/lids ディレクトリ自身は,LIDS でアクセスが # This file is auto generated by lidsconf
# Please do not modify this file by hand
DENY になっているため,保護されている形にな #
0:0::1:0:2:769:/:0-0 ①
ります. 0:0::0:0:130360:769:/etc/lids:0-0
0:0::3:0:888801:769:/var/log:0-0
/etc/lids ディレクトリ内に,全部で 13 個の設定 0:0::0:0:662820:769:/etc/ssh:0-0
565817:769:/usr/sbin/sshd:1:0:662820:769:/etc/ssh:0-0 ②
ファイルが入っています(表 5)

このディレクトリ内のファイルは lidsconf コマン
ドで作成されるので,手で編集しないほうが無難 号 2,デバイス番号 769 の/に対して,パーミッシ
です. ョン 1 を与えている」となります.
また,/usr/sbin/sshd が/etc/ssh に READONLY
lids.conf ファイルの見方
のパーミッションを設定されている箇所は,リス
LIDS 内部で ACL をどのように判断しているか理 ト 4 ②となっており,
「inode 番号 565817,デバイス
解するため,lids.confを見てみましょう(リスト4)
. 番号 769 のプログラム/usr/sbin/sshd が,inode 番
lids.conf を見てみると,制限したいディレクトリ 号 662820,デバイス番号 769 の/etc/ssh に対して,
やプログラムの横に数字が並んでいます.これは, パーミッション 1 を与えられている」という意味に
図9 のような書式になっています. なります.

● inode ●デバイス番号
たとえば,/ディレクトリに関しては,リスト 4 デバイス番号は,メジャー番号とマイナー番号
①のようになっていますが,これはプログラムを の組み合わせになっています.デバイス番号 769 に
指定していないデフォルト ACL のため,「inode 番 ついては,

Oct. 2004 - 75
●図 10 メジャー番号,マイナー番号とデバイスの関係
brw-rw---- 1 root disk 3, 1 May 6 1998 /dev/hda1

769 = 00000011 00000001 ダウンロード

ですから,上記は「メジャー番号= 3,マイナー番 LIDS のリリース版は http://www.lids.org/か


号=1」の意味です.筆者のPCでは,図10のように らダウンロードできます.現在の最新バージョン
出力されるので,これは/dev/hda1を表しています. (rc 版ですが)は,カーネル 2.6.7 用が「lids-
2.2.0rc3-2.6.7.tar.gz」,カーネル 2.4.27 用が「lids-
● inode が変更されたときの解決方法 1.2.2rc2-2.4.27.tar.gz」になります.
このように,LIDS では ACL を inode とデバイス ダウンロードしたファイルを展開すると,カーネ
番号で管理しています.そのため,apt-get や yum ル2.6.7用の場合は「lids-2.2.0rc3-2.6.7.patch」という
update などでプログラムの inode 番号が変更された カーネルに当てるパッチと,
「lidstools-2.2.5rc1.tar.gz」
場合には,ACL がうまく動作しなくなります. というlidstoolsパッケージがあります.
これを解決するためには,パッケージをアップ
導入手順
デートした後に,その都度コマンド
LIDSを導入するには,
# lidsconf -C
①カーネルに対してパッチを当てる
を実行して,LIDS 設定ファイル内での inode リス
②パッチを当てると,
「Security Options」に LIDS
トを更新する必要があります.
の項目が増えるので,選択する注 5
③オプションを選択したら,カーネルを make する
LIDS の導入方法 ④ make が終わったら,lidstools-2.2.5rc1.tar.gz を展
開してインストールする
カーネルパッチと lidstools
という手順を踏みます.
LIDS を導入するには,カーネルに当てるパッチ ただし,lidstools でシステムが稼動するための必
と lidstools と呼ばれる LIDS を設定するためのツー 要な ACL を作成していない場合には,このまま再
ル類が必要になります.これらは別々に導入する 起動してしまうとシステムが立ち上がらなくなって
こともできますが,LIDS のリリース版にはその時 しまいます.そのため,最後の再起動を行う前に,
点での最新の lidstoolsが同梱されていますので,そ
⑤ / e t c / l i d s / l i d s . i n i フ ァ イ ル で ,「 A C L _
ちらを使ったほうが無難でしょう注 4.
DISCOVERY=1」とする注 6
また,LIDS のパッチは素の(ftp.kernel.org から
⑥「lidsconf -C」コマンドを使用して,ACL を再作
ダウンロードした)カーネルソースに対応した形
成する
になっていますので,Red Hat 版や Debian 版のカ
ーネルに導入することは困難です.有志ユーザが としてから再起動を行います.
個別に対応版を出していますが,現時点での LIDS
LIDS を無効にするには
は素のカーネルにのみ対応していると考えたほう
が良いでしょう. システム起動時に LIDS を無効にするには,

注 4)LIDS のリリース版と異なるlidstools を使用した際に,まれにパラメータが表示されないなどの不具合があります.


注 5)この際,カーネル組み込みか,モジュールにするかの選択ができます.
注 6)のちほど,本文の「③ ACL DISCOVERY 機能」の項で解説します.

76 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介

●表 6 ステートの種類

BOOT システム起動時からカーネル封印まで

POSTBOOT カーネル封印後.通常はこのステートで運用を行う

SHUTDOWN このステートに移行してから,システムをシャットダウンする

●表 7 ステートフルACL による解決法

BOOT 時 /etc 以下と/var 以下は READONLY にし,/etc/mtab を WRITE にする

POSTBOOT 時 /etc 以下と/var 以下はすべて READONLY にする

SHUTDOWN 時 /var 以下は READONLY だが,/var/run を WRITE にする

GRUB や LILO などで「/boot/vmlinuz-2.6.7


が使えなくなった
root=/dev/hda1 ro lids=0」と“lids=0”を指定しま
す.このオプションで起動した際には,LIDS が組 など,機能面で若干の縮小がありました.
み込まれていない状態と同じように起動します.
②ステートフル ACL
最新版 LIDS に LIDS での ACL は,旧バージョンでは 1 種類しか
盛り込まれた機能 なかったため,たとえば/etc と/var 以下のファイ
LIDS-2 系列から,カーネル 2.6 に対応したため, ルを READONLYにしてしまうと,
以下の点が新機能として盛り込まれました.
¡起動時に/etc/mtab が変更されないため,mount
① LSM のサポート に手を加えなくてはならない
②ステートフル ACL ¡シャットダウンしてプロセスを停止するときに,
③ ACL DISCOVERY 機能 /var/run のプロセス ID ファイルが削除できない

それぞれを簡単に見ていきましょう. などの弊害がありました.
これを解決するために,LIDS-2 系列からはシス
① LSM のサポート
テムを表 6 の 3 つの状態(ステート)に分けて,そ
すでに本特集でも述べられていますが,カーネ れぞれのステートで ACL を記述することが可能に
ル 2.6 から,Linux にさまざまなセキュリティモデ なっています.
ルをモジュールとして組み込むことができるよう このため,さきほどの問題は,表 7 のようにして
になりました.これを可能にしているのが,LSM 解決できるようになりました.
という共通のフレームワークです.LIDS は LIDS-2 このように,ステートフル ACL の採用により,
系列から,LSM に対応しました. 柔軟なACL の作成が可能になっています.
ただし,LSM に対応したため,
③ ACL DISCOVERY 機能
¡ディレクトリ/ファイルを完全に隠すことができ
●従来の ACL 作成方法
なくなったため,隠しファイルではなく動作拒否
LIDS などのセキュア OS では,ACL を記述する
のファイルしか作成できなくなってしまった
際には非常に多くのプログラムの動作を把握する
¡iptables と連動する IP_NFMARK 機能がなくなっ
必要があります.
たため,ACL 違反のプログラムが生成したパケ
以前のバージョンでは,特定の ACL でプログラ
ットは送信しないなどの「ワーム拡散防止機能」
ムが動作しなかった場合には,/var/log/messages

Oct. 2004 - 77
●リスト5 ACL DISCOVERY モードでログファイルに出力される内容

Jul 24 18:16:10 localhost kernel: LIDS_ACL_DISCOVERY:[state 1]565738:3145729:


proftpd:7:0:905223:3145729:proftpd.scoreboard:0-0

●表 8 LIDS の情報源

■海外の Web サイト

① LIDS Project(本家) http://www.lids.org/

② LIDS Forum http://forum.lids.org/

■日本の Web サイト

③ LIDS-FAQ(旧版) http://www.linux.or.jp/JF/JFdocs/LIDS-FAQ/

④ 筆者の Web サイト http://www.honto.info/LIDS/

を見て,どの ACL 違反によりプログラムが動作し 用することにより,/var/log/messages 上の前述の


なかったのかを確認して ACL を調整する必要があ ようなログから,各ステートの conf ファイルとそ
りました.そのため,すべてのプログラムに対し の設定スクリプトを(一部できないことはありま
て調査と再起動を繰り返さなければならず,ACL すが)自動生成してくれます.
の作成が煩雑なものになってしまっていました.

LIDS の情報源
● ACL DISCOVERY を使用する
そこで,LIDS-2系列からはACL DISCOVERY機能 LIDS の情報源を表 8 にまとめました.海外では
が盛り込まれました.これは,一種のデバッグモー やはり①本家のメーリングリストと②フォーラム
ドで,プログラムのACL違反をログに残しつつ,シ で,活発に議論が行われています.
ステムはプログラムのACL違反を無視して動作を続 日本のサイトでは,③LIDS-FAQの和訳が「Linux
けるというもので,SELinux における permissive モ JF (Japanese FAQ) Project.」から見ることができま
ードと同様の機能です.これにより,あるプログラ す.この LIDS はかなり古いバージョンのものです
ムを動作させるにはどのACLを追加すれば良いのか ので,直接使用することは難しいですが,LIDS に
を,簡単に判断できるようになりました. 対する基本的な考えがよくまとまっています.
たとえば,ACL DISCOVERY モードを ON にして また,④筆者の Web サイトにも,最新の情報を
おくと,ログファイルにリスト 5 のように記録され 掲載しています.
ます.これは,proftpdが動作するために,このACL
を追加してあげれば良いという意味になります注7. まとめ

● Perl スクリプトにより ACL を自動生成 以上で述べたように,LIDS は SELinux と比べて


また,LIDS パッケージに同梱されている Perl ス セキュリティの高さに関しては劣りますが(もち
クリプトにより,ACL 違反のログからその動作を ろん,通常の Linux よりは上です)
,設定の方法が
許可するために必要な ACL を作成することが可能 直感的でわかりやすくなっています.そのため,
になりました.SELinux における audit2allow コマン セキュア OS とは何かを勉強したいという人には,
ドに似ています. 入門用途としてぴったりではないかと思われます.
「lidstools-2.2.5rc1/doc/acl_discovery/lids_acl_ これからセキュア OS を使おうとしている方は,
discovery.pl」を使用し,
“lidsconf -S”コマンドと併 ぜひLIDSを使ってみてください.s

注 7)ただし,フルパスでプログラムやディレクトリを表示する機能がないため,それは適宜調べる必要があります.

78 - Software Design
特集● SELinux 大全

籠谷和男 KOMORIYA Kazuo ● komoriya@terilogy.com

この章では,SELinux と対比する意味で,FreeBSD で提供される jail というセキュリティ機能


を紹介します.非常に柔軟性が高く,セキュア OS のように利用することもできますので,ぜひ参考
にしてください.

jail とは jail の動作の様子

jail は FreeBSD で提供される,プロセスとその子 いろいろと書くよりも,百聞は一見にしかずと


注1
孫を閉じ込めることのできる機能です . いうことで,動作を見ていくことにしましょう.
FreeBSD 4.0-RELEASE のときに,目玉機能として サンプル環境として,今回は FreeBSD 5.2.1-
実装されました. RELEASE-p9 を用意しました.ここでは,2 つの jail
同じような働きをする機能に chroot があります が動作している環境を例に見ていくことにします.
が,jail はこれを拡張したものであると考えるこ まず,jail に関連した管理コマンドには「jls」
とができます.実現できることは以下のようなこ 「jail」
「jexec」などがあります.
とです.
稼働中の jail の確認
① jail 環境ごとに chroot できる
動作している jail を確認する場合には,jls コマン
② jail 環境ごとに IP アドレスが利用できる
ドを使用します(図 1).jls コマンドにより,それ
③ jail 環境ごとに devfs が制限付きで利用可能
ぞれの jail環境での
④制限されたプロセス空間を利用できる
① jail の ID である JID
そして,これらの機能を,1 つのホスト上で同時
② IP アドレス
に複数利用することができます.
③ホストネーム
④ jail の置かれているパス

●図 1 jls コマンド実行結果
% jls
① JID②IP Address ③ Hostname ④ Path
2 172.16.120.26 jail-large2.komoriya.ddo.jp /home/jail-large2
1 172.16.120.25 jail-large1.komoriya.ddo.jp /home/jail-large1

注 1)jail は「牢獄」という意味ですので,まさしくこのイメージです.

Oct. 2004 - 79
を確認することができます. た IP アドレスだけが,それぞれの jail で利用できる

jail でのネットワーク ネットワークインターフェースとなります.


インターフェースを確認
jail でのネットワークサービス
次に,ホスト環境とそれぞれの jail のインターフ
ェースを確認してみることにしましょう.jail のな 次は,ホスト環境と,それぞれの jail におけるポ
かでコマンドを実行する場合には,jexec コマンド ートの LISTEN 状態を確認してみることにしましょ
を使用します.書式は, う(図3)

ホスト環境では,ここで動作しているすべての
jexec JID command …
インターフェースの状態が確認できますが,それ
となります. ぞれの jail では,その jail に関係するものだけが見
ここでの command は,もちろん JID で指定した えていることがわかると思います.
jail の中で実行されるため,その jail の中で実行がで
制限されたプロセス空間
きることが前提となります注 2.
図 2 を見てください.このように,jail に付与し 次は,ホスト環境とそれぞれの jail のプロセス状

●図 2 ホスト環境とjail 環境でのネットワークインターフェースの確認
% ifconfig -a ←ホスト環境でのインターフェースの確認
fwe0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
ether 02:06:1b:01:fa:20
ch 1 dma -1
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 172.16.120.23 netmask 0xfffffe00 broadcast 172.16.121.255
↑ホスト環境で実インターフェースが使用する IP アドレス
inet6 fe80::2d0:59ff:feb5:c200%fxp0 prefixlen 64 scopeid 0x2
inet 172.16.120.25 netmask 0xffffffff broadcast 172.16.120.25
↑ jail 環境(jail-large1)で使用する IP アドレス
inet 172.16.120.26 netmask 0xffffffff broadcast 172.16.120.26
↑ jail 環境(jail-large2)で使用する IP アドレス
ether 00:d0:59:b5:c2:00
media: Ethernet autoselect (10baseT/UTP)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
% sudo jexec 1 ifconfig -a ← JID=1 の jail(jail-large1)でのインターフェースの確認
fwe0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
ether 02:06:1b:01:fa:20
ch 1 dma -1
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 172.16.120.25 netmask 0xffffffff broadcast 172.16.120.25
↑ jail の中では,jail 環境(jail-large1)で使用する IP アドレスだけが設定されているように認識される
ether 00:d0:59:b5:c2:00
↑ MAC アドレスは,実ホストのものと同様となる
media: Ethernet autoselect (10baseT/UTP)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
% sudo jexec 2 ifconfig -a ← JID=2 の jail(jail-large2)でのインターフェースの確認
fwe0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500
ether 02:06:1b:01:fa:20
ch 1 dma -1
fxp0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 172.16.120.26 netmask 0xffffffff broadcast 172.16.120.26
↑ jail の中では,jail 環境(jail-large2)で使用する IP アドレスだけが設定されているように認識される
ether 00:d0:59:b5:c2:00
↑ MAC アドレスは,実ホストのものと同様となる
media: Ethernet autoselect (10baseT/UTP)
status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384

注 2)ホスト環境にしかないコマンドは,ホスト環境でしか実行できません.

80 - Software Design
App.3 ◆ FreeBSD のセキュリティ機能∼ jail の紹介

態を確認してみることにしましょう(図 4)
. 今回の例のようにフルセットの OS 環境を,1 つ
ほかの状態同様,ホスト環境ではすべてのプロ のハードウェア上で複数構築することもできます
セスが見えますが,それぞれの jail では,その jail し,DNS サーバしか動作しない jail,SMTP ゲート
に関係するものだけが見えていることがわかると ウェイしか存在しない jail など,さまざまな用途を
思います. 限定した jailを構築することも可能です.
procfs でも,それぞれのプロセスがどの環境で動 こういった,制限の厳しい jail 環境を構築してい
作しているかが確認できます.その際, くことで,jail をある意味でのセキュア OS として
「/proc/[pid]/status」の最後のフィールドで,どの 利用することができると言えるかもしれません.
環境で動作しているかを見ることができるように
なっています(図 4 の※を参照)

FreeBSD でのセキュアな
環境の構築
jail の利用用途 FreeBSD には,TrustedBSD の成果もマージされ
ている(いわゆる MAC の実装です)ので,jail と
ここまで紹介してきた例は,基本的にフルセッ これらの機能を組み合わせていくことで,より堅
トの OS 環境を jail で構築したものでした.しかし, 牢な環境を構築することができるのではないかと
jailの利用用途は,この限りではありません. 思います.s

●図 3 それぞれの環境におけるLISTEN 状態の確認
% netstat -an|grep LISTEN ←ホスト環境での LISTEN 状態の確認
tcp4 0 0 *.49167 *.* LISTEN
tcp4 0 0 *.6000 *.* LISTEN
tcp4 0 0 172.16.120.23.80 *.* LISTEN
tcp4 0 0 172.16.120.26.25 *.* LISTEN
tcp4 0 0 172.16.120.25.25 *.* LISTEN
tcp4 0 0 172.16.120.25.22 *.* LISTEN
tcp4 0 0 172.16.120.23.22 *.* LISTEN
% sudo jexec 1 netstat -an|grep LISTEN ← JID=1 の jail 環境での LISTEN 状態の確認
netstat: kvm not available
netstat: kvm not available
tcp4 0 0 172.16.120.25.25 *.* LISTEN
tcp4 0 0 172.16.120.25.22 *.* LISTEN
% sudo jexec 2 netstat -an | grep LISTEN ← JID=2 の jail 環境での LISTEN 状態の確認
netstat: kvm not available
netstat: kvm not available
tcp4 0 0 172.16.120.26.25 *.* LISTEN

●図 4 プロセス状態の確認
% ps -ax|wc ←ホスト環境では,jail 環境のプロセスも含めすべてが見える
80 476 3587
% sudo jexec 1 ps -ax ← JID=1 の jail 環境のプロセス確認
PID TT STAT TIME COMMAND
711 ?? SsJ 0:00.41 /usr/sbin/syslogd -s
↑この STAT 項目の「J」は,jail 内のプロセスであることを示すフラグ
854 ?? IsJ 0:00.51 /usr/sbin/sshd
861 ?? SsJ 0:03.55 sendmail: accepting connections (sendmail)
867 ?? IsJ 0:00.11 sendmail: Queue runner@00:30:00 for /var/spool/client
882 ?? SsJ 0:00.75 /usr/sbin/cron
17746 p0 R+J 0:00.02 ps -ax
% sudo jexec 2 ps -ax
PID TT STAT TIME COMMAND
1101 ?? SsJ 0:00.41 /usr/sbin/syslogd -s
↑こちらにも「J」があるが,こちらは JID=2 のもの
1251 ?? SsJ 0:03.46 sendmail: accepting connections (sendmail)
1257 ?? IsJ 0:00.11 sendmail: Queue runner@00:30:00 for /var/spool/client
1272 ?? IsJ 0:00.77 /usr/sbin/cron
17747 p0 R+J 0:00.03 ps -ax
% cat /proc/1101/status ← pid=1101 のプロセスの詳細確認(ホスト環境で確認)
syslogd 1101 1 1101 1101 -1,-1 sldr 1089613231,193913 0,93734 0,340851 select 0 0 0,0 jail-
large2.komoriya.ddo.jp ←※

Oct. 2004 - 81

You might also like