ADFSのクレームにSQL Serverデータベースを使う方法

Active Directory フェデレーションサービス(ADFS)を利用する目的にOffice365に代表されるシングルサインオンの実現がありますが、もうひとつの目的にクレームベースで認可が行える点があります。

クレームを利用すると、今までのActive Directoryのようにユーザー名やグループに基づいて行われていた認可が、役職や部署などの属性(クレーム)情報に基づいて認可できるようになります。
そのため、様々な条件に基づくアクセス制御ができるというメリットがあります。

ADFSでは、クレームにセットする属性情報にActive Directoryを使用するのですが、属性ストアという設定を使うことによって、SQL Serverにある属性情報やLDAPにある属性情報などを活用することもできます。
そうすれば、
たとえば

・ 顧客DBから会員種別(プラチナ、ゴールド、一般)などの情報を取得して、
クレームにセット
・ 人事情報DBから従業員種別(役員、正社員、派遣社員)などの情報を
取得して、クレームにセット

などのように、DBに入っていそうな、Webポータルのパーソナライズをするときに使われそうな情報が取得できるのです。

そこで、今日はActive Directoryで認証されたユーザーに対して、SQL Serverに登録されている情報に基づいてクレームが発行されるようにするための設定を見てみたいと思います。

これから行うことオーバービュー

① まず、ユーザー名とパスワードを入力して認証します。
② 認証に成功すると、ADFSがActive Directoryからメールアドレス情報を取得します。
③ 続いて、取得したメールアドレスをキーにして、SQL Serverから社員番号の情報を取得します。
④ 取得した社員番号をクレームにセットして、クレームを含むトークンをADFSサーバーが発行します。

スライド2

この流れをADFSサーバーの画面に置き換えると、このような流れになります。

スライド1

事前に受け付け変換規則でメールアドレスをADから取得するように設定し(今日はこの部分の詳細を割愛します)、発行変換規則でメールアドレスをもとに社員番号を取得してクレームに社員番号をセットします。

では、続いて具体的な手順を確認しましょう。

■ ■ ■

前提条件 SQL Serverのデータベース

今回、SQL ServerにはAttrStoreという名前のデータベースを作成し、WorkerIDという名前のテーブルをサンプルとして作成しました。テーブルには、以下のように社員番号を表すWorkerIDと、emailAddressをカラムとして設定しました。(適当でごめんなさい)

image

1.サービスアカウントに対するSQL Serverのアクセス許可設定

ADFSからSQL Serverにアクセスするときは、ADFSのサービスアカウントを使ってアクセスします。
そのため、ADFSのサービスアカウントにデータベースにアクセスできるようにするためのアクセス許可を設定する必要があります。

今回は前提として、Windows Server 2012 R2からサポートされるようになったグループ管理サービスアカウント(gMSA)をADFSのサービスアカウントとしているとしましょう。

グループ管理サービスアカウント(gMSA)とは何?という方は以下を参照
http://sophiakunii.wordpress.com/2013/09/12/%e3%82%b0%e3%83%ab%e3%83%bc%e3%83%97%e7%ae%a1%e7%90%86%e3%82%b5%e3%83%bc%e3%83%93%e3%82%b9%e3%82%a2%e3%82%ab%e3%82%a6%e3%83%b3%e3%83%88/#comments


では具体的な手順です。gMSAをADFSのサービスアカウントとしている場合、最初にAdd-ADComputerServiceAccountコマンドレットを使って、SQL Serverがインストールされているコンピューター(以下の場合ではdc)、サービスアカウント(以下の場合ではFsGmsa)をそれぞれ指定して実行します。これにより、特定のサーバーでgMSAを使う準備が整ったことになります。

ADFS-SQL009

続いて、SQL Server Management StudioからgMSAアカウントにロールを割り当てます。db_datareaderのロールがあれば十分です。

image

ADFS-SQL019

ADFS-SQL020

2.SQL Serverから取得した情報をセットするクレーム種類の定義

SQL Serverから取得した情報を既存のクレームではなく、全く新しいクレームにセットしたい場合、そのクレーム種類を定義する必要があります。今回のケースではDBから社員番号を取得してクレームにセットしていますが、社員番号を表すクレーム種類は既定で用意されていません。
そこで、[要求記述の追加]を使って”社員番号”というクレーム種類を作成します。
なお、既存のクレーム種類を使う場合、この設定は必須ではありません。

image

クレーム種類の名前はWorkerIDとします。
また、URL的なものが記述されていますが、クレーム種類の正式名称はURLの形式で記述します。
(一意な名前であれば、実在するURLでなくて構わないです)

FS-AttrStore002

3.属性ストアの定義

次はADFSサーバーがアクセスするSQL Serverを指定します。この設定は[属性ストアの追加]から指定します。

image

SQL Serverを属性ストアとして指定する場合、接続先はDBではおなじみ、接続文字列を使用します。

FS-AttrStore004

4.取得した属性をクレームにセット

最後に、SQL Serverから取得した属性をクレームにセットします。
この設定はADFSの[証明書利用者信頼]から、クレームを利用したいアプリケーションを選択し、[要求規則の編集]を開きます。

image

[発行変換規則]タブから[規則の追加]をクリックし、

FS-AttrStore011

要求規則テンプレートからカスタム規則を選択します。

FS-AttrStore012

要求規則名に適当な名前を入力し、カスタム規則にはADFSのルール言語を使用して、SQL Serverから取得した属性をクレームにセットするように定義します。

FS-AttrStore013

みかたは次のとおりです。

C:[Type==”http://schemas.xmlsoap.org/ws/2005/05/identity/
claims/emailaddress
”]=>issue(store=”WorkerIDStore”,types=(“http://schemas.example.com/claims/WorkerID”),
query=”SELECT WorkerID FROM WorkerIDTable WHERE emailaddress={0}”,param=c.value)

以上の構文を分解してみてみましょう。

C:[Type==”http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress”]

↑Email Address属性がクレームにあったら、
(今回のケースでは、要求プロバイダー信頼でEmailAddressを定義している前提です)

=>issue(store=”WorkerIDStore”,types=(“http://schemas.example.com/claims/WorkerID”)

↑WorkerIDStore属性ストアから取得した内容をWorkerIDクレームにセットしなさい。

query=”SELECT WorkerID FROM WorkerIDTable WHERE emailaddress={0}”,param=c.value)

↑属性ストアからどんな内容を取得するか?というと、WorkerIDTableテーブルからEmail Addressに該当するWorkerID(社員番号)を取得しなさい。
(たとえば、Administrator@example.comだったら、1番という要領です)

5.試してみる

ここまでで設定は完了です。
実際に、Administrator@example.comユーザーでアクセスしてみましょう。
すると、下の画面のようにWorkerIDとして1が入っていることが確認できます。
1番という情報はActive Directoryから取得した情報ではなく、SQL Serverから取得した情報です。

FS-AttrStore017

まとめ

クレームに入る情報は役職、部署、社員番号など、人事情報に近いものが扱われることが多いと考えられます。そうすると、人事情報はSQL Serverのデータベースなどで管理されているケースが多く、人事情報DBから情報を引っ張ってきて、クレームに活用したいというニーズもあるのではないかと思います。そうしたときに、SQL Serverから引っ張ってくる方法を覚えておくと、役に立つケースも多いのではないでしょうか。