スタンドアローンのADFSを作成する方法の手順を確認します。Microsoftの以下公式手順を参考に確認していきます。
環境
利用するWindowsサーバーは2019です。
- Active Directory Domain Service
- Windows Server 2019
- Active Directory Federation Service
- Windows Server 2019
Domain Serviceは既に作成されているものとして、本手順は記載しています。
構成
今回作成するADFS環境のイメージ図です。環境はAWSを利用しています。
KdsRootKeyの作成
Kds(Key Distribution Service)RootKey
とは、Federation Serviceの管理アカウントとなるActive Directoryの グループ管理サービスアカウント(gMSA)
で利用される鍵情報となります。
全く意味不明だったのですが、下記のMicrosoft MVPの方のブログが大変参考になりました。
グループ管理サービスアカウントとは、Active Directoryのサービスを管理するアカウントの概念のようです。
グループ管理サービスアカウント(以下、gMSA)とは、複数のサーバーで利用可能なサービスアカウントのことで、複数のサーバーで動かすサービスに共通のサービスアカウントを使いたいときに使用します。
これまでマイクロソフトでは、LocalSystem、LocalService、NetworkServiceのようなデフォルトで用意されるサービスアカウントや、[Active Directoryユーザーとコンピューター]から定義できるサービスアカウントなどがありました。
しかし、こうしたサービスアカウントとgMSAが決定的に異なるのは、gMSAを利用できるサーバーを限定できる点にあります。
そして、KdsRootKeyとは、そのグループ管理サービスアカウントで利用されるパスワードの生成に利用されているらしいです。
KDSとはKey Distribution Serviceの略で、gMSAのパスワードを生成するために使われるサービスです。gMSAの設定方法を見るとわかると思うのですが、サービスアカウントのパスワードは自分で設定することはなく、Active Directoryによって自動的にパスワードを生成します。このとき、パスワードは完全にランダムに作られるわけではなく、KDSによって作られたカギ(KdsRootKey)を使って作られます。
KdsRootKeyは通常事前に作成されていないため、今後作業のために作成しておきます。Active Directory ドメインコントローラーにAdmin権限にてログインします。
以下のPowershellを実行して作成します。
> Add-KdsRootKey -EffectiveTime ((Get-Date).Addhours(-10))
確認のコマンド。
> Get-KdsRootKey AttributeOfWrongFormat : KeyValue : {87, 239, 163, 201...} EffectiveTime : 2020/04/04 20:42:04 CreationTime : 2020/04/05 6:42:04 IsFormatValid : True DomainController : CN=EC2AMAZ-9SJ2Q34,OU=Domain Controllers,DC=example,DC=com ServerConfiguration : Microsoft.KeyDistributionService.Cmdlets.KdsServerConfiguration KeyId : e87f804a-a8e9-041e-79a1-5b4976072d88 VersionNumber : 1
Federation Serverをドメインに参加
Federation Serviceを作成するWindowsサーバー(Federation Server)をActive Directoryドメインに参加させます。今回は、併せてWindows Firewallの設定も外してしまいます。
サーバー証明書の作成
ADFSはADDS内の情報を外部に連携するため、内部的に443/TCPのWEBサイトを作成するのですが、このサーバー証明書はそのWEBサイトで利用するものです。本来であれば、ちゃんとした認証局により発行された証明書を利用すべきですが、今回は自己署名証明書で済ませてしまいます。
Windowsにおける自己署名証明書の作成手順はこちら。pfx形式の証明書を作成しておきます。
作成する証明書に関して、MSマニュアルには以下とあるのですが、
サブジェクトの別名には、enterpriseregistrationの値が含まれている必要があります。
色々なサイトを見ると、Office365にアクセスするために必要な設定であるだけで、単純なADFSの動作では不要のようです。
ADFSサーバーにデバイス登録するために、Workplace Joinを利用するには、enterpriseregistration.<ドメイン名>という名前がSubject Alternative Name (SANs) に含まれる証明書を用意する必要があったため、証明書取得の敷居が高いという課題がありました。
Federation Serviceの役割をインストールする
Federation ServerにあたるWindowsサーバーに、Federation Serviceをインストールします。ドメインAdminのユーザーにてログインし、 役割と機能の追加
のウィザードを起動します。
役割ベースまたは機能ベースのインストール
を選択します。
Federation Serviceをインストールしたいサーバー(今ログインしているサーバー)を選択します。
Active Directory Federation Services
を選択します。
機能のページでは追加で何か設定する必要ありません。
説明が書いてあるだけなので、ここもそのまま 次へ
を選択。
必要に応じて対象サーバーを自動的に再起動する
にチェックを入れて、インストールを開始します。
インストールできました。
Federation Serviceを設定する
続いて、Federation Serviceを設定します。サーバーマネージャーに通知が届いているはずですので、 このサーバーにフェデレーションサービスを構成します。
をクリックします。
フェデレーションサーバーファームに最初のフェデレーションサーバーを作成します
を選択します。
ここは構成の設定を実施するユーザーを指定するだけなので、現在ログインしているドメインAdminのユーザーのままでOKです。
インポート
から、事前に用意したpfx形式のサーバー証明書をインポートします。 フェデレーションサービス表示名
は、利用者がADFSのSSO画面にアクセスした時に表示される文字列となります。
グループ管理サービスアカウントを作成します
を選択し、適当なアカウント名を設定します。ここが前述のgMSAの部分となります。
Windows Internal Databaseを使用してサーバーにデーターベースを作成します。
を選択します。
Federation Serverを複数台作成して、そのレプリケーションを実施する場合、何らかのデータストアが必要になるようです。利用できるもとして、Windows同梱の Windows Internal Database(WID)
か、SQLServerを利用できるようです。両者の要件の違いはこちらで確認できます。
どのタイプの AD FS 構成データベースを使用するかを決定する
確認画面です。
前提条件の確認画面です。表示されている警告を考慮して、前述の Add-KdsRootKey
コマンド実行時に、 -EffectiveTime ((Get-Date).Addhours(-10))
パラメーターを付与して実行しています。
諸々警告が表示されていますが問題ありません。Federation ServerのOS再起動を実施して、Federation Serverの設定は完了です。
正しく設定できているかどうかは、Windowsイベントユーアーより確認できます。 アプリケーションとサービスログ
-> ADFS
-> Admin
とすすんで、イベントID100のログが出力されている事を確認します。
DNSコンテンツサーバーにレコードの登録
Federation ServerのIPアドレスを、DNSレコードとして登録します。サーバー証明書を作成する際に、コモンネームを設定しているはずですので、FQDNを合わせてあげてください。
企業 DNS をフェデレーション サービスと DRS 用に構成する
ADFSの動作確認
登録したFederation ServerのURLにアクセスしてみて、レスポンスが返るかどうか確認します。アクセス先URLは https://(Federation Server)/adfs/fs/federationserverservice.asmx
となります。
$ curl -k https://adfs.goodbyegangster.com/adfs/fs/federationserverservice.asmx <?xml version="1.0" encoding="utf-8"?> ... </wsdl:definitions>
今回は自己署名証明書を利用しているため、証明書のエラーが出るかもしれませんが、レスポンスが帰ってくるはずです。