CentosのApacheで、ActiveDirectory連携のベーシック認証ができなくなった


はじめに

普段は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ののページ が出てきます。ページに記載があるように、以下のコマンドを実行してみると、無事解決しました。

setsebool -P httpd_can_network_connect on

httpd_can_network_connectは、Apacheプロセスで動作するHTTPスクリプト・モジュールから外部への通信についてのポリシーのようです。

おわりに

別の社員さんに確認すると、OSのアップデートをしたとのことでした。OSのアップデートで何かしあったんだろうなと思っておきます。

CentOSで困ったときは、だいたいSELinuxです。