windowsログインで認証されたのなら、webサービスへのログインはスルーしてほしいものです。
webサービスごとにログインアカウント/パスワードなんて覚えてられません。面倒以外何物でもない。
ここではSSOをapache webにも適用したいと思います。
kickstartを使って自動で最小構成のマシンを作成した
既にドメインに参加済みで krb5.keytab ファイルは下記のようになっている
[root@sso ~]# klist -ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
2 host/sso.sybyl.local@SYBYL.LOCAL (des-cbc-crc)
2 host/sso.sybyl.local@SYBYL.LOCAL (des-cbc-md5)
2 host/sso.sybyl.local@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 host/sso.sybyl.local@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 host/sso.sybyl.local@SYBYL.LOCAL (arcfour-hmac)
2 host/SSO@SYBYL.LOCAL (des-cbc-crc)
2 host/SSO@SYBYL.LOCAL (des-cbc-md5)
2 host/SSO@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 host/SSO@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 host/SSO@SYBYL.LOCAL (arcfour-hmac)
2 SSO$@SYBYL.LOCAL (des-cbc-crc)
2 SSO$@SYBYL.LOCAL (des-cbc-md5)
2 SSO$@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 SSO$@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 SSO$@SYBYL.LOCAL (arcfour-hmac)
[root@sso ~]#
SSO向けとして、keytabファイルに追加でサービス記述子が「HTTP」のサービスプリンシパルを加えます。
ドメインコントローラにて作業します
[root@c ~]# /opt/samba/bin/samba-tool spn list sso$
sso$
User CN=SSO,CN=Computers,DC=sybyl,DC=local has the following servicePrincipalName:
HOST/SSO
HOST/sso.sybyl.local
[root@c ~]#
これに「HTTP」を加える
[root@c ~]# /opt/samba/bin/samba-tool spn add HTTP/sso.sybyl.local sso$
[root@c ~]# /opt/samba/bin/samba-tool spn list sso$
sso$
User CN=SSO,CN=Computers,DC=sybyl,DC=local has the following servicePrincipalName:
HOST/SSO
HOST/sso.sybyl.local
HTTP/sso.sybyl.local
[root@c ~]#
次に、ssoサイトに戻って、既存のkrb5.keytabファイルを除いて、krb5.keytabを新調する
[root@sso ~]# mv /etc/krb5.keytab /etc/krb5.keytab.orig
[root@sso ~]# /usr/bin/net ads keytab create -Uadministrator%<adのパスワード>
[root@sso ~]# klist -ke
Keytab name: FILE:/etc/krb5.keytab
KVNO Principal
---- --------------------------------------------------------------------------
2 host/sso.sybyl.local@SYBYL.LOCAL (des-cbc-crc)
2 host/sso.sybyl.local@SYBYL.LOCAL (des-cbc-md5)
2 host/sso.sybyl.local@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 host/sso.sybyl.local@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 host/sso.sybyl.local@SYBYL.LOCAL (arcfour-hmac)
2 host/SSO@SYBYL.LOCAL (des-cbc-crc)
2 host/SSO@SYBYL.LOCAL (des-cbc-md5)
2 host/SSO@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 host/SSO@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 host/SSO@SYBYL.LOCAL (arcfour-hmac)
2 http/sso.sybyl.local@SYBYL.LOCAL (des-cbc-crc)
2 http/sso.sybyl.local@SYBYL.LOCAL (des-cbc-md5)
2 http/sso.sybyl.local@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 http/sso.sybyl.local@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 http/sso.sybyl.local@SYBYL.LOCAL (arcfour-hmac)
2 http/SSO@SYBYL.LOCAL (des-cbc-crc)
2 http/SSO@SYBYL.LOCAL (des-cbc-md5)
2 http/SSO@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 http/SSO@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 http/SSO@SYBYL.LOCAL (arcfour-hmac)
2 SSO$@SYBYL.LOCAL (des-cbc-crc)
2 SSO$@SYBYL.LOCAL (des-cbc-md5)
2 SSO$@SYBYL.LOCAL (aes128-cts-hmac-sha1-96)
2 SSO$@SYBYL.LOCAL (aes256-cts-hmac-sha1-96)
2 SSO$@SYBYL.LOCAL (arcfour-hmac)
[root@sso ~]#
これでhttpの入ったサービスプリンシパルが用意できた
*サービス記述子の大文字(HTTP)と小文字(http)の使い分けに注意
apache httpのパッケージの他、kerberos認証のパッケージ(mod_auth_kerb)もインストールします
[root@sso ~]# yum install httpd mod_auth_kerb
mod_auth_kerbの設定ファイル(auth_kerb.conf)を作って、webサイトの一部分をsso部分にしてみます。
[root@sso ~]# vi /etc/httpd/conf.d/auth_kerb.conf
<Directory /var/www/html/private>
# SSLRequireSSL
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd Off
KrbAuthRealms SYBYL.LOCAL
KrbServiceName http/sso.sybyl.local
Krb5KeyTab /etc/krb5.keytab
require valid-user
</Directory>
[root@sso ~]#
keytabファイルはapache稼働ユーザが参照できるようにパーミッションを変更する
ACLで変更した
[root@sso ~]# cd /etc
[root@sso etc]# getfacl krb5.keytab
# file: krb5.keytab
# owner: root
# group: root
user::rw-
group::---
other::---
[root@sso etc]#
[root@sso etc]# setfacl -m u:apache:r krb5.keytab
[root@sso etc]# getfacl krb5.keytab
# file: krb5.keytab
# owner: root
# group: root
user::rw-
user:apache:r--
group::---
mask::r--
other::---
[root@sso etc]#
そして、稼働させます。
[root@sso ~]# systemctl start httpd
[root@sso ~]# systemctl enable httpd
*journalctl -u httpdにて動作確認をします
極めて簡単なコンテンツを用意してテストしてみます。
[root@sso ~]# echo "It's work." > /var/www/html/index.html
[root@sso ~]# mkdir /var/www/html/private
[root@sso ~]# echo "now kerberos authentication work" > /var/www/html/private/index.html
192.168.0.47 - - [23/Dec/2015:14:14:21 +0900] "GET / HTTP/1.1" 200 11
192.168.0.47 - illya@SYBYL.LOCAL [23/Dec/2015:14:16:34 +0900] "GET /private/ HTTP/1.1" 200 33
192.168.0.10 - - [23/Dec/2015:14:20:13 +0900] "GET /private/ HTTP/1.1" 401 381
[root@sso ~]# vi /etc/httpd/conf.d/auth_kerb.conf
(略)
- KrbMethodK5Passwd Off
+ KrbMethodK5Passwd On
(略)
[root@sso ~]# systemctl restart httpd
192.168.0.10 - illya@SYBYL.LOCAL [23/Dec/2015:14:31:40 +0900] "GET /private/ HTTP/1.1" 200 33
$_SERVER['REMOTE_USER'] => illya@SYBYL.LOCAL
$_SERVER['AUTH_TYPE'] => Basic
$_SERVER['PHP_AUTH_USER'] => illya
$_SERVER['PHP_AUTH_PW'] => xxxxxxxxxxxxxxx
ブラウザ依存で動かないときがある。特にFirefoxの場合。
ブラウザで「about:config」を開き、SSOサイトのURLを登録する必要があります。
登録する箇所は
のどちらかに。
下図のような感じで、「値」にアクセスしようとしているURLをカンマ(,)区切りで複数指定します。
ここでは「sso.sybyl.local」と「sso」でアクセスしえるので「http://sso,http://sso.sybyl.local」としている。
SSOで既にユーザに対するアクセス制限があるようなものであるが、
特定のサイトからのみアクセスを許可する制限も加えてみたいとする
単に
<Directory /var/www/html/private>
AuthType Kerberos
AuthName "Kerberos Login"
KrbMethodNegotiate On
KrbMethodK5Passwd Off
KrbAuthRealms SYBYL.LOCAL
KrbServiceName http/sso.sybyl.local
Krb5KeyTab /etc/krb5.keytab
require valid-user
require ip 192.168.0.0/24
require all denied
</Directory>
とすると、認証が掛からない。192.168.0.0/24のマシンでアクセスなら全て許可されてしまう。
そのため $_SERVER['PHP_AUTH_USER'] の値も取れません。
っでどうするかになるのだが、一応Allow/Denyで対応できた
<Directory /var/www/html/private>
(略)
require valid-user
Order Deny,Allow
Allow from 192.168.0.
Deny from all
Satisfy all
</Directory>
krb5_get_init_creds_password() failed: Client not found in Kerberos database