windowsログインで認証されたのなら、webサービスへのログインはスルーしてほしいものです。

webサービスごとにログインアカウント/パスワードなんて覚えてられません。面倒以外何物でもない。

ここではSSOをapache webにも適用したいと思います。

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 ~]#

keytabファイル

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のインストール

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
  • まずはドメインに参加済みのPCで、ドメインユーザでアクセスしてみる
    通常ページは下記の様に当然ながらOK
    2015y12m23d_140446373.png
    アクセスログは下記になる。*192.168.0.47はクライアント
    192.168.0.47 - - [23/Dec/2015:14:14:21 +0900] "GET / HTTP/1.1" 200 11
    次に、sso有効のページにアクセスするとそのまま表示される。
    2015y12m23d_141008765.png
    ログには誰が認証されたのかが残る
    192.168.0.47 - illya@SYBYL.LOCAL [23/Dec/2015:14:16:34 +0900] "GET /private/ HTTP/1.1" 200 33
  • ドメインに参加していないPCからアクセスすると、
    通常ページは問題なく表示されるものの、sso有効のページにアクセスすると
    2015y12m23d_142109599.png
    となる。
    ログには
    192.168.0.10 - - [23/Dec/2015:14:20:13 +0900] "GET /private/ HTTP/1.1" 401 381
    と記述される
  • mod_auth_kerbの設定ファイルを調整して認証画面を表示させる
    ドメイン以外のユーザにも認証が通れば利用させたいので、認証画面を表示させるようにします
    [root@sso ~]# vi /etc/httpd/conf.d/auth_kerb.conf
    (略)
     - KrbMethodK5Passwd Off
     + KrbMethodK5Passwd On
    (略)
    [root@sso ~]# systemctl restart httpd
    そして、再度sso有効のページにアクセスすると認証が求められます。そこでドメインのユーザとパスワードを入力します。
    2015y12m23d_143138396.png
    これで認証が通ると
    2015y12m23d_143403676.png
    となる。
    ログには
    192.168.0.10 - illya@SYBYL.LOCAL [23/Dec/2015:14:31:40 +0900] "GET /private/ HTTP/1.1" 200 33
    と記述される。php言語で$_SERVERの中身を調べると
    $_SERVER['REMOTE_USER'] => illya@SYBYL.LOCAL
    $_SERVER['AUTH_TYPE'] => Basic
    $_SERVER['PHP_AUTH_USER'] => illya
    $_SERVER['PHP_AUTH_PW'] => xxxxxxxxxxxxxxx
    がsso有効のページで追加されていた。これらを拾えばSSOな連携のとれたアプリが作れるのかも。

Firefox

ブラウザ依存で動かないときがある。特にFirefoxの場合。
ブラウザで「about:config」を開き、SSOサイトのURLを登録する必要があります。
登録する箇所は

  • network.negotiate-auth.trusted-uris
  • network.automatic-ntlm-auth.trusted-uris

のどちらかに。
下図のような感じで、「値」にアクセスしようとしているURLをカンマ(,)区切りで複数指定します。
ここでは「sso.sybyl.local」と「sso」でアクセスしえるので「http://sso,http://sso.sybyl.local」としている。
2017y08m11d_155717730.png

アクセス制限

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>

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2017-08-11 (金) 16:39:50 (72d)