Logo

Active Directory と Apache を連携し SSO 認証を実現する

Active Directory とApache を連携し、AD ドメイン内のユーザーのみアクセスできるサイトを作成します。

Last Modified: 2025/05/25



AD を使った SSO 認証

AD 及び Linux の勉強がてら、AD を使い、Single Sign-On (SSO) 対応の Web サーバーを構築します。

前提として AD が構築されており、Linux 上で Apache が動作していることを想定します。

環境

  • AD: Windows Server 2022
  • AD の IP, ドメイン: 172.31.110.129, takloose.local
  • Web サーバー: RHEL 9.6
  • Web サーバーの IP, ドメイン: 172.31.110.203, www.takloose.local

AD 側の設定

Apache 用のアカウントを作成します。このようにサービスが使うアカウントをサービスアカウントと呼ばれます。(正確にはユーザーの servicePrincipalName にサービス名をセットするとサービスカウントになります。)

AD

AD

また、ユーザーのプロパティから、アカウントオプションで、「このアカウントでKerberos AES 256 ビット暗号化をサポートする」にチェックを入れます。

AD

次に Apache 用の Kerberos キータブを作成します。 キータブとは Kerberos プリンシパル (ここでは Apache) の認証情報が入ったファイルです。これを使うことで AD と認証する際、パスワードを入力する必要がなくなります。

C:\Users\Administrator>ktpass -princ HTTP/www.takloose.local@TAKLOOSE.LOCAL -mapuser apache@TAKLOOSE.LOCAL -pass Asspui14 -ptype KRB5_NT_PRINCIPAL -crypto AES256-SHA1 -out httpd.keytab
Targeting domain controller: EC2AMAZ-VORJHOQ.takloose.local
Using legacy password setting method
Successfully mapped HTTP/www.takloose.local to apache.
Key created.
Output keytab to httpd.keytab:
Keytab version: 0x502
keysize 87 HTTP/www.takloose.local@TAKLOOSE.LOCAL ptype 1 (KRB5_NT_PRINCIPAL) vno 2 etype 0x12 (AES256-SHA1) keylength 32 (0xa83ef02a95bbc30e7b020b23edd0f3364c1d355c1ec3d99271b65a95234cd29e)

なお、このコマンドはキータブファイルを作成するだけでなく、サービスプリンシパル名 (HTTP/www.takloose.local@TAKLOOSE.LOCAL) と AD アカウント (apache@TAKLOOSE.LOCAL) を紐づけます。

こうすることで、www.takloose.local をホストするサービスがこのキータブを使って認証することができます。

そして、作成したキータブファイルを Web サーバーに転送します。

INFO

今回は、Windows Server の DNS サービスを使って Web サーバーのドメイン名を解決します。

そのために、DNS サービスで A レコードを追加します。 AD

Linux (Web サーバー) 側の設定

Web サーバーもドメイン参加する必要があります。AD に参加している前提で話を進めます。

必要なパッケージをインストールします。

$ dnf install httpd mod_auth_gssapi

Windows 側で作成したキータブファイルを任意の場所に配置し、適切なパーミッションを設定します。

$ mv httpd.keytab /etc/
$ chmod 400 /etc/httpd.keytab
$ chown apache:apache /etc/httpd.Keytab

Kerberos の設定ファイルを編集し、Kerberos レルム (takloose.local) を使用するように設定します。

/etc/krb5.conf

[libdefaults]
    ...

    default_realm = TAKLOOSE.LOCAL

[realms]
TAKLOOSE.LOCAL = {
    kdc = takloose.local
    admin_server = takloose.local
}

[domain_realm]
.takloose.local = TAKLOOSE.LOCAL
takloose.local = TAKLOOSE.LOCAL

SSO 認証に成功したときのみ表示するページを作成します。

$ mkdir /var/www/html/private
$ vim /var/www/html/private/index.html
$ cat /var/www/html/private/index.html
This is an SSO test page.

Kerberos 認証を使用するよう httpd の設定を行います。

/etc/httpd/conf/httpd.conf

<Location /private>
    AuthType GSSAPI
    AuthName "GSSAPI Single Sign On Login"
    GssapiCredStore keytab:/etc/httpd.keytab
    Require valid-user
</Location>

RHEL 9 の場合、デフォルトで SELinux が有効になっており、Apache がキータブファイルを読み取れないです。

そのため、SELinux コンテキストを変更するか、SELinux を無効化する必要があります。今回は簡単のため SELinux を無効化します。

$ setenforce 0

これで設定は完了です。httpd を再起動し、Kerberos チケットを取得すればアクセスができるはずです。

クライアントからテスト

クライアントも AD に参加していることを前提とします。

curl で SSO 認証するためには —negotiate オプションを付与します。 —negotiate オプションは SPNEGO 認証をするためのオプションです。

TIP

SPNEGO は GSS-API という SSO を実現するためのフレームワークを使用して実装されたプロトコルです。

また、—negotiate オプションを付与する場合、“—user :” オプションもつける必要があるそうです。man page

—negotiate

When using this option, you must also provide a fake -u/—user option to activate the authentication code properly. Sending a ‘-u :’ is enough as the user name and password from the -u option aren’t actually used.

以下の通り、TGT チケットを取得した後、Web サイトにアクセスできていることが確認できます。

$ curl --negotiate --user : http://www.takloose.local/private/
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>401 Unauthorized</title>
</head><body>
<h1>Unauthorized</h1>
<p>This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.</p>
</body></html>
$ kinit user01@TAKLOOSE.LOCAL
Password for user01@TAKLOOSE.LOCAL:
$ curl --negotiate --user : http://www.takloose.local/private/
This is an SSO test page

トラブルシューティング

[auth_gssapi:error] [pid 2809:tid 2881] [client 172.31.110.247:33094] GSS ERROR In Negotiate Auth: gss_accept_sec_context()
failed: [Unspecified GSS failure.  Minor code may provide more information (Request ticket server HTTP/www.takloose.local@TAKLOOSE.LOCAL kvno 5 enctype aes256-cts found in keytab but cannot decrypt ticket)]

うまく認証ができていないことを示しています。キータブファイルに問題がないか、「このアカウントでKerberos AES 256 ビット暗号化をサポートする」にチェックが入ってるか確認してください。

参考サイト: