CentOS6.7 64bit SELinuxによるアクセス制御

CentOS6.7 64bit SELinuxによるアクセス制御

当サイトでCentOS6.7 64bitへのインストール方法を紹介しているパッケージに関するSELinuxの設定を、以下に示します。

※CentOS7 64bitをご使用の場合は、当サイトのCentOS7 64bit SELinuxによるアクセス制御のページをご覧ください。

尚、ここではSELinuxの設定ファイル「/etc/selinux/config」で、ポリシーの設定を「SELINUXTYPE=targeted」とした状態でのSELinuxの動作を元にしています。

※「targeted」は、デフォルトの設定となります。他に「mls」が指定可能となっています。

ここでは、Apacheからのファイルの読み込みを許可する場合を元に、ディレクトリに設定されているSELinuxのコンテキストについて説明していきます。

Apacheから外部のデータベースへのアクセスを許可する場合等、SELinuxのブール値による設定については、当サイトのCentOS6 64bit SELinuxによるアクセス制御(その2)のページをご覧ください。

以下の各コマンドで、プロンプトが「#」で開始しているものはrootユーザーでの実行、「$」で開始しているものは一般ユーザーでの実行となります。

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

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

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

[core:error] [pid 1301] (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を起動したときにアクセスが拒否された場合、以下のようなエラーメッセージが表示されているかと思います。

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を有効化した際には、自動的にセキュリティコンテキストの設定が行われるようになっています。

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

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

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

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

type=AVC msg=audit(1443450133.441:29): avc: denied { getattr } for pid=1301 comm='httpd' path='/xxx/html/aaa.html' dev=dm-0 ino=130437 scontext=unconfined_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(1423905020.399:119): avc: denied { getattr } for pid=1911 comm='httpd' path='/xxx/ssl/server.crt' dev=dm-0 ino=521226 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_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 system_u:object_r:default_t:s0 html drwxr-xr-x. root root system_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-4.el6.x86_64 : Policy analysis command-line tools for SELinux リポジトリー : base 一致 : ファイル名 : /usr/bin/sesearch setroubleshoot-server-3.0.47-9.1.el6.x86_64 : SELinux troubleshoot server リポジトリー : base 一致 : ファイル名 : /usr/lib64/python2.6/site-packages/setroubleshoot/sesearch

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

# yum install setools-console

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

# sesearch -A -C -s httpd_t -t httpd_sys_content_t Found 13 semantic av rules: allow daemon httpd_sys_content_t : dir { getattr search open } , 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 } , ET allow httpd_t httpd_sys_content_t : file { ioctl read getattr lock open } , [ httpd_builtin_scripting ] ET allow httpd_t httpd_sys_content_t : dir { ioctl read getattr lock search open } , [ httpd_builtin_scripting ] ET 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_sys_content_t : lnk_file { read getattr } , [ httpd_builtin_scripting ] ET 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 && ] ET 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 && ] ET 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 -C -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 :(略) policycoreutils-python-2.0.83-24.el6.x86_64 : SELinux policy core python utilities リポジトリー : base 一致 : ファイル名 : /usr/sbin/semanage libsemanage-devel-2.0.43-5.1.el6.x86_64 : Header files and libraries used to build policy manipulation tools リポジトリー : base 一致 : ファイル名 : /usr/include/semanage libsemanage-devel-2.0.43-5.1.el6.i686 : Header files and libraries used to build policy manipulation tools リポジトリー : base 一致 : ファイル名 : /usr/include/semanage

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

# yum install policycoreutils-python

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

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

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

公開用に独自に作成したディレクトリに、Apacheのデフォルトのドキュメントルートと同じタイプ「httpd_sys_content_t」のコンテキストを設定するには、以下のようなコマンドを実行します。

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

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

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

# semanage fcontext -a -t httpd_config_t '/xxx/ssl(/.*)?'
  • 「-a」オプションを指定して、コンテキストの設定の追加を行うようにしています。
  • 「-t」オプションで、タイプ「httpd_config_t」のコンテキストを設定するようにしています。
  • 「/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によるアクセス制御については、以上です。