■SELinux■
・SELinuxとは
Fedoraには強力なアクセス制御機能を実現しLinuxをセキュアOS化するモジュールであるSELinuxが標準搭載されています。FedoraのSELinuxでは利便性優先のtargetedとstrict、さらには最新のmisという3種類のポリシータイプが用意されております。今回はデフォルトのtargetedポリシータイプを基本にSELinuxについて説明します。
最近よく「セキュアOS」という言葉を耳にする機会が多くなっていますが、そもそもセキュアOSとはなんんぞや?と思いますが、その名の通り、セキュリティーを強化したOSのことなのです。
今回紹介するSELinux(Security-Enhanced Linux)はLinuxをセキュアOS化する目的で開発された、Linux用セキュリティー拡張モジュールで、米国のNSA(National Security Agency)http://www.nsa.gov/が中心になって開発してGPLに従って配布しています。
・アクセス制御
これまでのUNIX系OSでは、個々のユーザごとにファイルやディレクトリにパーミッションを設定していました。このようなアクセス制御の仕組みを「任意アクセス制御」(DOC:Discretionary Access Conrol)と呼びます。任意アクセス制御では、アクセス制御はそれぞれのオーナーに一任され、システム全体の統一したセキュリティーの管理が難しくなります。また、rootユーザはシステムに関するあらゆる権限を与えられている為にroot権限が奪われてしまうとシステムを乗っ取られてしまいます。
それに対してSELinuxなどセキュアOSでは「任意アクセス制御」に加えて「強制アクセス制御」(MAC:Mandatory Access Control)というアクセス制御モデルを取ります。強制アクセス制御ではセキュリティー管理者が設定した「ポリシー」に基づいてアクセス制御をおこないます。
例えば、Apachのhttpdプロセスには、/var/www/html以外のディレクトリへのアクセスを許可しないといったことが可能になります。もちろん強制アクセス制御はrootユーザにも適用されるために、root権限を制限することも可能です。
SELinuxの強制アクセス制限モデルの中心になるのは、TE(Type Enforcement)、RBAC(Role-Based Access Control)という2つです。
・TEについて
TE(Type Enforcement)とは、システム内のすべてのプロセスとファイルなどのリソースにラベルを付けて、それぞれのプロセス毎に細かくアクセス制御を行う機能のことです。
このとき、プロセスに付けられたラベルを「ドメイン」、ファイルやディレクトリなどのリソースに付けられたラベルを「タイプ」と呼びます。それぞれのドメインごとに、タイプに対してアクセス制御を行うのです。
例としては、Webサーバー「Apach」を取り上げてみます。「Apach」のプロセス「httpd」には、「httpd_t」というドメインが割り当てられています。また、「Apach」で公開するファイルは「/var/www」ディレクトリですが、そのディレクトリ以下のファイルには「httpd_sys_content_t」というタイプが割り当てられております。
「http_t」ドメインに「httpd_sys_content_t」タイプの「読み込み」と「属性の取得」を許可する設定例は次のようになります。
プロセスへのドメインの割り当ては機能によって行われます。また、すべてのプロセスには「init」を起点とする親子関係がありますが、「SELinux」ではデフォルトで子プロセスのドメインは親プロセスのドメインを引き継ぎます。その為、なにも設定していないとすべてが「init」プロセスと同じドメインになってしまいます。そうではなく、あらかじめ設定されたポリシーに従って親プロセスが子プロセスを起動したときのドメインを割り当てる仕組みです。なお、ファイルなどのリソースへのタイプの割り当ては「SELinux」のアクセス制御を使用する前に行っておく必要があります。例えば「fixfile relabel」コマンドを実行すると、あらかじめ設定されたポリシーに従って、全てのリソースにタイプが設定されます。
・RBACについて
RBAC(Role-Based Access Control)は、ユーザーに割り当てられたロールによりアクセス権限を限定する仕組みです。これまでのLinuxでは「root」ユーザに絶対的な権限が与えられていました。したがって「root」のパスワードがもれた場合にはシステムを乗っ取られてしまうのです。
それに対して「SELinux」ではユーザーごとに個別にアクセス制御を設定した「ロール」と呼ばれる役割を与え、アクセス可能なリソースを設定できるのです。例えば「Webページ管理者」といった「ロール」を用意して、Web管理に必要なリソースに対してのみアクセスを許可するといった設定が可能なわけです。ロールは一般のユーザー、rootの区別はなく割り当てられます。例えば「ssh」によるリモートログインで「root」としてログインした場合には、より権限の低いロールを割り当てるといった設定も可能なのです。
■SELinuxの基本設定
FedoraでのSELinuxの基本設定を行っていきます。SELinxの設定は難解な部分が多いですが、Fedoraではアクセス制御の厳しさに応じた3種類のポリシータイプが用意されており、さらにSELinuxでのアクセス制御を行うサービスをポリシーファイルを変更しないで「オン・オフ」する仕組みを導入したことで比較的容易に扱うことができます。
・ポリシータイプ
Fedora Core 5移行では、SELinuxバージョン2.X系のセキュリティポリシーに移行し、モジュール化されたReferenceポリシー(http://www.tresys.com)が採用されています。
SELinuxは強力なアクセス制御が可能な反面、適切にポリシーを設定しないと意図したプロセスが作動しません。現状ではポリシーの設定にはセキュリティに関する詳細な知識が必要になります。また、デスクトップ環境を中心に運用する場合には厳しすぎるポリシーでは使い勝手が悪い場合もありえます。そのためFedoraでは3種類のポリシータイプを用意しており、それを必要に応じて切り替えられるようになっております。
Fedoraのデフォルトモードである「targeted」モードの場合、ポリシーファイルで設定されたネットワークデーモン以外のプロセスのドメインが、強制サクセス制御を行わない「unconfined_t」に設定されております。ロールは一般ユーザ、rootユーザともに「unconfined_r」に設定されています。
misモードではFedora Core 6以降で導入されたMLS機能を有効にしたモードです。MLSとは「Multi Level Security」の頭文字を表しており、全てのプロセスが強制アクセス制御の対象となります。さらに、それに加えてセキュリティを複数に分割することにより、より柔軟な管理が可能です。
尚、SELinuxのRefernceポリシーにはセキュリティをカテゴリ(部門)ごとにわけて管理する機能にMCS(Multi Category Security)という機能があります。MCLはMLSのサブセット版で、Fedoraの場合全てのポリシータイプでMCSが有効となっています。
・SELinuxでの動作モード
SELinuxでの動作モードでは次の3種類があります。
「無効」はSELinuxが無効な状態、「Enforcing」は有効な状態です。「Pemissive」はSELinuxが有効ですが、アクセス拒否は行わず、メッセージのみを記録するモードです。記録されたファイルは「/var/log/messagesおよびdmesg」になります。サーバーの設定中などにアクセス拒否にその原因を探るために使用されます。
・コマンドラインでの動作モード変更
コマンドラインで動作モードを切り替えるには「setenforce」コマンドを使用します。引数に「1」を指定した場合にはEnforcingモード、「0」を指定した場合にはPermissiveモードとなります。
※Permissiveモードにする。
※Enforcingモードにする。
現在のモードを確認するには引数なしで実行します。
SELinuxに関するより詳しい設定状況を表示する。
・SELinux管理者ツール
SELinuxの管理をダイアログで行うための「SELinux管理者ツール」が搭載されています。コマンドラインでSELinuxの詳細な管理を行うツールにsemanageコマンドがありますが、SELinux管理者ツールはそのGUI版になります。
SELinux管理者ツールは「システム」メニュー⇒「管理」⇒「SELinux Management」を選択し起動します。管理者ツールは8つのパネルより構成されているのですが、通常の使用では「状態」パネルと「ブーリアン値」パネルでの2つのパネルを使用します。SELinuxの詳細な仕組みが分からないまま、その他のパネルの設定を変更するとサービスが起動しなくなるなどのトラブルが生じる可能性があるので注意して下さい。
・状態パネル
「状態」パネルではモードの切り替えとポリシーの選択を行います。「システムのデフォルトの強制モード」ではシステム起動時のモードを、「現在の強制モード」では現在のモードを切り替えます。
「システムデフォルトのポリシータイプ」では起動時のポリシータイプを選択できます。デフォルトはtargetedポリシータイプです。minimum、misポリシータイプを選択するには、あらかじめ対応するパッケージをインストールしておく必要があります。また、ポリシータイプを変更した場合、ラベルの再設定が必要になりますが「次の再起動でリラベル」をチェックしておくと、次回の再起動時に自動でラベルが設定されます。
・「ブーリアン値」パネル
「ブーリアン値」パネルでは、ポリシーファイルを直接修正することなく、個別にオン/オフできるポリシーが用意されております。例えば、apacheモジュールの「httpd_enable_cgi」はApache WebサーバのCGIの実行許可に関する設定です。初期状態ではチェックされCGIが許可されていますが、これを外すとApacheの設定にかかわらずCGIが実行拒否されます(httpdデーモンを再起動する必要はありません)
ここでの設定は「0」(false)もしくは「1」(true)のブーリアン値として/etc/selinux/targeted/modules/active/booleans.localに書き込まれます。なお、booleans.localは「ブーリアン値」パネルの設定を変更した時点で作成されます。
・「ファイルラべリング」パネル
「ファオリラベリング」パネルでは、ローカルファイルシステム内の各ファイルに設定されているラベルを確認できます。上部の「フィルター」で表示内容を絞り込むことができます。
・「ユーザマッピング」パネル
「ユーザマッピング」パネルでは、システムログイン名と「SELinux」におけるユーザー及びMLS/MCSのレンジのマッピングを行います。デフォルトでは「root」、「system_u」、それ以外(_default_)に分割されていますが、targetedモードではそれらの区別はありません。
・「SELinux User」パネル
「SELinux User」パネルでは、SELinuxにおけるユーザーのMLS/MCSのレベル、レンジやロールが設定されています。なおレベル「s0」はレベルが設定されていないことを表しています。
・「変換」パネル
「変換」パネルでは、セキュリティレベルとMLS/MCSのレンジの名前の対応を設定します。「SELinux User」パネルと見比べてみるとわかるように、全てのユーザーは「SystemLow-SystemHigh」という名前のレンジに設定されています。この「SystemLow-SystemHigh」は、実際には「s0-s0:c0-c1023」 というセキュリティレベルを表します。「s0」というのは階層なしで、「c0.c1023」は「c0~c1023」のすべてのカテゴリにアクセスできることを示しています。
・「Network Port」パネル
「Network Port」パネルでは、ネットワークポートに設定されているラベルを確認できます。
・「ポリシーモジュール」パネル
「ポリシーモジュール」パネルでは、現在ロードされているポリシーモジュールと、そのバージョンの確認と変更が行えます。
・コマンドラインでのブーリアン値の確認
SELinux管理者ツールの「ブーリアン値」パネルでは、個別にオン/オフできるポリシーの確認/設定が行えましたが、コマンドラインで現在のブーリアン値を確認するには「getsebool」コマンドを使用します。その際にオプション「-a」を指定した場合には、すべての値が表示されます。
・SELinuxの設定ファイル
SELinuxのメイン設定ファイルは「/etc/sysconfig/selinux」になります。
変数「SELINUX」の値を変更することで、システム起動時のSELinuxの動作を設定できます。このように「enforcing」になっていれば、Enforcingモードとなり強制アクセス制御が機能しています。その他の設定としては2つあります。それでは設定ファイルを見てみましょう。
その他の設定ファイル
■ランレベルを再設定する
Fedoraではとくに「targeted」モードにおいては、アクセス制御の対象となるネットワークサービスが基本的に動作するようにポリシーが設定されております。ただし、サービス設定によってはポリシーによってアクセスが拒否され意図した通りに動作しない場合があります。まずは、タイプを再設定することで対処できるケースについて取り上げます。
・リソースタイプについて
ホームディレクトリ以外のファイルやディレクトリなどのリソースに対するセキュティコンテキストは「/etc/selinux/<ポリシータイプ>」ディレクトリの「contexts/file_contexts」で設定されています。例えば、Apachが使用する「/var/www」ディレクトリの設定を示します。ファイルを確認してみましょう。
上記ディレクトリの最後の「(/.*)?」は正規表記による指定で、「/var/www」ディレクトリ以下の任意のディレクトリを表します。この指定により「/var/www」ディレクトリ以下は「httpd_sys_content_t」というタイプを持ちます。ファイルのタイプはその下のディレクトリにも引き継がれますので「/var/www/html」ディレクトリ以下においたhtmlファイルのタイプも「httpd_sys_content_t」となります。TEにより「httpd_sys\content_t」タイプは「httpd_t」ドメインから読み込みを許可されているので「/var/www/html」ディレクトリ以下においたWebページが表示されるのです。
それでは「~/public_html」ディレクトリにユーザーごとのWebページを設置する場合はどうでしょうか。初期状態のホームディレクトリのタイプは「user_home_t」となっているために「public_html」ディレクトリを作成してWebページを置くと、そのタイプも「user_home_t」となってしまいます。
実際に「~public_html」ディレクトリにhtmlファイルを保存してWebブラウザから「http://サーバー/~ユーザ名」にアクセスしてみましょう。するとエラーメッセージになります。また、ログファイルには(/var/log/audit/audit.log)次のようなSELinuxの監視ログ(AVCメッセージ)が残ります。
これでSELinuxの監視ログを見ることができます。
ドメイン「httpd_t」にはタイプが「user_home_t}の「~/public_html」ディレクトリにはアクセス権がないためにアクセスが拒否(denied)されたというメッセージです。「scontext」「tcontext」には、それぞれのプロセスのセキュリティテキスト、リソースのセキュリティテキストです。ホームディレクトリに関するセキュリティコンテキストは「file_contexts.homedir(/etc/selinux<ポリシータイプ>ディレクトリの「contexts/files/file_contexts.homedirs)に記述されております。このファイルを見てみると次のような行があります。
これはホームディレクトリ以下の「www」「web」もしくは「public_html」のいずれかのディレクトリに対して、タイプ「httpd_user_content_t」を設定するものです。タイプ「httpd_user_content_t」は、httpd_tドメインからの読み込みをポリシーで許可されています。したがって、この設定に従ってタイプを設定し直せばいいわけです。
・タイプを個別に付け直す
ファイルやディレクトリなどのリソースに関するセキュリティコンテキストを「file_contexts」ファイルの設定に従って修正するにはいくつかの方法があります。最も簡単なのは、指定したディレクトリ以下のタイプをポリシーファイルの設定に従って修正する「restorecon -R <ディレクトリ>」コマンドを実行する方法です。
以上の命令で「~public_html」のタイプが「httpd_user_content_t」に変更されました。
なお「chcon -R -t」タイプコマンドを使用すると、引数で指定したタイプに設定することができます。前述の例は次のようにすることもできます。
・ポリシー内のラベルを変更する
ポリシー内のラベルを設定したり、ネットワークポートのマッピングを設定するSELinux管理コマンドに「semanage」があります。これを使用して「/home/<ユーザ名>/www2」ディレクトリのタイプを「httpd_sys_content_t」に設定するには次のように行います。
targetedモードの場合、結果は「/etc/selinux/targeted/contexts/files/file_contexts.local」に書き込まれます。
以上が「/home/<ユーザ名>/fxsl/www2」ディレクトリに対して「restorecon」コマンドを実行すると、タイプが「httpd_sys_content_t」となります。
■モジュールの作成
Fedora Core 4までのセキュリティーポリシーはコマンドでラベルを再設定をしても動作しないケースでは、ポリシーのソースファイルを修正してコンパイルを行ってポリシーをカーネルに読み込ませておりました。それに対して、Fedora Core 5以降ではポリシーがモジュール化して必要な部分のみモジュール・パッケージとして作成してカーネルに動的に追加/削除ができるようになりました。とはいっても、実際にポリシーの修正を行うにはセキュリティ及びアプリケーションに関する高度な知識が必要になります。また、ポリシーファイルの設定を誤ると逆にセキュリティーホールを増やしてしまう可能性もありますので注意して下さい。ここではモジュール作成の概略を説明いたします。
・auditdデーモンについて
SELinuxの監視ログは「auditdデーモン」によって「/var/log/audit/audit.log」に出力されております。「auditdデーモン」が起動していないと監視ログも「/var/log/messages」に出力され、他の雑多なログと混ざってSELinux関連の部分が分かりにくくなってしまいます。環境によっては「auditdデーモン」がインストールされていない場合には「ソフトウェアの追加/削除」などでauditパッケージをインストールしてください。
「auditdパッケージ」をインストールすると自動的にauditdサービスが起動します。サービスの設定ツール「システム」⇒「管理」⇒「サービス」で「auditd」が有効になっているかを確認してみて下さい。
・監視ログ検索
auditdの監視ログを検索しフォーマットして表示してくれるツールに「ausearch」があります。「-m タイプ」オプションを指定すると指定したタイプのログのみが表示されます。例えば、タイプがポリシーによる判定結果を記録する「AVC」(Access Vector Cache)であるログのみを表示するには次のように行います。
・ロードされているモジュールの確認
現在ロードされているSELinuxのモジュールは「semodule -l」コマンドで確認します。
なお、これらのモジュールの他に基本モジュール「base.pp」がロードされておりますが、「semodule -l」コマンドでの出力では基本モジュールは省略されます。
・監視ログモジュールを作成する
モジュール作成の例としてWindowsのファイルサーバ機能を提供するSambaを取り上げて説明します。例えば、Sambaで「/mnt/share」というディレクトリを公開しているとします。「/mnt」ディレクトリ以下のタイプは「mnt_t」に設定されておりますが、初期状態ではSamba経由で書き換えが許可されておりません。ここで「smbd」(Sambaのサーバープロセス)に「/mnt/share」というディレクトリを公開しているときに、その書き換えを許可するようにローカルモジュールパッケージ「local.pp」として作成してみましょう。手順としてはモジュール用のTEファイル(local.te)を作成して、それをコンパイルしバイナリ形式のモジュールファイル(local.mod)に変換、最後にパッケージファイル(local.pp)にまとめるという作業になります。なお、モジュール作成にはcheckpolicyパッケージが必要になりますので、インストールされていない場合は下記のコマンドでインストールしてください。
・TEファイルを作成する
まず、TEファイルとして「local.te」を作成します。各種エディタ等で作成してもかまいませんが、「sudit2allow」というコマンドを使用することでログファイルから簡単に自動生成することができます。
SambaサーバーにWindowdクライアントからアクセスし、「/mnt/share」ディレクトリにアクセスして下さい。パーミッションが許可されていた場合でもクライアントには「/mnt/share」ディレクトリは変更できません。また、「var/log/audit/audit.log」には書き換え(write)が拒否された(denied)というログが記録されます。
auditdのログファイルをローテートするには下記のコマンドを使用します。
続いて、制御モードを「Permissiveモード」に設定します。
この状態でもう一度Windowsクライアントからアクセスしてみましょう。続いて、ディレクトリを作成したり、その下にファイルをコピーしたり、操作を行ってみましょう。作成(create)、名前の変更(add_name)などが拒否されたログも記録されます。
この「/var/log/audit/audit.log」から「local.te」を作成するには「audit2allow」コマンドを実行します。(-m local)はlocalという名前のモジュールを作成するオプションです。
これで、ローカルモジュールの用のTEファイル「local.te」が作成されました。実際に確認してみましょう。
※一番初めの行は、モジュール名とバージョン情報が記載されています。
※下から2行目ではドメイン「smbd?t」にタイプ「mnt_t」のディレクトリを許可しており、一番下の行ではファイルへのアクセスを許可しています。
・TEファイルをコンパイルする
では、次に「checkmodule」コマンドでTEファイル(local.te)をコンパイルしバイナリ形式のmodファイル(local.mod)に変換します。
・モジュールのパッケージを作成する
続いて「semodule_package」を使用して、modファイル(local.mod)をモジュールパッケージ(local.pp)に変換します。
・モジュールをカーネルにロードする
完成したモジュールパケージ(local.pp)をカーネルにロードするには「semodule -i パス」コマンドを使用します。
・モジュールを削除する
一度、カーネルにロードされたモジュールは「etc/selinux/targeted/module/active/module」ディレクトリに保存されてシステムを再起動しても有効な状態になっております。そのモジュールを削除するには「semodule -r モジュール名」を実行します。
・SELinuxとは
Fedoraには強力なアクセス制御機能を実現しLinuxをセキュアOS化するモジュールであるSELinuxが標準搭載されています。FedoraのSELinuxでは利便性優先のtargetedとstrict、さらには最新のmisという3種類のポリシータイプが用意されております。今回はデフォルトのtargetedポリシータイプを基本にSELinuxについて説明します。
最近よく「セキュアOS」という言葉を耳にする機会が多くなっていますが、そもそもセキュアOSとはなんんぞや?と思いますが、その名の通り、セキュリティーを強化したOSのことなのです。
今回紹介するSELinux(Security-Enhanced Linux)はLinuxをセキュアOS化する目的で開発された、Linux用セキュリティー拡張モジュールで、米国のNSA(National Security Agency)http://www.nsa.gov/が中心になって開発してGPLに従って配布しています。
・アクセス制御
これまでのUNIX系OSでは、個々のユーザごとにファイルやディレクトリにパーミッションを設定していました。このようなアクセス制御の仕組みを「任意アクセス制御」(DOC:Discretionary Access Conrol)と呼びます。任意アクセス制御では、アクセス制御はそれぞれのオーナーに一任され、システム全体の統一したセキュリティーの管理が難しくなります。また、rootユーザはシステムに関するあらゆる権限を与えられている為にroot権限が奪われてしまうとシステムを乗っ取られてしまいます。
それに対してSELinuxなどセキュアOSでは「任意アクセス制御」に加えて「強制アクセス制御」(MAC:Mandatory Access Control)というアクセス制御モデルを取ります。強制アクセス制御ではセキュリティー管理者が設定した「ポリシー」に基づいてアクセス制御をおこないます。
例えば、Apachのhttpdプロセスには、/var/www/html以外のディレクトリへのアクセスを許可しないといったことが可能になります。もちろん強制アクセス制御はrootユーザにも適用されるために、root権限を制限することも可能です。
SELinuxの強制アクセス制限モデルの中心になるのは、TE(Type Enforcement)、RBAC(Role-Based Access Control)という2つです。
・TEについて
TE(Type Enforcement)とは、システム内のすべてのプロセスとファイルなどのリソースにラベルを付けて、それぞれのプロセス毎に細かくアクセス制御を行う機能のことです。
このとき、プロセスに付けられたラベルを「ドメイン」、ファイルやディレクトリなどのリソースに付けられたラベルを「タイプ」と呼びます。それぞれのドメインごとに、タイプに対してアクセス制御を行うのです。
例としては、Webサーバー「Apach」を取り上げてみます。「Apach」のプロセス「httpd」には、「httpd_t」というドメインが割り当てられています。また、「Apach」で公開するファイルは「/var/www」ディレクトリですが、そのディレクトリ以下のファイルには「httpd_sys_content_t」というタイプが割り当てられております。
「http_t」ドメインに「httpd_sys_content_t」タイプの「読み込み」と「属性の取得」を許可する設定例は次のようになります。
|
プロセスへのドメインの割り当ては機能によって行われます。また、すべてのプロセスには「init」を起点とする親子関係がありますが、「SELinux」ではデフォルトで子プロセスのドメインは親プロセスのドメインを引き継ぎます。その為、なにも設定していないとすべてが「init」プロセスと同じドメインになってしまいます。そうではなく、あらかじめ設定されたポリシーに従って親プロセスが子プロセスを起動したときのドメインを割り当てる仕組みです。なお、ファイルなどのリソースへのタイプの割り当ては「SELinux」のアクセス制御を使用する前に行っておく必要があります。例えば「fixfile relabel」コマンドを実行すると、あらかじめ設定されたポリシーに従って、全てのリソースにタイプが設定されます。
・RBACについて
RBAC(Role-Based Access Control)は、ユーザーに割り当てられたロールによりアクセス権限を限定する仕組みです。これまでのLinuxでは「root」ユーザに絶対的な権限が与えられていました。したがって「root」のパスワードがもれた場合にはシステムを乗っ取られてしまうのです。
それに対して「SELinux」ではユーザーごとに個別にアクセス制御を設定した「ロール」と呼ばれる役割を与え、アクセス可能なリソースを設定できるのです。例えば「Webページ管理者」といった「ロール」を用意して、Web管理に必要なリソースに対してのみアクセスを許可するといった設定が可能なわけです。ロールは一般のユーザー、rootの区別はなく割り当てられます。例えば「ssh」によるリモートログインで「root」としてログインした場合には、より権限の低いロールを割り当てるといった設定も可能なのです。
■SELinuxの基本設定
FedoraでのSELinuxの基本設定を行っていきます。SELinxの設定は難解な部分が多いですが、Fedoraではアクセス制御の厳しさに応じた3種類のポリシータイプが用意されており、さらにSELinuxでのアクセス制御を行うサービスをポリシーファイルを変更しないで「オン・オフ」する仕組みを導入したことで比較的容易に扱うことができます。
・ポリシータイプ
Fedora Core 5移行では、SELinuxバージョン2.X系のセキュリティポリシーに移行し、モジュール化されたReferenceポリシー(http://www.tresys.com)が採用されています。
SELinuxは強力なアクセス制御が可能な反面、適切にポリシーを設定しないと意図したプロセスが作動しません。現状ではポリシーの設定にはセキュリティに関する詳細な知識が必要になります。また、デスクトップ環境を中心に運用する場合には厳しすぎるポリシーでは使い勝手が悪い場合もありえます。そのためFedoraでは3種類のポリシータイプを用意しており、それを必要に応じて切り替えられるようになっております。
|
Fedoraのデフォルトモードである「targeted」モードの場合、ポリシーファイルで設定されたネットワークデーモン以外のプロセスのドメインが、強制サクセス制御を行わない「unconfined_t」に設定されております。ロールは一般ユーザ、rootユーザともに「unconfined_r」に設定されています。
misモードではFedora Core 6以降で導入されたMLS機能を有効にしたモードです。MLSとは「Multi Level Security」の頭文字を表しており、全てのプロセスが強制アクセス制御の対象となります。さらに、それに加えてセキュリティを複数に分割することにより、より柔軟な管理が可能です。
尚、SELinuxのRefernceポリシーにはセキュリティをカテゴリ(部門)ごとにわけて管理する機能にMCS(Multi Category Security)という機能があります。MCLはMLSのサブセット版で、Fedoraの場合全てのポリシータイプでMCSが有効となっています。
・SELinuxでの動作モード
SELinuxでの動作モードでは次の3種類があります。
|
「無効」はSELinuxが無効な状態、「Enforcing」は有効な状態です。「Pemissive」はSELinuxが有効ですが、アクセス拒否は行わず、メッセージのみを記録するモードです。記録されたファイルは「/var/log/messagesおよびdmesg」になります。サーバーの設定中などにアクセス拒否にその原因を探るために使用されます。
・コマンドラインでの動作モード変更
コマンドラインで動作モードを切り替えるには「setenforce」コマンドを使用します。引数に「1」を指定した場合にはEnforcingモード、「0」を指定した場合にはPermissiveモードとなります。
|
|
現在のモードを確認するには引数なしで実行します。
|
SELinuxに関するより詳しい設定状況を表示する。
|
・SELinux管理者ツール
SELinuxの管理をダイアログで行うための「SELinux管理者ツール」が搭載されています。コマンドラインでSELinuxの詳細な管理を行うツールにsemanageコマンドがありますが、SELinux管理者ツールはそのGUI版になります。
SELinux管理者ツールは「システム」メニュー⇒「管理」⇒「SELinux Management」を選択し起動します。管理者ツールは8つのパネルより構成されているのですが、通常の使用では「状態」パネルと「ブーリアン値」パネルでの2つのパネルを使用します。SELinuxの詳細な仕組みが分からないまま、その他のパネルの設定を変更するとサービスが起動しなくなるなどのトラブルが生じる可能性があるので注意して下さい。
・状態パネル
「状態」パネルではモードの切り替えとポリシーの選択を行います。「システムのデフォルトの強制モード」ではシステム起動時のモードを、「現在の強制モード」では現在のモードを切り替えます。
「システムデフォルトのポリシータイプ」では起動時のポリシータイプを選択できます。デフォルトはtargetedポリシータイプです。minimum、misポリシータイプを選択するには、あらかじめ対応するパッケージをインストールしておく必要があります。また、ポリシータイプを変更した場合、ラベルの再設定が必要になりますが「次の再起動でリラベル」をチェックしておくと、次回の再起動時に自動でラベルが設定されます。
・「ブーリアン値」パネル
「ブーリアン値」パネルでは、ポリシーファイルを直接修正することなく、個別にオン/オフできるポリシーが用意されております。例えば、apacheモジュールの「httpd_enable_cgi」はApache WebサーバのCGIの実行許可に関する設定です。初期状態ではチェックされCGIが許可されていますが、これを外すとApacheの設定にかかわらずCGIが実行拒否されます(httpdデーモンを再起動する必要はありません)
ここでの設定は「0」(false)もしくは「1」(true)のブーリアン値として/etc/selinux/targeted/modules/active/booleans.localに書き込まれます。なお、booleans.localは「ブーリアン値」パネルの設定を変更した時点で作成されます。
|
・「ファイルラべリング」パネル
「ファオリラベリング」パネルでは、ローカルファイルシステム内の各ファイルに設定されているラベルを確認できます。上部の「フィルター」で表示内容を絞り込むことができます。
・「ユーザマッピング」パネル
「ユーザマッピング」パネルでは、システムログイン名と「SELinux」におけるユーザー及びMLS/MCSのレンジのマッピングを行います。デフォルトでは「root」、「system_u」、それ以外(_default_)に分割されていますが、targetedモードではそれらの区別はありません。
・「SELinux User」パネル
「SELinux User」パネルでは、SELinuxにおけるユーザーのMLS/MCSのレベル、レンジやロールが設定されています。なおレベル「s0」はレベルが設定されていないことを表しています。
・「変換」パネル
「変換」パネルでは、セキュリティレベルとMLS/MCSのレンジの名前の対応を設定します。「SELinux User」パネルと見比べてみるとわかるように、全てのユーザーは「SystemLow-SystemHigh」という名前のレンジに設定されています。この「SystemLow-SystemHigh」は、実際には「s0-s0:c0-c1023」 というセキュリティレベルを表します。「s0」というのは階層なしで、「c0.c1023」は「c0~c1023」のすべてのカテゴリにアクセスできることを示しています。
・「Network Port」パネル
「Network Port」パネルでは、ネットワークポートに設定されているラベルを確認できます。
・「ポリシーモジュール」パネル
「ポリシーモジュール」パネルでは、現在ロードされているポリシーモジュールと、そのバージョンの確認と変更が行えます。
・コマンドラインでのブーリアン値の確認
SELinux管理者ツールの「ブーリアン値」パネルでは、個別にオン/オフできるポリシーの確認/設定が行えましたが、コマンドラインで現在のブーリアン値を確認するには「getsebool」コマンドを使用します。その際にオプション「-a」を指定した場合には、すべての値が表示されます。
|
・SELinuxの設定ファイル
SELinuxのメイン設定ファイルは「/etc/sysconfig/selinux」になります。
変数「SELINUX」の値を変更することで、システム起動時のSELinuxの動作を設定できます。このように「enforcing」になっていれば、Enforcingモードとなり強制アクセス制御が機能しています。その他の設定としては2つあります。それでは設定ファイルを見てみましょう。
|
|
その他の設定ファイル
|
■ランレベルを再設定する
Fedoraではとくに「targeted」モードにおいては、アクセス制御の対象となるネットワークサービスが基本的に動作するようにポリシーが設定されております。ただし、サービス設定によってはポリシーによってアクセスが拒否され意図した通りに動作しない場合があります。まずは、タイプを再設定することで対処できるケースについて取り上げます。
・リソースタイプについて
ホームディレクトリ以外のファイルやディレクトリなどのリソースに対するセキュティコンテキストは「/etc/selinux/<ポリシータイプ>」ディレクトリの「contexts/file_contexts」で設定されています。例えば、Apachが使用する「/var/www」ディレクトリの設定を示します。ファイルを確認してみましょう。
|
|
上記ディレクトリの最後の「(/.*)?」は正規表記による指定で、「/var/www」ディレクトリ以下の任意のディレクトリを表します。この指定により「/var/www」ディレクトリ以下は「httpd_sys_content_t」というタイプを持ちます。ファイルのタイプはその下のディレクトリにも引き継がれますので「/var/www/html」ディレクトリ以下においたhtmlファイルのタイプも「httpd_sys_content_t」となります。TEにより「httpd_sys\content_t」タイプは「httpd_t」ドメインから読み込みを許可されているので「/var/www/html」ディレクトリ以下においたWebページが表示されるのです。
それでは「~/public_html」ディレクトリにユーザーごとのWebページを設置する場合はどうでしょうか。初期状態のホームディレクトリのタイプは「user_home_t」となっているために「public_html」ディレクトリを作成してWebページを置くと、そのタイプも「user_home_t」となってしまいます。
|
実際に「~public_html」ディレクトリにhtmlファイルを保存してWebブラウザから「http://サーバー/~ユーザ名」にアクセスしてみましょう。するとエラーメッセージになります。また、ログファイルには(/var/log/audit/audit.log)次のようなSELinuxの監視ログ(AVCメッセージ)が残ります。
|
これでSELinuxの監視ログを見ることができます。
ドメイン「httpd_t」にはタイプが「user_home_t}の「~/public_html」ディレクトリにはアクセス権がないためにアクセスが拒否(denied)されたというメッセージです。「scontext」「tcontext」には、それぞれのプロセスのセキュリティテキスト、リソースのセキュリティテキストです。ホームディレクトリに関するセキュリティコンテキストは「file_contexts.homedir(/etc/selinux<ポリシータイプ>ディレクトリの「contexts/files/file_contexts.homedirs)に記述されております。このファイルを見てみると次のような行があります。
|
|
これはホームディレクトリ以下の「www」「web」もしくは「public_html」のいずれかのディレクトリに対して、タイプ「httpd_user_content_t」を設定するものです。タイプ「httpd_user_content_t」は、httpd_tドメインからの読み込みをポリシーで許可されています。したがって、この設定に従ってタイプを設定し直せばいいわけです。
・タイプを個別に付け直す
ファイルやディレクトリなどのリソースに関するセキュリティコンテキストを「file_contexts」ファイルの設定に従って修正するにはいくつかの方法があります。最も簡単なのは、指定したディレクトリ以下のタイプをポリシーファイルの設定に従って修正する「restorecon -R <ディレクトリ>」コマンドを実行する方法です。
|
以上の命令で「~public_html」のタイプが「httpd_user_content_t」に変更されました。
|
なお「chcon -R -t」タイプコマンドを使用すると、引数で指定したタイプに設定することができます。前述の例は次のようにすることもできます。
|
・ポリシー内のラベルを変更する
ポリシー内のラベルを設定したり、ネットワークポートのマッピングを設定するSELinux管理コマンドに「semanage」があります。これを使用して「/home/<ユーザ名>/www2」ディレクトリのタイプを「httpd_sys_content_t」に設定するには次のように行います。
|
targetedモードの場合、結果は「/etc/selinux/targeted/contexts/files/file_contexts.local」に書き込まれます。
|
以上が「/home/<ユーザ名>/fxsl/www2」ディレクトリに対して「restorecon」コマンドを実行すると、タイプが「httpd_sys_content_t」となります。
|
■モジュールの作成
Fedora Core 4までのセキュリティーポリシーはコマンドでラベルを再設定をしても動作しないケースでは、ポリシーのソースファイルを修正してコンパイルを行ってポリシーをカーネルに読み込ませておりました。それに対して、Fedora Core 5以降ではポリシーがモジュール化して必要な部分のみモジュール・パッケージとして作成してカーネルに動的に追加/削除ができるようになりました。とはいっても、実際にポリシーの修正を行うにはセキュリティ及びアプリケーションに関する高度な知識が必要になります。また、ポリシーファイルの設定を誤ると逆にセキュリティーホールを増やしてしまう可能性もありますので注意して下さい。ここではモジュール作成の概略を説明いたします。
・auditdデーモンについて
SELinuxの監視ログは「auditdデーモン」によって「/var/log/audit/audit.log」に出力されております。「auditdデーモン」が起動していないと監視ログも「/var/log/messages」に出力され、他の雑多なログと混ざってSELinux関連の部分が分かりにくくなってしまいます。環境によっては「auditdデーモン」がインストールされていない場合には「ソフトウェアの追加/削除」などでauditパッケージをインストールしてください。
「auditdパッケージ」をインストールすると自動的にauditdサービスが起動します。サービスの設定ツール「システム」⇒「管理」⇒「サービス」で「auditd」が有効になっているかを確認してみて下さい。
・監視ログ検索
auditdの監視ログを検索しフォーマットして表示してくれるツールに「ausearch」があります。「-m タイプ」オプションを指定すると指定したタイプのログのみが表示されます。例えば、タイプがポリシーによる判定結果を記録する「AVC」(Access Vector Cache)であるログのみを表示するには次のように行います。
|
・ロードされているモジュールの確認
現在ロードされているSELinuxのモジュールは「semodule -l」コマンドで確認します。
|
なお、これらのモジュールの他に基本モジュール「base.pp」がロードされておりますが、「semodule -l」コマンドでの出力では基本モジュールは省略されます。
・監視ログモジュールを作成する
モジュール作成の例としてWindowsのファイルサーバ機能を提供するSambaを取り上げて説明します。例えば、Sambaで「/mnt/share」というディレクトリを公開しているとします。「/mnt」ディレクトリ以下のタイプは「mnt_t」に設定されておりますが、初期状態ではSamba経由で書き換えが許可されておりません。ここで「smbd」(Sambaのサーバープロセス)に「/mnt/share」というディレクトリを公開しているときに、その書き換えを許可するようにローカルモジュールパッケージ「local.pp」として作成してみましょう。手順としてはモジュール用のTEファイル(local.te)を作成して、それをコンパイルしバイナリ形式のモジュールファイル(local.mod)に変換、最後にパッケージファイル(local.pp)にまとめるという作業になります。なお、モジュール作成にはcheckpolicyパッケージが必要になりますので、インストールされていない場合は下記のコマンドでインストールしてください。
|
・TEファイルを作成する
まず、TEファイルとして「local.te」を作成します。各種エディタ等で作成してもかまいませんが、「sudit2allow」というコマンドを使用することでログファイルから簡単に自動生成することができます。
SambaサーバーにWindowdクライアントからアクセスし、「/mnt/share」ディレクトリにアクセスして下さい。パーミッションが許可されていた場合でもクライアントには「/mnt/share」ディレクトリは変更できません。また、「var/log/audit/audit.log」には書き換え(write)が拒否された(denied)というログが記録されます。
|
|
auditdのログファイルをローテートするには下記のコマンドを使用します。
|
続いて、制御モードを「Permissiveモード」に設定します。
|
この状態でもう一度Windowsクライアントからアクセスしてみましょう。続いて、ディレクトリを作成したり、その下にファイルをコピーしたり、操作を行ってみましょう。作成(create)、名前の変更(add_name)などが拒否されたログも記録されます。
|
|
この「/var/log/audit/audit.log」から「local.te」を作成するには「audit2allow」コマンドを実行します。(-m local)はlocalという名前のモジュールを作成するオプションです。
|
これで、ローカルモジュールの用のTEファイル「local.te」が作成されました。実際に確認してみましょう。
|
|
※一番初めの行は、モジュール名とバージョン情報が記載されています。
※下から2行目ではドメイン「smbd?t」にタイプ「mnt_t」のディレクトリを許可しており、一番下の行ではファイルへのアクセスを許可しています。
・TEファイルをコンパイルする
では、次に「checkmodule」コマンドでTEファイル(local.te)をコンパイルしバイナリ形式のmodファイル(local.mod)に変換します。
|
|
・モジュールのパッケージを作成する
続いて「semodule_package」を使用して、modファイル(local.mod)をモジュールパッケージ(local.pp)に変換します。
|
・モジュールをカーネルにロードする
完成したモジュールパケージ(local.pp)をカーネルにロードするには「semodule -i パス」コマンドを使用します。
|
・モジュールを削除する
一度、カーネルにロードされたモジュールは「etc/selinux/targeted/module/active/module」ディレクトリに保存されてシステムを再起動しても有効な状態になっております。そのモジュールを削除するには「semodule -r モジュール名」を実行します。
|