13.4. 設定例
以下の例は、SELinux が Apache HTTP サーバーを補完する方法と、Apache HTTP サーバーの完全な機能を維持する方法の実例を紹介します。
13.4.1. 静的サイトの実行 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
静的 Web サイトを作成するには、その Web サイトの
.html ファイルに httpd_sys_content_t タイプのラベルを付けます。デフォルトでは、Apache HTTP サーバーは httpd_sys_content_t タイプのラベルが付けられたファイルに書き込みできません。以下の例では、読み取り専用の Web サイトのファイルを保存する新しいディレクトリーを作成します。
- root で
mkdirユーティリティーを使用して、最上位のディレクトリーを作成します。mkdir /mywebsite
~]# mkdir /mywebsiteCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 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 - Apache HTTP サーバーが、
/mywebsite/、およびその下のファイルとサブディレクトリーに読み取り専用でアクセスできるようにするには、ディレクトリーにhttpd_sys_content_tタイプのラベルを付けます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。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 restoreconユーティリティーを 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: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 で以下のコマンドを入力して、Apache HTTP Server のステータスを確認します。サーバーが停止している場合は、起動します。
systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)Copy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーが実行している場合は、root で以下のコマンドを実行してサービスを再起動します (httpd.confに加えた変更も適用されます)。systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since Wed 2014-02-05 13:16:46 CET; 2s agoCopy to Clipboard Copied! Toggle word wrap Toggle overflow systemctl restart httpd.service
~]# systemctl restart httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Web ブラウザーを使用して
http://localhost/index.htmlに移動します。以下が表示されます。index.html from /mywebsite/
index.html from /mywebsite/Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.4.2. NFS および CIFS ボリュームの共有 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
デフォルトで、クライアント側の NFS マウントは、NFS ボリュームのポリシーで定義されたデフォルトのコンテキストでラベル付けされます。一般的なポリシーでは、このデフォルトのコンテキストは
nfs_t タイプを使用します。また、デフォルトでは、クライアント側でマウントされた Samba 共有には、ポリシーで定義されたデフォルトのコンテキストのラベルが付けられます。一般的なポリシーでは、このデフォルトコンテキストはcifs_t タイプを使用します。
ポリシーの設定によっては、サービスが、
nfs_t タイプまたは cifs_t タイプのラベルが付いたファイルを読み込めない場合があります。これにより、このタイプのラベルが付いたファイルシステムをマウントしてから、その他のサービスによる読み取りやエクスポートができなくなる可能性があります。ブール値を有効または無効にして、nfs_t タイプおよび cifs_t タイプへのアクセスを許可するサービスを制御できます。
httpd_use_nfs ブール値を有効にして、httpd が NFS ボリューム (nfs_t タイプのラベルが付いている) にアクセスし、共有できるようにします。
setsebool -P httpd_use_nfs on
~]# setsebool -P httpd_use_nfs on
httpd_use_cifs ブール値を有効にして、httpd が CIFS ボリューム (cifs_t の種類のラベルが付いている) にアクセスし、共有できるようにします。
setsebool -P httpd_use_cifs on
~]# setsebool -P httpd_use_cifs on
注記
再起動後も、setsebool の変更を保持したくない場合は、
-P オプションを使用しないでください。
13.4.3. サービス間でのファイルの共有 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Type Enforcement は、プロセスが別のプロセスで使用することを目的としたファイルにアクセスするのを防ぐのに役立ちます。たとえば、Samba は、デフォルトでは、
httpd_sys_content_t のタイプでラベルが付いたファイル (Apache HTTP サーバーが使用するファイル) を読み込むことができません。ファイルに public_content_t または public_content_rw_t のタイプのラベルが付けられている場合は、Apache HTTP サーバー、FTP、rsync、および Samba との間でファイルを共有できます。
以下の例では、ディレクトリーとファイルを作成し、Apache HTTP Server、FTP、rsync、および Samba でディレクトリーとファイルを共有 (読み取り専用) できるようにします。
- root で
mkdirユーティリティーを使用して、複数のサービス間でファイルを共有するための新しいトップレベルディレクトリーを作成します。mkdir /shares
~]# mkdir /sharesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - file-context 設定のパターンに一致しないファイルおよびディレクトリーには、
default_tタイプのラベルが付けられます。このタイプは、制限のあるサービスからはアクセスできません。ls -dZ /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 public_content_tタイプでの/shares/のラベル付けでは、Apache HTTP サーバー、FTP、rsync、および Samba による読み取り専用アクセスが許可されます。root で以下のコマンドを入力し、ラベルの変更を file-context 設定に追加します。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 restoreconユーティリティーを 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:s0Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Samba 経由で
/shares/を共有するには、以下を行います。
- samba パッケージ、samba-common パッケージ、および samba-client パッケージがインストールされていることを確認します (バージョン番号が異なる場合があります)。
rpm -q 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.i686Copy to Clipboard Copied! Toggle word wrap Toggle overflow これらのパッケージのいずれかがインストールされていない場合は、root で以下のコマンドを実行してインストールします。yum install package-name
~]# yum install package-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow /etc/samba/smb.confを root で編集します。このファイルの下部に以下のエントリーを追加し、Samba で/shares/ディレクトリーを共有します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - Samba ファイルシステムをマウントするには、Samba アカウントが必要です。root で次のコマンドを入力して、Samba アカウントを作成します。username は、既存の Linux ユーザーです。たとえば、smbpasswd -a testuser は、Linux
testuserユーザーの Samba アカウントを作成します。smbpasswd -a 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 上記のコマンドを実行し、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'!エラーが発生します。 - Samba サービスを再起動します。
systemctl start smb.service
~]# systemctl start smb.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 利用可能な共有をリスト表示するには、次のコマンドを入力します。username は、手順 3 で追加した Samba アカウントです。パスワードを求められたら、手順 3 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は異なる場合があります)。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow mkdirユーティリティーを使用して、新しいディレクトリーを作成します。このディレクトリーは、sharesの Samba 共有をマウントするために使用されます。mkdir /test/
~]# mkdir /test/Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で次のコマンドを入力して、
sharesの Samba 共有を/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 のパスワードを入力します。 - Samba で共有されているファイルの内容を表示します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
Apache HTTP サーバー経由で
/shares/ を共有するには、次のコマンドを実行します。
- httpd パッケージがインストールされていることを確認します (バージョン番号が異なる場合があります)。
rpm -q httpd
~]$ rpm -q httpd httpd-2.2.11-6.i386Copy to Clipboard Copied! Toggle word wrap Toggle overflow このパッケージがインストールされていない場合は、root でyumユーティリティーを使用してインストールします。yum install httpd
~]# yum install httpdCopy to Clipboard Copied! Toggle word wrap Toggle overflow /var/www/html/ディレクトリーに変更します。root で以下のコマンドを入力し、/shares/ディレクトリーへのリンク (名前はshares) を作成します。html]# ln -s /shares/ shares
html]# ln -s /shares/ sharesCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Apache HTTP サーバーを起動します。
systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Web ブラウザーを使用して
http://localhost/sharesに移動します。/shares/index.htmlが表示されます。
デフォルトでは、
index.html ファイルが存在する場合は読み込まれます。/shares/ にindex.html がなく、代わりに file1、file2、および file3 があった場合は、http://localhost/shares へのアクセス時にディレクトリーのリストが表示されます。
index.htmlファイルを削除します。rm -i /shares/index.html
~]# rm -i /shares/index.htmlCopy to Clipboard Copied! Toggle word wrap Toggle overflow touchユーティリティーを root で使用し、/shares/に 3 つのファイルを作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root で以下のコマンドを入力して、Apache HTTP サーバーのステータスを確認します。
systemctl status httpd.service
~]# systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: inactive (dead)Copy to Clipboard Copied! Toggle word wrap Toggle overflow サーバーが停止している場合は、起動します。systemctl start httpd.service
~]# systemctl start httpd.serviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow - Web ブラウザーを使用して
http://localhost/sharesに移動します。ディレクトリーのリストが表示されます。
13.4.4. ポート番号の変更 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
ポリシー設定によっては、サービスは特定のポート番号でのみ実行できます。ポリシーを変更せずにサービスが実行するポートを変更しようとすると、サービスが起動できなくなる可能性があります。
semanage ユーティリティーを使用して、root ユーザーに、SELinux が httpd でリッスンできるポートをリスト表示します。
semanage port -l | grep -w http_port_t
~]# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
標準設定では、
httpd は TCP ポート 80、443、488、8008、8009、または 8443 でリッスンできます。/etc/httpd/conf/httpd.conf が、http_port_t に登録されていないポートで httpd がリッスンするように設定されていると、httpd が起動できません。
httpd を TCP ポート 80、443、488、8008、8009、または 8443 以外のポートで実行するように設定するには、次のコマンドを実行します。
/etc/httpd/conf/httpd.confファイルを root で編集し、Listenオプションにhttpdの SELinux ポリシーで設定されていないポートのリストが表示されるようにします。以下の例では、httpdが 10.0.0.1 IP アドレスおよび TCP ポート 12345 でリッスンするように設定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow - root ユーザーになり、次のコマンドを実行して、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 - ポートが追加されたことを確認します。
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, 8443Copy to Clipboard Copied! Toggle word wrap Toggle overflow
ポート 12345 で
httpd を実行しなくなった場合は、root で semanage ユーティリティーを使用し、ポリシー設定からポートを削除します。
semanage port -d -t http_port_t -p tcp 12345
~]# semanage port -d -t http_port_t -p tcp 12345