はじめに
普段はDebian系のOSを使っているのですが、久しぶりにCentOSを使う必要があり、SELinuxにやられたので書きます。
getenforce 0
をしてSELinuxを無効化すればいいよ、的な記事が世の中にはたくさんあるみたいですが、SELenuxの無効化はしません。
今回起きたこと
閲覧を特定の人に制限するために、ApacheでActiveDirectory(LDAP認証)と連携してベーシック認証をおこなうページを作成しました。
だいたい以下のような感じの構成で順調に動いていました。ADは同じLAN内の別サーバです。
環境
- CentOS 7.7
- Apache2.4
- mod_auth_ldap
ある日、社員さんから「認証ができなくなった」と報告がありました。確認すると、ベーシック認証のダイアログは表示されますが、認証はできず 500 Internal Server Error
と表示されてしまいます。
調査
Apacheのログの確認
とりあえず、ログを見てみます。特に何もありません。
PHPのプログラムの確認
次に、Apacheでのベーシック認証は完了しているものの、PHPのプログラムのロジックに問題があるのでは考えてPHPのプログラムを確認してみました。
ログの出力レベルの設定をして確認しましたが、プログラムには問題なさそうです。
LDAPモジュールのエラーの確認
次に、LDAPモジュールのデバッグオプションを有効にしてみました。Apacheの設定ファイルに以下を追加します。
LDAPLibraryDebug 7
以下のようなログが表示されました。正しく通信できてないぽいですね。
ldap_create
ldap_simple_bind
ldap_sasl_bind
ldap_send_initial_request
ldap_new_connection 1 1 0
ldap_int_open_connection
ldap_connect_to_host: TCP <ip_address>
ldap_new_socket: 16
ldap_prepare_socket: 16
ldap_connect_to_host: Trying <ip_address>
ldap_pvt_connect: fd: 16 tm: 10 async: 0
ldap_ndelay_on: 16
attempting to connect:
connect errno: 13
「ldap connect errno: 13」とGoogleで検索すると、[StackOverflowののページ](https://stackoverflow.com/questions/28684736/php-ldap-connection-cant-contact-ldap-server) が出てきました。ページに記載があるように、以下のコマンドを実行してみると、無事解決しました。
setsebool -P httpd_can_network_connect on
httpd_can_network_connectは、Apacheプロセスで動作するHTTPスクリプト・モジュールから外部への通信についてのポリシーのようです。
おわりに
別の社員さんに確認すると、OSのアップデートをしたとのことでした。OSのアップデートで設定が書き換わるなどしたのかもしれません。
CentOSで困ったときは、まずはSELinuxを疑ってみるのが良いかもしれません。