「既存のActiveDirectory側にあるユーザー情報にて、AWSコンソールにログインする」て奴を試してみます。具体的には、以下資料に記載されているADFSとIAM SAML ID Providerを利用した方法となります。
Enabling Federation to AWS Using Windows Active Directory, ADFS, and SAML 2.0
環境
- Active Directory Domain Service
- Windows Server 2019
- Active Directory Federation Service
- Windows Server 2019
Domain ServiceもFederation Serviceも、既に構築されているものとして作業をしています。
構成
イメージです。
今回の手順で設定する情報たちです。
- Active Directory Domain Service側
- Active Directory ドメイン名
- Federation向けActive Directoryユーザーグループ
- AWS-sample
- Federation向けActive Directoryユーザー
- Name
- ZunkoTohoku
- email address
- zunkotohoku@example.com
- Name
- Active Directory Fedration Service側
- Federation ServerのURL
- adfs.goodbyegangster.com
- Federation ServerのURL
- AWS側
- Federation向けIAM Role名
- ADFS-sample
- Federation向けIAM Role名
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"
利用することになるドメインユーザーを作成します。
> $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
作成したドメインユーザーを、 AWS-sample
グループに追加します。
> Add-ADGroupMember -Identity "AWS-sample" -Members "ZunkoTohoku"
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 間 (Shibboleth か Active Directory フェデレーションサービスと IAM など) の信頼を確立し、組織内のユーザーが AWS リソースにアクセスできるようにする場合は、AWS ID プロバイダーを使用します。IAM の SAML プロバイダーは IAM 信頼ポリシーでプリンシパルとして使用されます。
まず登録する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
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" } } } ] }
ADFS-sample
という名前のIAM Roleを作成します。
$ aws iam create-role --role-name ADFS-sample --assume-role-policy-document file://trust_relationship.json
認可させたいIAM Policyをアタッチします。
$ aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess --role-name ADFS-sample
Federation Serviceの設定
ここからの作業は、Federation ServiceにあたるWindowsサーバーでの作業となります。該当WindowsサーバーにドメインAdminのユーザーでログインします。
証明書利用者信頼(Relying Party Trust)の作成
証明書利用者信頼
とは、ADFSの Relying Party Trust/Service Provider
にあたります。このあたりの説明については、以下のブログが参考になりました。
証明書利用者信頼とは…
ADFSが発行したトークンを利用する先(アプリケーションなど)を登録する場所として、証明書利用者信頼を利用します。
今回トークンを利用する先はAWSになりますので、AWSの情報を証明書利用者信頼に追加することになります。
Windows管理ツール
から ADFSの管理
を起動します。
ADFS管理ウィンドウが表示されるので、 操作
の 証明書利用者信頼の追加
をクリックすると、ウィザードが起動します。
要求に対応する
を選択します。
オンラインまたはローカルネットワークで公開されている証明書についてデータをインポートする
を選択し、フェデレーションメタデータのアドレスに https://signin.aws.amazon.com/static/saml-metadata.xml
を入力します。該当アドレスは、AWSのSAMLメタ情報となります。
証明書利用者信頼(Service Provider)の管理名を設定します。
認証処理時のポリシーを設定します。 すべてのユーザーを許可
を選択します。
確認画面。
設定完了です。
フェデレーションメタデータを使用して要求に対応する証明書利用者信頼を作成するには
要求発行ポリシー(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の管理
の画面の証明書利用者信頼にて、上記で作成した信頼を選択、右ペインにある 要求発行ポリシーの編集
をクリックします。
規則の追加
を選択します。
Name IDの追加
利用するテンプレートとして 入力方向の要求を変換
を選びます。
以下を入力します。
パラメーター | 値 |
---|---|
要求変換名 | NameID |
入力方向の要求の種類 | Windows アカウント名 |
出力方向の要求の種類 | 名前 ID |
出力方向の名前 ID の形式 | 永続 ID |
すべての要求値をパススルーする | チェック |
RoleSessionNameの追加
テンプレートの LDAP属性を要求として送信
を選択します。
以下を入力します。
パラメーター | 値 |
---|---|
要求規則名 | RoleSessionName |
属性ストア | ActiveDirectory |
LDAP属性 | E-Mail-Addresses |
出力方向の要求の種類 | https://aws.amazon.com/SAML/Attributes/RoleSessionName |
カスタム要求の追加(ADグループの取得)
利用するテンプレートとして カスタム規則を使用して要求を送信
を選択します。
以下のカスタム規則を追加します。
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);
カスタム規則に記述したものは、要求規則言語というものらしいです。下記あたりの資料を読んで、分かったような、それでも全く分からないような感じなのですが、とりあえずこのカスタム規則は、tokenGroupsというクエリで取得されたActiveDirectory内グループ情報を、temp領域に保存している処理らしいです。
www.slideshare.net
ADグループをIAM Role情報への変換
利用するテンプレートとして カスタム規則を使用して要求を送信
を選択します。
以下のカスタム規則を追加します。
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-"));
このカスタム規則も詳細はよく分からないのですが、前の処理で一時領域に保存したADグループ情報から、prefixが AWS-ホニャララ
にあたるものの場合、利用するIAM Role情報を ADFS-ホニャララ
に変換して 、SAML Responseに追加してくれる処理らしいです。
最終的に作成した要求発行ポリシーは下記となります。
接続確認
設定できたので、ADFSが提供する下記URLのサインオンページにアクセスします。
https://(Federation ServiceのFQDN)/adfs/ls/IdpInitiatedSignOn.aspx
サインイン先として、ADFSの証明書利用者信頼として登録したサービスを指定します。
ActiveDirectoryユーザーのEmailアドレスとパスワードを入力します。
AWSコンソールにアクセスできました。ActiveDirectory側の認証情報にてログインしています。
設定していて躓いた点に関してメモ。サインインを試みようとした際、以下のような MSIS7012
エラーが出力された場合。
そもそもサインオン用ページが有効化されていない可能性があるとのこと。
既定では、Windows 2016 の AD FS では、[サインオン] ページが有効になっていません。 有効にするには、PowerShell コマンド Set-adfsproperties を使用します。
Federation ServerのWindowsにドメインAdminでログインし、以下Powershellを実行します。
> Set-AdfsProperties -EnableIdPInitiatedSignonPage $true
確認コマンド。
> (Get-AdfsProperties).EnableIdPInitiatedSignonPage
True