14.4. 設定例

以下では、SELinux がどのように Apache HTTP Server を補完するのか、Apache HTTP Server の全機能をどのように維持するのかを実践的な例を用いて示します。

14.4.1. 静的なサイトを稼働させる

静的な web サイトを作成する場合は、その web サイトの .html ファイルに httpd_sys_content_t タイプのラベルを付けます。デフォルトでは、Apache HTTP Server は httpd_sys_content_t タイプのラベルが付いたファイルに書き込みはできません。以下の 例では、読み取り専用 web サイト向けのファイルを保存する新規ディレクトリーを作成します。
  1. root で mkdir ユーティリティーを使用して最上位のディレクトリーを作成します。
    ~]# mkdir /mywebsite
  2. root で /mywebsite/index.html ファイルを作成します。以下のコンテンツを /mywebsite/index.html にコピーして貼り付けます。
    <html>
    <h2>index.html from /mywebsite/</h2>
    </html>
  3. /mywebsite/ およびその配下のファイルやサブディレクトリーへの読み取り専用アクセスを Apache HTTP Server に許可するために、このディレクトリー に httpd_sys_content_t タイプのラベルを付けます。root で以下のコマンドを実行してラベルの変更をファイルコンテキスト設定に追加します。
    ~]# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
  4. root で restorecon を使用してラベル変更を適用します。
    ~]# 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
  5. この例の場合、root で /etc/httpd/conf/httpd.conf ファイルを編集します。既存の DocumentRoot オプションをコメントアウトし、DocumentRoot "/mywebsite" オプションを追加します。編集後は以下のようになります。
    #DocumentRoot "/var/www/html"
    DocumentRoot "/mywebsite"
  6. root で以下のコマンドを実行して Apache HTTP Server の状態を確認します。サーバーが停止している場合は起動します。
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    ~]# systemctl start httpd.service
    サーバーが稼働している場合は、root で以下のコマンドを実行してサービスを再起動します (httpd.conf への変更にもこれを適用)。
    ~]# 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 ago
    ~]# systemctl restart httpd.service
  7. web ブラウザで http://localhost/index.html に移動します。以下のように表示されます。
    index.html from /mywebsite/

14.4.2. NFS および CIFS ボリュームの共有

クライアント側の NFS マウントは、デフォルトで NFS ボリュームのポリシーで定義されたデフォルトのコンテキストでラベル付けされます。共通ポリシーでは、このデフォルトのコンテキストは、nfs_t タイプを使用します。またデフォルトでは、クライアント側にマウントされた Samba 共有は、ポリシーが定義したデフォルトのコンテキストでラベル付けされます。共通ポリシーでは、このデフォルトのコンテキストは cifs_t タイプを使用します。
ポリシー設定によっては、サービスが nfs_t または cifs_t タイプのラベルが付けられたファイルを読み取れない場合もあります。これにより、これらのタイプのラベルが付けられたファイルシステムがマウントされ、他のサービスが読み取ったり、エクスポートすることを防ぐことができます。ブール値をオンやオフに切り替えて、nfs_tcifs_t タイプにアクセス可能なサービスを制御することができます。
(nfs_t タイプのラベルが付けられている) NFS ボリュームへのアクセスと共有を httpd に許可する場合は、httpd_use_nfs ブール値を有効にします。
~]# setsebool -P httpd_use_nfs on
(cifs_t タイプのラベルが付けられている) CIFS ボリュームへのアクセスと共有を httpd に許可する場合は、httpd_use_cifs ブール値を有効にします。
~]# setsebool -P httpd_use_cifs on

注記

再起動後に setsebool による変更を維持したくない場合は、-P オプションを使用しないでください。

14.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 でそのディレクトリーとファイルを共有 (読み取り専用) できるようにします。
  1. root で mkdir を使用して、複数サービス間でファイルを共有するための最上位の新規ディレクトリーを作成します。
    ~]# mkdir /shares
  2. ファイルコンテキスト設定のパターンに合致しないファイルやディレクトリーには、default_t タイプのラベルが付いている場合があります。制限のあるサービスは、このタイプのファイルやディレクトリーにはアクセスできません。
    ~]$ ls -dZ /shares
    drwxr-xr-x  root root unconfined_u:object_r:default_t:s0 /shares
  3. root で /shares/index.html ファイルを作成します。以下のコンテンツをコピーして /shares/index.html に貼り付けます。
    <html>
    <body>
    <p>Hello</p>
    </body>
    </html>
  4. /shares/public_content_t タイプのラベルを付けることで、Apache HTTP Server、FTP、rsync、Samba による読み取り専用アクセスを許可します。root で以下のコマンドを実行し、ラベルの変更をファイルコンテキスト設定に追加します。
    ~]# semanage fcontext -a -t public_content_t "/shares(/.*)?"
  5. root で restorecon ユーティリティーを使用してラベル変更を適用します。
    ~]# 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
Samba で /shares/ を共有する場合は、以下の手順にしたがいます。
  1. sambasamba-commonsamba-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
    上記のパッケージがインストールされていない場合は、root で以下のコマンドを実行して、これらをインストールします。
    ~]# yum install package-name
  2. root で /etc/samba/smb.conf ファイルを編集します。Samba で /shares/ ディレクトリーを共有するために、以下のエントリーをこのファイルの末尾に追加します。
    [shares]
    comment = Documents for Apache HTTP Server, FTP, rsync, and Samba
    path = /shares
    public = yes
    writable = no
  3. Samba ファイルシステムのマウントには Samba アカウントが必要になります。root で以下のコマンドを実行し、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.
    上記のコマンドを実行する際に、システムに存在しないアカウントのユーザー名を指定すると、Cannot locate Unix account for 'username'! エラーが発生します。
  4. Samba サービスを開始します。
    ~]# systemctl start smb.service
  5. 以下のコマンドを実行し、利用可能な共有を表示します。username はステップ 3 で追加した Samba アカウントにします。パスワードの入力を求められたら、ステップ 3 で Samba アカウントに割り当てたパスワードを入力します (バージョン番号は使用しているバージョンによって異なります)。
    ~]$ smbclient -U username -L localhost
    Enter username's password:
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Sharename       Type      Comment
    ---------       ----      -------
    shares          Disk      Documents for Apache HTTP Server, FTP, rsync, and Samba
    IPC$            IPC       IPC Service (Samba Server Version 3.4.0-0.41.el6)
    username        Disk      Home Directories
    Domain=[HOSTNAME] OS=[Unix] Server=[Samba 3.4.0-0.41.el6]
    
    Server               Comment
    ---------            -------
    
    Workgroup            Master
    ---------            -------
  6. mkdir ユーティリティーを使って新規ディレクトリーを作成します。このディレクトリーは Samba 共有の shares をマウントする際に使用します。
    ~]# mkdir /test/
  7. root で以下のコマンドを実行して、Samba 共有の shares/test/ にマウントします。username はステップ 3 のユーザー名にしてください。
    ~]# mount //localhost/shares /test/ -o user=username
    ステップ 3 で設定した username のパスワードを入力します。
  8. Samba で共有されているファイルのコンテンツを表示します。
    ~]$ cat /test/index.html
    <html>
    <body>
    <p>Hello</p>
    </body>
    </html>
Apache HTTP Server で /shares/ を共有する場合は、以下の手順にしたがいます。
  1. httpd パッケージがインストールされていることを確認します (バージョン番号は使用しているバージョンによって異なります)。
    ~]$ rpm -q httpd
    httpd-2.2.11-6.i386
    このパッケージがインストールされていない場合は、root で yum ユーティリティーを使用してインストールします。
    ~]# yum install httpd
  2. /var/www/html/ ディレクトリーに移動します。root で以下のコマンドを実行して /shares/ ディレクトリーへのリンク (shares という名前にします) を作成します。
    html]# ln -s /shares/ shares
  3. Apache HTTP Server を起動します。
    ~]# systemctl start httpd.service
  4. web ブラウザを使って http://localhost/shares に移動します。/shares/index.html が表示されます。
デフォルトでは、index.html ファイルが存在していれば、Apache HTTP Server はこれを読み込みます。/shares/file1file2file3 しかなく index.html がない場合、http://localhost/shares にアクセスするとディレクトリー一覧が表示されます。
  1. index.html ファイルを削除します。
    ~]# rm -i /shares/index.html
  2. root で touch ユーティリティーを使用して /shares/ に新規ファイルを 3 つ作成します。
    ~]# touch /shares/file{1,2,3}
    ~]# ls -Z /shares/
    -rw-r--r--  root root system_u:object_r:public_content_t:s0 file1
    -rw-r--r--  root root unconfined_u:object_r:public_content_t:s0 file2
    -rw-r--r--  root root unconfined_u:object_r:public_content_t:s0 file3
  3. root で以下のコマンドを実行して Apache HTTP Server の状態を確認します。
    ~]# systemctl status httpd.service
    httpd.service - The Apache HTTP Server
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled)
       Active: inactive (dead)
    サーバーが停止している場合は、これを起動します。
    ~]# systemctl start httpd.service
  4. web ブラウザで http://localhost/shares に移動します。ディレクトリー一覧が表示されます。

14.4.4. ポート番号を変更する

ポリシー設定によっては、サービスが特定のポート番号でのみ実行できるようにすることが可能です。ポリシーを変更せずサービスが実行されるポートを変えようとすると、サービスの起動に失敗する場合があります。root ユーザーで semanage ユーティリティーを使用して、SELinux が httpd にリッスンを許可しているポートを表示します。
~]# semanage port -l | grep -w http_port_t
http_port_t                    tcp      80, 443, 488, 8008, 8009, 8443
デフォルトでは、SELinux で httpd にリッスンを許可している TCP ポートは 80、443、488、8008、8009、8443 になります。httpdhttp_port_t 用に記載されていないポートをリッスンするよう /etc/httpd/conf/httpd.conf を設定すると、httpd の起動に失敗します。
httpd が TCP ポート 80、443、488、8008、8009、8443 以外のポートで実行するようにするには、以下の手順で設定します。
  1. root で /etc/httpd/conf/httpd.conf ファイルを編集し、SELinux ポリシーでは httpd 用に設定されていないポートを Listen オプションに記載します。以下の例では、httpd が IP アドレス 10.0.0.1、TCP ポート 12345 でリッスンするよう設定します。
    # Change this to Listen on specific IP addresses as shown below to 
    # prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
    #
    #Listen 12.34.56.78:80
    Listen 10.0.0.1:12345
  2. root で以下のコマンドを実行し、SELinux ポリシーの設定にこのポートを追加します。
    ~]# semanage port -a -t http_port_t -p tcp 12345
  3. ポートが追加されたことを確認します。
    ~]# semanage port -l | grep -w http_port_t
    http_port_t                    tcp      12345, 80, 443, 488, 8008, 8009, 8443
ポート 12345 で httpd を実行しないようになったら、root ユーザーで semanage ユーティリティーを実行してポリシー設定からそのポートを削除します。
~]# semanage port -d -t http_port_t -p tcp 12345

このページには機械翻訳が使用されている場合があります (詳細はこちら)。