制限のあるサービスの管理
Red Hat Enterprise Linux 6.4
SELinux の制御下にあるサービスの設定について
エディッション 4
概要
上級ユーザーや管理者の方などが Security-Enhanced Linux (SELinux) を使用したり、 また設定を行なったりする際に役立つガイドです。 SELinux のコンポーネントは、 上級ユーザーや管理者の方々が設定を行なわなければならない場合があるサービスに関連しているため、 本ガイドでは Red Hat Enterprise Linux に焦点を絞って SELinux のコンポーネントについて説明していきます。 また、 こうしたサービスを設定する場合の実例をあげながら、 SELinux でどのようにサービスの動作を補完しているのかについて見ていきます。
第1章 はじめに リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Security-Enhanced Linux (SELinux) とは、 Linux カーネル内の「強制アクセス制御 (MAC)」の実装であり、 標準の「任意アクセス制御 (DAC)」がチェックされた後、 許可される動作をチェックします。 SELinux は米国国家安全保障局 (National Security Agency) により開発され、 Linux システム内のファイルやプロセス、またその動作についても定義されたポリシーに応じてルールを強制することができます。
Security-Enhanced Linux (SELinux) では、 ディレクトリやデバイスなどのファイルをオブジェクト (客体) として参照します。 ユーザーによって実行されたコマンドや Mozilla Firefox アプリケーションなどのプロセスはサブジェクト (主体) として参照されます。 ほとんどのオペレーティングシステムでは、 サブジェクトとオブジェクトの交信手段、 サブジェクト同士の交信手段などを制御する任意アクセス制御システム (DAC) が使用されています。 DAC を使用するオペレーティングシステムでは、 ユーザーが所有するファイル (オブジェクト) の権限はそのユーザーが制御するようになっています。 たとえば、 Linux オペレーティングシステムの場合、 ユーザーは自分のホームディレクトリを誰でも読み取れるようにすることができるため、 気付かずに機密の可能性がある情報へのアクセスを他のユーザーやプロセス (サブジェクト) に渡してしまう恐れがあります。
DAC によるアクセス決定はユーザー ID と所有権だけを基準とし、 ユーザーのロール、 プログラムの機能及び信頼性、データの機密性及び整合性など他のセキュリティ関連の情報は無視されます。 通常、 各ユーザーが所有ファイルの完全決定権を持っているため、 システム全体にセキュリティポリシーを試行するのが困難になります。 さらに、 ユーザーによって実行されるプログラムはそのユーザーに与えられる権限を継承し、 そのユーザーのファイルへのアクセス権を自由に変更することができます。 このため、 悪意あるソフトウェアに対する保護は最低限のものしか与えられません。 多くのシステムサービスや特権を有するプログラムは、 特権付与の制御がおおまかで、その必要性をはるかに越える特権を持ったまま実行されます。 したがって、 こうしたプログラムのうちいずれかにでも不備があればそこを攻撃され、さらなるシステムアクセス権が奪われる恐れがあります。[1]
以下は、 SELinux を実行していない Linux オペレーティングシステムで使われているパーミッションの例です。 システムによっては、 パーミッションがこの例と多少異なる場合があります。
ls -l コマンドを使って、 ファイルのパーミッションを表示させます。
ls -l file1 -rwxrw-r-- 1 user1 group1 0 2010-01-29 09:17 file1
$ ls -l file1
-rwxrw-r-- 1 user1 group1 0 2010-01-29 09:17 file1
最初の 3 つのパーミッション
rwx では、 Linux の user1 ユーザー (この例では所有者) が file1 に対して持っているアクセス権を制御しています。 次の 3 つのパーミッション rw- では、 Linux の group1 グループが file1 に対して持っているアクセス権を制御しています。 最後の 3 つのパーミッション r-- では、 その他のユーザーが file1 に対して持っているアクセス権を制御しています。 その他のユーザーには、 すべてのユーザーおよびプロセスが含まれます。
SELinux を使用すると、Linux カーネルに MAC (強制アクセス制御) が追加され、Red Hat Enterprise Linux ではデフォルトで有効になります。汎用の MAC アーキテクチャーには、各種のセキュリティ関連情報を含むラベルを決定基準とした管理用セキュリティポリシーを、 システム内の全プロセスおよびファイルに対して実施する能力が必要とされます。適切に実装することで、システム自体が的確に自己防御され、アプリケーションの改ざんを保護、回避することによりアプリケーションの安全性に必須のサポートを提供します。MAC ではアプリケーションどうしがしっかりと確実に分離されるため、信頼性の低いアプリケーションでも安全に実行することができます。プロセス実行に関する特権を制限する能力により、アプリケーションやシステムサービス内の脆弱性が悪用され発生する可能性のある被害範囲を限定することができます。限られた権限しか持たない正規ユーザーだけでなく、権限を与えられたユーザーが不正なアプリケーションを知らずに実行してしまった場合でも情報を保護することができます。[2]
以下は、 SELinux を実行する Linux オペレーティングシステム上でプロセス、 Linux ユーザー、 ファイルなどに適用されるセキュリティ関連の情報を含むラベルの例です。 SELinux コンテキストと呼ばれ、
ls -Z コマンドで表示させます。
ls -Z file1 -rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
$ ls -Z file1
-rwxrw-r-- user1 group1 unconfined_u:object_r:user_home_t:s0 file1
この例では、 SELinux によりユーザー (
unconfined_u)、 ロール (object_r)、 タイプ (user_home_t)、 レベル (s0) が file1 ファイルに与えられています。 この情報がアクセス制御の決定に使用されます。 ls -Z コマンドでは SELinux コンテキストと共に DAC ルールも表示されます。SELinux ポリシールールは、 DAC ルールの後にチェックされます。 このため、 DAC ルールで最初にアクセスが拒否されると、 SELinux ポリシールールは適用されません。
第2章 Targeted ポリシー リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux で使用されるデフォルトの SELinux ポリシーは Targeted ポリシーになります。Targeted ポリシーを使用すると、対象となるプロセスは制限ドメイン内で実行され、対象外のプロセスは未制限のドメイン内で実行されます。例えば、デフォルトではログインしたユーザーは
unconfined_t ドメイン内で実行され、init で開始されたシステムプロセスは initrc_t ドメイン内で実行されます。 いずれも未制限のドメインです。
SELinux は、実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。これを行なうため、Boolean を使用します。Boolean を使用すると、SELinux ポリシーの記述方法などの知識が全くなくても、ランタイム時の SELinux ポリシーを部分的に変更することができます。たとえば、サービスによる NFS ファイルシステムへのアクセスを許可するなど、Boolean を使用することで、SELinux ポリシーの再読み込みや再コンパイルを行なうことなく、各種の変更を行なうことができるようになります。Boolean 設定については事例をあげて詳細に説明していきます。
サービス用のファイル群の格納にデフォルト以外のディレクトリを使用する、 デフォルト以外のポート番号でサービスが実行するよう変更するなど、 その他の変更には、 policycoreutils-python パッケージで提供している
semanage コマンドなどのツールを使ったポリシー設定の更新が必要になります。 このコマンドについては設定事例をあげて詳細に説明していきます。
2.1. Type Enforcement リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、そのアクセスが許可されます。
2.2. 制限のあるプロセス リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux では、 ネットワークでリッスンするサービスはほぼ全て制限されています。 また、
root ユーザーとして実行され passwd アプリケーションなどユーザーのタスクを行なうプロセスもほとんど制限されています。 プロセスが制限されている場合、 そのプロセスはそれ自体のドメイン内で実行されます。httpd プロセスならhttpd_t ドメイン内で実行されます。 制限のあるプロセスが攻撃を受けた場合、 SELinux ポリシー設定に応じて、 攻撃側がリソースにアクセスして加えることができる被害が限定されます。
次の例では、Samba での使用を目的としたファイルなど、正しくラベル付けが行なわれていないファイルは Apache HTTP サーバー (
httpd) では読み込ませないよう SELinux で阻止する方法を示します。この例はサンプルのため、実稼働環境では使用しないようにしてください。ここでは、httpd、 wget、setroubleshoot-server、audit などのパッケージがすでにインストールされていること、SELinux の targeted ポリシーが使用されていること、enforcing モードで実行していることを前提としています。
sestatusコマンドを実行し、 SELinux が有効になっていること、 enforcing モードで実行していること、 targeted ポリシーが使われていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が有効になっていると、SELinux status: enabledが返されます。 SELinux が enforcing モードで実行されていると、Current mode: enforcingが返されます。 SELinux targeted ポリシーが使用されていると、Policy from config file: targetedが返されます。- root ユーザーになり、
touch /var/www/html/testfileコマンドを実行してファイルを作成します。 ls -Z /var/www/html/testfileコマンドを実行して SELinux のコンテキストを表示します。-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow このtestfileファイルには、SELinux のunconfined_uユーザーラベルが付けられています。unconfined_uSELinux ユーザーにマッピングされた Linux ユーザーによってこのファイルが作成されたためです。ファイルではなくプロセスの場合には、ロールベースのアクセス制御 (RBAC) が使用されます。ファイルの場合はロールに意味はなく、汎用ロールとなるobject_rロールが使用されます (永続的なストレージおよびネットワークファイルシステム上のファイル)。/proc/ディレクトリ配下では、プロセスに関連するファイルにはsystem_rロールが使用される場合があります。[3]httpd_sys_content_tタイプでhttpdプロセスによるこのファイルへのアクセスを許可しています。- root ユーザーになり、
service httpd startコマンドを使ってhttpdプロセスを開始します。httpdが正常に起動すると以下のような出力が表示されます。/sbin/service httpd start Starting httpd: [ OK ]
# /sbin/service httpd start Starting httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux ユーザーでの書き込みアクセスがあるディレクトリに移動してから、
wget http://localhost/testfileコマンドを実行します。 デフォルト設定に変更がなければ、 このコマンドは成功します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow chconコマンドでファイルのラベルを付け換えます。ただし、ファイルシステムのラベルが付け換えられると、 この変更は失われます。ファイルシステムのラベルが付け換えられた場合でも、 こうした変更を永続的に維持するには、semanageコマンドを使用します。このコマンドについてはのちほど説明していきます。 root ユーザーになり、次のコマンドを実行してタイプを Samba で使用されるタイプに変更します。chcon -t samba_share_t /var/www/html/testfilels -Z /var/www/html/testfileコマンドを実行し、変更を表示します。-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile
-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfileCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在の DAC パーミッションでは、
httpdプロセスによるtestfileへのアクセスを許可している点に注意してください。Linux ユーザーとしての書き込みアクセスがあるディレクトリに移動し、wget http://localhost/testfileコマンドを実行します。デフォルト設定に変更がなければ、このコマンドは失敗します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーになり、
rm /var/www/html/testfileコマンドを実行しtestfileを削除します。 httpdを実行しておく必要がない場合は、 root ユーザーになりservice httpd stopコマンドを実行しhttpdを停止します。/sbin/service httpd stop Stopping httpd: [ OK ]
# /sbin/service httpd stop Stopping httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
上記の例では、 SELinux によって追加される安全性を示しました。 ステップ 5 では、 DAC ルールによって
httpd プロセスの testfile へのアクセスが許可されています。しかし、httpd プロセスによるアクセス権がないタイプにラベルが付け換えられたため、SELinux によってアクセスが拒否されるようになります。ステップ 7 のあと、setroubleshoot-server パッケージをインストールすると、次のようなエラーが /var/log/messages にログ記録されます。
setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/testfile (samba_share_t). For complete SELinux messages run sealert -l c05911d3-e680-4e42-8e36-fe2ab9f8e654
setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/testfile (samba_share_t). For complete SELinux messages run sealert -l c05911d3-e680-4e42-8e36-fe2ab9f8e654
また、 以下のようなエラーは
/var/log/httpd/error_log にログ記録されます。
[Tue Dec 01 11:43:18 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied
[Tue Dec 01 11:43:18 2009] [error] [client 127.0.0.1] (13)Permission denied: access to /testfile denied
2.3. 制限のないプロセス リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
制限のないプロセスは制限のないドメインで実行されます。例えば、
init プログラムは制限のない initrc_t ドメインで実行され、制限のないカーネルプロセスは kernel_t ドメインで、制限のない Linux ユーザーは unconfined_t ドメインで実行されます。制限のないプロセスの場合でも SELinux ポリシールールは適用されます。ただし、既存のポリシールールは制限のないドメイン内で実行中のプロセスにほとんどすべてのアクセスを許可します。このため、制限のないドメイン内で実行中のプロセスは、もっぱら DAC ルールに依存することになります。制限のないプロセスが攻撃された場合、攻撃者によってシステムリソースやデータへのアクセス権が奪われても SELinux ではそれを阻止しませんが、 DAC ルールは常に適用されます。SELinux は DAC ルールに加えて使用することで二重のセキュリティ強化を施行するものであり、DAC ルールの代替として使用するものではありません。
以下の例では、 Apache HTTP Server (
httpd) を制限なしで実行している場合、 Samba 向けのデータにApache HTTP Server をどのようにしてアクセスさせることができるかを示します。Red Hat Enterprise Linux では、httpd プロセスはデフォルトで制限のある httpd_t ドメイン内で実行されます。次の例はあくまで例であり、実稼働環境では使用しないでください。httpd、 wget、dbus、audit パッケージがインストールされていること、 SELinux targeted ポリシーが使われていること、 またモードは enforcing で実行されていることを前提としています。
sestatusコマンドを実行し、 SELinux が有効になっていること、 enforcing モードで実行していること、 targeted ポリシーが使われていることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が有効になっていると、SELinux status: enabledが返されます。 SELinux が enforcing モードで実行されていると、Current mode: enforcingが返されます。 SELinux targeted ポリシーが使用されていると、Policy from config file: targetedが返されます。- root ユーザーになり、
touch /var/www/html/test2fileコマンドを実行してファイルを作成します。 ls -Z /var/www/html/test2fileコマンドを実行して SELinux のコンテキストを表示します。-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/test2file
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/test2fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow test2fileには SELinuxunconfined_uユーザーのラベルが付けられています。unconfined_uSELinux ユーザーにマッピングされた Linux ユーザーによってこのファイルが作成されたためです。 ファイルではなくプロセスの場合には、 ロールベースのアクセス制御 (RBAC) が使用されます。 ファイルの場合、 ロールの使用は意味がありません。object_rロールはファイルに使用される汎用ロールになります (永続的なストレージおよびネットワークファイルシステム上)。/proc/ディレクトリ配下では、 プロセスに関連するファイルはsystem_rロールを使用することができます。 [4]httpd_sys_content_tタイプを使用すると、httpdプロセスにこのファイルへのアクセスを許可することになります。chconコマンドでファイルのラベルを付け換えます。ただし、ファイルシステムのラベルが付け換えられると、 この変更は失われます。ファイルシステムのラベルが付け換えられた場合でも、 こうした変更を永続的に維持するには、semanageコマンドを使用します。このコマンドについてはのちほど説明していきます。 root ユーザーになり、次のコマンドを実行してタイプを Samba で使用されるタイプに変更します。chcon -t samba_share_t /var/www/html/test2filels -Z /var/www/html/test2fileコマンドを実行して変更を表示します。-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/test2file
-rw-r--r-- root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/test2fileCopy to Clipboard Copied! Toggle word wrap Toggle overflow service httpd statusコマンドを実行し、httpdプロセスが実行していないことを確認します。/sbin/service httpd status httpd is stopped
$ /sbin/service httpd status httpd is stoppedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力が異なる場合は、 root ユーザーでservice httpd stopコマンドを実行し、httpdプロセスを停止します。/sbin/service httpd stop Stopping httpd: [ OK ]
# /sbin/service httpd stop Stopping httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpdプロセスを制限なしで実行する場合は、 root ユーザーで以下のコマンドを実行し、/usr/sbin/httpdのタイプを制限のあるドメインに遷移しないタイプに変更します。chcon -t unconfined_exec_t /usr/sbin/httpdls -Z /usr/sbin/httpdコマンドを実行し、/usr/sbin/httpdがunconfined_exec_tタイプでラベル付けされていることを確認します。-rwxr-xr-x root root system_u:object_r:unconfined_exec_t /usr/sbin/httpd
-rwxr-xr-x root root system_u:object_r:unconfined_exec_t /usr/sbin/httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーになり、
service httpd startコマンドを使ってhttpdプロセスを開始します。httpdが正常に起動すると以下のような出力が表示されます。/sbin/service httpd start Starting httpd: [ OK ]
# /sbin/service httpd start Starting httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep httpdコマンドを実行し、httpdプロセスがunconfined_tドメイン内で実行していることを表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux ユーザーでの書き込みアクセスがあるディレクトリに移動し、
wget http://localhost/test2fileコマンドを実行します。 デフォルト設定に変更がなければ、 このコマンドは成功します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpdプロセスにはsamba_share_tタイプのラベルが付けられたファイルへのアクセス権はありませんが、httpdは制限のないunconfined_tドメイン内で実行しているため、 DAC ルールの使用に依存しています。 したがって、wgetコマンドは成功します。 もしhttpdが制限のあるhttpd_tドメインで実行していたなら、wgetコマンドは失敗していたでしょう。 restoreconコマンドは、 ファイルのデフォルト SELinux コンテキストを復元します。 root ユーザーになり、restorecon -v /usr/sbin/httpdコマンドを実行して、/usr/sbin/httpdのデフォルトの SELinux コンテキストを復元します。/sbin/restorecon -v /usr/sbin/httpd restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_exec_t:s0->system_u:object_r:httpd_exec_t:s0
# /sbin/restorecon -v /usr/sbin/httpd restorecon reset /usr/sbin/httpd context system_u:object_r:unconfined_exec_t:s0->system_u:object_r:httpd_exec_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /usr/sbin/httpdコマンドを実行し、/usr/sbin/httpdがhttpd_exec_tタイプでラベル付けされていることを確認します。ls -Z /usr/sbin/httpd -rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpd
$ ls -Z /usr/sbin/httpd -rwxr-xr-x root root system_u:object_r:httpd_exec_t /usr/sbin/httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーになり、
/sbin/service httpd restartコマンドを実行し、httpdを再起動します。 再起動したら、ps -eZ | grep httpdコマンドを実行してhttpdが制限のあるhttpd_tドメイン内で実行していることを確認します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーになり、
rm /var/www/html/test2fileコマンドを実行しtest2fileを削除します。 httpdを実行しておく必要がない場合は、 root ユーザーになりservice httpd stopコマンドを実行しhttpdを停止します。/sbin/service httpd stop Stopping httpd: [ OK ]
# /sbin/service httpd stop Stopping httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
このセクションでは、 制限のあるプロセスが攻撃を受けた場合、データはどのように保護されるのか (SELinux で保護)、また制限のないプロセスが攻撃を受けた場合、攻撃者にとっていかにデータにアクセスしやすいか (SELinux で保護されていない) を例を使って説明しました。
第3章 Apache HTTP Server リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Apache HTTP Server Project ページより抜粋:
原文: "The Apache HTTP Server Project is an effort to develop and maintain an open-source HTTP server for modern operating systems including UNIX and Windows NT. The goal of this project is to provide a secure, efficient and extensible server that provides HTTP services in sync with the current HTTP standards". (訳文: Apache HTTP Server Project は、 UNIX や Windows NT など新しいオペレーティングシステム向けのオープンソース HTTP サーバーの開発および保守に取り組んでいます。 現在の HTTP 標準に適合する HTTP サービスを提供し、 安全かつ効率的で拡張性のあるサーバーを実現していくことを目標としています。)[5]
Red Hat Enterprise Linux では、 Apache HTTP Server は httpd パッケージで提供されています。 httpd パッケージがインストールされているか確認する場合は、
rpm -q httpd を実行します。Apache HTTP Server を使用する予定にも関わらず、このパッケージがインストールされていない場合は、root ユーザーになり次のコマンドを実行してパッケージのインストールを行ないます。
yum install httpd
yum install httpd
3.1. Apache HTTP Server と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux を有効にすると、Apache HTTP Server (
httpd) はデフォルトで制限のあるサービスとして実行されます。制限のあるプロセスはそのプロセス自体のドメインで実行され、 他の制限のあるプロセスとは分離されます。 制限のあるプロセスが攻撃を受けると、 SELinux ポリシー設定に応じて、 攻撃側がリソースにアクセスして加えることができる被害は限定されます。 次の例では、 httpd プロセス自体のドメイン内で実行しているプロセスを示します。 httpd、 setroubleshoot、 setroubleshoot-server、 policycoreutils-python の各パッケージがインストールされていることを前提とします。
getenforceを実行して SELinux が enforcing モードで実行しているか確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。- root ユーザーになり
service httpd startを実行し、httpdを起動します。service httpd start Starting httpd: [ OK ]
# service httpd start Starting httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep httpdを実行してhttpdプロセスを表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpdプロセスに関連する SELinux コンテキストはunconfined_u:system_r:httpd_t:s0です。 コンテキストの末尾から 2 番目の部分、httpd_tがタイプになります。 プロセスのドメインやファイルのタイプを定義するのがタイプです。 この例の場合、httpdプロセスはhttpd_tドメインで実行されています。
httpd_t などの制限ドメイン内で実行しているプロセスがファイルや他のプロセス、システムなどとどのように交信するのかをSELinux ポリシーで定義します。httpd からアクセスができるよう、ファイルには適切なラベルを付けなければなりません。たとえば、httpd_sys_content_t タイプのラベルが付いたファイルの場合、httpd からはこのファイルの読み取りは可能ですが書き込みはできません。この場合、Linux (DAC) のパーミッションで書き込みのアクセスが許可されていても書き込みを行なうことはできません。特定の動作を許可する場合、たとえば、スクリプトによるネットワークへのアクセスを許可する、httpd による NFS や CIFS ファイルシステムへのアクセスを許可する、httpd による CGI (Common Gateway Interface) スクリプトの実行を許可するなどの場合には、Boolean をオンにする必要があります。
httpd が TCP ポート 80、443、488、8008、8009、8443 以外のポートでリッスンするよう /etc/httpd/conf/httpd.conf を設定する場合は、semanage port コマンドを使って SELinux ポリシー設定に新しいポート番号を追加する必要があります。以下では、まだ SELinux ポリシー設定で httpd 用には定義されていないポートでリッスンするよう httpd を設定した結果、httpd の起動に失敗する例を示します。また、httpd がポリシーにまだ定義されていない非標準のポートで正しくリッスンするよう SELinux システムを設定する方法についても示します。httpd パッケージがインストールされていることを前提としています。各コマンドは root ユーザーで実行してください。
service httpd statusを実行してhttpdが実行中ではないことを確認します。service httpd status httpd is stopped
# service httpd status httpd is stoppedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力が上記と異なる場合は、service httpd stopを実行してプロセスを停止します。service httpd stop Stopping httpd: [ OK ]
# service httpd stop Stopping httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage port -l | grep -w http_port_tを実行して、 SELinux でhttpdにリッスンを許可しているポートを表示させます。semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
# semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
/etc/httpd/conf/httpd.confを編集、Listenオプションを設定します。SELinux ポリシー設定ではhttpd用にまだ設定が行なわれていないポートをこのオプションに記述します。この例では、 ポート 12345 でリッスンするようhttpdを設定しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow service httpd startを実行してhttpdを起動します。service httpd start Starting httpd: (13)Permission denied: make_sock: could not bind to address 127.0.0.1:12345 no listening sockets available, shutting down Unable to open logs [FAILED]
# service httpd start Starting httpd: (13)Permission denied: make_sock: could not bind to address 127.0.0.1:12345 no listening sockets available, shutting down Unable to open logs [FAILED]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のような SELinux 拒否がログ記録されます。setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77
setroubleshoot: SELinux is preventing the httpd (httpd_t) from binding to port 12345. For complete SELinux messages. run sealert -l f18bca99-db64-4c16-9719-1db89f0d8c77Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpdによるポート 12345 のリッスンを SELinux で許可させるには、 以下の例で使用している次のコマンドが必要になります。semanage port -a -t http_port_t -p tcp 12345
# semanage port -a -t http_port_t -p tcp 12345Copy to Clipboard Copied! Toggle word wrap Toggle overflow - もう一度
service httpd startを実行して、httpdを起動させ新しいポートをリッスンするようにします。service httpd start Starting httpd: [ OK ]
# service httpd start Starting httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow httpdによる非標準ポート (この例では TCP 12345) でのリッスンを許可する SELinux 設定が完了しました。これで、httpdがこのポートで正常に起動するようになります。httpdが確かに TCP ポート 12345 でリッスンし通信を行なっているか確認するには、 そのポートに telnet 接続を開き HTTP GET コマンドを以下のように発行します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。 アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、 そのアクセスが許可されます。
以下の例では、
/var/www/html/ ディレクトリに新しいファイルを作成し、 そのファイルが親ディレクトリ (/var/www/html/) の httpd_sys_content_t タイプを継承していることを示しています。
ls -dZ /var/www/htmlを実行して/var/www/html/の SELinux コンテキストを表示させます。ls -dZ /var/www/html drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html
$ ls -dZ /var/www/html drwxr-xr-x root root system_u:object_r:httpd_sys_content_t:s0 /var/www/htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/にはhttpd_sys_content_tタイプのラベルが付けられていることが分かります。- root ユーザーになり
touch /var/www/html/file1を実行して新しいファイルを作成します。 ls -Z /var/www/html/file1を実行して SELinux コンテキストを表示させます。ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1
$ ls -Z /var/www/html/file1 -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ls -Z コマンドを使用すると file1 には httpd_sys_content_t タイプのラベルが付けられていることが分かります。 SELinux では、 httpd がこのタイプのラベルが付いたファイルを読み込めるよう許可していますが、 書き込みは許可していません。 Linux のパーミッションが書き込みアクセスを許可していても変わりません。 SELinux ポリシーで httpd_t ドメイン (httpd が実行されるドメイン) で実行しているプロセスが読み取りと書き込みを行なうことができるタイプを定義しています。 これにより、 プロセスが別のプロセス用のファイルにアクセスしてしまわないよう保護しています。
たとえば、
httpd は httpd_sys_content_t タイプ (Apache HTTP Server 用) のラベルが付いたファイルを読み込むことができますが、デフォルトでは samba_share_t タイプ (Samba 用) のラベルが付いたファイルにはアクセスできません。また、ユーザーのホームディレクトリにあるファイルには user_home_t タイプのラベルが付けられます。これにより、デフォルトで httpd がユーザーのホームディレクトリにあるファイルの読み取りや書き込みを行なわないよう保護しています。
httpd で使用されるタイプをいくつか以下に示します。 タイプを使い分けることで柔軟なアクセスを設定することができるようになります。
httpd_sys_content_t- このタイプは、静的な Web サイトで使用される
.htmlファイルなどの Web コンテンツに使用します。このタイプのラベルが付けられたファイルは、httpdおよびhttpdで実行されるスクリプトに対してアクセス可能となります (読み取り専用)。デフォルトでは、このタイプのラベルが付けられたファイルおよびディレクトリへのhttpdや他のプロセスによる書き込み、編集は行なえません。デフォルトでは、/var/www/html/内に作成またはコピーされたファイルにはhttpd_sys_content_tタイプのラベルが付けられます。 httpd_sys_script_exec_t- このタイプは、
httpdに実行させるスクリプトに対して使用します。 一般的には/var/www/cgi-bin/内の CGI (Common Gateway Interface) スクリプトに使用されます。 デフォルトでは、 SELinux ポリシーによりhttpdによる CGI スクリプトの実行は阻止されます。 これを許可するため、 スクリプトにhttpd_sys_script_exec_tタイプのラベル付けを行い、httpd_enable_cgiBoolean をオンにします。httpd_sys_script_exec_tのラベルが付けられたスクリプトは、httpdで実行されるとhttpd_sys_script_tドメインで実行されます。httpd_sys_script_tドメインには、postgresql_tやmysqld_tなど他のシステムドメインへのアクセスがあります。 httpd_sys_content_rw_t- このタイプのラベルを使用したファイルは、
httpd_sys_script_exec_tタイプのラベルが付いたスクリプトによる書き込みが可能になります。 ただし、 これ以外のラベルタイプのスクリプトによる編集はできません。httpd_sys_script_exec_tタイプのラベルが付いたスクリプトに読み込みや書き込みを行なわせるファイルには、httpd_sys_content_rw_tタイプのラベルを使用してください。 httpd_sys_content_ra_t- このタイプのラベルを使用したファイルは、
httpd_sys_script_exec_tタイプのラベルが付いたスクリプトによる追加が可能になります。 ただし、 これ以外のラベルタイプのスクリプトによる編集はできません。httpd_sys_script_exec_tタイプのラベルが付いたスクリプトに読み込みや追加を行なわせるファイルには、httpd_sys_content_ra_tタイプのラベルを使用してください。 httpd_unconfined_script_exec_t- このタイプのラベルを付けたスクリプトは SELinux の保護なしで実行されます。 このタイプの使用は、 これ以外の手段を試したがいずれもうまくいかない複雑なスクリプトを使用する場合に限ってください。
httpdに対して SELinux の保護をオフにする、 またはシステム全体に対して SELinux の保護をオフにするよりは、 このタイプを使用した方がよいでしょう。
注記
httpd に使用できる他のタイプについては次のコマンドを実行すると確認できます。
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
grep httpd /etc/selinux/targeted/contexts/files/file_contexts
grep httpd /etc/selinux/targeted/contexts/files/file_contexts
SELinux のコンテキストを変更する
ファイルやディレクトリのタイプは chcon コマンドを使用すると変更することができます。 chcon を使って行なった変更は、 ファイルシステムの再ラベルや restorecon コマンドを実行すると失われます。 特定ファイルの SELinux コンテキストの変更をユーザーに許可するかどうかは SELinux ポリシーで制御します。 以下の例では、 httpd 用の index.html ファイルと新規ディレクトリを作成し、 そのファイルとディレクトリに httpd がアクセスできるようラベル付けを行ないます。
- root ユーザーで
mkdir -p /my/websiteを実行し、httpdによって使用されるファイルを格納するディレクトリを最上位に作成します。 - ファイルコンテキスト設定のパターンに合致しないファイルやディレクトリには
default_tタイプのラベルが付けられる場合があります。 制限のあるサービスからはこのタイプのファイルやディレクトリにはアクセスできません。ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /my
$ ls -dZ /my drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /myCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
chcon -R -t httpd_sys_content_t /my/を実行し、/my/ディレクトリおよびサブディレクトリのタイプを、httpdからアクセスできるタイプに変更します。これで/my/website/の配下に作成されるファイルは、default_tタイプではなくhttpd_sys_content_tタイプを継承するようになるため、 httpd からアクセスできるようになります。chcon -R -t httpd_sys_content_t /my/ touch /my/website/index.html ls -Z /my/website/index.html -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.html
# chcon -R -t httpd_sys_content_t /my/ # touch /my/website/index.html # ls -Z /my/website/index.html -rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /my/website/index.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow
一時的な変更について:
chcon についての詳細を Red Hat Enterprise Linux 6 SELinux ユーザーガイドの「chcon」セクションにて参照してください。
再ラベルや
restorecon コマンドの実行後もこのラベルの変更を維持するために、semanage fcontext コマンド (semanage は policycoreutils-python パッケージで提供) を使用します。 このコマンドにより変更がファイルコンテキスト設定に追加されます。このあと、restorecon コマンドを実行すると、ファイルコンテキスト設定が読み込まれ、ラベルの変更が適用されます。次の例では、httpd に使用させる新規ディレクトリと index.html ファイルを作成し、httpd によるアクセスを許可するためラベルに永久的な変更を行ないます。
- root ユーザーで
mkdir -p /my/websiteを実行し、httpdによって使用されるファイルを格納するディレクトリを最上位に作成します。 - root ユーザーで以下のコマンドを実行して、 ラベルの変更をファイルコンテキスト設定に追加します。
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"
semanage fcontext -a -t httpd_sys_content_t "/my(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow "/my(/.*)?"の式は、/my/ディレクトリおよび配下の全ファイルとディレクトリにラベルの変更が適用されるという意味です。 - root ユーザーで
touch /my/website/index.htmlを実行し新しいファイルを作成します。 - root ユーザーで
restorecon -R -v /my/を実行しラベルの変更を適用します (ステップ 2 のsemanageコマンドで変更されたファイルコンテキスト設定がrestoreconにより読み込まる)。restorecon -R -v /my/ restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
# restorecon -R -v /my/ restorecon reset /my context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /my/website/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
一時的な変更について:
semanage についての詳細を Red Hat Enterprise Linux SELinux ユーザーガイドの「semanage fcontext」セクションにて参照してください。
3.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 これを行なうため、 Boolean を使用します。 Boolean を使用すると、 SELinux ポリシーの記述方法などの知識が全くなくてもランタイム時の SELinux ポリシーの一部変更を行なうことができます。 SELinux ポリシーの再読み込みや再コンパイルを行なうことなく、サービスによる NFS ファイルシステムへのアクセスを許可するなどの変更を行なうことができるようになります。
Boolean の状態を変更するには、
setsebool コマンドを使用します。 たとえば、 allow_httpd_anon_write Boolean をオンにする場合は次のコマンドを root ユーザーで実行します。
setsebool -P allow_httpd_anon_write on
# setsebool -P allow_httpd_anon_write on
同じ例を使って Boolean をオフにする場合は、 コマンドの
on を off にします。 以下にそのコマンドを示します。
setsebool -P allow_httpd_anon_write off
# setsebool -P allow_httpd_anon_write off
注記
再起動後、
setsebool による変更を維持したくない場合は -P オプションを使用しないでください。
httpd の動作方法を指定する一般的な Boolean について以下に説明します。
allow_httpd_anon_write- この Boolean を無効にした場合、
httpdによるpublic_content_rw_tタイプのラベルが付いたファイルへのアクセスを読み取り専用に限定します。有効にすると、パブリックファイル転送サービス用のファイルを含むパブリックディレクトリなどpublic_content_rw_tタイプのラベルが付いたファイルへの書き込みを許可するようになります。 allow_httpd_mod_auth_ntlm_winbind- この Boolean を有効にすると、
httpdでmod_auth_ntlm_winbindモジュールを介した NTLM および Winbind 認証メカニズムへのアクセスが許可されます。 allow_httpd_mod_auth_pam- この Boolean を有効にすると、
httpdでmod_auth_pamモジュールを介した PAM 認証メカニズムへのアクセスが許可されます。 allow_httpd_sys_script_anon_write- パブリックファイル転送サービスで使用されるような、
public_content_rw_tタイプのラベルが付いたファイルへの書き込みアクセスを HTTP スクリプトに許可するかどうかを指定する Boolean です。 httpd_builtin_scriptinghttpdスクリプト機能へのアクセスを定義する Boolean です。 PHP コンテンツの場合、 この Boolean の有効化が必要とされることが多くあります。httpd_can_network_connect- この Boolean を無効にすると、 HTTP スクリプトやモジュールによるネットワークやリモートポートへの接続の開始が阻止されます。 接続の開始を許可する場合は Boolean をオンにします。
httpd_can_network_connect_db- この Boolean を無効にすると、 HTTP スクリプトやモジュールによるデータベースサーバーへの接続の開始が阻止されます。 接続の開始を許可する場合は Boolean をオンにします。
httpd_can_network_relayhttpdをフォワードプロキシまたはリバースプロキシとして使用する場合、 この Boolean をオンにします。httpd_can_sendmail- この Boolean を無効にすると、 HTTP モジュールによるメール送信が阻止されます。
httpdに脆弱性が見つかった場合にスパム攻撃を阻止することができます。 HTTP モジュールにメールの送信を許可する場合は、 この Boolean をオンにします。 httpd_dbus_avahi- この Boolean をオフにすると、
httpdによるD-Bus経由のavahiサービスへのアクセスが拒否されます。 このアクセスを許可する場合は、 この Boolean をオンにします。 httpd_enable_cgi- この Boolean を無効にすると、
httpdによる CGI スクリプトの実行が阻止されます。httpdに CGI スクリプトの実行を許可する場合は、 この Boolean をオンにします (CGI スクリプトにはhttpd_sys_script_exec_tタイプのラベルを付けておく必要があります)。 httpd_enable_ftp_server- この Boolean をオンにすると、
httpdが FTP ポートでリッスンできるようになるため、 FTPサーバーとして動作できるようになります。 httpd_enable_homedirs- この Boolean を無効にすると、
httpdによるユーザーのホームディレクトリへのアクセスが阻止されます。 ユーザーのホームディレクトリ (/home/*/内のコンテンツ) へのアクセスを許可する場合は、 この Boolean をオンにします。 httpd_execmem- この Boolean を有効にすると、 実行可能かつ書き込み可能なメモリーアドレスを必要とするプログラムの実行を
httpdに許可します。 バッファのオーバーフローに対する保護が低下するため、 安全上、 この Boolean の有効化はお勧めできません。 ただし、 特定のモジュールやアプリケーションではこの特権を必要とするものがあります (Java や Mono アプリケーションなど)。 httpd_ssi_exec- Web ページ内の SSI (server side include) エレメントを実行可能にするかどうかを指定する Boolean です。
httpd_tty_commhttpdによる制御ターミナルへのアクセスを許可するかどうかを指定する Boolean です。 通常、 このアクセスは必要とされませんが、 SSL 証明書ファイルを設定する場合などに、 パスワードのプロンプトを表示させ処理するためターミナルへのアクセスが必要になります。httpd_unified- この Boolean を有効にすると、
httpd_tに対してhttpdの全タイプへの完全アクセスが許可されます (つまり、 sys_content_t の実行、 読み込み、 書き込み)。 無効にすると、 読み取り専用 web コンテンツ、 書き込み可能 web コンテンツ、 実行可能 web コンテンツ間に分離が施行されます。 この Boolean を無効にすることで安全性は高くなりますが、 各ファイルに持たせるアクセス権に応じてスクリプトや他の web コンテンツを別々にラベル付けしなければならない管理作業コストが生じることになります。 httpd_use_cifs- Samba でマウントされるファイルシステムなど、
cifs_tタイプのラベルが付けられる CIFS ファイルシステム上にあるファイル群へのアクセスをhttpdに許可する場合は、 この Boolean をオンにします。 httpd_use_nfs- NFS でマウントされるファイルシステムなど、
nfs_tタイプのラベルが付けられる NFS ファイルシステム上にあるファイル群へのアクセスをhttpdに許可する場合は、 この Boolean をオンにします。
3.4. 設定の実例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux でどのように Apache HTTP Server を補完するのか、 Apache HTTP Server の全機能をどのように管理するのかなど、 実践的な例を以下に示します。
3.4.1. 静的なサイトを実行する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
静的な web サイトを作成する場合は、 その web サイトの
.html ファイルに httpd_sys_content_t タイプのラベルを付けます。 デフォルトでは、httpd_sys_content_t タイプのラベルが付いたファイルには Apache HTTP Server による書き込みは行なえません。 次のように、読み取り専用 web サイト向けのファイルを格納する新しいディレクトリを作成します。
- root ユーザーで
mkdir /mywebsiteを実行し最上位にディレクトリを作成します。 - root ユーザーで
/mywebsite/index.htmlファイルを作成します。 以下のコンテンツを/mywebsite/index.htmlにコピーして貼り付けます。<html> <h2>index.html from /mywebsite/</h2> </html>
<html> <h2>index.html from /mywebsite/</h2> </html>Copy to Clipboard Copied! Toggle word wrap Toggle overflow /mywebsite/および配下のファイルやサブディレクトリへの Apache HTTP Server 読み取り専用アクセスを許可するため、/mywebsite/にhttpd_sys_content_tタイプのラベルを付けます。root ユーザーで次のコマンドを実行してラベルの変更をファイルコンテキスト設定に追加します。semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
restorecon -R -v /mywebsiteを実行してラベルの変更を行ないます。restorecon -R -v /mywebsite restorecon reset /mywebsite context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0
# restorecon -R -v /mywebsite restorecon reset /mywebsite context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0 restorecon reset /mywebsite/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:httpd_sys_content_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この例の場合、 root ユーザーで
/etc/httpd/conf/httpd.confを編集します。 既存のDocumentRootオプションをコメントアウトします。DocumentRoot "/mywebsite"オプションを追加します。 編集結果は以下のようになるはずです。#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"
#DocumentRoot "/var/www/html" DocumentRoot "/mywebsite"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
service httpd statusを実行し Apache HTTP Server の状態を確認します。 サーバーが停止している場合は、 root ユーザーでservice httpd startを実行してサーバーを起動します。 サーバーが実行中の場合は、 root ユーザーでservice httpd restartを実行しサーバーの再起動を行ないます (これによりhttpd.confへの変更がすべて適用されます)。 - web ブラウザで
http://localhost/index.htmlに行きます。 次のように表示されます。index.html from /mywebsite/
index.html from /mywebsite/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.4.2. NFS と CIFS ファイルシステムを共有する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、クライアント側の NFS マウントには NFS ファイルシステムのポリシーで定義されたデフォルトのコンテキストがラベル付けされます。一般的なポリシーであれば、このデフォルトのコンテキストには
nfs_t タイプが使用されます。またデフォルトでは、クライアント側にマウントされた Samba 共有にはポリシーで定義されたデフォルトのコンテキストがラベル付けされます。一般的なポリシーであれば、このデフォルトのコンテキストには cifs_t タイプが使用されます。
ポリシー設定によっては
nfs_t または cifs_t タイプのラベルが付いたファイルはサービスからは読み取れない場合があります。 このため、このタイプのラベルが付いたファイルシステムは他のサービスによるマウント、読み込み、エクスポートなどが阻止される可能性があります。Boolean をオンまたはオフにすることで、nfs_t や cifs_t タイプへのアクセスを許可するサービスを管理することができるようになります。
httpd_use_nfs Boolean をオンにして、 httpd による NFS ファイルシステム (nfs_t タイプのラベルが付いたファイル) へのアクセスと共有を許可します。 root ユーザーで setsebool を実行して Boolean をオンにします。
setsebool -P httpd_use_nfs on
setsebool -P httpd_use_nfs on
httpd_use_cifs Boolean をオンにして、 httpd による CIFS ファイルシステム (cifs_t タイプのラベルが付いたファイル) へのアクセスと共有を許可します。 root ユーザーで setsebool コマンドを実行します。
setsebool -P httpd_use_cifs on
setsebool -P httpd_use_cifs on
注記
再起動後、
setsebool による変更を維持したくない場合は -P オプションを使用しないでください。
3.4.3. サービス間でファイルを共有する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement を使用すると、 プロセスが別のプロセス用のファイルにアクセスしてしまうのを防ぐのに役立ちます。たとえば、デフォルトでは Samba は
httpd_sys_content_t タイプのラベルが付いたファイルの読み込みはできません。このタイプは Apache HTTP Server での使用を目的としています。目的のファイルに public_content_t または public_content_rw_t タイプのラベルを付けると、Apache HTTP Server、FTP、rsync、Samba 間でファイルを共有することができるようになります。
以下の例では、 ディレクトリとファイルを作成し、 Apache HTTP Server、 FTP、 rsync、 Samba 経由でそのディレクトリファイルを共有 (読み取り専用) できるようにしています。
- root ユーザーで
mkdir /sharesを実行して、 複数のサービス間でファイルを共有できるよう最上位に新規のディレクトリを作成します。 - ファイルコンテキスト設定のパターンに合致しないファイルやディレクトリには
default_tタイプのラベルが付けられる場合があります。 制限のあるサービスからはこのタイプのファイルやディレクトリにはアクセスできません。ls -dZ /shares drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /shares
$ ls -dZ /shares drwxr-xr-x root root unconfined_u:object_r:default_t:s0 /sharesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
/shares/index.htmlファイルを作成します。 次のコンテンツをコピーして/shares/index.htmlに貼り付けます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /shares/にpublic_content_tタイプのラベルを付けることで、 Apache HTTP Server、 FTP、 rsync、Samba による読み取り専用アクセスを許可します。 root ユーザーで次のコマンドを実行し、 ラベルの変更をファイルコンテキスト設定に追加します。semanage fcontext -a -t public_content_t "/shares(/.*)?"
semanage fcontext -a -t public_content_t "/shares(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
restorecon -R -v /shares/を実行しラベルの変更を適用します。restorecon -R -v /shares/ restorecon reset /shares context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0 restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
# restorecon -R -v /shares/ restorecon reset /shares context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0 restorecon reset /shares/index.html context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Samba で
/shares/ を共有する場合
rpm -q samba samba-common samba-clientを実行して、 samba、 samba-common、 samba-client の各パッケージがインストールされているか確認します (バージョン番号は使用しているバージョンによって異なります)。rpm -q samba samba-common samba-client samba-3.4.0-0.41.el6.3.i686 samba-common-3.4.0-0.41.el6.3.i686 samba-client-3.4.0-0.41.el6.3.i686
$ rpm -q samba samba-common samba-client samba-3.4.0-0.41.el6.3.i686 samba-common-3.4.0-0.41.el6.3.i686 samba-client-3.4.0-0.41.el6.3.i686Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記いずれのパッケージもインストールされていない場合は、 root ユーザーでyum install package-nameを実行してインストールを行ないます。- root ユーザーで
/etc/samba/smb.confを編集します。 Samba で/shares/ディレクトリを共有するため、 次のエントリをこのファイルの末尾に追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Samba ファイルシステムをマウントするには Samba アカウントが必要になります。 root ユーザーで
smbpasswd -a usernameを実行し、 Samba アカウントを作成します。 username の部分は既存の Linux ユーザーにします。 たとえば、smbpasswd -a testuserを実行すると、 Linux の testuser ユーザー用の Samba アカウントが作成されます。smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.
# smbpasswd -a testuser New SMB password: Enter a password Retype new SMB password: Enter the same password again Added user testuser.Copy to Clipboard Copied! Toggle word wrap Toggle overflow smbpasswd -a usernameを実行する際、 システムに存在しない Linux アカウントのユーザー名をusername に使用すると、 「Cannot locate Unix account for 'username'!」というエラーが発生する原因になります。 - root ユーザーで
service smb startを実行し Samba サービスを起動します。service smb start Starting SMB services: [ OK ]
service smb start Starting SMB services: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow smbclient -U username -L localhostを実行し、 使用できる共有を表示させます。 username はステップ 3 で追加した Samba アカウントにします。 パスワード入力を求められたら、 ステップ 3 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は使用しているバージョンによって異なります)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
mkdir /test/を実行し新規ディレクトリを作成します。 このディレクトリは Samba 共有のsharesをマウントする際に使用します。 - root で次のコマンドを実行して、Samba 共有の
sharesを/test/にマウントします。username はステップ 3 のユーザー名にしてください。mount //localhost/shares /test/ -o user=username
mount //localhost/shares /test/ -o user=usernameCopy to Clipboard Copied! Toggle word wrap Toggle overflow ステップ 3 で設定した username のパスワードを入力します。 cat /test/index.htmlを実行して Samba で共有しているファイルを表示させます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Apache HTTP Server で
/shares/ を共有する場合
rpm -q httpdを実行して httpd パッケージがインストールされているか確認します (バージョン番号は使用しているバージョンによって異なります)。rpm -q httpd httpd-2.2.11-6.i386
$ rpm -q httpd httpd-2.2.11-6.i386Copy to Clipboard Copied! Toggle word wrap Toggle overflow このパッケージがインストールされていない場合は、 root ユーザーでyum install httpdを実行してインストールします。/var/www/html/ディレクトリに移動します。 root ユーザーで次のコマンドを実行して/shares/ディレクトリへのリンクを作成します。ln -s /shares/ shares
ln -s /shares/ sharesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
service httpd startを実行して Apache HTTP Server を起動します。service httpd start Starting httpd: [ OK ]
service httpd start Starting httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - web ブラウザを使って
http://localhost/sharesに行きます。/shares/index.htmlが表示されます。
デフォルトでは、
index.html ファイルが存在していればそのファイルが Apache HTTP Server によって読み込まれます。/shares/ に file1、file2、file3 しかなく index.html がない場合、http://localhost/shares にアクセスするとディレクトリ一覧が表示されます。
- root ユーザーで
rm -i /shares/index.htmlを実行してindex.htmlファイルを削除します。 - root ユーザーで
touch /shares/file{1,2,3}を実行し、/shares/内に 3 つのファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
service httpd statusを実行して Apache HTTP Server の状態を確認します。 サーバーが停止している場合は、 root ユーザーでservice httpd startを実行し再起動を行ないます。 - web ブラウザで
http://localhost/sharesに行きます。 ディレクトリ一覧が表示されます。
3.4.4. ポート番号を変更する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ポリシー設定に応じて、サービスの実行が許可されるのは特定のポート番号に限られます。ポリシーを変更せず、サービスが実行されるポートを変えようとすると、サービスの起動に失敗する場合があります。root ユーザーで
semanage port -l | grep -w "http_port_t" コマンドを実行し、SELinux で http によるリッスンを許可しているポートを表示させます。
semanage port -l | grep -w http_port_t http_port_t tcp 80, 443, 488, 8008, 8009, 8443
# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
デフォルトでは、 SELinux で
http にリッスンを許可している TCP ポートは 80、443、488、8008、8009、8443 になります。httpd で http_port_t 用に記載されていないポートをリッスンするよう /etc/httpd/conf/httpd.conf に設定を行なうと、httpd の起動に失敗します。
次のように、TCP ポート 80、443、488、8008、8009、8443 以外のポートで実行するよう
httpd に設定を行ないます。
- root ユーザーで
/etc/httpd/conf/httpd.confを編集し、 SELinux ではhttpd用に設定されていないポートをListenオプションに記載します。 以下の例では、httpdが 10.0.0.1 IP アドレス、 TCP ポート 12345 でリッスンするよう設定しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
semanage port -a -t http_port_t -p tcp 12345を実行して、 そのポートを SELinux ポリシー設定に追加します。 - root ユーザーで
semanage port -l | grep -w http_port_tを実行してポートが追加されたか確認します。semanage port -l | grep -w http_port_t http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443
# semanage port -l | grep -w http_port_t http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ポート 12345 での
httpd の実行が必要なくなった場合には、 root ユーザーで semanage port -d -t http_port_t -p tcp 12345 を実行してポリシー設定からそのポートを削除します。
[5]
Apache HTTP Server Project ページの "The Number One HTTP Server On The Internet" セクションより抜粋: http://httpd.apache.org/。 著作権 © 2009 The Apache Software Foundation (2010年 7月 7日に閲覧)
第4章 Samba リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Samba の web サイトより抜粋:
原文: "Samba is an Open Source/Free Software suite that has, since 1992, provided file and print services to all manner of SMB/CIFS clients, including the numerous versions of Microsoft Windows operating systems. Samba is freely available under the GNU General Public License.". (訳文: Samba とは、 1992 年に設立され、 Microsoft Windows オペレーティングシステムの各種バージョンをはじめ、 あらゆる SMB/CIFS クライアントにファイルやプリンタなどのサービスを提供している Open Source/Free Software スィートです。 Samba は GNU General Public License に基づき自由に入手が可能です。)[6]
Red Hat Enterprise Linux では、 Samba サーバーは samba パッケージにより提供されます。
rpm -q samba を実行して samba パッケージがインストールされているか確認します。Samba を使用する予定にも関わらず、このパッケージがインストールされていない場合は、root ユーザーになり次のコマンドを実行してパッケージのインストールを行ないます。
yum install samba
yum install samba
4.1. Samba と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux を有効にすると、 Samba サーバー (
smbd) はデフォルトで制限のあるサービスとして実行されます。 制限のあるサービスはそのサービス自体のドメイン内で実行され、 他の制限のあるサービスとは分離されます。 次の例では、 サービス自体のドメイン内で実行している smbd プロセスを示しています。 samba パッケージがインストールされていることを前提としています。
getenforceを実行して、 SELinux が enforcing モードで実行していることを確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行されている場合は、getenforceコマンドによりEnforcingが返されます。- root ユーザーで
service smbd startを実行してsmbdを起動します。service smb start Starting SMB services: [ OK ]
service smb start Starting SMB services: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep smb実行してsmbdプロセスを表示させます。ps -eZ | grep smb unconfined_u:system_r:smbd_t:s0 16420 ? 00:00:00 smbd unconfined_u:system_r:smbd_t:s0 16422 ? 00:00:00 smbd
$ ps -eZ | grep smb unconfined_u:system_r:smbd_t:s0 16420 ? 00:00:00 smbd unconfined_u:system_r:smbd_t:s0 16422 ? 00:00:00 smbdCopy to Clipboard Copied! Toggle word wrap Toggle overflow smbdプロセスに関連する SELinux コンテキストはunconfined_u:system_r:smbd_t:s0です。 このコンテキストの最後から 2 番目の部分、smbd_tがタイプになります。 プロセスのドメインやファイルのタイプを定義するのがタイプです。 この例の場合、smbdプロセスは smbd_t ドメイン内で実行しています。
smbd によるファイルのアクセスおよび共有を許可するため、適切なラベルを付ける必要があります。たとえば、smbd では samba_share_t タイプのラベルが付いたファイルの読み込みと書き込みを行なうことができますが、デフォルトでは httpd_sys_content_t タイプのラベルが付いたファイルにはアクセスできません。このタイプは Apache HTTP Server での使用を目的としているためです。Samba によるホームディレクトリや NFS ファイルシステムのエクスポートを許可する、また Samba にドメインコントローラとしての動作を許可するなど、特定の動作を許可する場合は Boolean をオンにする必要があります。
4.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ファイルに
samba_share_t タイプのラベルを付けて Samba によるファイル共有ができるようにします。 このタイプのラベル付けはユーザー作成のファイルに限ってください。システムファイルにはこのタイプのラベルは付けないよう注意してください。ラベル付けしたファイルやディレクトリを共有するため Boolean をオンにします。SELinux では、/etc/samba/smb.conf と Linux パーミッションが設定されていれば、samba_share_t タイプのラベルが付いたファイルへの Samba による書き込みは許可されます。
samba_etc_t タイプは、 /etc/samba/ 内にあるsmb.conf などの特定ファイルに使用されます。 samba_etc_t タイプのラベル付けは手作業では行なわないでください。 /etc/samba/ 内のファイルに適切なラベルが付けられていない場合、 root ユーザーで restorecon -R -v /etc/samba を実行してそのファイルをデフォルトのコンテキストに復元します。 /etc/samba/smb.conf に samba_etc_t タイプのラベルが付いていない場合、 service smb start コマンドの実行が失敗し、 SELinux 拒否がログ記録される場合があります。 /etc/samba/smb.conf に httpd_sys_content_t タイプのラベルが付いていた場合に拒否となる例を示します。
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af
setroubleshoot: SELinux is preventing smbd (smbd_t) "read" to ./smb.conf (httpd_sys_content_t). For complete SELinux messages. run sealert -l deb33473-1069-482b-bb50-e4cd05ab18af
4.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って Samba の動作方法を SELinux に指示します。
allow_smbd_anon_write- この Boolean を有効にすると、 特殊なアクセス制限がなく共通ファイル用に予約されている領域など、 パブリックディレクトリへの
smbdによる書き込みが許可されます。 samba_create_home_dirs- この Boolean を有効にすると、 Samba が単独で新規ホームディレクトリを作成できるようになります。 PAM などのようなメカニズムで有効にされることが多くあります。
samba_domain_controller- この Boolean を有効にすると、 ドメインコントローラとして Samba を動作させ、
useradd、groupadd、passwdなどの関連コマンドの実行パーミッションを付与することができます。 samba_enable_home_dirs- この Boolean を有効にすると、 Samba によるユーザーのホームディレクトリ共有が可能になります。
samba_export_all_ro- あらゆるファイルやディレクトリをエクスポートし、 読み取り専用のパーミッションを付与します。 これにより、
samba_share_tタイプのラベルが付いていないファイルやディレクトリを Samba で共有できるようにします。samba_export_all_roBoolean はオンになっているが、samba_export_all_rwBoolean がオフになっている場合、/etc/samba/smb.confで書き込みアクセスが設定され Linux パーミッションでも書き込みアクセスが許可されていても、 Samba 共有への書き込みアクセスは拒否されます。 samba_export_all_rw- あらゆるファイルやディレクトリをエクスポートし、 読み取りと書き込みのパーミッションを付与します。 これにより、
samba_share_tタイプのラベルが付いていないファイルやディレクトリを Samba でエクスポートできるようにします。/etc/samba/smb.confのパーミッションおよび Linux パーミッションを設定して書き込みアクセスを許可する必要があります。 samba_run_unconfined- この Boolean を有効にすると、Samba による /var/lib/samba/scripts ディレクトリ内の制限のないスクリプトの実行を許可します。
samba_share_fusefs- Samba に fusefs ファイルシステムを共有させる場合は、 この Boolean を有効にする必要があります。
samba_share_nfs- この Boolean を無効にすることで、 Samba を介した NFS 共有への完全アクセスを
smbdに与えないようにします。 この Boolean を有効にすると、 Samba による NFS ファイルシステムの共有が許可されます。 use_samba_home_dirs- Samba のホームディレクトリ用にリモートサーバーを使用する場合、この Boolean を有効にします。
virt_use_samba- 仮想マシンによる CIFS ファイルへのアクセスを許可します。
4.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux でどのように Samba サーバーを補完するのか、 Samba サーバーの全機能をどのように管理するのかなど、 実践的な例を以下に示します。
4.4.1. 作成したディレクトリを共有する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
新規のディレクトリを作成し、 そのディレクトリを Samba で共有します。
rpm -q samba samba-common samba-clientを実行して、 samba、 samba-common、 samba-client の各パッケージがインストールされているか確認します。 いずれかのパッケージがインストールされていない場合は、 root ユーザーでyum install package-nameを実行してインストールを行ないます。- root ユーザーで
mkdir /myshareを実行して Samba でファイルを共有するためのディレクトリを最上位に新規に作成します。 - root ユーザーで
touch /myshare/file1を実行して空のファイルを作成します。 このファイルは後で Samba 共有が正しくマウントされたか確認する際に使用します。 - SELinux では、
/etc/samba/smb.confおよび Linux パーミッションが設定されていれば、samba_share_tタイプのラベルが付いたファイルへの Samba による読み取りおよび書き込みは許可されます。root ユーザーで次のコマンドを実行し、ファイルコンテキスト設定にラベルの変更を追加します。semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
semanage fcontext -a -t samba_share_t "/myshare(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
restorecon -R -v /myshareを実行しラベルの変更を適用します。restorecon -R -v /myshare restorecon reset /myshare context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0 restorecon reset /myshare/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0
# restorecon -R -v /myshare restorecon reset /myshare context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0 restorecon reset /myshare/file1 context unconfined_u:object_r:default_t:s0->system_u:object_r:samba_share_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
/etc/samba/smb.confを編集します。 Samba で /myshare/ ディレクトリを共有するため、 以下をこのファイルの末尾に追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Samba ファイルシステムをマウントするには Samba アカウントが必要になります。 root ユーザーで
smbpasswd -a usernameを実行し Samba アカウントを作成します。 username は既存の Linux ユーザーにします。 たとえば、smbpasswd -a testuserにすると、 Linux testuser ユーザーの Samba アカウントが作成されます。smbpasswd -a testuser New SMB password: (パスワードを入力) Retype new SMB password: (もう一度同じパスワードを入力) Added user testuser.
# smbpasswd -a testuser New SMB password: (パスワードを入力) Retype new SMB password: (もう一度同じパスワードを入力) Added user testuser.Copy to Clipboard Copied! Toggle word wrap Toggle overflow smbpasswd -a usernameを実行する際、 システム上に存在していない Linux アカウントをのユーザー名を username に入れると、 「Cannot locate Unix account for 'username'!」エラーが発生する原因になります。 - root ユーザーで
service smb startを実行して Samba サービスを起動します。service smb start Starting SMB services: [ OK ]
service smb start Starting SMB services: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow smbclient -U username -L localhostを実行し、 使用できる共有を表示させます。 username はステップ 7 で追加した Samba アカウントにします。 パスワード入力を求められたら、 ステップ 7 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は使用しているバージョンによって異なります)。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
mkdir /test/を実行し新規ディレクトリを作成します。 このディレクトリは Samba 共有のmyshareをマウントする際に使用します。 - root で次のコマンドを実行して、Samba 共有の
myshareを/test/にマウントします。 username はステップ 7 のユーザー名にしてください。mount //localhost/myshare /test/ -o user=username
mount //localhost/myshare /test/ -o user=usernameCopy to Clipboard Copied! Toggle word wrap Toggle overflow ステップ 7 で設定した username のパスワードを入力します。 ls /test/を実行して ステップ 3 で作成したfile1を表示させます。ls /test/ file1
$ ls /test/ file1Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4.2. web サイトを共有する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
/var/www/html/ で web サイトを共有したい場合など、ファイルに samba_share_t タイプのラベルが付けられない場合があります。 このような場合には、 すべてのファイルやディレクトリを共有するよう samba_export_all_ro Boolean を使用して読み取り専用パーミッションを付与するか (現在のラベルに関わらず)、 samba_export_all_rw Boolean を使用して読み取りと書き込みのパーミッションを付与します (現在のラベルに関わらず)。
以下の例では、
/var/www/html/ 内に web サイトのファイルを作成してから、 そのファイルを Samba で共有し読み取りと書き込みのパーミッションを与えています。 ここでは、 httpd、 samba、 samba-common、 samba-client、 wget のパッケージがインストールされていることを前提としています。
- root ユーザーになり
/var/www/html/file1.htmlファイルを作成します。 次のコンテンツをコピーして/var/www/html/file1.htmlに貼り付けます。<html> <h2>File being shared through the Apache HTTP Server and Samba.</h2> </html>
<html> <h2>File being shared through the Apache HTTP Server and Samba.</h2> </html>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ls -Z /var/www/html/file1.htmlを実行してfile1.htmlの SELinux コンテキストを表示させます。ls -Z /var/www/html/file1.html -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1.html
$ ls -Z /var/www/html/file1.html -rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/file1.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow file1.index.htmlにはhttpd_sys_content_tタイプのラベルが付けられています。デフォルトでは、Apache HTTP Server によるアクセスはできますが、 Samba によるアクセスはできません。- root ユーザーで
service httpd startを実行して Apache HTTP Server を起動します。service httpd start Starting httpd: [ OK ]
service httpd start Starting httpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Linux ユーザーでの書き込みアクセスがあるディレクトリに移動し、
wget http://localhost/file1.htmlコマンドを実行します。 デフォルト設定に変更がなければ、 このコマンドは成功します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
/etc/samba/smb.confを編集します。 Samba で/var/www/html/ディレクトリを共有するため、 以下をこのファイルの末尾に追加します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/ディレクトリにはhttpd_sys_content_tタイプのラベルが付けられます。 デフォルトでは、httpd_sys_content_tタイプのラベルの付いたファイルやディレクトリには、 Linux パーミッションが付与されていても Samba からはアクセスできません。 Samba によるアクセスを許可するため、 root ユーザーで次のコマンドを実行し、samba_export_all_roBoolean をオンにします。setsebool -P samba_export_all_ro on
setsebool -P samba_export_all_ro onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 再起動後、この変更を維持したくない場合は-Pを使用しないでください。samba_export_all_roBoolean をオンにすると、Samba からはいずれのタイプにもアクセスもできるようになるため注意してください。- root ユーザーで
service smb startを実行してsmbdを起動します。service smb start Starting SMB services: [ OK ]
service smb start Starting SMB services: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第5章 ファイル転送プロトコル リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ファイル転送プロトコル、 FTP は、 今日インターネット上で見られる、最も古く、一般的に使用されているプロトコルです。ユーザーはリモートホストに直接ログインする必要がなく、またリモートシステムの使い方を知らなくても、ネットワーク上の複数のコンピュータホスト間で確実にファイル転送を行なえるようにすることがその目的になります。FTP により、ユーザーはシンプルで標準的なコマンドセットを使用するだけでリモートシステム上のファイルにアクセスできるようになります。
Very Secure FTP Daemon (
vsftpd) は、高速で安定性があり、かつ何よりも高い安全性を確保するため、その土台から設計が行なわれています。多数の接続を効率的かつ安全に処理できる能力があることから、Red Hat Enterprise Linux に同梱されている唯一の独立型 FTP サーバーとなります。
Red Hat Enterprise Linux では、Very Secure FTP デーモンは vsftpd パッケージで提供されます。
rpm -q vsftpd を実行して vsftpd がインストールされているか確認します。
rpm -q vsftpd
$ rpm -q vsftpd
FTP サーバーを利用する方で vsftpd パッケージがインストールされていない場合には、 次のコマンドを root ユーザーで実行してインストールを行ないます。
yum install vsftpd
yum install vsftpd
5.1. FTP と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
FTP デーモンの
vsftpd はデフォルトで制限のあるサービスとして実行されます。vsftpd とファイル、 プロセスまたシステムとの交信方法は SELinux ポリシーで定義されます。たとえば、 認証ユーザーが FTP 経由でログインすると、そのユーザーは自分のホームディレクトリの読み取りや書き込みが行なえません。SELinux により、vsftpd によるユーザーのホームディレクトリへのアクセスはデフォルトで阻止されるためです。また、vsftpd には NFS や CIFS ファイルシステムへのアクセスもデフォルトではありません。 このため、/etc/vsftpd/vsftpd.conf 内で書き込みアクセスが設定されていても、anonymous ユーザーには書き込みアクセスが与えられません。Boolean をオンにすると、こうしたアクセスを許可することができるようになります。
認証ユーザーがログインして、自分のホームディレクトリを表示させようとすると SeLinux 拒否になる例を以下に示します。
rpm -q ftpを実行して ftp パッケージがインストールされているか確認します。 インストールされていない場合は root ユーザーでyum install ftpを実行しインストールを行ないます。rpm -q vsftpdを実行して vsftpd パッケージがインストールされているか確認します。 インストールされていない場合は root ユーザーでyum install vsftpdを実行しインストールを行ないます。- Red Hat Enterprise Linux では、
vsftpdはデフォルトでは anonymous ユーザーによるログインしか許可していません。認証ユーザーによるログインを許可するため、root で/etc/vsftpd/vsftpd.confを編集します。local_enable=YESオプションを必ずコメントアウトしてください。# Uncomment this to allow local users to log in. local_enable=YES
# Uncomment this to allow local users to log in. local_enable=YESCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
service vsftpd startを実行してvsftpdを起動します。vsftpd.confの編集前にこのサービスが実行中だった場合は、 root ユーザーでservice vsftpd restartを実行し設定の変更を適用します。service vsftpd start Starting vsftpd for vsftpd: [ OK ]
service vsftpd start Starting vsftpd for vsftpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 現在ログインしているユーザーのまま
ftp localhostを実行します。 ユーザー名のプロンプトが表示されたら、 ログインしているユーザー名になっているか確認します。 ユーザー名が正しければ Enter を押します。 ユーザー名が違う場合は、 正しいユーザー名を入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 次のような SELinux 拒否がログ記録されます。
setroubleshoot: SELinux is preventing the ftp daemon from reading users home directories (username). For complete SELinux messages. run sealert -l c366e889-2553-4c16-b73f-92f36a1730ce
setroubleshoot: SELinux is preventing the ftp daemon from reading users home directories (username). For complete SELinux messages. run sealert -l c366e889-2553-4c16-b73f-92f36a1730ceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - ホームディレクトリへのアクセスが SELinux により拒否されています。 これを解決するには、
ftp_home_dirBoolean を有効にします。 root ユーザーで次のコマンドを実行してftp_home_dirBoolean を有効にします。setsebool -P ftp_home_dir=1
# setsebool -P ftp_home_dir=1Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記
再起動後、 変更を維持したくない場合は -P オプションを使用しないでください。もう一度ログインしてみます。 今度はftp_home_dirBoolean でホームディレクトリへのアクセスが許可され、 ログインに成功します。
5.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、 anonymous ユーザーは FTP でログインすると
/var/ftp/ 内のファイルへの読み取りアクセスが与えられます。 このディレクトリには public_content_t タイプのラベルが付いているため、 /etc/vsftpd/vsftpd.conf で書き込みが設定されていても、 許可されるのは読み取り専用アクセスのみになります。 public_content_t タイプへは、Apache HTTP Server、Samba、NFS など他のサービスによるアクセスも可能です。
FTP 経由でファイルを共有する場合は、次のいずれかのタイプを使用します。
public_content_t- ユーザーが作成したファイルやディレクトリを vsftpd 経由の読み取り専用で共有する場合に
public_content_tタイプのラベルを付けます。このタイプのラベルが付いたファイルには、Apache HTTP Server、Samba、NFS など、他のサービスからもアクセスすることができます。public_content_tタイプのラベルが付いたファイルへの書き込みは、Linux パーミッションで書き込みが許可されていても行なえません。書き込みアクセスが必要な場合は、public_content_rw_tタイプを使用してください。 public_content_rw_t- ユーザーが作成したファイルやディレクトリを
vsftpd経由の読み取りおよび書き込みのパーミッションで共有する場合にpublic_content_rw_tタイプのラベルを付けます。このタイプのラベルが付いたファイルには、Apache HTTP Server、Samba、NFS など、他のサービスからもアクセスすることができます。このタイプのラベルが付いたファイルに書き込みを行う場合は、まず最初に各サービスの Boolean をオンにしておく必要がある点に注意してください。
5.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って
vsftpd の動作方法を SELinux に指示します。
allow_ftpd_anon_write- この Boolean を無効にした場合、
vsftpdによるpublic_content_rw_tタイプのラベルが付いたファイルおよびディレクトリへの書き込みが阻止されます。 有効にすると、 ユーザーによる FTP 経由のファイルのアップロードが可能になります。 ファイルのアップロード先となるディレクトリにはpublic_content_rw_tタイプのラベルを付け、 また Linux パーミッションも設定しておく必要があります。 allow_ftpd_full_access- この Boolean をオンにすると、 アクセス制御に Linux (DAC) のパーミッションしか使用されなくなるため、 認証ユーザーはファイルに
public_content_tやpublic_content_rw_tのタイプのラベルが付いていなくてもファイルの読み取りおよび書き込みが可能になります。 allow_ftpd_use_cifs- この Boolean を有効にすると、
vsftpdによるcifs_tタイプのラベルが付いたファイルやディレクトリへのアクセスを許可します。 したがって、 この Boolean を有効にすることで Samba でマウントしたファイルシステムをvsftpdで共有することができるようになります。 allow_ftpd_use_nfs- この Boolean を有効にすると、
vsftpdによるnfs_tタイプのラベルが付いたファイルやディレクトリへのアクセスを許可します。 したがって、 この Boolean を有効にすることで NFS でマウントしたファイルシステムをvsftpdで共有することができるようになります。 ftp_home_dir- この Boolean を有効にすると、 認証ユーザーによるユーザーのホームディレクトリ内のファイルの読み取りと書き込みを許可します。 この Boolean をオフにした場合、 ホームディレクトリからファイルをダウンロードしようとすると
550 Failed to open fileなどのエラーが発生します。 SELinux 拒否がログ記録されます。 ftpd_connect_db- FTP デーモンによるデータベースへの接続開始を許可します。
httpd_enable_ftp_serverhttpdによる FTP ポートでのリッスンおよび FTP サーバーとしての動作を許可します。tftp_anon_write- この Boolean を有効にすると、 特殊なアクセス制限がなく共通ファイル用に予約されている領域など、パブリックディレクトリへの TFTP によるアクセスが許可されます。
5.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
5.4.1. FTP サイトにアップロードする リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
特定のユーザーがファイルのアップロード専用として使用できる FTP サイトを作成している例を示します。 ディレクトリ構造を作成し、 必要となる SELinux 設定の変更を行なっています。
- root ユーザーで
setsebool ftp_home_dir=1を実行して FTP ホームディレクトリへのアクセスができるようにします。 - root ユーザーで
mkdir -p /myftp/pubを実行して新規ディレクトリを最上位に作成します。 - Linux ユーザーの書き込みアクセスを許可するため、
/myftp/pub/ディレクトリで Linux パーミッションの設定を行ないます。以下の例では、所有者とグループを root から所有者 user1 とグループ root に変更します。書き込みアクセスを与えたいユーザーを「user1」の部分に入れてください。chown user1:root /myftp/pub chmod 775 /myftp/pub
# chown user1:root /myftp/pub # chmod 775 /myftp/pubCopy to Clipboard Copied! Toggle word wrap Toggle overflow chownコマンドで所有者とグループのパーミッションを変更しています。chmodコマンドではモードを変更し、user1 ユーザーには読み取り、書き込み、実行のパーミッションを許可、root グループのメンバーには読み取り、書き込み、実行のパーミッションを許可しています。これ以外のユーザーには読み取りと実行のパーミッションを許可しています。このディレクトリ配下にあるファイルの読み込みを Apache HTTP Server に許可する必要があります。 - SELinux を実行する場合は、ファイルやディレクトリにアクセス許可のラベルを適切に付ける必要があります。Linux パーミッションの設定だけでは不十分です。ファイルに
public_content_tタイプのラベルが付いている場合は、FTP、Apache HTTP Server、Samba による読み込みおよび再同期が可能です。ファイルにpublic_content_rw_tタイプのラベルが付いている場合は、FTP による書き込みが可能です。 Samba など FTP 以外のサービスによるpublic_content_rw_tタイプのラベルが付いているファイルへの書き込みについては、書き込みを行なう前にまず Boolean を設定しておく必要があります。最上位のディレクトリ (/myftp/) にpublic_content_tタイプのラベルを付け、/myftp/配下にコピーまたは新規作成されたファイルに対してサービスによる書き込みや変更が行なわれないようにします。root ユーザーで次のコマンドを実行し、ラベルの変更をファイルコンテキスト設定に追加します。semanage fcontext -a -t public_content_t /myftp
semanage fcontext -a -t public_content_t /myftpCopy to Clipboard Copied! Toggle word wrap Toggle overflow restorecon -R -v /myftp/を実行してラベルの変更を適用します。restorecon -R -v /myftp/ restorecon reset /myftp context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0
# restorecon -R -v /myftp/ restorecon reset /myftp context unconfined_u:object_r:default_t:s0->system_u:object_r:public_content_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow /myftpにはpublic_content_tタイプのラベル、/myftp/pub/にはdefault_tタイプのラベルが付いているか確認します。ls -dZ /myftp/ drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /myftp/ ls -dZ /myftp/pub/ drwxrwxr-x. user1 root unconfined_u:object_r:default_t:s0 /myftp/pub/
$ ls -dZ /myftp/ drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /myftp/ $ ls -dZ /myftp/pub/ drwxrwxr-x. user1 root unconfined_u:object_r:default_t:s0 /myftp/pub/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - ユーザーが FTP 経由でファイルをアップロードできるようにするため、 まず先に FTP にディレクトリへの書き込みを許可する必要があります。 SELinux で FTP に書き込みを許可しているのは、
public_content_rw_tタイプのラベルが付いたディレクトリです。ここでは、FTP に書き込みを許可するディレクトリとして/myftp/pub/を使用しています。root ユーザーで次のコマンドを実行し、ラベルの変更をファイルコンテキスト設定に追加します。semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?"
semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
restorecon -R -v /myftp/pubを実行してラベルの変更を適用します。restorecon -R -v /myftp/pub restorecon reset /myftp/pub context system_u:object_r:default_t:s0->system_u:object_r:public_content_rw_t:s0
# restorecon -R -v /myftp/pub restorecon reset /myftp/pub context system_u:object_r:default_t:s0->system_u:object_r:public_content_rw_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow allow_ftpd_anon_writeBoolean をオンにして、vsftpdによるpublic_content_rw_tタイプのラベルが付いたファイルへの書き込みを許可する必要があります。root ユーザーで次のコマンドを実行し、この Boolean をオンにします。setsebool -P allow_ftpd_anon_write on
setsebool -P allow_ftpd_anon_write onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 再起動後、 変更を維持したくない場合は-Pオプションを使用しないでください。
FTP でログインしてからファイルをアップロードする例を以下に示します。 ユーザーは前述の例と同じ user1 ユーザーを使用しています。
/myftp/pub/ ディレクトリは user1 が専用所有者となるディレクトリです。
cd ~/を実行してホームディレクトリに移動します。 次に、mkdir myftpを実行して FTP 経由でアップロードするファイルを格納するディレクトリを作成します。cd ~/myftpを実行して~/myftp/ディレクトリに移動します。 このディレクトリ内にftpuploadファイルを作成します。 以下の内容をこのファイルにコピーします。File upload via FTP from a home directory.
File upload via FTP from a home directory.Copy to Clipboard Copied! Toggle word wrap Toggle overflow getsebool allow_ftpd_anon_writeを実行して、allow_ftpd_anon_writeBoolean がオンになっているか確認します。getsebool allow_ftpd_anon_write allow_ftpd_anon_write --> on
$ getsebool allow_ftpd_anon_write allow_ftpd_anon_write --> onCopy to Clipboard Copied! Toggle word wrap Toggle overflow この Boolean がオフになっている場合は、 root ユーザーでsetsebool -P allow_ftpd_anon_write onを実行し Boolean をオンにします。 再起動後、 変更を維持したくない場合は-Pオプションを使用しないでください。- root ユーザーで
service vsftpd startを実行し、vsftpdを起動します。service vsftpd start Starting vsftpd for vsftpd: [ OK ]
# service vsftpd start Starting vsftpd for vsftpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ftp localhostを実行します。 ユーザー名の入力が求められたら、 書き込みアクセスを持っているユーザーのユーザー名を入力し、 そのユーザーの正しいパスワードを入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow allow_ftpd_anon_writeBoolean が有効になっているためアップロードが成功します。
第6章 ネットワークファイルシステム リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Linux リファレンスガイド より抜粋:
NFS (Network File System) を利用すると、 ホストはリモートのシステム上にあるパーティションをマウントし、 ローカルのファイルシステムと同じように使用することができるようになります。 これにより、 管理者側はリソースをネットワーク上の一元的な場所に格納し、 認証ユーザーに安定したリソースアクセスを提供できるようになります。
Red Hat Enterprise Linux では、 NFS に完全対応させる場合は nfs-utils が必要になります。
rpm -q nfs-utils を実行して nfs-utils がインストールされているか確認してください。NFS を使用する予定にも関わらず、このパッケージがインストールされていない場合は、root ユーザーで次のコマンドを実行してパッケージのインストールを行ないます。
yum install nfs-utils
yum install nfs-utils
6.1. NFS と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux を実行すると、
NFS デーモンはデフォルトで制限されます。SELinux ポリシーにより、NFS によるファイル共有はデフォルトで許可されます。
6.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、 クライアント側にマウントした NFS ファイルシステムには、 ポリシーで定義された NFS ファイルシステム用デフォルトコンテキストのラベルが付けられます。一般的なポリシーであれば、このデフォルトのコンテキストには
nfs_t タイプが使用されます。NFS では次のようなタイプが使用されます。タイプに応じて柔軟なアクセス設定ができます。
var_lib_nfs_t- このタイプは、
/var/lib/nfsディレクトリ内の既存ファイルおよびこのディレクトリにコピーまたは作成される新規ファイルに対して使用されます。通常の操作では、このタイプは変更する必要はありません。加えられた変更をデフォルトの設定に復元する場合は、root ユーザーでrestorecon -R -v /var/lib/nfsコマンドを実行します。 nfsd_exec_t/usr/sbin/rpc.nfsdファイルには、nfsd_exec_tのラベルが付けられます。これ以外、NFS 関連の実行可能なシステムファイルやライブラリも同様にこのタイプのラベルが付けられます。ユーザーがファイルのラベル付けを行なう際は、このタイプは使用しないでください。nfsd_exec_tはnfsd_tに遷移します。
6.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って NFS の動作方法を SELinux に指示します。
allow_ftpd_use_nfs- この Boolean を有効にすると、
ftpdによる NFS マウントへのアクセスを許可します。 allow_nfsd_anon_write- この Boolean を有効にすると、特殊なアクセス制限がなく共通ファイル用に予約されている領域など、パブリックディレクトリへの
nfsdによる anonymous の書き込みが許可されます。 httpd_use_nfs- この Boolean を有効にすると、NFS ファイルシステム上に格納されたファイルへの
httpdによるアクセスを許可します。 nfs_export_all_ro- ファイルやディレクトリのエクスポートはすべて NFS 経由で行い、読み取り専用パーミッションを与えます。
nfs_export_all_rw- ファイルやディレクトリのエクスポートはすべて NFS 経由で行い、読み取りと書き込みのパーミッションを与えます。
qemu_use_nfs- qemu による NFS ファイルシステムの使用を許可します。
samba_share_nfs- この Boolean を無効にすることで、
smbdには Samba を介した NFS 共有へのフルアクセスを与えないようにします。この Boolean を有効にすると、Samba による NFS ファイルシステムの共有が許可されます。 use_nfs_home_dirs- この Boolean を有効にすると、NFS ホームディレクトリのサポートが有効になります。
virt_use_nfs- 仮想マシンによる NFS ファイルへのアクセスを許可します。
xen_use_nfs- Xen による NFS ファイルの使用を許可します。
6.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
6.4.1. NFS を使ってディレクトリを共有する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
NFS と SELinux を使ったディレクトリの作成と共有の例を示します。 2 台のホストを使用しています。 ホスト名が
nfs-srv で IP アドレスが 192.168.1.1の NFS サーバーと、 ホスト名が nfs-client で IP アドレスが 192.168.1.100 のクライアントです。 いずれのホストも同じサブネット (192.168.1.0/24) 上にあります。これは一例に過ぎません。 また、 nfs-utils パッケージがインストールされていること、 SELinux targeted ポリシーを使用していること、 SELinux は enforced モードで実行していることを前提としています。
NFS を介した全ユーザーへのアクセスが Linux ファイルパーミッションで与えられ、 ネットワークへのアクセスにも制限がない状態であっても、 SELinux の Boolean を使って適切なパーミッションを与えない限り、 SELinux で NFS ファイルシステムがマウントされないよう防ぐことができます。
6.4.1.1. サーバーのセットアップ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
次のステップ 1 からステップ 10 までは NFS サーバー
nfs-srv で行なってください。
setseboolコマンドを実行し、 NFS ファイルシステムの読み取りと書き込みでのマウントを無効にします。setsebool -P nfs_export_all_rw off
setsebool -P nfs_export_all_rw offCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記
再起動後、setseboolによる変更を維持したくない場合は-Pオプションを使用しないでください。rpm -q nfs-utilsを実行して、 nfs-utils パッケージがインストールされているか確認します。 nfs-utils パッケージにより NFSを使用するためのサポートプログラムが提供されるため、 このパッケージは NFS サーバーおよび使用中のすべてのクライアントにインストールしてください。 このパッケージがインストールされていない場合は、 root ユーザーでyum install nfs-utilsを実行してインストールしてください。- root で
mkdir /myshareを実行して、 NFS を使って共有するディレクトリを最上位に新規作成します。 - root ユーザーで
touch /myshare/file1を実行して共有エリア内に新規で空のファイルを作成します。 このファイルがクライアントによってアクセスされることになるファイルになります。 - 全ユーザーへのアクセスが Linux パーミッションにより完全に与えられていても、 SELinux でアクセスをブロックすることができることを確認するため、
/myshareディレクトリに誰でもアクセスできる Linux のフルアクセス権限を与えます。chmod -R 777 /myshare
# chmod -R 777 /myshareCopy to Clipboard Copied! Toggle word wrap Toggle overflow 警告
これは説明を目的とした用例に過ぎません。 実稼働のシステムにはここで示すパーミッションを使用しないでください。 /etc/exportsファイルを編集して、 次の行をファイルの先頭に追加します。/myshare 192.168.1.100(rw)
/myshare 192.168.1.100(rw)Copy to Clipboard Copied! Toggle word wrap Toggle overflow このエントリでは、サーバー上の共有フォルダ/myshareへのフルパス、nfs-srvが共有するホストやネットワークの範囲 (この例の場合は単一ホストnfs-clientの IP アドレス192.168.1.100)、共有パーミッションを示しています。ここでは(rw)でわかるように、読み取りと書き込みのパーミッションが与えられています。- NFS に使用する TCP と UDP のポートが rpcbind により動的に割り当てられますが、ファイアウォールルールを作成する際、これが問題となる場合があります。この例では、 NFS トラフィックがファイアウォールを通過できるようにするプロセスを簡略化するため、/etc/sysconfig/nfs ファイルを編集して、
MOUNTD_PORT、STATD_PORT、LOCKD_TCPPORT、LOCKD_UDPPORTの変数をすべてアンコメントします。ここではファイル内のポート番号の変更は必要ありません。着信接続がサーバーのファイアウォールを必ず通過できるようにしておきます。system-config-firewall ツールを使って行ないます。- NFS 用 TCP および UDP ポートの 2049
- TCP および UDP ポートの 111 (rpcbind/sunrpc)
MOUNTD_PORT="port"オプションで指定された TCP および UDP ポートSTATD_PORT="port"オプションで指定された TCP および UDP ポートLOCKD_TCPPORT="port"オプションで指定された TCP ポートLOCKD_UDPPORT="port"オプションで指定された UDP ポート
- root ユーザーで
service nfs startを実行して、 NFS および関連サービスを起動させます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で
exportfs -rvを実行し、 NFS サブシステムのエクスポートテーブルを必ず更新させます。exportfs -rv exporting 192.168.1.100:/myshare
# exportfs -rv exporting 192.168.1.100:/myshareCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
showmount -eを実行し、 エクスポートされたファイルシステムをすべて表示させます。showmount -e Export list for nfs-srv: /myshare 192.168.1.100
# showmount -e Export list for nfs-srv: /myshare 192.168.1.100Copy to Clipboard Copied! Toggle word wrap Toggle overflow
これで、 サーバー
nfs-srv は 192.168.1.100 での nfs-client との NFS 通信が許可されるよう設定され、 Linux ファイルシステムの全権限が有効にされました。 SELinux を無効にすると、 クライアントによるこの共有のマウントおよびフルアクセスが可能になります。 しかし、 nfs_export_all_rw Boolean を無効にしているため、 以下の出力で示すように、 クライアントは現在、 このファイルシステムをマウントすることができません。 このステップはクライアント側 (nfs-client) で行なってください。
mkdir /myshare mount.nfs 192.168.1.1:/myshare /myshare mount.nfs: access denied by server while mounting 192.168.1.1:/myshare/
[nfs-client]# mkdir /myshare
[nfs-client]# mount.nfs 192.168.1.1:/myshare /myshare
mount.nfs: access denied by server while mounting 192.168.1.1:/myshare/
前述のステップ 1 で無効にした SELinux Boolean を有効にすると、 クライアント側で共有ファイルシステムのマウントが行なえるようになります。 このステップは NFS サーバー
nfs-srv で行なってください。
setsebool -P nfs_export_all_rw on
[nfs-srv]# setsebool -P nfs_export_all_rw on
NFS デーモンを再起動します。
service nfs restart
[nfs-srv]# service nfs restart
ここでもう一度 NFS ファイルシステムをマウントしてみます。 このステップは NFS クライアント
nfs-client で行なってください。
クライアント側でファイルシステムが正しくマウントされました。 この例でわかるように、 SELinux で防御性を高めることにより、Linux パーミッションでは全ユーザーに完全アクセスが与えられるよう設定されていても、SELinux のパーミッションを強制することができます。
第7章 BIND (Berkeley Internet Name Domain) リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
BIND では
named デーモンを使って名前解決サービスを行ないます。 BIND のおかけで、 ユーザーは数値アドレスではなく名前でコンピューターリソースやサービスを検索することができます。
Red Hat Enterprise Linux では、 DNS サーバーは bind パッケージで提供されます。
rpm -q bind を実行して、 bind パッケージがインストールされているか確認します。 インストールされていない場合は、 root ユーザーで次のコマンドを実行してインストールしてください。
yum install bind
yum install bind
7.1. BIND と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
/var/named/slaves、/var/named/dynamic、 /var/named/data ディレクトリのデフォルトパーミッションでは、 ゾーン転送およびダイナミック DNS 更新によるゾーンファイルの更新が許可されます。 /var/named 内のファイルには named_zone_t タイプのラベルが付けられ、 マスターゾーンファイルに使用されます。
スレーブサーバーの場合、
/etc/named.conf でスレーブゾーンを /var/named/slaves に配置するよう設定します。 以下に、 スレーブ DNS サーバーの /etc/named.conf 内にあるドメインエントリの例を示します。 このスレーブ DNS サーバーは、 /var/named/slaves 内に testdomain.com 用のゾーンファイルを格納しています。
ゾーンファイルに
named_zone_t のラベルが付けられている場合は、 named_write_master_zones Boolean を有効にして、 ゾーンファイル更新のためゾーン転送とダイナミック DNS を許可する必要があります。 また、 親ディレクトリのモードを変更し、 named ユーザーまたはグループに読み取り、 書き込み、 実行のアクセスを許可しなければなりません。
/var/named/ 内のゾーンファイルで named_cache_t タイプのラベルが付いているファイルは、 ファイルシステムの再ラベル付けや restorecon -R /var/ の実行が行なわれると named_zone_t タイプにラベルが変更されます。
7.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
BIND で使用されるタイプを以下に示します。 タイプに応じて柔軟なアクセス設定ができます。
named_zone_t- マスターゾーンファイルに使用されます。 他のサービスでは、 このタイプのファイルを変更することはできません。このタイプのファイルを変更できるのは
namedのみになります。この場合、named_write_master_zonesBoolean をオンにする必要があります。 named_cache_t- このタイプのラベルが付いたファイルの場合、特にBoolean を設定しなくてもデフォルトで
namedによる書き込みが可能です。/var/named/slaves、/var/named/dynamic、/var/named/dataディレクトリ内にコピーまたは作成されるファイルにはnamed_cache_tタイプのラベルが自動的に付けられます。 named_var_run_t/var/run/bind/、/var/run/named/、/var/run/unbound/ディレクトリ内にコピーまたは作成されるファイルには、named_var_run_tタイプのラベルが自動的に付けられます。named_conf_t- BIND 関連の設定ファイル (一般的には
/etc/ディレクトリに格納される) には、named_conf_tタイプのラベルが自動的に付けられます。 named_exec_t- BIND 関連の実行可能ファイル (一般的には
/usr/sbin/ディレクトリに格納される) には、named_exec_tタイプのラベルが自動的に付けられます。 named_log_t- BIND 関連のログファイル (一般的には
/var/log/ディレクトリに格納される) には、named_log_tタイプのラベルが自動的に付けられます。 named_initrc_exec_t/etc/rc.d/init.d/ディレクトリ内にある実行可能な BIND 関連のファイルには、named_initrc_exec_tタイプのラベルが自動的に付けられます。
7.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って BIND の動作方法を SELinux に指示します。
named_write_master_zones- この Boolean を無効にすると、
namedによるnamed_zone_tタイプのラベルが付いたゾーンファイルやディレクトリへの書き込みが阻止されます。 一般的には、namedはゾーンファイルへの書き込みを必要としません。 ただし、 第 2 サーバーなどがゾーンファイルへの書き込みを必要とする場合には、 この Boolean を有効にして書き込み動作を許可します。
7.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
7.4.1. ダイナミック DNS リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
BIND を使用すると、 ホストがゾーンファイルや DNS 内の記録を動的に更新することができるようになります。 ホストコンピューターの IP アドレスが頻繁に変更され、 DNS レコードでリアルタイムの修正が必要となる場合に BIND を使用します。
ダイナミック DNS で更新させるゾーンファイル用に
/var/named/dynamic ディレクトリを使用します。 /var/named/dynamic に作成またはコピーされるファイルは、 named による書き込みを許可する Linux パーミッションを継承します。また、こうしたファイルには named_cache_t タイプのラベルが付けられるため、named による書き込み許可が SELinux により与えられます。
/var/named/dynamic 内のゾーンファイルに named_zone_t タイプのラベルが付けられている場合、 DNS 更新がマージされる前にまずジャーナルに書き込まれるため、一定の期間 DNS の更新に失敗することがあります。このタイプのラベルが付けられているゾーンファイルでジャーナルに書き込みが行なわれ、そのジャーナルのマージが試行されていると、次のようなエラーがログ記録されます。
named[PID]: dumping master file: rename: /var/named/dynamic/zone-name: permission denied
named[PID]: dumping master file: rename: /var/named/dynamic/zone-name: permission denied
また、 次のような SELinux 拒否もログ記録されます。
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
setroubleshoot: SELinux is preventing named (named_t) "unlink" to zone-name (named_zone_t)
このラベル付けに関する問題を解決するには、 Linux root ユーザーで
restorecon -R -v /var/named/dynamic コマンドを実行します。
第8章 CVS (Concurrent Versioning System) リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
CVS (Concurrent Versioning System) は、フリーのリビジョンコントロールシステムです。 中央に置かれた複数ファイルのセットに対する変更の監視および追跡に使用します。 一般的に複数のユーザーによってアクセスされます。 ソースコードリポジトリの管理などによく使用され、 オープンソースのプログラマー間では幅広く使用されています。
Red Hat Enterprise Linux では、 CVS は cvs パッケージにより提供されます。
rpm -q cvs を実行して cvs パッケージがインストールされているか確認します。CVS を使用する予定にも関わらず、このパッケージがインストールされていない場合は、root ユーザーで次のコマンドを実行してパッケージのインストールを行ないます。
yum install cvs
yum install cvs
8.1. CVS と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
cvs は cvs_t として実行します。 Red Hat Enterprise Linux では、 CVS による読み取りと書き込みが許可されるのは特定のディレクトリに限られます。 cvs デーモンによる読み取りと書き込みのアクセスが与えられる領域は cvs_data_t ラベルで定義されます。 SELinux で CVS を使用する場合、 CVS データ用に予約されている領域へのフルアクセスがクライアントに与えられるため、 適切なラベル割り当てが重要になります。
8.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
CVS で使用されるタイプを以下に示します。 タイプに応じて柔軟なアクセス設定ができます。
cvs_data_t- このタイプは CVS リポジトリ内のデータに対して使用されます。 CVS がフルアクセスできるのはこのタイプのデータのみです。
cvs_exec_t- このタイプは
/usr/bin/cvsバイナリに対して使用されます。
8.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って CVS の動作方法を SELinux に指示します。
allow_cvs_read_shadow- この Boolean を使って
cvsデーモンによるユーザー認証用/etc/shadowファイルへのアクセスを許可します。
8.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
8.4.1. CVS のセットアップ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
リモートアクセスを許可する SELinux 設定と簡単な CVS セットアップの例を以下に示します。 2 台のホストを使用しています。 ホスト名が
cvs-srv で IP アドレスが 192.168.1.1 の CVS サーバーと、 ホスト名が cvs-client で IP アドレスが 192.168.1.100 のクライアントです。 いずれのホストも同じサブネット上にあります (192.168.1.0/24)。 これは一例に過ぎません。 また、 cvs と xinetd パッケージがインストールされていること、 SELinux targeted ポリシーを使用していること、 SELinux は enforced モードで実行していることを前提としています。
DAC の全パーミッションが許可されている場合であっても、 SELinux ではファイルラベルに応じたポリシールールを施行し、 CVS アクセス用のラベルが明確に付けられている特定領域にしかアクセスを許可しないようにすることができます。
注記
ステップ 1 から 9 は CVS サーバー
cvs-srv で行なってください。
- cvs と xinetd のパッケージが必要になります。
rpm -q cvsを実行して、 cvs パッケージがインストールされているか確認してください。 インストールされていない場合は、 root ユーザーで次のコマンドを実行し、 cvs をインストールします。yum install cvs
# yum install cvsCopy to Clipboard Copied! Toggle word wrap Toggle overflow rpm -q xinetdを実行して、 xinetd パッケージがインストールされているか確認してください。インストールされていない場合は、 root ユーザーで次のコマンドを実行し xinetd をインストールします。yum install xinetd
# yum install xinetdCopy to Clipboard Copied! Toggle word wrap Toggle overflow CVSと言う名前のグループを作成します。 root ユーザーでgroupadd CVSコマンドを実行するか、 system-config-users ツールを使って行ないます。cvsuserと言うユーザー名のユーザーを作成し、 このユーザーを CVS グループのメンバーにします。 system-config-users ツールを使って行ないます。/etc/servicesファイルを編集し、 以下のように CVS サーバーのエントリをアンコメントします。cvspserver 2401/tcp # CVS client/server operations cvspserver 2401/udp # CVS client/server operations
cvspserver 2401/tcp # CVS client/server operations cvspserver 2401/udp # CVS client/server operationsCopy to Clipboard Copied! Toggle word wrap Toggle overflow - CVS リポジトリをファイルシステムの root 領域に作成します。 SELinux を使用する場合、 リポジトリは root ファイルシステムに配置するのが最適です。 他のサブディレクトリに影響を与えることなく、 再帰的なラベルを与えることができます。 たとえば、 root ユーザーでリポジトリを格納する
/cvsディレクトリを作成します。mkdir /cvs
[root@cvs-srv]# mkdir /cvsCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 誰でもアクセスできるよう
/cvsディレクトリに全パーミッションを与えます。chmod -R 777 /cvs
[root@cvs-srv]# chmod -R 777 /cvsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 警告
これは説明を目的とした用例に過ぎません。 実稼働のシステムにはここで示すパーミッションを使用しないでください。 /etc/xinetd.d/cvsファイルを編集し、 CVS セクションをアンコメントして/cvsディレクトリを使用するよう設定します。 以下のようになるはずです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
service xinetd startを実行し、xinetdデーモンを起動します。 - system-config-firewall ツールを使って、 ポート 2401 上で TCP を使用した着信接続を許可するルールを追加します。
cvsuserユーザーになり、 次のコマンドを実行します。cvs -d /cvs init
[cvsuser@cvs-client]$ cvs -d /cvs initCopy to Clipboard Copied! Toggle word wrap Toggle overflow - これで CVS は設定されましたが、 SELinux ではログインおよびファイルのアクセスが拒否されます。これを確認するため、
cvs-clientに $CVSROOT 変数をセットして、リモートによるログインを試行してみます。次のステップはcvs-clientで行なってください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux によりアクセスがブロックされました。 SELinux でこのアクセスを許可させるため、 次のステップをcvs-srvで行なってください。 - 既存のデータおよび新規のデータすべてに再帰的にラベル付けが行なわれるよう、 root ユーザーで
/cvsディレクトリのコンテキストを変更しcvs_data_tタイプを与えます。semanage fcontext -a -t cvs_data_t '/cvs(/.*)?' restorecon -R -v /cvs
[root@cvs-srv]# semanage fcontext -a -t cvs_data_t '/cvs(/.*)?' [root@cvs-srv]# restorecon -R -v /cvsCopy to Clipboard Copied! Toggle word wrap Toggle overflow - これで、 クライアント
cvs-clientはログインして、 このリポジトリ内のすべての CVS リソースにアクセスできるようになったはずです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第9章 Squid キャッシングプロキシ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Squid Caching Proxy プロジェクトページより抜粋:
原文: "Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. Squid has extensive access controls and makes a great server accelerator." (訳文: Squid とは HTTP、 HTTPS、 FTP などに対応する Web 用キャッシングプロキシです。 頻繁に要求される Web ページをキャッシングして再利用することで帯域幅の使用を抑えます。 Squid は豊富なアクセス制御機能が備わっている強力なサーバーアクセラレーターになります。)
Red Hat Enterprise Linux では、 Squid キャッシングプロキシは squid パッケージにより提供されます。
rpm -q squid を実行して squid パッケージがインストールされているか確認します。squid を使用する予定にも関わらず、このパッケージがインストールされていない場合は、root ユーザーで次のコマンドを実行してパッケージのインストールを行ないます。
yum install squid
# yum install squid
9.1. Squid キャッシングプロキシと SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux を有効にすると、 squid はデフォルトで制限のあるサービスとして実行されます。 制限のあるプロセスはそれ自体のドメイン内で実行され、 他の制限のあるプロセスとは分離されます。 制限のあるプロセスが攻撃を受けると、 SELinux ポリシー設定に応じて、 攻撃側がリソースにアクセスして加えることができる被害は限定されます。 以下に、 squid 自体のドメイン内で実行している squid プロセスの例を示します。 ここでは squid パッケージがインストールされていることを前提としています。
getenforceを実行して、 SELinux が enforcing モードで実行しているか確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。- root ユーザーで
service squid startを実行し、squidを起動します。service squid start Starting squid: [ OK ]
# service squid start Starting squid: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep squidを実行し、squidプロセスを表示させます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow squidプロセスに関連する SELinux コンテキストはunconfined_u:system_r:squid_t:s0です。 コンテキストの最後から 2 番目の部分、squid_tがタイプになります。 プロセスのドメインやファイルのタイプを定義するのがタイプです。 この例の場合、squidプロセスはsquid_tドメイン内で実行しています。
squid_t などの制限ドメイン内で実行しているプロセスがファイルや他のプロセス、 システムなどとどのように交信するのかをSELinux ポリシーで定義します。squid によるアクセスを許可するには、 ファイルに適切なラベルを付けを行なう必要があります。
/etc/squid/squid.conf を設定して、squid にデフォルトの TCP ポート 3128、3401、4827 以外のポートでリッスンさせる場合は、semanage port コマンドを使って SELinux ポリシー設定にそのポート番号を追加する必要があります。以下では、SELinux ポリシー設定では最初 squid 用には定義されていなかったポートでリッスンするよう squid を設定したため、squid の起動に失敗する例を示します。また、SELinux システムを設定し、ポリシーではまだ定義されていなかった非標準のポートで squid によるリッスンを許可する方法についても示します。ここでは、squid パッケージがインストールされていることを前提としています。各コマンドは root ユーザーで実行してください。
service squid statusを実行し、squidが実行中ではないことを確認します。service squid status squid is stopped
# service squid status squid is stoppedCopy to Clipboard Copied! Toggle word wrap Toggle overflow 出力が上記と異なる場合は、service squid stopを実行してプロセスを停止します。service squid stop Stopping squid: [ OK ]
# service squid stop Stopping squid: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanage port -l | grep -w squid_port_tを実行して、 SELinux でsquidにリッスンを許可しているポートを表示させます。semanage port -l | grep -w -i squid_port_t squid_port_t tcp 3401, 4827 squid_port_t udp 3401, 4827
semanage port -l | grep -w -i squid_port_t squid_port_t tcp 3401, 4827 squid_port_t udp 3401, 4827Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
/etc/squid/squid.confを編集します。SELinux ポリシー設定ではsquid用に設定していないポートをリッスンするようhttp_portオプションを設定します。この例では、ポート 10000 でリッスンするようsquidを設定しています。# Squid normally listens to port 3128 http_port 10000
# Squid normally listens to port 3128 http_port 10000Copy to Clipboard Copied! Toggle word wrap Toggle overflow setseboolコマンドを実行し、squid_connect_anyBoolean をオフに設定します。 これで、 squid の動作は特定ポート上に限られることになります。setsebool -P squid_connect_any 0
setsebool -P squid_connect_any 0Copy to Clipboard Copied! Toggle word wrap Toggle overflow service squid startを実行し、squidを起動します。service squid start Starting squid: .................... [FAILED]
# service squid start Starting squid: .................... [FAILED]Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のような SELinux 拒否がログ記録されます。localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982
localhost setroubleshoot: SELinux is preventing the squid (squid_t) from binding to port 10000. For complete SELinux messages. run sealert -l 97136444-4497-4fff-a7a7-c4d8442db982Copy to Clipboard Copied! Toggle word wrap Toggle overflow squidによるポート 10000 のリッスンを SELinux で許可するには、例で使用しているものと同じ次のコマンドが必要になります。semanage port -a -t squid_port_t -p tcp 10000
# semanage port -a -t squid_port_t -p tcp 10000Copy to Clipboard Copied! Toggle word wrap Toggle overflow - もう一度
service squid startを実行して、squidを起動させ新しいポートをリッスンするようにします。service squid start Starting squid: [ OK ]
# service squid start Starting squid: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで、
squidによる非標準のポート (この例では TCP 10000) でのリッスンを許可する SELinux 設定が完了しました。squidはこのポートで正常に起動するようになります。
9.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。 アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、 そのアクセスが許可されます。
squid で使用されるタイプを以下に示します。 タイプに応じて柔軟なアクセス設定ができます。
httpd_squid_script_exec_t- このタイプは、
cachemgr.cgiなどのユーティリティに使用されます。 squid とその設定に関するさまざまな統計値を提供します。 squid_cache_t- このタイプは、
/etc/squid/squid.conf内のcache_dirディレクティブで定義されているように、 squid によってキャッシュされるデータに使用されます。 デフォルトでは、/var/cache/squidと/var/spool/squidにコピーまたは作成されるファイルにはsquid_cache_tタイプのラベルが付けられます。 また、/var/squidGuardにコピーまたは作成される squidGuard URL リダイレクト用のファイルやsquid用のプラグインにもsquid_cache_tタイプのラベルが付けられます。 squid のキャッシュデータ用として使用できるのは、このラベルが付いたファイルやディレクトリのみなります。 squid_conf_tsquidの設定用に使用されるディレクトリおよびファイルに対して使用されます。エラーメッセージやアイコンなどを含め、/etc/squidと/usr/share/squid内に既存するファイルや、 ここに作成またはコピーされるファイルにはこのタイプのラベルが付けられます。squid_exec_t- このタイプは squid バイナリの
/usr/sbin/squidに使用されます。 squid_log_t- このタイプはログに使用されます。
/var/log/squidまたは/var/log/squidGuard内に既存するファイル、 ここに作成またはコピーされるファイルにはこのタイプのラベルを付けなければなりません。 squid_initrc_exec_t- このタイプは、
squidの起動に必要となる初期設定ファイルに使用します。初期設定ファイルは/etc/rc.d/init.d/squidにあります。 squid_var_run_t- このタイプは
/var/run内のファイルに使用されます。 特に、 squid の実行時に作成される/var/run/squid.pidという名前のプロセス ID (PID) にはこのタイプが付けられます。
9.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って Squid の動作方法を SELinux に指示します。
squid_connect_any- この Boolean を有効にすると、 ポートを問わず squid によるリモートホストへの接続開始を許可します。
9.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
9.4.1. Squid を非標準のポートに接続させる リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
前述の Boolean を施行し、特定のポートに限ったアクセスをデフォルトで許可することで SELinux が Squid を補完している実践的な例を以下に示します。また、Boolean を変更する方法、およびその変更により許可されるアクセスについても示します。
以下に示す例は、 シンプルな Squid 設定に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。 Squid に関する総合的な説明は本ガイドの範疇を越えてしまいますので、 詳細については、 公式の Squid ドキュメント を参照してください。 ここでは、 Squid ホストにはインターネットアクセスがあり、2 種類のネットワークインターフェースが備わっていることを前提としています。 また、ファイアウォールでは、Squid がリッスンするデフォルトの TCP ポート (TCP 3128) を使った内部インターフェース上のアクセスを許可するよう設定されていることを前提としています。
- root ユーザーになり squid パッケージをインストールします。
rpm -q squidを実行して squid パッケージがインストールされているか確認します。 インストールされていない場合は、 root ユーザーでyum install squidを実行しインストールを行ないます。 - メインの設定ファイル
/etc/squid/squid.confを編集し、cache_dirディレクティブが以下のようにアンコメントされているか確認します。cache_dir ufs /var/spool/squid 100 16 256
cache_dir ufs /var/spool/squid 100 16 256Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記では、 この設定例で使用するcache_dirディレクティブのデフォルト設定を定義しています。 Squid ストレージフォーマット (ufs)、 キャッシュを配置するシステム上のディレクトリ (/var/spool/squid)、 キャッシュに使用するメガバイト単位のディスク領域 (100)、 第一レベルのキャッシュディレクトリ数と第二レベルのキャッシュディレクトリ数 (16 と 256) の設定情報で構成されています。 - 同じ設定ファイル内の
http_access allow localnetディレクティブもアンコメントされているか確認してください。 Red Hat Enterprise Linux では、 Squid のデフォルトインストールで自動的に設定されるlocalnetACL からのトラフィックを許可します。 既存する RFC1918 ネットワーク上のクライアントマシンにプロキシを通過できるアクセスを許可します (この設定例ではこれで充分です)。 - 同じ設定ファイル内の
visible_hostnameディレクティブもアンコメントされ、 マシンのホスト名が設定されているか確認してください。 値はホストの完全修飾ドメイン名にします。visible_hostname squid.example.com
visible_hostname squid.example.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
service squid startを実行し、squidを起動します。 はじめてsquidを起動すると、 前のステップでcache_dirディレクティブに指定したキャッシュディレクトリがこのコマンドにより初期化されてからsquidデーモンが起動されます。squidの起動に成功すると、 以下のような出力となります。/sbin/service squid start init_cache_dir /var/spool/squid... Starting squid: . [ OK ]
# /sbin/service squid start init_cache_dir /var/spool/squid... Starting squid: . [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow squidプロセス ID (PID) が制限のあるサービスとして起動されているか確認します。この例ではsquid_var_run_tの値で確認します。ls -lZ /var/run/squid.pid -rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pid
# ls -lZ /var/run/squid.pid -rw-r--r--. root squid unconfined_u:object_r:squid_var_run_t:s0 /var/run/squid.pidCopy to Clipboard Copied! Toggle word wrap Toggle overflow - この時点で、前に設定していた
localnetACL に接続しているクライアントマシンは、そのプロキシとしてこのホストの内部インターフェースを使用できるようになります。これはシステム全体または一般的な全 Web ブラウザのセッティングで設定することができます。これで Squid では目的のマシンのデフォルトポートでリッスンするようになりますが (TCP 3128)、目的のマシンで許可されるのは、一般的なポートを介したインターネット上の他のサービスへの発信接続のみになります。これが SELinux 自体で定義されているポリシーになります。SELinux では、次のステップで示すように非標準のポートへのアクセスは拒否されます。 - TCP ポート 10000 での web サイトのリスニングなど、 Squid プロキシを介し非標準のポートを使った要求がクライアントによって行なわれると、 次のような拒否がログ記録されます。
SELinux is preventing the squid daemon from connecting to network port 10000
SELinux is preventing the squid daemon from connecting to network port 10000Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このアクセスを許可する場合は、 デフォルトでは無効になっている
squid_connect_anyBoolean を変更する必要があります。squid_connect_anyBoolean をオンにするには、 root ユーザーで次のコマンドを実行します。setsebool -P squid_connect_any on
# setsebool -P squid_connect_any onCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注記
再起動後、setseboolによる変更を維持したくない場合は-Pオプションを使用しないでください。 - クライアントの代わりとして、いずれのポートでも Squid による接続の開始が許可されるようになるため、 クライアントはインターネット上の非標準のポートにアクセスできるようになります。
第10章 MySQL リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
MySQL プロジェクトページより抜粋:
原文: "The MySQL® database has become the world's most popular open source database because of its consistent fast performance, high reliability and ease of use. It's used on every continent -- Yes, even Antarctica! -- by individual Web developers as well as many of the world's largest and fastest-growing organizations to save time and money powering their high-volume Web sites, business-critical systems and packaged software -- including industry leaders such as Yahoo!, Alcatel-Lucent, Google, Nokia, YouTube, and Zappos.com." (訳文: 安定した高速パフォーマンス、高い信頼性、 そしてその使いやすさで、 MySQL® データベースは世界でもっともポピュラーなオープンソースのデータベースとなりました。すべての大陸で (南極大陸をも含め!)、web 開発者そして急速な成長を遂げている世界でも有数の企業の多くにより (Yahoo、Alcatel-Lucent、Google、Nokia、YouTube、Zappos.com など) 、時間的、金銭的な効率性を高めながら大量の web サイト、ビジネスに不可欠なシステム、パッケージ化されたソフトウェアなどを供給するために利用されています。)
Red Hat Enterprise Linux では、 MySQL は mysql-server パッケージで提供されます。
rpm -q mysql-server を実行して、 mysql-server パッケージがインストールされているか確認してください。 インストールされていない場合は、 root ユーザーで次のコマンドを実行してインストールを行ないます。
yum install mysql-server
yum install mysql-server
10.1. MySQL と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
MySQL を有効にすると、 デフォルトで制限のあるサービスとして実行されます。 制限のあるプロセスはそれ自体のドメイン内で実行され、 他の制限のあるプロセスとは分離されます。 制限のあるプロセスが攻撃を受けると、 SELinux ポリシー設定に応じて、 攻撃側がリソースにアクセスして加えることができる被害は限定されます。 以下に、 MySQL 自体のドメイン内で実行している MySQL プロセスの例を示します。 ここでは mysql パッケージがインストールされていることを前提としています。
getenforceを実行して、 SELinux が enforcing モードで実行していることを確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。- root ユーザーで
service mysqld startを実行し、mysqldを起動します。service mysqld start Initializing MySQL database: Installing MySQL system tables... [ OK ] Starting MySQL: [ OK ]
# service mysqld start Initializing MySQL database: Installing MySQL system tables... [ OK ] Starting MySQL: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep mysqldを実行し、mysqldプロセスを表示させます。ps -eZ | grep mysqld unconfined_u:system_r:mysqld_safe_t:s0 6035 pts/1 00:00:00 mysqld_safe unconfined_u:system_r:mysqld_t:s0 6123 pts/1 00:00:00 mysqld
$ ps -eZ | grep mysqld unconfined_u:system_r:mysqld_safe_t:s0 6035 pts/1 00:00:00 mysqld_safe unconfined_u:system_r:mysqld_t:s0 6123 pts/1 00:00:00 mysqldCopy to Clipboard Copied! Toggle word wrap Toggle overflow mysqldプロセスに関連する SELinux コンテキストはunconfined_u:system_r:mysqld_t:s0です。 コンテキストの最後から 2 番目の部分、mysqld_tがタイプになります。 プロセスのドメインやファイルのタイプを定義するのがタイプです。 この例の場合、mysqldプロセスはmysqld_tドメイン内で実行しています。
10.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。 アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、 そのアクセスが許可されます。
mysqld で使用されるタイプを以下に示します。 タイプに応じて柔軟なアクセス設定ができます。
mysqld_db_t- このタイプは MySQL データベースの場所に使用します。 Red Hat Enterprise Linux では、 データベースのデフォルトの場所は
/var/lib/mysqlになりますが、 この場所は変更することができます。 MySQL データベース用の場所を変更する場合は、 新しい場所にこのタイプのラベルを付ける必要があります。 デフォルトのデータベースの場所を変更する方法、 新しいセクションに適切にラベル付けを行なう方法について以下の例で説明していきます。 mysqld_etc_t- このタイプは、 MySQL のメイン設定ファイル
/etc/my.cnfおよび/etc/mysqlディレクトリにある他の設定ファイルすべてに使用されます。 mysqld_exec_t- このタイプは
/usr/libexec/mysqldにあるmysqldバイナリに使用されます。 Red Hat Enterprise Linux では MySQL バイナリのデフォルトの場所になります。 他のシステムでは、 このバイナリは/usr/sbin/mysqldに配置されることがあります。 この場合にもこのタイプのラベルを付けるようにしてください。 mysqld_initrc_exec_t- このタイプは、 Red Hat Enterprise Linux ではデフォルトで
/etc/rc.d/init.d/mysqldに配置されている MySQL の初期設定ファイルに使用されます。 mysqld_log_t- 正常に動作させるため、 MySQL のログにはこのタイプのラベルを付ける必要があります。
/var/log/内にあるログファイルで、mysql.*のワイルドカードに一致するログファイルはすべて、このタイプのラベルを付ける必要があります。 mysqld_var_run_t- このタイプは
/var/run/mysqld内のファイルで使用されます。特に、mysqldデーモンの実行時に作成される/var/run/mysqld/mysqld.pidと言う名前のプロセス ID (PID) に使用されます。また、/var/lib/mysql/mysql.sockなどの関連ソケットファイルにも使用されます。このようなファイルには、 制限のあるサービスとして正常に動作させるため適切なラベル付けが必要になります。
10.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って MySQL の動作方法を SELinux に指示します。
allow_user_mysql_connect- この Boolean を有効にすると、 ユーザーによる MySQL への接続が可能になります。
exim_can_connect_db- この Boolean を有効にすると、
eximメーラーによるデータベースサーバーへの接続開始を許可します。 ftpd_connect_db- この Boolean を有効にすると、
ftpデーモンによるデータベースサーバーへの接続開始を許可します。 httpd_can_network_connect_db- この Boolean を有効にすると、 データベースサーバーとの通信に web サーバーが必要になります。
10.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
10.4.1. MySQL のデータベース格納場所を変更する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux 6 を使用する場合、MySQL のデフォルトのデータベース格納場所は
/var/lib/mysql になります。この場所は SELinux でデータベースが配置される場所として期待される場所となるため、この領域にはすでに mysqld_db_t タイプを使った適切なラベル付けが行なわれています。
データベースを格納する場所は、それぞれの環境要件や設定に応じて変更することもできますが、SELinux に変更後の新しい場所を認識させる、つまりラベル付けを行なうことが重要となります。MySQL データベースの格納場所を変更する方法、また SELinux によるコンテンツに応じた保護メカニズムを新しい格納場所にも適用できるようラベル付けを行なう方法を以下の例で説明していきます。
以下に示す例は、MySQL に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。MySQL に関する総合的な説明は本ガイドの範疇を越えてしまいますので、詳細については、公式の MySQL ドキュメント を参照してください。ここでは、mysql-server パッケージと setroubleshoot-server パッケージがインストールされていること、
auditd サービスが実行されていること、有効なデータベースがデフォルトの場所である /var/lib/mysql にあることを前提としています。
ls -lZ /var/lib/mysqlを実行し、mysqlデフォルトデータベース格納場所の SELinux コンテキストを表示させます。ls -lZ /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysql
# ls -lZ /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow データベースファイルの格納場所にデフォルトで付けられるコンテキストエレメントのmysqld_db_tが表示されています。本例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。mysqlshow -u root -pを入力し、使用できるデータベースを表示させるためmysqldの root パスワードを入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
service mysqld stopを実行し、mysqldデーモンをシャットダウンさせます。service mysqld stop Stopping MySQL: [ OK ]
# service mysqld stop Stopping MySQL: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データベース格納場所となるディレクトリを新規作成します。この例では
/mysqlを使用しています。mkdir -p /mysql
# mkdir -p /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 古い場所にあるデータベースファイルを新しい場所にコピーします。
cp -R /var/lib/mysql/* /mysql/
# cp -R /var/lib/mysql/* /mysql/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - mysql ユーザーおよび mysql グループによるアクセスを許可するため所有権を変更します。この変更は従来の Unix パーミッションに対する変更であり、SELinux による制限はそのまま変更されていません。
chown -R mysql:mysql /mysql
# chown -R mysql:mysql /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZ /optを実行し、新規ディレクトリの初期コンテキストを表示してみます。ls -lZ /opt drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysql
# ls -lZ /opt drwxr-xr-x. mysql mysql unconfined_u:object_r:usr_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow コンテキストusr_tは、現在、MySQL データベースファイルの格納場所として適したタイプではありません。コンテキストを変更すると、MySQL がこの場所で正しく動作できるようになります。- MySQL のメインとなる設定ファイル
/etc/my.cnfをテキストエディターで開き、新しい格納場所を参照するようdatadirオプションを編集します。この例の場合なら、新しい格納場所として入力するのは/mysqlになります。[mysqld] datadir=/mysql
[mysqld] datadir=/mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow このファイルを保存してから終了します。 - root ユーザーで
service mysqld startを実行し、mysqldを起動します。サービスの起動は失敗し、/var/log/messagesファイルに拒否のログが記録されます。ただし、auditデーモンおよびsetroubleshootサービスが実行されている場合は、/var/log/audit/audit.logファイルの方に拒否のログが記録されます。SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71
SELinux is preventing /usr/libexec/mysqld "write" access on /mysql. For complete SELinux messages. run sealert -l b3f01aff-7fa6-4ebe-ad46-abaef6f8ad71Copy to Clipboard Copied! Toggle word wrap Toggle overflow 拒否の理由は、/mysqlが MySQL データファイル用として適切なラベルが付けられていないためです。SELinux で、MySQL によるusr_tタイプのラベルが付いたコンテンツへのアクセスが阻止されています。この問題を解決するため次の手順を行なってください。 - 次の
semanageコマンドを実行し、/mysqlのコンテキストマッピングを追加します。semanageはデフォルトではインストールされていないため注意してください。インストールされていない場合は、policycoreutils-python パッケージをインストールします。semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"
semanage fcontext -a -t mysqld_db_t "/mysql(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.localファイルに書き込まれます。grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local /mysql(/.*)? system_u:object_r:mysqld_db_t:s0
# grep -i mysql /etc/selinux/targeted/contexts/files/file_contexts.local /mysql(/.*)? system_u:object_r:mysqld_db_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow restoreconコマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /mysql
restorecon -R -v /mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - これで
/mysqlのデータ格納場所に MySQL 用の正しいコンテキストがラベル付けされました。mysqldデーモンを起動します。service mysqld start Starting MySQL: [ OK ]
# service mysqld start Starting MySQL: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - コンテキストが確かに
/mysql用に正しく変更されているか確認します。ls -lZ /opt drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
ls -lZ /opt drwxr-xr-x. mysql mysql system_u:object_r:mysqld_db_t:s0 mysqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - データ格納場所の変更そしてラベル付けが正しく行なわれたため、
mysqldデーモンが正常に起動するようになりました。ここまでの設定が完了したら、実行中の全サービスが正常に動作しているか確認テストを行なってください。
第11章 PostgreSQL リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
PostgreSQL プロジェクトページより抜粋:
原文: "PostgreSQL is a powerful, open source object-relational database system. It has more than 15 years of active development and a proven architecture that has earned it a strong reputation for reliability, data integrity, and correctness." (訳文: PostgreSQL はオープンソースでありパワフルなオブジェクト関係データベースシステムになります。15年以上に渡り活発な開発が行なわれ、信頼性、データ整合性、正確性に強化な評判を得ている実績のあるアーキテクチャを提供しています。)
Red Hat Enterprise Linux 6 では、PostgreSQL は postgresql-server パッケージで提供されます。
rpm -q postgresql-serverを実行して、postgresql-server パッケージがインストールされているか確認してください。インストールされていない場合は、root ユーザーで次のコマンドを実行してインストールを行ないます。
yum install postgresql-server
yum install postgresql-server
11.1. PostgreSQL と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
PostgreSQL を有効にすると、デフォルトで制限のあるサービスとして実行されます。制限のあるプロセスはそれ自体のドメイン内で実行され、他の制限のあるプロセスとは分離されます。制限のあるプロセスが攻撃を受けると、SELinux ポリシー設定に応じて、攻撃側がリソースにアクセスして加えることができる被害は限定されます。以下に、PostgreSQL 自体のドメイン内で実行している PostgreSQL プロセスの例を示します。 ここでは postgresql-server パッケージがインストールされていることを前提としています。
getenforceを実行して、SELinux が enforcing モードで実行しているか確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。- root ユーザーで
service postgresql startを実行し、postgresqlを起動します。service postgresql start Starting postgresql service: [ OK ]
service postgresql start Starting postgresql service: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep postgresを実行して、postgresqlプロセスを表示させます。Copy to Clipboard Copied! Toggle word wrap Toggle overflow postgresqlプロセスに関連する SELinux コンテキストはunconfined_u:system_r:postgresql_t:s0です。コンテキストの最後から 2 番目の部分、postgresql_tがタイプになります。プロセスのドメインやファイルのタイプを定義するのがタイプです。この例の場合、postgresqlプロセスはpostgresql_tドメイン内で実行しています。
11.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、そのアクセスが許可されます。
postgresql で使用されるタイプを以下に示します。タイプに応じて柔軟なアクセス設定ができます。
postgresql_db_t- このタイプは複数の場所で使用されます。このタイプでラベル付けされた場所は PostgreSQL のデータファイル用に使用されます。
/usr/lib/pgsql/test/regres/usr/share/jonas/pgsql/var/lib/pgsql/data/var/lib/postgres(ql)?
postgresql_etc_t- このタイプは
/etc/postgresql内の設定ファイルに使用されます。 postgresql_exec_t- このタイプは複数の場所で使用されます。このタイプでラベル付けされた場所は PostgreSQL のバイナリに使用されます。
/usr/bin/initdb(.sepgsql)?/usr/bin/(se)?postgres/usr/lib(64)?/postgresql/bin/.*/usr/lib/phsql/test/regress/pg_regress
postgresql_initrc_exec_t- このタイプは
/etc/rc.d/init.d/postgresqlにある PostgreSQL 初期設定ファイルに使用されます。 postgresql_log_t- このタイプは複数の場所で使用されます。このタイプでラベル付けされた場所はログファイルに使用されます。
/var/lib/pgsql/logfile/var/lib/pgsql/pgstartup.log/var/lib/sepgsql/pgstartup.log/var/log/postgresql/var/log/postgres.log.*/var/log/rhdb/rhdb/var/log/sepostgresql.log.*
postgresql_var_run_t- このタイプは、
/var/run/postgresql内のプロセス ID (PID) など PostgreSQL のランタイムファイルに使用されます。
11.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って PostgreSQL の動作方法を SELinux に指示します。
allow_user_postgresql_connect- この Boolean を有効にすると、いずれのユーザードメイン (PostgreSQL の定義) からのデータサーバーへの接続も許可します。
11.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
11.4.1. PostgreSQL のデータベース格納場所を変更する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux 6 を使用する場合、PostgreSQL のデフォルトのデータベース格納場所は
/var/lib/pgsql/data になります。この場所は SELinux でデータベースが配置される場所として期待される場所となるため、この領域にはすでに postgresql_db_t タイプを使った適切なラベル付けが行なわれています。
データベースを格納する場所は、それぞれの環境要件や設定に応じて変更することもできますが、SELinux に変更後の新しい場所を認識させる、つまりラベル付けを行なうことが重要となります。PostgreSQL データベースの格納場所を変更する方法、また SELinux によるコンテンツに応じた保護メカニズムを新しい格納場所にも適用できるようラベル付けを行なう方法を以下の例で説明していきます。
以下に示す例は、PostgreSQL に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。PostgreSQL に関する総合的な説明は本ガイドの範疇を越えてしまいますので、詳細については、公式の PostgreSQL ドキュメント を参照してください。ここでは、postgresql-server パッケージがインストールされていることを前提としています。
ls -lZ /var/lib/pgsqlを実行し、postgresqlデフォルトデータベース格納場所の SELinux コンテキストを表示させます。ls -lZ /var/lib/pgsql drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 data
# ls -lZ /var/lib/pgsql drwx------. postgres postgres system_u:object_r:postgresql_db_t:s0 dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow データベースファイルの格納場所にデフォルトで付けられるコンテキストエレメントのpostgresql_db_tが表示されています。本例で使用する新しいデータベース格納場所が期待通り正常に動作するよう、このコンテキストをその新しい場所に手作業で適用する必要があります。- データベース格納場所となるディレクトリを新規作成します。この例では
/opt/postgresql/dataを使用しています。別の場所を使用する場合は、次のコマンドを使用する際に置換してください。mkdir -p /opt/postgresql/data
# mkdir -p /opt/postgresql/dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 新規に作成したディレクトリを表示させまます。このディレクトリの初期コンテキストは usr_t になっている点に注意してください。このコンテキストでは、SELinux による PostgreSQL への保護メカニズムを実施するには不十分です。コンテキストを変更することにより、新規に作成したディレクトリをデータ格納場所として適切に動作させることができるようになります。
ls -lZ /opt/postgresql/ drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 data
# ls -lZ /opt/postgresql/ drwxr-xr-x. root root unconfined_u:object_r:usr_t:s0 dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow - postgres ユーザーおよび postgres グループによるアクセスを許可するため所有権を変更します。この変更は従来の Unix パーミッションに対する変更であり、SELinux による制限はそのまま変更されていません。
chown -R postgres:postgres /opt/postgresql
# chown -R postgres:postgres /opt/postgresqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - テキストエディターで PostgreSQL の初期設定ファイル
/etc/rc.d/init.d/postgresqlを開き、新しい場所をポイントするようPGDATAとPGLOGを変更します。vi /etc/rc.d/init.d/postgresql PGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.log
# vi /etc/rc.d/init.d/postgresql PGDATA=/opt/postgresql/data PGLOG=/opt/postgresql/data/pgstartup.logCopy to Clipboard Copied! Toggle word wrap Toggle overflow このファイルを保存してからテキストエディターを終了します。 - 新しい場所にあるデータベースを初期化します。
su - postgres -c "initdb -D /opt/postgresql/data"
su - postgres -c "initdb -D /opt/postgresql/data"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - データベースの場所を変更したことにより、サービスの起動に失敗します。
service postgresql start Starting postgresql service: [FAILED]
# service postgresql start Starting postgresql service: [FAILED]Copy to Clipboard Copied! Toggle word wrap Toggle overflow サービスが起動しない原因は SELinux にあります。新しい場所に適切なラベル付けが行なわれていないためです。以下の手順で、新しい場所 (/opt/postgresql) にラベルを付け、postgresql サービスを正常に起動させます。 semanageコマンドを実行し、/opt/postgresqlおよび配下にあるすべてのディレクトリとファイルに対するコンテキストマッピングを追加します。semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"
semanage fcontext -a -t postgresql_db_t "/opt/postgresql(/.*)?"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.localファイルに書き込まれます。grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local /opt/postgresql(/.*)? system_u:object_r:postgresql_db_t:s0
# grep -i postgresql /etc/selinux/targeted/contexts/files/file_contexts.local /opt/postgresql(/.*)? system_u:object_r:postgresql_db_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow restoreconコマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /opt/postgresql
restorecon -R -v /opt/postgresqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow - これで
/opt/postgresqlのデータ格納場所に PostgreSQL 用の正しいコンテキストがラベル付けされました。postgresqlサービスが正常に起動するようになります。service postgresql start Starting postgreSQL service: [ OK ]
# service postgresql start Starting postgreSQL service: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow - コンテキストが確かに
/opt/postgresql用に正しく変更されているか確認します。ls -lZ /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresql
ls -lZ /opt drwxr-xr-x. root root system_u:object_r:postgresql_db_t:s0 postgresqlCopy to Clipboard Copied! Toggle word wrap Toggle overflow psコマンドを使って、postgresqlプロセスで新しい場所が表示されるか確認します。ps aux | grep -i postmaster postgres 21564 0.3 0.3 42308 4032 ? S 10:13 0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/data
# ps aux | grep -i postmaster postgres 21564 0.3 0.3 42308 4032 ? S 10:13 0:00 /usr/bin/postmaster -p 5432 -D /opt/postgresql/dataCopy to Clipboard Copied! Toggle word wrap Toggle overflow - データ格納場所の変更そしてラベル付けが正しく行なわれたため、
postgresqlデーモンが正常に起動するようになりました。ここまでの設定が完了したら、実行中の全サービスが正常に動作しているか確認テストを行なってください。
第12章 rsync リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Rsync プロジェクトページより抜粋:
原文: "rsync is an open source utility that provides fast incremental file transfer." (訳文: rsync は、高速な増分ファイル転送を実現するオープンソースのユーティリティです。)
Red Hat Enterprise Linux を使用する場合、rsync は rsync パッケージで提供されます。
rpm -q rsync を実行して、rsync パッケージがインストールされているか確認してください。インストールされていない場合は、root ユーザーで次のコマンドを実行してインストールを行ないます。
yum install rsync
yum install rsync
12.1. rsync と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux 6 SELinux rsync_selinux(8) man ページより抜粋: "SELinux requires files to have an extended attribute to define the file type. Policy governs the access daemons have to these files. If you want to share files using the rsync daemon, you must label the files and directories public_content_t." (訳文: SELinux にはファイルタイプ定義の拡張属性を持たせるためのファイルが必要になります。ポリシーでは、こうしたファイルに対してデーモンに持たせるアクセス権を管理します。rsync デーモンを使ってファイルの共有をする場合は、ファイルやディレクトリにpublic_content_t タイプのラベルをつける必要があります。 )
ほとんどのサービスと同様、
rsync に対して SELinux による保護メカニズムを適用させるには、適切なラベル付けが必要になります。
12.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。 アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、 そのアクセスが許可されます。
rsync で使用されるタイプを以下に示します。 タイプに応じて柔軟なアクセス設定ができます。
public_content_trsyncで共有するファイルの場所に使用する汎用タイプになります。rsyncで共有するファイルの格納用に特殊なディレクトリを作成する場合は、そのディレクトリおよびコンテンツにはこのラベルを適用する必要があります。rsync_exec_t/usr/bin/rsyncシステムバイナリに使用されるタイプです。rsync_log_t- デフォルトで
/var/log/rsync.logにあるrsyncログファイルに使用されます。rsync によりログが記録されるファイルの場所を変更する場合は、ランタイム時にrsyncコマンドに対して--log-file=FILEオプションを使用します。 rsync_var_run_t/var/run/rsyncd.lockにあるrsyncdロックファイルに使用されるタイプです。このロックファイルはrsyncサーバーで接続関連の制限を管理する際に使用されます。rsync_data_t- ファイルやディレクトリを rsync ドメインとして使用し、他のサービスのアクセス範囲とは分離させたい場合、このタイプを使用します。また、
public_content_tは汎用の SELinux コンテキストになります。複数のサービスとやりとりを行なうファイルやディレクトリに使用します (rsync ドメインとしての FTP ディレクトリおよび NFS ディレクトリ)。 rsync_etc_t/etc/ディレクトリ内にある rsync 関連のファイルに使用されます。
12.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。次の Boolean を使って rsync の動作方法を SELinux に指示します。
allow_rsync_anon_write- この Boolean を有効にすると、rsync_t ドメイン内の
rsyncによる public_content_rw_t タイプのファイル、リンク、ディレクトリなどの管理を許可します。多くの場合、パブリック転送サービスに使用されるパブリックファイルになります。ファイルおよびディレクトリにはpublic_content_rw_tのラベルを付ける必要があります。 rsync_client- この Boolean を有効にすると、rsync_port_t で定義されるポートへの
rsyncによる接続開始を許可し、また rsync_data_t タイプのファイル、リンク、ディレクトリの管理も許可されます。rsyncを SELinux の管理下に置くため、rsyncデーモンは rsync_t ドメイン内になければならない点に注意してください。本章では、rsync_t ドメインで実行しているrsyncの設定例を示します。 rsync_export_all_ro- この Boolean を有効にすると、rsync_t ドメイン内の
rsyncによる NFS および CIFS のエクスポートを許可します。クライアントに付与するアクセス権は読み取り専用になります。
12.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
12.4.1. デーモンとして rsync を使用する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Red Hat Enterprise Linux を使用する場合、rsync をデーモンとして使用し、一元的にファイルを格納、継続的に同期しておくためのセントラルサーバーとして複数のクライアントが直接通信を行なえるようにすることができます。以下では、rsync を適切なドメイン内のネットワークソケット全体でデーモンとして実行させようした場合、事前定義された TCP ポート (SELinux ポリシー内) での実行を期待している SELinux がどのような反応を示すかについて見ていきます。次に、非標準のポートでの
rsync デーモンによる正常な実行を許可するため SELinux を編集する方法について説明していきます。
SELinux ポリシーとローカルのデーモンおよびプロセスに対する制御力を示すため、本例は単一のシステム上で行います。以下に示す例は、rsync に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。rsync に関する総合的な説明は本ガイドの範疇を越えてしまいますので、詳細については、公式の rsync ドキュメント を参照してください。ここでは、rsync パッケージ、setroubleshoot-server パッケージ、audit パッケージがインストールされていること、SELinux targeted ポリシーを使用していること、SELinux が enforcing モードで実行されていることを前提としています。
rsync を rsync_t として起動させる
getenforceを実行して、 SELinux が enforcing モードで実行していることを確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。whichコマンドを実行し、rsync バイナリがシステムパス内にあるか確認します。which rsync /usr/bin/rsync
$ which rsync /usr/bin/rsyncCopy to Clipboard Copied! Toggle word wrap Toggle overflow rsyncをデーモンとして実行する場合、/etc/rsyncd.confと言う名前を付けた設定ファイルを使用する必要があります。ここで使用している設定ファイルは非常に簡潔なファイルになっているため、利用できるすべてのオプションが表示されているわけではありません。rsyncデーモンの事例として必要なものを備えているだけです。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで、デーモンモードで動作させる rsync 用の簡単な設定ファイルができました。このステップでは、SELinux による保護メカニズムを rsync に適用させるには、
rsync --daemonを実行するだけでは不十分であることを確認します。次の出力を見てみてください。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 最後のpsコマンドからの出力に注目してください。コンテキストではrsyncデーモンはunconfined_tデーモン内で実行していることを示しています。つまり、rsync がrsync --daemonコマンドで起動されたため、rsync_tには遷移していないということです。この状態では、SELinux はこのデーモンに対してルールとポリシーを施行することができません。この問題を解決するため次のステップを見てみます。次のステップでは、rsyncを適切にラベル付けした init スクリプトから起動させるため、rsync_tに遷移するようになります。これではじめて SELinux とその保護メカニズムをrsyncに適用できるようになります。rsyncプロセスを終了してから、次のステップに進みます。 - rsync 用のカスタムの init スクリプトには次のステップが必要になります。次を
/etc/rc.d/init.d/rsyncdに保存します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下のようにして、このスクリプトにinitrc_exec_tタイプのラベルを付けます。 semanageコマンドを実行し、/etc/rc.d/init.d/rsyncdのコンテキストマッピングを追加します。semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"
semanage fcontext -a -t initrc_exec_t "/etc/rc.d/init.d/rsyncd"Copy to Clipboard Copied! Toggle word wrap Toggle overflow - このマッピングは
/etc/selinux/targeted/contexts/files/file_contexts.localファイルに書き込まれます。grep rsync /etc/selinux/targeted/contexts/files/file_contexts.local /etc/rc.d/init.d/rsyncd system_u:object_r:initrc_exec_t:s0
# grep rsync /etc/selinux/targeted/contexts/files/file_contexts.local /etc/rc.d/init.d/rsyncd system_u:object_r:initrc_exec_t:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow restoreconコマンドを使ってこのコンテキストマッピングを実行中のシステムに適用します。restorecon -R -v /etc/rc.d/init.d/rsyncd
restorecon -R -v /etc/rc.d/init.d/rsyncdCopy to Clipboard Copied! Toggle word wrap Toggle overflow ls -lZコマンドを実行して、確かにスクリプトに適切なタイプのラベルが付けられているかを確認します。以下の出力では、スクリプトにはinitrc_exec_tタイプのラベルが付けられています。ls -lZ /etc/rc.d/init.d/rsyncd -rwxr-xr-x. root root system_u:object_r:initrc_exec_t:s0 /etc/rc.d/init.d/rsyncd
ls -lZ /etc/rc.d/init.d/rsyncd -rwxr-xr-x. root root system_u:object_r:initrc_exec_t:s0 /etc/rc.d/init.d/rsyncdCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 新しいスクリプトで
rsyncdを起動します。rsync が適切にラベル付けした init スクリプトから起動されるようになりました。プロセスはrsync_tとして開始されるようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow これで、rsync がrsync_tドメイン内で実行するようになったため、SELinux ではその保護メカニズムをrsyncデーモンに適用できるようになります。
rsyncd を rsync_t ドメイン内で実行させる方法について説明してきました。次に、このデーモンをデフォルト以外のポートで適切に実行させる方法について見ていきます。ここでは TCP ポート 10000 を使用します。
デフォルト以外のポートで rsync デーモンを実行する
/etc/rsyncd.confファイルを変更して、port = 10000の行をグローバル設定エリア内にあるファイルの冒頭に追加します (file エリアが定義される直前)。新しい設定ファイルは次のようになります。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - この新しい設定の init スクリプトから rsync を起動すると、次のような拒否が SELinux によりログ記録されます。
Jul 22 10:46:59 localhost setroubleshoot: SELinux is preventing the rsync (rsync_t) from binding to port 10000. For complete SELinux messages. run sealert -l c371ab34-639e-45ae-9e42-18855b5c2de8
Jul 22 10:46:59 localhost setroubleshoot: SELinux is preventing the rsync (rsync_t) from binding to port 10000. For complete SELinux messages. run sealert -l c371ab34-639e-45ae-9e42-18855b5c2de8Copy to Clipboard Copied! Toggle word wrap Toggle overflow semanageコマンドを実行して、TCP ポート 10000 をrsync_port_tの SELinux ポリシーに追加します。semanage port -a -t rsync_port_t -p tcp 10000
# semanage port -a -t rsync_port_t -p tcp 10000Copy to Clipboard Copied! Toggle word wrap Toggle overflow - これで TCP ポート 10000 が
rsync_port_tの SELinux ポリシーに追加されました。rsyncdがこのポートで正常に起動し動作するようになります。service rsyncd start Starting rsyncd: [ OK ]
# service rsyncd start Starting rsyncd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow netstat -lnp | grep 10000 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 9910/rsync
# netstat -lnp | grep 10000 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN 9910/rsyncCopy to Clipboard Copied! Toggle word wrap Toggle overflow
SELinux のポリシーが修正されたため、
rsyncd による TCP ポート 10000 での動作が許可されるようになりました。
第13章 Postfix リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Postfix プロジェクトページより抜粋:
原文: "What is Postfix? It is Wietse Venema's mailer that started life at IBM research as an alternative to the widely-used Sendmail program. Postfix attempts to be fast, easy to administer, and secure. The outside has a definite Sendmail-ish flavor, but the inside is completely different." (訳文: Postfix とは? 幅広く利用されていた Sendmail プログラムの代替となるプログラムの調査が IBM によって行なわれたのが始まりとなる Wietse Venema のメーラーです。Postfix では高速で管理が容易でありながら安全なメーラーを目指しています。外観は Sendmail 色を色濃く残していますが、プログラム自体はまったく異なる仕様になっています。)
Red Hat Enterprise Linux では、 postfix は postfix パッケージで提供されます。
rpm -q postfix を実行して、 postfix パッケージがインストールされているか確認してください。 インストールされていない場合は、 root ユーザーで次のコマンドを実行してインストールを行ないます。
yum install postfix
yum install postfix
13.1. Postfix と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Postfix を有効にすると、デフォルトで制限のあるサービスとして実行されます。制限のあるプロセスはそれ自体のドメイン内で実行され、他の制限のあるプロセスとは分離されます。制限のあるプロセスが攻撃を受けると、SELinux ポリシー設定に応じて、攻撃側がリソースにアクセスして加えることができる被害は限定されます。以下に、Postfix 自体のドメイン内で実行している Postfix プロセスの例を示します。 ここでは postfix パッケージがインストールされていること、また Postfix サービスが起動されていることを前提としています。
getenforceを実行して SELinux が enforcing モードで実行しているか確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行している場合は、getenforceコマンドを実行するとEnforcingが返されます。- root ユーザーで
service postfix startを実行し、postfixを起動します。service postfix start Starting postfix: [ OK ]
service postfix start Starting postfix: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep postfixを実行し、postfixプロセスを表示させます。ps -eZ | grep postfix system_u:system_r:postfix_master_t:s0 1651 ? 00:00:00 master system_u:system_r:postfix_pickup_t:s0 1662 ? 00:00:00 pickup system_u:system_r:postfix_qmgr_t:s0 1663 ? 00:00:00 qmgr
ps -eZ | grep postfix system_u:system_r:postfix_master_t:s0 1651 ? 00:00:00 master system_u:system_r:postfix_pickup_t:s0 1662 ? 00:00:00 pickup system_u:system_r:postfix_qmgr_t:s0 1663 ? 00:00:00 qmgrCopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、Postfixmasterプロセスに関連する SELinux コンテキストはunconfined_u:system_r:postfix_master_t:s0です。 コンテキストの最後から 2 番目の部分、postfix_master_tがこのプロセスのタイプになります。 プロセスのドメインやファイルのタイプを定義するのがタイプです。 この例の場合、masterプロセスはpostfix_master_tドメイン内で実行しています。
13.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement が SELinux の targeted ポリシーで使用されるメインのパーミッション制御になります。全ファイルおよびプロセスにタイプのラベルが付けられます。ファイルの場合はタイプ、プロセスの場合はドメインを定義します。任意のタイプにアクセスするドメインなのか、 別のドメインにアクセスするドメインなのかなど、SELinux のポリシールールではタイプによって互いがアクセスしあう方法を定義します。アクセスを許可する特定の SELinux ポリシールールが存在する場合にのみ、そのアクセスが許可されます。
Postfix で使用されるタイプを以下に示します。 タイプに応じて柔軟なアクセス設定ができます。
postfix_etc_t/etc/postfix/ディレクトリ内にある Postfix 用の設定ファイルに使用されるタイプです。postfix_data_t/var/lib/postfix/ディレクトリ内にある Postfix データファイル用に使用されるタイプです。postfix_var_run_t/run/ディレクトリ内に格納される Postfix ファイルに使用されるタイプです。postfix_initrc_exec_t- Postfix 実行可能ファイルの
postfix_initrc_tドメインへの遷移に使用されるタイプです。 postfix_spool_t/var/spool/ディレクトリ内に格納される Postfix ファイルに使用されるタイプです。
注記
次のコマンドを実行すると、Postfix 用のタイプとファイルの全一覧を表示させることができます。
grep postfix /etc/selinux/targeted/contexts/files/file_contexts
$ grep postfix /etc/selinux/targeted/contexts/files/file_contexts
13.3. Boolean リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SELinux は実行するサービスに必要な最小限レベルのアクセスに基づいています。サービスの実行手段は複数あるため、サービスをどのように実行するのかを SELinux に指示する必要があります。 次の Boolean を使って Postfix の動作方法を SELinux に指示します。
allow_postfix_local_write_mail_spool- この Boolean を有効にすると、Postfix によるシステム上のローカルメールスプールへの書き込みを許可します。ローカルスプールを使用する際、Postfix を正常に動作させるためにはこの Boolean を有効にする必要があります。
13.4. 設定例 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
13.4.1. SpamAssassin と Postfix リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
SpamAssassin プロジェクトページより抜粋:
原文: "Open Source mail filter, written in Perl, to identify spam using a wide range of heuristic tests on mail headers and body text. Free software." (訳文: Perl で記述されたオープンソースのメールフィルターです。メールのヘッダーおよび本文で幅広い範囲の発見的テストを使用してスパムを識別するフリーソフトウェアです。)
Red Hat Enterprise Linux を使用する場合、SpamAssassin は spamassassin パッケージで提供されます。
rpm -q spamassassin を実行して、spamassassin パッケージがインストールされているか確認してください。インストールされていない場合は、root ユーザーで次のコマンドを実行してインストールを行ないます。
yum install spamassassin
yum install spamassassin
SpamAssassin は Postfix などのメーラーと連携してスパムフィルタリング機能を提供します。メールの効果的な遮断、分析、フィルタリングが行なわれるためには、SpamAssassin はネットワークインターフェース上でリッスンを行なう必要があります。SpamAssassin のデフォルトポートは TCP/783 ですが、変更することもできます。SELinux で特定のポートに限ったアクセスをデフォルトで許可することにより SpamAssassin を補完している実践的な例を以下に示します。次に、ポートを変更する方法およびデフォルト以外のポートで SpamAssassin を正常に動作させる方法について説明していきます。
以下に示す例は、 シンプルな SpamAssassin 設定に対してどのように SELinux が影響を与えることができるのかを示す一例に過ぎません。 SpamAssassin に関する総合的な説明は本ガイドの範疇を越えてしまいますので、 詳細については、 公式の SpamAssassin ドキュメント を参照してください。 ここでは、spamassassin がインストールされていること、使用しているポートでのアクセス許可がファイアウォールで設定されていること、SELinux が enforcing モードで実行されていることを前提としています。
デフォルト以外のポートで SpamAssassin を実行する
semanageコマンドを実行して、SELinux でspamdによるリッスンをデフォルトで許可しているポートを表示させます。semanage port -l | grep spamd spamd_port_t tcp 783
# semanage port -l | grep spamd spamd_port_t tcp 783Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の出力では、SpamAssassin が動作するポートとして TCP/783 がspamd_port_tで定義されていることを示しています。/etc/sysconfig/spamassassin設定ファイルを編集し、SpamAssassin が TCP/10000 で起動するよう変更します。# Options to spamd SPAMDOPTIONS="-d -p 10000 -c m5 -H"
# Options to spamd SPAMDOPTIONS="-d -p 10000 -c m5 -H"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の行は、SpamAssassin がポート 10000 で動作するよう指定しています。ここからは、このソケットを開くよう SELinux ポリシーを変更する方法を見ていきます。- SpamAssassin を起動すると、次のようなエラーメッセージが表示されます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の出力は、このポートへのアクセスが SELinux によってブロックされたことを表しています。 - SELinux により次のような拒否がログ記録されます。
SELinux is preventing the spamd (spamd_t) from binding to port 10000.
SELinux is preventing the spamd (spamd_t) from binding to port 10000.Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーで
semanageコマンドを実行し、SpamAssassin のサンプルポート (TCP/10000) での動作を許可するよう SELinux ポリシーを変更します。semanage port -a -t spamd_port_t -p tcp 10000
semanage port -a -t spamd_port_t -p tcp 10000Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SpamAssassin が起動し、TCP ポート 10000 で動作していることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - SELinux ポリシーで
spamdによる TCP ポート 10000 へのアクセスが許可されたため、SpamAssassin がこのポートで正常に動作するようになりました。
第14章 DHCP リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
クライアントに第 3 層 TCP/IP を動的に提供、詳細を設定するため Red Hat Enterprise Linux で使用されるデーモンが DHCPD になります。
DHCP サーバーの
dhcpd は、 dhcp パッケージで提供されます。rpm -q dhcp を実行して、 dhcp パッケージがインストールされているか確認します。 インストールされていない場合は、 root ユーザーで次のコマンドを実行してインストールしてください。
yum install dhcp
yum install dhcp
14.1. DHCP と SELinux リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
DHCP を有効にすると、デフォルトで制限のあるサービスとして実行されます。制限のあるプロセスはそれ自体のドメイン内で実行され、他の制限のあるプロセスとは分離されます。制限のあるプロセスが攻撃を受けると、SELinux ポリシー設定に応じて、攻撃側がリソースにアクセスして加えることができる被害は限定されます。以下に、DHCPD 自体のドメイン内で実行している DHCPD と関連プロセスの例を示します。ここでは dhcp パッケージがインストールされていること、また DHCPD サービスが起動されていることを前提としています。
getenforceを実行して、 SELinux が enforcing モードで実行しているか確認します。getenforce Enforcing
$ getenforce EnforcingCopy to Clipboard Copied! Toggle word wrap Toggle overflow SELinux が enforcing モードで実行されている場合は、getenforceコマンドによりEnforcingが返されます。- root ユーザーで
service dhcpd startを実行し、DHCPDを起動します。service dhcpd start Starting dhcpd: [ OK ]
service dhcpd start Starting dhcpd: [ OK ]Copy to Clipboard Copied! Toggle word wrap Toggle overflow ps -eZ | grep dhcpdを実行し、dhcpdプロセスを表示させます。ps -eZ | grep dhcpd unconfined_u:system_r:dhcpd_t:s0 5483 ? 00:00:00 dhcpd
ps -eZ | grep dhcpd unconfined_u:system_r:dhcpd_t:s0 5483 ? 00:00:00 dhcpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow dhcpd プロセスに関連する SELinux コンテキストはunconfined_u:system_r:dhcpd_t:s0です。
14.2. タイプ リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
dhcpd で使用されるタイプを以下に示します。
dhcp_etc_t- 設定ファイルなど、
/etc内のファイルに主に使用されるタイプです。 dhcpd_var_run_t/var/run内にある dhcpd 用の PID ファイルに使用されるタイプです。dhcpd_exec_t- DHCP 実行可能ファイルの
dhcpd_tドメインへの遷移に使用されるタイプです。 dhcpd_initrc_exec_t- DHCP 実行可能ファイルの
dhcpd_initrc_tドメインへの遷移に使用されるタイプです。
注記
次のコマンドを実行すると、dhcp 用のタイプとファイルの全一覧を表示させることができます。
grep dhcp /etc/selinux/targeted/contexts/files/file_contexts
$ grep dhcp /etc/selinux/targeted/contexts/files/file_contexts
第15章 参考文献 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
本ガイドではその範疇を越えてしまう SELinux 関連の詳細が記述されている書籍および資料などを以下にいくつか挙げておきます。SELinux は急速なスピードで開発されているため、記述の一部は Red Hat Enterprise Linux の特定リリースにしか適用できない場合があるため注意してください。
書籍
- SELinux by Example
- Mayer、MacMillan、Caplan 著2007年、Prentice Hall 出版
- SELinux: NSA's Open Source Security Enhanced Linux
- Bill McCarty 著2004年、O'Reilly Media Inc. 出版
チュートリアルとヘルプ
- Russell Coker 氏によるチュートリアルとトーク
- Dan Walsh 氏のジャーナル
- Red Hat ナレッジベース
全般情報
- NSA SELinux メイン web サイト
- NSA SELinux FAQ
メーリングリスト
- NSA SELinux メーリングリスト
- Fedora SELinux メーリングリスト
コミュニティ
- SELinux プロジェクト Wiki
- SELinux コミュニティページ
- IRC
- irc.freenode.net, #selinux
付録A 改訂履歴 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 4-2.2.400 | 2013-10-31 | ||
| |||
| 改訂 4-2.2 | Fri Aug 9 2013 | ||
| |||
| 改訂 4-2.1 | Wed Jul 10 2013 | ||
| |||
| 改訂 4-2 | Fri Feb 22 2013 | ||
| |||
| 改訂 3-0 | Wed Jun 20 2012 | ||
| |||
| 改訂 2-0 | Tue Dec 6 2011 | ||
| |||
| 改訂 1-0 | Thu May 19 2011 | ||
| |||
| 改訂 0-0 | Tue Nov 9 2010 | ||
| |||
法律上の通知 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Copyright © 2011 Red Hat, Inc.
This document is licensed by Red Hat under the Creative Commons Attribution-ShareAlike 3.0 Unported License. If you distribute this document, or a modified version of it, you must provide attribution to Red Hat, Inc. and provide a link to the original. If the document is modified, all Red Hat trademarks must be removed.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.