Spring Security + Kerberos認証+SPNEGOでSSO(2)<ActiveDirectory側の設定>
ユーザ管理、認証を行うActiveDirectory(以下、AD)側の設定について、以下の作業を行います(既にActiveDirectoryインストール済ならユーザ追加から)。
- ADサーバの用意
- ActiveDirectoryのインストール
- クライアント、SSOで認証させたいアプリが稼働しているサーバ(以下、APサーバ)用のADユーザを追加
- APサーバ用のSPN(サービスプリンシパル名)を登録
- APサーバ用のキータブファイルの作成
- (それ以外にDNSの逆引き登録もあるようですが、なくてもSSOはできるようなので省略)
注:ActiveDirectoryで検索すると、「Azure Active Directory」やAWSが提供しているActiveDirectory管理サービスなどがヒットすることがありますが、この記事では素のActiveDirectoryを使う場合について書いていきます。
ADサーバの用意
私はADサーバもクライアントもAPサーバもAWS上に構築しました。
ADサーバは、MarketPlaceからWindows Server 2019 Baseを選択し、インスタンスはt2.large、ストレージはデフォルトのままで作成しました。
(勿論、本番で運用するにはもっと高スペックにする必要があると思います)
セキュリティグループの設定
以下、ADクライアントも含めた「全部のせ」のセキュリティグループ設定(インバウンドのみ)を挙げます。実際の本番運用では各サーバの役割に応じて、アウトバウンドも含めて適切な設定をそれぞれ行う必要があります。
※設定しなくてもいい項目が含まれているかもしれませんが、ご了承ください。
許可項目 | プロトコル | ポート番号 | 許可対象 |
---|---|---|---|
NTP | UDP | 123 |
同サブネット |
RPC | UDP | 135 |
同サブネット |
RPC | TCP | 135 |
同サブネット |
ICMP(ping) | ICMP | すべて |
同サブネット |
LDAP | TCP | 389 |
同サブネット |
LDAP | UDP | 389 |
同サブネット |
LDAPS | TCP | 636 |
同サブネット |
DNS | UDP | 53 |
同サブネット |
DNS | TCP | 53 |
同サブネット |
Kerberos-kdc-admin | TCP | 749 |
APサーバ |
Kerberos-kdc | TCP | 88 |
APサーバ |
Kerberos認証 | TCP | 464 |
同サブネット |
RDP(内部) | TCP | 3389 |
同サブネット |
RDP(作業PC) | TCP | 3389 |
作業環境のグローバルIP |
rpc動的ポート | TCP | 1024~65535 |
同サブネット |
Netlogon | UDP | 137-138 |
同サブネット |
Netlogon | TCP | 139 |
同サブネット |
グローバルカタログ | TCP | 3268-3269 |
同サブネット |
smb | TCP | 445 |
同サブネット |
smb | UDP | 445 |
同サブネット |
RSync | TCP | 873 |
同サブネット |
ActiveDirectoryのインストール
インストール手順は色々なところで紹介されていますので、「ActiveDirectory インストール」と検索すれば、わかりやすい手順が紹介されているはず。
私は以下のブログを参考にさせていただきました。
REMSYSTEM:Windows Server 2019でActive Directoryをインストールする手順
ここでドメイン名を決めておく必要があります。
この記事では、検証用のドメイン名として、「KK.EXAMPLE.COM」というドメイン名をつけています。
APサーバ(以下、サーバ)用のADユーザを追加
起動したWindows Serverにリモートデスクトップでログインし、「Windows管理ツール」から「ActiveDirectory ユーザとコンピュータ」を選択。
「Users」下に新しいユーザを追加(ここではkrb5-testと命名)。
あくまでAPサーバが使うユーザなのでリモートデスクトップ接続の権限設定は不要です。
次にKerberos認証にでSSOを行う際に必須となる、SPNの登録とkeytabの発行を行います。
SPNの登録手順は以下の通りです。
- コマンドプロンプトをたちあげ(多分PowerShellでも可)、カレントディレクトリはどこでもいいので以下のコマンドを実行。
-
setspn -a HTTP/XXXXX.XXX.XXX krb5-test
- XXXXX.XXX.XXXはAPサーバのDNS名が入ります。AWSで構築している場合、「プライベートIP v4 DNS」と書かれている名前などがそのまま使えます。
- 以下のコマンドで登録内容を確認できます。
-
setspn -l account name
- "krb5-test"は↑で追加したADユーザに読み替えてください。
続いてkeytabファイルの発行
- 同じくコマンドプロンプトを立ち上げ、以下のコマンドを実行。
-
ktpass /princ HTTP/XXXXX.XXX.XXX@KK.EXAMPLE.COM /mapuser krb5-test@KK.EXAMPLE.COM /pass ******** /out krb5.keytab /crypto all /ptype KRB5_NT_PRINCIPAL /mapop set
- XXXXX.XXX.XXX部分にはsetspnしたときと同じ名前が入ります。
- /mapuser、/passには追加したADユーザのログオン名(ドメイン名部分は大文字)、パスワードを入力してください。
- 特にパスを指定しなければkeytabファイルはカレントディレクトリに出力されるため、別のところに出力したい場合は/outの内容を任意のパスに書き換えます。
出力したkeytabをAPサーバにアップロードしておきます。
テスト時のADクライアント用のADユーザを追加
先ほどのAPサーバ用のADユーザと同様の手順でADユーザを追加します。
このままでは、この作成したADユーザでADクライアントPCにリモートデスクトップ接続できないため、以下の設定を行ってリモートデスクトップ接続を許可します。
- Windows管理ツール>ActiveDirectoryユーザとコンピュータ
- 左側のペイン上に表示されている、作成したドメイン名下の「Build In」というフォルダをクリック
- グループ名が表示されるので、その中の「Remote Desktop Users」を選択
- 「メンバー」タブを選択し、「追加」ボタンを押下
- 「選択するオブジェクト名を入力してください」と書かれているテキストエリアに、作成したADユーザを入力し、OKボタンを押下
- これでADユーザにリモートデスクトップ権限が割り当てられます。