SPSS Modeler で、シングルサインオンを構成する際の気づきまとめ

SPSS Modeler でシングルサインオンを実現するには、SPSS Modeler のマニュアルに記載してある通りにすれば、実行可能です。
ただ、ケアレスミスをした場合に、どこに問題があったか突き止めるのは、それなりに大変です。
今回は、自身がはまってしまったことや、切り分けに使用した方法などをメモしておきます。


# そもそも Modeler Server にログインできない
ユーザーがドメインに登録されていても、Client から Modeler Server にログインできないケースがあります。
これは、Modeler Server が稼働している Windows Server のローカルセキュリティポリシーの設定に原因がある可能性があります。
ローカルセキュリティポリシーのローカルログインを許可するユーザーには、管理者グループやサーバーオペレーターグループに登録されているユーザーなどに限定されています。
Windows 管理者に依頼して、当該ユーザーがログインできるように設定変更を依頼してください。

# SPSS Modeler クライアントの Windows での設定ミス

マニュアルには、Windows Client 側でレジストリーの編集が必要と書いてあります。
regedit コマンドを起動し、kerberos の階層に移動し、マニュアルに書いてあるレジストリー名 ( allowtgtsessionkey )をコピーして、値に 0x1 を登録すれば良いように思えますが、どうやら落とし穴があるようです。
マニュアルから、コピーをすると、allowtgtsessionkey の後ろに、" "(半角スペース)が入ってしまいます。
これが原因で、設定が有効にならなかったようです。
※あくまでも実機確認でのコメントです。windows のレジストリに詳しい方がいらっしゃったらコメントください。


##  allowtgtsessionkey が機能しているか否かの確認方法

klist tgt コマンドを実行します。Session Key の "KeyLength 32" が 0 で無ければ有効です。 0 の場合は、レジストリが正しいか確認してください。

```
klist tgt

Current LogonId is 0:0x476bf5d

Cached TGT:

ServiceName        : krbtgt
TargetName (SPN)   : krbtgt
ClientName         : kanao
DomainName         : TWO.DOMAIN.LOCAL
TargetDomainName   : TWO.DOMAIN.LOCAL
AltTargetDomainName: TWO.DOMAIN.LOCAL
Ticket Flags       : 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Session Key        : KeyType 0x12 - AES-256-CTS-HMAC-SHA1-96
                   : KeyLength 32 - 5b 6d 48 36 82 69 6f f5 0b 2e 07 0f 3e 86 3d d0 1a 48 14 09 94 34 28 08 58 f6 e6 cb 1d 0f eb 87
.
.
.
.
.

```

# krb5.conf の設定の確認
krb5.conf については、MIT のマニュアルを参照とあるだけなので、正しい記述をするのは結構ハードな気がします。

既に、ADが構成されている環境の情報を集めるだけであれば、ドメインユーザーでログイン後、参照すべき kdc の情報 "Kdc Called: ... " を参照することは可能です。

```
klist

Current LogonId is 0:0x476bf5d

Cached Tickets: (2)

#0>     Client: kanao @ TWO.DOMAIN.LOCAL
        Server: krbtgt/TWO.DOMAIN.LOCAL @ TWO.DOMAIN.LOCAL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0xXXXXXXXX -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: 12/7/2020 5:45:29 (local)
        End Time:   12/7/2020 15:45:29 (local)
        Renew Time: 12/14/2020 5:45:29 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called: server22.two.domain.local

#1>     Client: kanao @ TWO.DOMAIN.LOCAL
        Server: LDAP/server22.two.domain.local/two.domain.local @ TWO.DOMAIN.LOCAL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0xXXXXXXXX -> forwardable pre_authent ok_as_delegate name_canonicalize
        Start Time: 12/7/2020 5:45:29 (local)
        End Time:   12/7/2020 15:45:29 (local)
        Renew Time: 0
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0
        Kdc Called: server22.two.domain.local

```

上記の情報を元に作成した krb5.conf のサンプルは以下の通り。

```
[libdefaults]
     default_realm = TWO.DOMAIN.LOCAL
     dns_lookup_kdc = true
     dns_lookup_realm = true

[realms]
     TWO.DOMAIN.LOCAL = {
          kdc = server22.two.domain.local:88
          admin_server = server22.two.domain.local:749
          default_domain = two.domain.local
     }

[domain_realm]
     .two.domain.local = TWO.DOMAIN.LOCAL
     two.domain.local = TWO.DOMAIN.LOCAL
```

このように、同じ AD ドメインでのシングルサインオンであれば、最低限の情報は収集できます（普通にサーバー管理者に聞けば良い話ではある）。


# サービスプリンシパル名の確認する
マニュアルの記載通りに実施しているのであれば、setspn コマンドで、
SPSS Modeler Server 側のサービスプリンシパル名をドメインコントローラーに登録しているはずです。
Modeler Client が導入されている Windows PC から、サービスプリンシパル名にアクセスできるか確認するコマンドは以下の通りです。

klist get <サービスプリンシパル名>
以下に実行例を示します。
※管理者権限が必要です。

```
klist get modelerserver/server22.two.domain.local:28058

Current LogonId is 0:0x48012eb
A ticket to modelerserver/server22.two.domain.local:28058 has been retrieved successfully.

Cached Tickets: (2)

#0>     Client: wnobu @ TWO.DOMAIN.LOCAL
        Server: krbtgt/TWO.DOMAIN.LOCAL @ TWO.DOMAIN.LOCAL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0xXXXXXXXX -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: 12/7/2020 6:03:29 (local)
        End Time:   12/7/2020 16:03:29 (local)
        Renew Time: 12/14/2020 6:03:29 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called: server22.two.domain.local

#1>     Client: wnobu @ TWO.DOMAIN.LOCAL
        Server: modelerserver/server22.two.domain.local:28058 @ TWO.DOMAIN.LOCAL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0xXXXXXXXX -> forwardable pre_authent ok_as_delegate name_canonicalize
        Start Time: 12/7/2020 6:03:29 (local)
        End Time:   12/7/2020 16:03:29 (local)
        Renew Time: 0
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0
        Kdc Called: server22.two.domain.local

```
Windows のコマンドプロンプトから実行して正常に終了すれば、ドメインコントローラーやサーバー側の設定は問題ないことになります。


# SPSS Modeler Client 側の確認
サービスプリンシパル名が正しく設定されているのに、Modeler Client からつながらないケースがあります。
この場合は、Modeler Client のログファイルを確認します。

C:\ProgramData\IBM\SPSS\Modeler\XX.X\log フォルダにある client_logging.log を参照します。
シングルサインオンしを試行すると、principal - .... の記述がログに書き出されます。
※なお、クライアントのログは、DEBUG 情報が取得できるようにします。

```
2020-12-02 05:56:38,643 [Thread-12] DEBUG com.spss.kerberos.client.internal.SsoClientImpl$ClientInitialAction  - principal = modelerserver/server22.two.domain.local:28058@TWO.DOMAIN.LOCAL
```
この例では、

```
principal = modelerserver/server22.two.domain.local:28058@TWO.DOMAIN.LOCAL
```
となっています。
この行に書かれているサービスプリンシパル名が、正しいかを確認してください。
Modeler Client 側で設定できる箇所は、以下の通りです。
![Server_Login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13492/ce3ba262-c45f-468a-a48b-22e81bb29676.png)

設定可能なものは、ホスト名とポート番号ですが、これらの値を元に、サービスプリンシパル名を生成しているようです。
サービスプリンシパル名 = "modelerserver/" + "ホスト名" + "ポート番号" + "@" + "レルム名"
なお、"レルム名"は、krb5.conf ファイルにある、default_realm  で指定した名前になります。
※クロスレルムの環境の場合は、SPSS modeler Server が稼働しているレルム名を指定すれば良いです。
※ただし、Modeler Server が複数のレルム上で稼働し、切り替えて接続したい場合は、都度、default_realm を書き換える必要があるので、そのような運用は現実的ではないでしょう。
そこは、おとなしく、通常の認証でログインする運用にすべきでしょう。

## ログに記載されたプリンシパル名と、Modeler Client 側の設定が異なる場合
正しい設定を Modeler Client 側に設定しても、log に書かれるプリンシパル名が異なる場合、以下のファイルをご確認ください。

```
C:\Windows\System32\drivers\etc\hosts
```

hosts ファイルに記載している IP アドレスとホスト名が Modeler Client で設定しているホスト名と異なる場合
例えば、 FQDN が aaaa.domain.local であるサーバーに対して hosts で、aaaa と指定している場合、
プリンシパル名が、aaaa として、解釈されてしまう。

これだと、Modeler Client の設定が正しくても、リクエストに使用するサービスプリンシパル名が正しくない（ドメインコントローラーに設定されていない）ので、シングルサインオンを行うことは出来ません。

対応策としては、以下のいずれかになります。
1. hosts の中身を FQDN にする。
2. ドメインコントローラーに登録するサービスプリンシパル名を aaaa などにする