ADFSを利用して、AWSとActiceDirectoryのSAML認証の実施

「既存のActiveDirectory側にあるユーザー情報にて、AWSコンソールにログインする」て奴を試してみます。具体的には、以下資料に記載されているADFSとIAM SAML ID Providerを利用した方法となります。

Enabling Federation to AWS Using Windows Active Directory, ADFS, and SAML 2.0

環境

Domain ServiceもFederation Serviceも、既に構築されているものとして作業をしています。

構成

イメージです。

f:id:goodbyegangster:20200410044519p:plain

今回の手順で設定する情報たちです。

FederationさせるActiveDirectoryユーザーの作成

利用するActive Directory側のユーザーを作成します。

AWS-sample というドメインユーザーグループを作成します。

> New-ADGroup -Name "AWS-sample" -GroupCategory Security -GroupScope Global -DisplayName "AWS-sample" -Path "CN=Users,DC=example,DC=com" -Description "Group for AWS SAML Federation"

New-ADGroup

利用することになるドメインユーザーを作成します。

> $password = ConvertTo-SecureString "Passw0rd" -AsPlainText -Force
> New-ADUser -Name "ZunkoTohoku" -DisplayName "Zunko Tohoku" -EmailAddress "zunkotohoku@example.com" -CannotChangePassword $True -PasswordNeverExpires $True -PasswordNotRequired $False -AccountPassword $password -Enabled $True

New-ADUser

作成したドメインユーザーを、 AWS-sample グループに追加します。

> Add-ADGroupMember -Identity "AWS-sample" -Members "ZunkoTohoku"

Add-ADGroupMember

IAM SAML ID Providerの作成

IAM SAML ID Providerとは、利用する外部IdPをAWSに登録した定義情報みたいなものになります。

IAM SAML 2.0 ID プロバイダーは、SAML 2.0 (Security Assertion Markup Language 2.0) 基準をサポートする外部 ID プロバイダー (IdP) を記述する IAM のエンティティです。SAML 互換 IdP 間 (ShibbolethActive Directory フェデレーションサービスと IAM など) の信頼を確立し、組織内のユーザーが AWS リソースにアクセスできるようにする場合は、AWS ID プロバイダーを使用します。IAM の SAML プロバイダーは IAM 信頼ポリシーでプリンシパルとして使用されます。

IAM SAML ID プロバイダーの作成

まず登録するADFSの定義情報をダウンロードします。Federation Serviceの https://(Federation Service)/FederationMetadata/2007-06/FederationMetadata.xml のURLにアクセスし、ADFSのメタ情報をダウンロードします。

$ wget --no-check-certificate https://adfs.goodbyegangster.com/FederationMetadata/2007-06/FederationMetadata.xml

ダウンロードしたメタ情報を登録して、IAM SAML ID Providerを作成します。

$ aws iam create-saml-provider --saml-metadata-document file://FederationMetadata.xml --name adfs

aws iam create-saml-provider

Federation用IAM Roleの作成

利用されるIAM Role(FederationされたADユーザーに認可されるIAM Policy)を作成します。

作成するIAM Roleの信頼関係を定義したjsonファイルを用意します。 Federated の値は、上記で作成したIAM SAML ID ProviderのARNを記述します。

trust_relationship.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789012:saml-provider/adfs"
      },
      "Action": "sts:AssumeRoleWithSAML",
      "Condition": {
        "StringEquals": {
          "SAML:aud": "https://signin.aws.amazon.com/saml"
        }
      }
    }
  ]
}

SAML 用のロールを作成するための前提条件

ADFS-sample という名前のIAM Roleを作成します。

$ aws iam create-role --role-name ADFS-sample --assume-role-policy-document file://trust_relationship.json

aws iam create-role

認可させたいIAM Policyをアタッチします。

$ aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --role-name ADFS-sample

aws iam attach-role-policy

Federation Serviceの設定

ここからの作業は、Federation ServiceにあたるWindowsサーバーでの作業となります。該当WindowsサーバーにドメインAdminのユーザーでログインします。

証明書利用者信頼(Relying Party Trust)の作成

証明書利用者信頼 とは、ADFSの Relying Party Trust/Service Provider にあたります。このあたりの説明については、以下のブログが参考になりました。

証明書利用者信頼とは…

ADFSが発行したトークンを利用する先(アプリケーションなど)を登録する場所として、証明書利用者信頼を利用します。

要求プロバイダー信頼と証明書利用者信頼

今回トークンを利用する先はAWSになりますので、AWSの情報を証明書利用者信頼に追加することになります。


Windows管理ツール から ADFSの管理 を起動します。

ADFS管理ウィンドウが表示されるので、 操作証明書利用者信頼の追加 をクリックすると、ウィザードが起動します。

要求に対応する を選択します。

f:id:goodbyegangster:20200410044652p:plain

オンラインまたはローカルネットワークで公開されている証明書についてデータをインポートする を選択し、フェデレーションメタデータのアドレスに https://signin.aws.amazon.com/static/saml-metadata.xml を入力します。該当アドレスは、AWSSAMLメタ情報となります。

f:id:goodbyegangster:20200410044711p:plain

証明書利用者信頼(Service Provider)の管理名を設定します。

f:id:goodbyegangster:20200410044623p:plain

認証処理時のポリシーを設定します。 すべてのユーザーを許可 を選択します。

f:id:goodbyegangster:20200410044727p:plain

確認画面。

f:id:goodbyegangster:20200410044741p:plain

設定完了です。

f:id:goodbyegangster:20200410044756p:plain

フェデレーションメタデータを使用して要求に対応する証明書利用者信頼を作成するには

要求発行ポリシー(Claim Rules)の編集

作成した証明書利用者信頼に対して、要求発行ポリシーを追加します。何のためにするのかというと、

In these steps we’re going to add the claim rules so that the elements AWS requires and ADFS doesn’t provide by default (NameId, RoleSessionName, and Roles) are added to the SAML authentication response.

AWSが必要とするけど、ADFSでは提供してくれない情報(ユーザーの属性)を、ADFSから貰うSAMLレスポンスに追加するための設定、ということらしいです。

ADFSの管理 の画面の証明書利用者信頼にて、上記で作成した信頼を選択、右ペインにある 要求発行ポリシーの編集 をクリックします。

f:id:goodbyegangster:20200410044815p:plain

規則の追加 を選択します。

f:id:goodbyegangster:20200410044829p:plain

Name IDの追加

利用するテンプレートとして 入力方向の要求を変換 を選びます。

f:id:goodbyegangster:20200410044845p:plain

以下を入力します。

パラメーター
要求変換名 NameID
入力方向の要求の種類 Windows アカウント名
出力方向の要求の種類 名前 ID
出力方向の名前 ID の形式 永続 ID
すべての要求値をパススルーする チェック

f:id:goodbyegangster:20200410044900p:plain

RoleSessionNameの追加

テンプレートの LDAP属性を要求として送信 を選択します。

f:id:goodbyegangster:20200410044917p:plain

以下を入力します。

パラメーター
要求規則名 RoleSessionName
属性ストア ActiveDirectory
LDAP属性 E-Mail-Addresses
出力方向の要求の種類 https://aws.amazon.com/SAML/Attributes/RoleSessionName

f:id:goodbyegangster:20200410044933p:plain

カスタム要求の追加(ADグループの取得)

利用するテンプレートとして カスタム規則を使用して要求を送信 を選択します。

f:id:goodbyegangster:20200410044947p:plain

以下のカスタム規則を追加します。

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => add(store = "Active Directory", types = ("http://temp/variable"), query = ";tokenGroups;{0}", param = c.Value);

f:id:goodbyegangster:20200410045023p:plain

カスタム規則に記述したものは、要求規則言語というものらしいです。下記あたりの資料を読んで、分かったような、それでも全く分からないような感じなのですが、とりあえずこのカスタム規則は、tokenGroupsというクエリで取得されたActiveDirectory内グループ情報を、temp領域に保存している処理らしいです。

MS doc 要求規則言語の役割

www.slideshare.net

ADグループをIAM Role情報への変換

利用するテンプレートとして カスタム規則を使用して要求を送信 を選択します。

f:id:goodbyegangster:20200410045003p:plain

以下のカスタム規則を追加します。

c:[Type == "http://temp/variable", Value =~ "(?i)^AWS-"] => issue(Type = "https://aws.amazon.com/SAML/Attributes/Role", Value = RegExReplace(c.Value, "AWS-", "arn:aws:iam::(AWSアカウントNo):saml-provider/adfs,arn:aws:iam::(AWSアカウントNo):role/ADFS-"));

f:id:goodbyegangster:20200410045042p:plain

このカスタム規則も詳細はよく分からないのですが、前の処理で一時領域に保存したADグループ情報から、prefixが AWS-ホニャララ にあたるものの場合、利用するIAM Role情報を ADFS-ホニャララ に変換して 、SAML Responseに追加してくれる処理らしいです。


最終的に作成した要求発行ポリシーは下記となります。

f:id:goodbyegangster:20200410045059p:plain

接続確認

設定できたので、ADFSが提供する下記URLのサインオンページにアクセスします。

https://(Federation ServiceのFQDN)/adfs/ls/IdpInitiatedSignOn.aspx

サインイン先として、ADFSの証明書利用者信頼として登録したサービスを指定します。

f:id:goodbyegangster:20200410045113p:plain

ActiveDirectoryユーザーのEmailアドレスとパスワードを入力します。

f:id:goodbyegangster:20200410045136p:plain

AWSコンソールにアクセスできました。ActiveDirectory側の認証情報にてログインしています。

f:id:goodbyegangster:20200410045151p:plain


設定していて躓いた点に関してメモ。サインインを試みようとした際、以下のような MSIS7012 エラーが出力された場合。

f:id:goodbyegangster:20200410045212p:plain

そもそもサインオン用ページが有効化されていない可能性があるとのこと。

既定では、Windows 2016 の AD FS では、[サインオン] ページが有効になっていません。 有効にするには、PowerShell コマンド Set-adfsproperties を使用します。

Idp によって開始されるサインオンページを有効にする

Federation ServerのWindowsドメインAdminでログインし、以下Powershellを実行します。

> Set-AdfsProperties -EnableIdPInitiatedSignonPage $true

Set-AdfsProperties

確認コマンド。

> (Get-AdfsProperties).EnableIdPInitiatedSignonPage
True

Get-AdfsProperties