Professional Documents
Culture Documents
All About SELinux
All About 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 E-mail : ynakam@selinux.gr.jp
22 - Software Design
1 章◆ SELinux とは?
●図 1 不正アクセスの流れ ●図 2 不正アクセス対策
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 のようなセキュア
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 とは
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
強制アクセス制御 定できるセキュリティポリシ」と,そのセキュリ
ティポリシに従ったセキュリティチェックを実装
SELinux の機能概要で説明したように強制アク しています.
セス制御は,
「セキュリティ管理者のみが設定でき
るセキュリティポリシ」を「すべてのユーザ/プ 最小特権
ロセスに強制する」ことです.SELinux では,
LSM(Linux Security Module :図 4 の③)を利用す 最小特権は TE(Type Enforcement)とドメイン
ることで,
「すべてのユーザ/プロセスに強制する」 遷移,RBAC(Role-Based Access Control)で実現
ことを実現しています. されています.これらについて順に説明していき
LSM を簡単に説明すると,カーネル内において, ます.
●図 4 LSM のしくみ
プロセス
①アクセス要求
セキュリティ管理者のみが
②Linuxパーミッション Linuxカーネル 設定可能
チェック
④セキュリティ
チェック依頼
⑤セキュアOS
③LSM
モジュール
⑥チェック結果
セキュリティポリシ
⑦アクセス
rootでも回避できない
リソース セキュリティチェック
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 }
26 - Software Design
1 章◆ SELinux とは?
¡タイプ 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 設定記述の例
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 とは?
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(許可)されたことを示し
●リスト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 の効果
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 ページの更新などを監査することがで クセス権限を設定できるだけです.しかし,バッ
き,不正な操作に対する抑止効果があります. ファオーバーフロー攻撃は,次で説明する権限内
ワーム感染マシン 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 の限界
■アクセス制御に関係ない攻撃
Dos 攻撃 − ハード/ソフトウェアでの対策
■与えられた権限内での攻撃
クロスサイトスクリプティング − セキュアなプログラミング
セッション管理不備によるなりすまし攻撃 − セキュアなプログラミング
■ OS 自体のセキュリティホール
32 - Software Design
特集● SELinux 大全
SELinux 機能のモードについて説明します.
●表 1 SELinux 関連のパッケージ
パッケージ名 解説
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 ユーザでログインします.ロールについて
は後ほど説明しますが,ここではデフォルトの
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 …
略
①プロセスのセキュリティコンテキスト
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 で
の設定が正しく動作しなくなります. 最後に
Oct. 2004 - 39
特集● SELinux 大全
ポリシファイルについて 述されています.このファイルはテキスト形式で
すが,編集内容が保持されないため,通常は編集
しません.
ポリシファイルの用意
40 - Software Design
3 章◆ SELinux 設定方法の基礎∼ポリシファイル編集法
このディレクトリ下の「アプリケーション名.te」という 設定の反映
program
ファイルで,アプリケーションに関連する設定が行われています
ポリシを編集しただけ
●表 2 file_contexts ディレクトリの構造 では,設定は反映されま
ファイル/ディレクトリ 意味 せん.設定を反映する操
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
※端末ファイルのタイプが書き換えられるため,コマンドがコンソールにアクセスできなくなり,アクセス拒否ログが出力されます.
そこで,ログアウトすることで端末ファイルのタイプをリセットしています.
COLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMNCOLUMN
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 簡単な設定追加が必要なアプリケーション
OpenSSH ssh.te,ssh.fc
Samba samba.te,samba.fc
●表 3c 大きな設定変更が必要なアプリケーション アプリケーション
注 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 動作テストで出力されたログ
※/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 元の出力に戻す
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 audit2allow の書式
audit2allow [-d] [-v] [-l] [-i 入力ファイル] [-o 追記するファイル]
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
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 のような 追加します.
●表 5 ファイルのアクセス権限を設定するときに利用するマクロ
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 で定義されている要素
定義内容 意味
50 - Software Design
特集● SELinux 大全
● a の定義の問題点
Oct. 2004 - 51
●表 1 tunable.te の調整による設定の変化
調整前 調整後
図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 ドメインのおもなアクセス権限
/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/)」 を 動 作 さ せ て み ま し ょ う . 今 回 は ,
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 ディレク ようとして拒否されたログが出力されていること
トリにて,このファイルを展開します. がわかります.
●ログのチェック
実際に,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/xferlog xferlog_t
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
略
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 ロールを使えなく
ログインすることで,ホームディレクトリに転送 なっており,ログインできないからです.
Oct. 2004 - 57
この設定の副作用として,make relabel をする際
setfiles file_contexts/file_contexs /ho
にエラーが出てしまいます.これを回避するため
me/ynakam (実際は 1 行)
には,file_contexts/program/apache.fcから,リスト
6の行を削除するかコメントアウトすればOKです. を実行し,タイプを付け直します.
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
58 - Software Design
特集● SELinux 大全
て立ち上げられていた「LSM(Linux Security
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 章で掲載した図を
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 を理解する
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)
if (error)
return error;
DQUOT_INIT(dir);
error = dir->i_op->mkdir(dir, dentry, mode); ③
62 - Software Design
App.1 ◆ LSM を理解する
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 大全
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 のポリシ周りに注力しています.彼独自のポリシを持っており,彼のポリシに
Russell Coker 氏 パッチが取り込まれると,その後本家に取り込まれる流れになっているようです.ポリシに
関する議論は彼に CC すると話が早いです.
●表 2 国内企業の取り組み
監査機能強化モジュール 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 のポリシを変更するためには,ポリシフ
●表 3 SELinux の対応が始まっているディストリビューション
66 - Software Design
App.2 ◆ SELinux の最新動向
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 た, 得 授業で使える!すぐに役立つ!
厳選 教育ホームページ紹介
付い
ほか
Oct. 2004 - 67
特集● SELinux 大全
カーネルとの連携 △ ◎
¡設定が簡単
ディストリビューションとの連携 △ ◎
のちほど説明しますが,LIDS でアクセス制限を
情報源 △ ○
設定する方法は「どのプログラムが,どのオブジェ
コミュニティの取り組み ○ ○
クトに対して,どういうパーミッションを持ってい
コミュニティの親密性 ◎ ○
る」という構文のコマンドを並べたリスト形式にな
注 1)カーネル2.2 用のものは,残念ながら開発がストップしました.
68 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介
LIDS の場合
¡ディストリビューションとの連携
SELinux は,Red Hat Linux や Turbolinux など, これに対し,LIDS を導入すると,システムは伝
さまざまなディストリビューションに取り込まれ 統的なパーミッションによるアクセス制御を行っ
ていますが,LIDS は,まだディストリビューショ た後に,LSM を通じて LIDS 独自のパーミッション
ンに取り込まれていません. によるアクセス制御が行われます(図 2).これに
より,UNIX パーミッションで許可されている書き
¡コミュニティの相違 込み行為を,LIDS のアクセス制御で禁止したりす
LIDS は,完全にコミュニティベースで開発が進 ることができます.
められているため,個人の要望が聞き届けられや
すいと言えます注 2. ● LIDS で作成したパーミッションの特徴
◆◆◆ LIDS で作成したパーミッションに関しては,
以上の点から,LIDS は SELinux に比べて設定が MAC(強制アクセス制御)で,次のような特色を
粗い反面,より直感的でわかりやすい設定方法を 持っています.
提供していると言えます.
では次の 2 種類のアクセス制御が可能になります.
UNIXパーミッション 動作の拒否
-rwxr-xr-x root root
①ファイルに対するアクセス制御 No
②プロセスに対してのアクセス制御 Yes
を書いたリストがあり,これを 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
動作が許可される 動作の拒否
70 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介
●表 2 LIDS で設定できるパーミッション
DENY 拒否.ディレクトリ名やファイル名は表示されるが,内部にアクセスすることはできない
WRITE 読み込み/書き込み/消去などがすべてできる
●図 4 lidsconf コマンドの書式
lidsconf -A ステート -s プログラム -o ディレクトリ/ファイル -j パーミッション
※ステートに関しては後述の「②ステートフルACL」の項で解説します.
etc READONLY
● LIDS 設定の構文 ssh 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 ィ上,付与するものは
●表 4 一部のLinux ケーパビリティの説明
CAP_DAC_OVERRIDE ファイルの読み込み/書き込みと実行権限のチェックをバイパスする
CAP_KILL シグナル送信に対する権限チェックをバイパスする
CAP_NET_ADMIN さまざまなネットワークに関係する操作(インターフェースの設定や,ルーティング
テーブルを変更するなど)を許可する
CAP_SYS_TIME システムクロックの変更を許可する
※オプションは省略する場合もあります.
Oct. 2004 - 73
●リスト2 孫プロセスまでパーミッションやケーパビリティを継承
●リスト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 やケーパビリティなどについて
74 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介
●表 5 /etc/lids ディレクトリ内部に格納されているファイル
lids.pw ステート変更時や設定変更時に使用するパスワードファイル
lids.cap プログラムへのデフォルトケーパビリティ
●図 9 lids.conf の書式
プログラムの inode:デバイス番号:プログラム:パーミッション:継承レベル:ディレクトリ/ファイルの inode:デバイス番号:時間(Obsolete)
● inode ●デバイス番号
たとえば,/ディレクトリに関しては,リスト 4 デバイス番号は,メジャー番号とマイナー番号
①のようになっていますが,これはプログラムを の組み合わせになっています.デバイス番号 769 に
指定していないデフォルト ACL のため,「inode 番 ついては,
Oct. 2004 - 75
●図 10 メジャー番号,マイナー番号とデバイスの関係
brw-rw---- 1 root disk 3, 1 May 6 1998 /dev/hda1
76 - Software Design
5 章◆他のセキュア OS の選択肢∼ LIDS の紹介
●表 6 ステートの種類
BOOT システム起動時からカーネル封印まで
POSTBOOT カーネル封印後.通常はこのステートで運用を行う
SHUTDOWN このステートに移行してから,システムをシャットダウンする
●表 7 ステートフルACL による解決法
それぞれを簡単に見ていきましょう. などの弊害がありました.
これを解決するために,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 モードでログファイルに出力される内容
●表 8 LIDS の情報源
③ LIDS-FAQ(旧版) http://www.linux.or.jp/JF/JFdocs/LIDS-FAQ/
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. まとめ
注 7)ただし,フルパスでプログラムやディレクトリを表示する機能がないため,それは適宜調べる必要があります.
78 - Software Design
特集● SELinux 大全
●図 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 で利用できる
●図 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