CentOS6.7 64bit SELinuxによるアクセス制御(その2)
SELinuxによるアクセス制御の詳細につきましては、当サイトのCentOS6 64bit SELinuxによるアクセス制御のページもご覧ください。
ここでは、Apacheから外部のデータベースへのアクセスを許可する場合を元に、SELinuxのブール値による設定について説明していきます。
※CentOS7 64bitをご使用の場合は、当サイトのCentOS7 64bit SELinuxによるアクセス制御(その2)のページをご覧ください。
以下の各コマンドで、プロンプトが「#」で開始しているものはrootユーザーでの実行、「$」で開始しているものは一般ユーザーでの実行となります。
Apacheから外部のデータベースへのアクセスを許可
PHPから外部のMySQLへ接続を行う際に、以下のようなエラーになってしまう場合、
※PHPからローカルのMySQLへの接続、mysqlコマンドを使用しての外部のMySQLへの接続は可能。
SQLSTATE[HY000] [2002] Permission denied
SELinuxによるアクセス制御が有効になっていることが原因の可能性があります。
SELinuxによるアクセス制御の有効、無効の設定
SELinuxの設定状態は以下のコマンドで確認でき、アクセス制御が有効になっている場合は「Enforcing」となっています。
# getenforce Enforcing
※無効になっている場合は、「Permissive」、または「Disabled」となります。
以下のコマンドで、SELinuxによるアクセス制御を無効にすることができます。
# setenforce Permissive
または
# setenforce 0
これによりPHPから外部のMySQLへの接続が可能となった場合、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」に出力され、ApacheからMySQLへのアクセスが拒否された場合は、以下のようなログが出力されているかと思います。
※ログの出力に使用されるauditは、デフォルトでインストールされています。
type=AVC msg=audit(1443538179.535:45): avc: denied { name_connect } for pid=1592 comm='httpd' dest=3306 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:mysqld_port_t:s0 tclass=tcp_socket
このログにより、タイプ「httpd_t」のコンテキストが設定された(scontext)、プロセス「httpd」(comm)から、タイプ「mysqld_port_t」のコンテキスト(tcontext)への、クラス「tcp_socket」(tclass)の操作「{ name_connect }」が拒否(denied)されたことが分かります。
SELinuxのコンテキストに設定されているアクセス制御の確認
SELinuxのコンテキストに設定されているアクセス制御の確認をするには、「sesearch」コマンドを使用します。
「sesearch」コマンドがインストールされていない場合、このコマンドはパッケージsetools-consoleに含まれています。
以下のコマンドを実行して、setools-consoleのインストールを行います。
# yum install setools-console
タイプ「httpd_t」のコンテキストから、タイプ「mysqld_port_t」のコンテキストへ、クラス「tcp_socket」でどのようなアクセス制御が設定されているかは、以下のコマンドで確認することができます。
# sesearch -A -C -s httpd_t -t mysqld_port_t -c tcp_socket Found 4 semantic av rules: allow httpd_t port_type : tcp_socket { recv_msg send_msg } , DT allow httpd_t mysqld_port_t : tcp_socket { recv_msg send_msg name_connect } , [ httpd_can_network_connect_db ] DT allow httpd_t port_type : tcp_socket { recv_msg send_msg } , [ allow_ypbind ] DT allow httpd_t port_type : tcp_socket name_connect , [ httpd_can_network_connect ]
この確認結果から、操作「name_connect」は、ブール値による設定「httpd_can_network_connect_db」により、拒否「DT」されていることが分かります。
※「sesearch」コマンドのオプションに「-C」を指定すると、出力結果の「[」、「]」で囲まれた中にブール値による設定が表示されます。
※ブール値による設定は、「setsebool」コマンドを使用してオン、オフを切り替えることでアクセス許可の設定が行えるものとなっています。
SELinuxのブール値によるアクセス制御を設定
ブール値によるアクセス制御の設定状態は、「getsebool」コマンドで確認できます。
# getsebool httpd_can_network_connect_db httpd_can_network_connect_db -->, off
※「getsebool」コマンドに個別の設定名を指定する変わりに、「-a」オプションを指定すれば、全ての設定状態が確認できます。
「setsebool」コマンドを使用して、「httpd_can_network_connect_db」の設定をオンにします。
# setsebool -P httpd_can_network_connect_db on
- 「-P」オプションを指定して、サーバーの再起動後も設定が有効になるようにします。
これにより、PHPから外部のMySQLへの接続が可能となります。
SELinuxによるアクセス制御(その2)については、以上です。