ADFSトレーニングテキスト全文公開チャレンジ(5) – ADFSのインストール(前編)

皆さんこんにちは。国井です。
Advent Calendar風にお届けしてきたADFSトレーニングテキスト全文公開チャレンジですが、しっかり土日は公開せずにお休みさせていただきました。
週も明けて改めて続きを公開していきます。今回はADFSサーバーのインストールと必要な要素についてです。

■ ■ ■

スライド30

ADFS のインストールを行うときには、次のステップで実装します。

■認証局環境の実装
前のページで解説した 3 種類の証明書が利用できるよう、環境を整えます。

■データベースの準備
ADFS のデータベースには、OS 標準で用意されている WID (Windows Internal Database) または SQL Server を利用できます。SQL Server を利用する場合には、ADFS サーバーをインストールする前にインストールしておかなければなりません。

■サービスアカウントの作成
ADFS サービスを実行するためのサービスアカウントを用意します。ADFS ではグループの管理されたサービスアカウントを利用することを推奨しており、事前に作成しておくことをお勧めします。

■ADFS のインストール
Windows Server 2016 の [役割と機能の追加] から ADFS を追加します。ADFS の役割の追加後に実行可能な [フェデレーション サービスの構成] を実行し、ADFS の初期設定を行います。

■フェデレーションサービス名の構成
ADFS の名前を意味するフェデレーションサービス名は ADFS サーバーのインストールと共に自動的に設定されますが、必要に応じて変更します。


スライド31

ADFS で利用する証明書を実装するときには、以下の点に注意してください。

■証明書の名前をフェデレーションサービス名と同じにする
SSL による通信を行う際、クライアントコンピューターは SSL 通信を行うホスト名として、フェデレーション サービス名 (ADFS サーバー名ではない!) を指定します。そのため、SSL 通信を行うための証明書をはじめ、ADFS サーバーで使用する、すべての証明書はフェデレーションサービス名と一致している必要があります。

■証明書の発行要求や入れ替えに IIS は利用できない
Windows Server 2012 R2の ADFS サーバーより、IIS を伴わずに ADFS がインストールされるようになりました。そのため、SSL 証明書は IIS 管理ツールからインストールしたり、証明書の発行要求を行ったり、入れ替えをしたり、することができません。

証明書のインストールと入れ替えには ADFS 管理ツールを使用します。また、証明書の発行要求には別のサーバーにインストールされた IIS を利用するか、certreq.exe コマンドを利用する方法が一般的です。

・certreq.exeによる証明書発行要求 (CSR) の作成
Certreq.exe -new certreq.inf certreq.csr

・certreq.exeによる証明書の作成
Certreq.exe -accept certreq.cer

■証明書の有効期間に伴う証明書の書き換え (トークン署名証明書)
証明書には有効期間があります。有効期間が近づいたら書き換えを行い、期限切れにならないように構成します。トークン署名証明書には、既定で自己署名証明書が使われており、証明書の有効期間は Get-ADFSProperties コマンドレットによって 365日に設定されています。そして、365日後に ADFS が利用できなくなることを防ぐため、ADFS サーバーではロールオーバーと呼ばれる機能を実装し、有効期間が近づいたら証明書の書き換えを行い、証明書の延長を行います。ところが、証明書の書き換えには異なる証明書の鍵を利用して行われるため、フェデレーションメタデータに記載された鍵情報が変わってしまい、結果としてフェデレーション メタデータの再発行をしなければなりません

このような問題を解決するためには、2 つの方法があります。
ひとつは、商用認証局から発行された証明書を利用することです。トークン署名証明書にはSSL 証明書と同じ証明書を利用することができるため、SSL 証明書の入れ替えのタイミングでトークン署名証明書を入れ替えるように運用することができます。また、商用認証局の証明書は同じ鍵で証明書の延長ができるというメリットがあります。

もうひとつは、Set-ADFSProperties コマンドレットで証明書の有効期間を長く設定することです。次のコマンドレットを実行することで、有効期間を 10 年に延ばすことが可能です。

Set-ADFSProperties -CertificateDuration 3650
Update-ADFSCertificate –Urgent

■証明書の有効期間に伴う証明書の書き換え (SSL 証明書)
トークン署名証明書と同じく、SSL 証明書にも有効期間があり、有効期間が近づいたら書き換えを行います。SSL 証明書には公的な認証局から発行された証明書を利用するため、一般には証明書の鍵を書き換えずに有効期間だけを書き換えることができます。このことはフェデレーションメタデータの再発行を必要しないことを意味します。
一方、SSL 証明書にはトークン署名証明書のようなロールオーバー機能がないため、手動で書き換えを行わなければなりません。書き換え操作は新しい証明書を ADFS サーバーにインストールした後、それぞれの ADFS サーバーで次のコマンドレットを Windows PowerShell から実行します。

Get-ChildItem cert:\LocalMachine\My | fl
#1 台目の ADFS サーバーでの実行コマンドレット
Set-AdfsSslCertificate -Thumbprint <Thumbprint>
#2 台目以降の ADFS サーバーでの実行コマンドレット
Set-AdfsCertificate -CertificateType Service-Communications `
-Thumbprint <Thumbprint>
Restart-Service adfssrv –Force

<Thumbprint> 欄には Get-ChildItem cert:\LocalMachine\My | fl コマンドレットで確認した、新しい証明書の Thumbprint の値が入ります。
一方、Web アプリケーションプロキシでは、新しい証明書をインストールした後、それぞれのサーバーで次のコマンドレットを Windows PowerShell から実行します。

Get-ChildItem cert:\LocalMachine\My | fl
Set-WebApplicationProxySslCertificate -Thumbprint <Thumbprint>
Get-WebApplicationProxyApplication | `
Set-WebApplicationProxyApplication `
-ExternalCertificateThumbprint <Thumbprint>

Certreq.exe で使用する要求ファイルの作成

Certreq.exe で CSR を作成するためには CSR に含まれる内容を事前に inf ファイルとして作成しておく必要があります。inf ファイルはメモ帳を開いて、以下のような書式で記述します。

[NewRequest]
Subject = “C=JP,ST=Tokyo,L=Shinagawa-ku,O=adfs,CN=fs1.adfs.jp”
Exportable = TRUE
KeyLength = 2048
MachineKeySet = TRUE
SMIME = FALSE

認証局によって、決められた記述方法を定義している場合があります。詳しくは認証局にお問い合わせください。

証明書の入れ替え時のエラー

上記の方法によって証明書の入れ替えても、Office 365の一部サービスでは証明書入れ替えが正しく反映されない場合があります (KB2973873)。
こうした問題には、Windows PowerShell から「netsh http show sslcert」コマンドを使用して設定を反映させます。

Get-ChildItem cert:\LocalMachine\My | fl
netsh
HTTP
DELETE SSLCert IPPORT=0.0.0.0:443
ADD SSLCert IPPORT=0.0.0.0:443 Certhash=<Thumbprint> Appid={5d89a20c-beab-4389-9447-324788eb944a}


スライド32

ADFS サーバーで利用するデータベースには、WID (Windows Internal Database) と SQL Server のいずれかを選択できます。WIDを選択した場合、WID は ADFS サーバーのインストールとともにインストールされるので、事前準備は必要ありません。しかし、SQL Server を利用する場合は ADFS サーバーのインストール中にデータベースを選択するため、SQL Server 自体を事前にインストールしておく必要があります。また、データベースとして WID を選択した場合、SAML Token Replay Detection と SAML Artifact Resolution を利用できない、マスター データベースを持つ ADFS サーバー (最初にインストールした ADFS サーバー) でしか ADFS 管理ツールを利用できない、といった制約があります (ただし、Office 365の実装では使用しません)。

しかし、ADFS サーバーのデータベースに格納される情報は ADFS サーバーの構成情報だけであり、トークンに関わる情報は格納されることはありません。そのため、ADFS 管理ツールから変更を行わなければ、データベースの内容が変更されることもないので、データベースへの I/O を考慮に入れたり、高頻度でのバックアップを行う必要はないでしょう。

データベースサーバーの冗長構成を実装する場合、WID では 2 台以上の WID を利用した ADFS サーバーを実装することで、1 台目の ADFS サーバーが持つ WID データベースから定期的にレプリケーションを行います。一方、SQL Server を利用する場合、SQL Server 自身で利用可能な冗長構成を活用します。


スライド33
既定では、ADFS サーバーのサービスを実行するためのサービス アカウントにグループの管理されたサービス アカウントを使用します。グループの管理されたサービスアカウントは複数のサーバーで共通のサービスアカウントを利用するために設計されたサービス アカウントで、Windows Server 2008 R2 以降のActive Directory で作成することができます。

グループの管理されたサービス アカウントは ADFS の実装時に作成することが可能です。しかし、グループの管理されたサービス アカウントを作成するときに生成されるパスワードは KDS ルートキーをもとに作られるため、KDS ルートキー自体、事前に作成しておかなければ、グループの管理されたサービスアカウントの作成自体、失敗します。KDS ルートキーを作成するときは次のコマンドレットを実行します。

Add-KdsRootKey -EffectiveTime ((Get-Date).addhours(-10))

一方、グループの管理されたサービス アカウントを作成するときは次のコマンドレットを実行します。

New-ADServiceAccount -Name <サービス アカウント名> `
-DNSHostName <サービスを利用するサーバーの名前>

DNSHostName スイッチではグループの管理されたサービス アカウントを使用するサーバー名を指定します。ただし、ADFS サーバーの構成ウィザードではサービスアカウントを指定することにより、自動的に DNSHostName は設定されるため、-DNSHostName オプションで明示的に ADFS サーバー名を指定する必要はありません。(-DNSHostName オプションは指定しないと New-ADServiceAccount コマンドレット自体、動作しないので適当なサーバー名を指定しておいてください)

ADFS サービスのサービスアカウントは管理者権限がなくてもサービスを動作させることは可能です。しかし、サービス アカウントに管理者権限がないと、ADFS サーバーのインストール中に SPN (Service Principal Name) の登録に失敗します。そのため、管理者権限のないユーザーをサービスアカウントとして利用するときには、SPN の登録を ADFS サーバーのインストール完了後に手動で行う必要があります。SPN の登録を行うときには、次のコマンドを実行します。

setspn -a host/adfssrv <ドメイン名>\<サービス アカウント名>
setspn –a HTTP/<ADFS サーバーの FQDN> <ドメイン名>\<サービス アカウント名>

編集後記

ADFSサーバーのインストールって本当面倒ですよね。インストールそのものはウィザードを実行すればよいだけなんだけど、前提条件として行わなければならない要素や設定が多く、実装に困らされたものです。特にトークン署名証明書の有効期間が1年という問題は何も知らずにインストールすると1年後に誰もサインインできなくなるというトラブルを引き起こします。だから証明書の有効期間を延ばしておくというのはセオリーなんだけど、そういうことって当時は情報がなかったのですよね。
今回はインストールと言いつつ、インストールそのものの手順にたどり着けなかったですが、次回はきちんとお伝えしますので、お楽しみに。