はじめに
普段は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」とかで検索すると、[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です。