SELINUXの設定

SELinuxによるアクセス制御

 

概要

当サイトでCentOS7.1 64bitへのインストール方法を紹介しているパッケージに関するSELinuxの設定を、以下に示します。
尚、ここではSELinuxの設定ファイル「/etc/selinux/config」で、ポリシーの設定を「SELINUXTYPE=targeted」とした状態でのSELinuxの動作を元にしています。
※「targeted」は、デフォルトの設定となります。他に「mls」が指定可能となっています。
ここでは、Apacheからのファイルの読み込みを許可する場合を元に、ディレクトリに設定されているSELinuxのコンテキストについて説明していきます。

Apacheからのファイルの読み込みを許可

ドキュメントルートの変更やエイリアスの使用で、独自に作成したディレクトリを公開したい場合や、SSL使用時の秘密鍵や証明書といった設定関連のファイルを独自に作成したディレクトリに置きたい場合に、chownやchmodを使用してアクセス権の設定を行ってもアクセスが拒否されてしまうときは、SELinuxによるアクセス制御が有効になっていることが原因の可能性があります。

公開したい独自に作成したディレクトリのファイルへのアクセスが拒否された場合、Apacheのエラーログ「/var/log/httpd/error_log」には以下のようなログが出力されているかと思います。

[core:error] [pid 3008:tid 139956904216320] (13)Permission denied: [client xxx.xxx.xxx.xxx:xxxxx] AH00035: access to /xxx/aaa.html denied (filesystem path '/xxx/html/aaa.html') because search permissions are missing on a component of the path

※「/xxx/html/aaa.html」は、実際にアクセスしようとしたサーバー上のファイルのパスになります。

また、SSLで使用する秘密鍵や証明書を独自に作成したディレクトリに置いてApacheを起動したときにアクセスが拒否された場合、コマンド「systemctl -l status httpd.service」を実行すると、以下のようなエラーメッセージが表示されているかと思います。

# systemctl -l status httpd.service
:(略)
Starting httpd: AH00526: Syntax error on line 147 of /etc/httpd/conf/extra/httpd-ssl.conf:
SSLCertificateFile: file '/xxx/ssl/server.crt' does not exist or is empty
[失敗]
:(略)

※「/xxx/ssl/server.crt」は、実際にSSLの証明書が配置されているサーバー上のファイルのパスになります。

SELinuxによるアクセス制御の有効、無効の設定

SELinuxの設定状態は以下のコマンドで確認でき、アクセス制御が有効になっている場合は「Enforcing」となっています。

# getenforce
Enforcing

※無効になっている場合は、「Permissive」、または「Disabled」となります。
以下のコマンドで、SELinuxによるアクセス制御を無効にすることができます。

# setenforce Permissive

または

# setenforce 0

これにより独自に作成したディレクトリへのアクセスが可能となった場合、SELinuxが原因となっています。

SELinuxによるアクセス制御を全てに無効にしてよい場合、setenforceによる設定はサーバーの再起動後には元に戻ってしまいますので、SELinuxの設定ファイル「/etc/selinux/config」を以下のように編集しサーバーを再起動します。

:(略)
SELINUX=enforcing
↓変更
SELINUX=disabled

※「SELINUX=disabled」と設定しSELinuxを無効化すると、その間に作成されたディレクトリやファイルにはセキュリティコンテキストの設定が行われませんが、再度「SELINUX=enforcing」と設定してSELinuxを有効化した際には、自動的にセキュリティコンテキストの設定が行われるようになっています。但しOS起動時にラベリングが行われる際にシステムが起動するまで時間がかかります。

※「SELINUX=permissive」と設定しアクセス制御は行わず、アクセス拒否のログは残すようにすることもできます。

SELinuxによるアクセス拒否のログの確認

SELinuxを無効にしたくない場合、原因となっているSELinuxの設定を調べていきます。SELinuxのログは「/var/log/audit/audit.log」に出力され、公開したい独自に作成したディレクトリのファイルへのアクセスが拒否された場合は、以下のようなログが出力されているかと思います。

※ログの出力に使用されるauditは、デフォルトでインストールされています。

type=AVC msg=audit(1438526471.103:394): avc:  denied  { getattr } for  pid=3014 comm="httpd" path="/xxx/html/aaa.html" dev="dm-0" ino=101440840 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file

※「/xxx/html/aaa.html」は、実際にアクセスしようとしたサーバー上のファイルのパスになります。

このログにより、タイプ「httpd_t」のコンテキストが設定された(scontext)、プロセス「httpd」(comm)から、タイプ「default_t」のコンテキストが設定された(tcontext)、ファイル「/xxx/html/aaa.html」(path)への、クラス「file」(tclass)の操作「{ getattr }」が拒否(denied)されたことが分かります。

また、SSLで使用する秘密鍵や証明書を独自に作成したディレクトリに置いて、Apacheを起動したときにアクセスが拒否された場合は、以下のようなログが出力されているかと思います。

type=AVC msg=audit(1441211704.629:38): avc:  denied  { getattr } for  pid=1571 comm="httpd" path="/xxx/ssl/server.crt" dev=dm-0 ino=130351 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:default_t:s0 tclass=file

※「/xxx/ssl/server.crt」は、実際にSSLの証明書が配置されているサーバー上のファイルのパスです。

このログにより、タイプ「httpd_t」のコンテキストが設定された(scontext)、プロセス「httpd」(comm)から、タイプ「default_t」のコンテキストが設定された(tcontext)、ファイル「/xxx/ssl/server.crt」(path)への、クラス「file」(tclass)の操作「{ getattr }」が拒否(denied)されたことが分かります。

ディレクトリに設定されているSELinuxのコンテキストの確認

以下のコマンドを使用して、アクセスが拒否されている独自に作成したディレクトリのセキュリティコンテキストの設定を確認してみます。

# ls -Z /xxx/
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 html
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 ssl

※「/xxx/」には、確認したいディレクトリのパスを指定します。

このディレクトリには、タイプ「default_t」のコンテキストが設定されています。

以下のコマンドを使用して、Apacheのデフォルトのドキュメントルートのディレクトリのセキュリティコンテキストの設定を確認してみます。

# ls -Z /var/www/ | grep html
drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 html

このディレクトリには、タイプ「httpd_sys_content_t」のコンテキストが設定されています。

以下のコマンドを使用して、Apacheの設定ファイルが置かれているディレクトリのセキュリティコンテキストの設定を確認してみます。

# ls -Z /etc/ | grep httpd
drwxr-xr-x. root root system_u:object_r:httpd_config_t:s0 httpd

このディレクトリには、タイプ「httpd_config_t」のコンテキストが設定されています。

SELinuxのコンテキストに設定されているアクセス制御の確認

SELinuxのコンテキストに設定されているアクセス制御の確認をするには、「sesearch」コマンドを使用します。

「sesearch」コマンドがインストールされていない場合、このコマンドはパッケージsetools-consoleに含まれています。

これは以下のコマンドで確認できます。

# yum provides */sesearch
:(略)
setools-console-3.3.7-46.el7.x86_64 : Policy analysis command-line tools for SELinux
リポジトリー        : base
一致          :
ファイル名    : /usr/bin/sesearch

以下のコマンドを実行して、setools-consoleのインストールを行います。

# yum install setools-console

タイプ「httpd_t」のコンテキストから、タイプ「httpd_sys_content_t」のコンテキストへどのようなアクセス制御が設定されているかは、以下のコマンドで確認することができます。

# sesearch -A -s httpd_t -t httpd_sys_content_t
Found 15 semantic av rules:
   allow httpd_t file_type : filesystem getattr ;
   allow httpd_t file_type : dir { getattr search open } ;
   allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } ;
   allow httpd_t httpd_sys_content_t : dir { ioctl read getattr lock search open } ;
   allow httpd_t httpd_sys_content_t : lnk_file { read getattr } ;
   allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ;
   allow httpd_t httpd_content_type : dir { getattr search open } ;
   allow daemon httpd_sys_content_t : dir { getattr search open } ;
DT allow httpd_t httpd_sys_content_t : dir { ioctl read write getattr lock add_name remove_name search open } ; [ httpd_enable_cgi httpd_unified && httpd_builtin_scripting && ]
ET allow httpd_t httpd_content_type : file { ioctl read getattr lock open } ; [ httpd_builtin_scripting ]
ET allow httpd_t httpd_content_type : dir { ioctl read getattr lock search open } ; [ httpd_builtin_scripting ]
ET allow httpd_t httpd_content_type : lnk_file { read getattr } ; [ httpd_builtin_scripting ]
DT allow httpd_t httpdcontent : file { ioctl read write create getattr setattr lock append unlink link rename execute open } ; [ httpd_enable_cgi httpd_unified && httpd_builtin_scripting && ]
DT allow httpd_t httpdcontent : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir open } ; [ httpd_enable_cgi httpd_unified && httpd_builtin_scripting && ]
DT allow httpd_t httpdcontent : lnk_file { ioctl read write create getattr setattr lock append unlink link rename } ; [ httpd_enable_cgi httpd_unified && httpd_builtin_scripting && ]

タイプ「httpd_t」のコンテキストから、タイプ「httpd_config_t」のコンテキストへどのようなアクセス制御が設定されているかは、以下のコマンドで確認することができます。

# sesearch -A -s httpd_t -t httpd_config_t
Found 5 semantic av rules:
   allow httpd_t file_type : filesystem getattr ;
   allow httpd_t file_type : dir { getattr search open } ;
   allow httpd_t httpd_config_t : file { ioctl read getattr lock open } ;
   allow httpd_t httpd_config_t : dir { ioctl read getattr lock search open } ;
   allow httpd_t httpd_config_t : lnk_file { read getattr } ;

この確認結果から、どちらもファイルの読み込み系の操作が許可されており、タイプ「httpd_sys_content_t」のほうは、ブール値によるアクセス許可も指定できるようになっていることが分かります。

※「sesearch」コマンドのオプションに「-C」を指定すると、出力結果の「[」、「]」で囲まれた中にブール値による設定が表示されます。

※ブール値による設定は、「setsebool」コマンドを使用してオン、オフを切り替えることでアクセス許可の設定が行えるものとなっています。

ディレクトリにSELinuxのコンテキストを設定

ファイルやディレクトリにコンテキストの設定を行うには、「semanage」コマンドを使用します。

「semanage」コマンドがインストールされていない場合、このコマンドはパッケージpolicycoreutils-pythonに含まれています。

これは以下のコマンドで確認できます。

# yum provides */semanage
:(略)
libsemanage-devel-2.1.10-16.el7.i686 : Header files and libraries used to build policy manipulation tools
リポジトリー        : base
一致          :
ファイル名    : /usr/include/semanage



libsemanage-devel-2.1.10-16.el7.x86_64 : Header files and libraries used to build policy manipulation tools
リポジトリー        : base
一致          :
ファイル名    : /usr/include/semanage



policycoreutils-python-2.2.5-15.el7.x86_64 : SELinux policy core python utilities
リポジトリー        : base
一致          :
ファイル名    : /usr/sbin/semanage
ファイル名    : /usr/share/bash-completion/completions/semanage

以下のコマンドを実行して、policycoreutils-pythonのインストールを行います。

# yum install policycoreutils-python

新規に作成したファイルやディレクトリにコンテキストの設定を行うには、コンテキストの設定ファイル「/etc/selinux/targeted/contexts/files/file_contexts.local」に設定を行います。

この設定ファイルには、「semanage」コマンドを使用して設定を追加していきます。

※SELinuxのデフォルトのコンテキストの設定は、ディレクトリ「/etc/selinux/targeted/contexts/files/」にある別のファイルで行われています。

サイトを公開する場合、デフォルトルートの場合(/var/www/html)は、既に設定されているSELINUXのコンテキストで問題有りません。

独自にドキュメントルートを設定したディレクトリを公開する場合は、タイプ「httpd_sys_content_t」のコンテキストを設定する必要があります。
設定内容は、以下のようなコマンドを実行します。

# semanage fcontext -a -t httpd_sys_content_t "/xxx/html(/.*)?"
⇒WordPressのインストール時にはデフォルトの上記設定ではwp-config.phpの生成が出来ないため、下記コンテキストを設定します
# semanage fcontext -a -t httpd_sys_rw_content_t "/xxx/html(/.*)?"
  • 「-a」オプションを指定して、コンテキストの設定の追加を行うようにしています。
  • 「-t」オプションで、タイプ「httpd_sys_content_t」のコンテキストを設定するようにしています。
  • 「/xxx/html」は、設定対象のディレクトリです。

この段階では、コンテキストの設定ファイル「/etc/selinux/targeted/contexts/files/file_contexts.local」への設定の追加が行われますが、実際のファイルへのコンテキストの反映はまだ行われていません。

以下のようなコマンドを実行して、コンテキストの設定をファイルに反映させます。

# restorecon -R -v /xxx/html/
⇒更に、WordPressの自動更新や、テーマの追加等を実行出来るためには下記の追加設定をします
# setsebool -P httpd_graceful_shutdown on
  • 「-R」オプションを指定して、ディレクトリの下層にもコンテキストの設定が行われるようにします。
  • 「-v」オプションを指定して、コンテキストの変更内容がコマンド実行結果に表示されるます。
  • 「/xxx/html/」は、コンテキストの設定を反映させるディレクトリです。

これにより、公開用のディレクトリへのアクセスが可能となります。

同様に、SSLで使用する秘密鍵や証明書の置き場所用のディレクトリに、Apacheの設定ファイルが置かれているディレクトリと同じタイプ「httpd_config_t」のコンテキストを設定する必要があります。以下のようなコマンドを実行します。

# semanage fcontext -a -t httpd_config_t "/etc/pki/xxx/ssl(/.*)?"
  • 「-a」オプションを指定して、コンテキストの設定の追加を行うようにしています。
  • 「-t」オプションで、タイプ「httpd_config_t」のコンテキストを設定するようにしています。
  • 「/etc/pki/xxx/ssl」は、設定対象のディレクトリになります。

以下のようなコマンドを実行して、コンテキストの設定をファイルに反映させます。

# restorecon -R -v /xxx/ssl/
  • 「-R」オプションを指定して、ディレクトリの下層にもコンテキストの設定が行われるようにします。
  • 「-v」オプションを指定して、コンテキストの変更内容がコマンド実行結果に表示されるようにします。
  • 「/xxx/ssl/」は、コンテキストの設定を反映させるディレクトリになります。

これにより、SSLで使用する秘密鍵や証明書の置き場所用に、独自に作成したディレクトリへのアクセスが可能となります。

尚、追加したコンテキストの設定を削除するには、以下のようなコマンドを実行します。

# semanage fcontext -d "/xxx/html(/.*)?"
  • 「-d」オプションを指定して、コンテキストの設定の削除を行うようにしています。
  • 「/xxx/html」は、削除対象のディレクトリになります。

これにより、コンテキストの設定ファイル「/etc/selinux/targeted/contexts/files/file_contexts.local」から設定が削除されます。

設定の削除をファイルに反映させるには、以下のようなコマンドを実行します。

# restorecon -R -v /xxx/html/
  • 「-R」オプションを指定して、ディレクトリの下層にもコンテキストの設定が行われるようにします。
  • 「-v」オプションを指定して、コンテキストの変更内容がコマンド実行結果に表示されるようにします。
  • 「/xxx/html/」は、コンテキストの設定を反映させるディレクトリになります。

SELinuxの無効化

SELinuxは、WindowsでいうところのUACのような機能だが、サーバーとして動作させる際に、予期せぬ制約がかかることが多いので無効化しておく。

設定ファイルの修正

現状の設定を確認する。以下のコマンドで、現在の設定を確認する。
CentOS7 (1511) Minimalの導入直後であれば、「Enforcing」となっている。

# getenforce
Enforcing
#

以下のコマンドで、設定ファイルをバックアップする。

# cp -pi /etc/selinux/config /etc/selinux/config.`date "+%Y%m%d_%H%M%S"`
#

以下の設定ファイルを修正する。

/etc/selinux/config

 

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
### Disalbe SELINUX begin
##SELINUX=enforcing
SELINUX=disabled
### Disalbe SELINUX end
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected.
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

再起動

以下のコマンドで再起動する。

# shutdown -r now
#

結果の確認

再起動後に以下のコマンドで、状態を確認する。
「Disabled」になっていれば良い。

# getenforce
Disabled
#

参考サイト:url = http://www.kakiro-web.com/linux/selinux.html

 

タイトルとURLをコピーしました