IAM チュートリアル: AWS CloudFormation テンプレートを使用して SAML ID プロバイダー (IdP) を作成する
AWS アカウントの SAML フェデレーションを設定するには、SAML ID プロバイダー (IdP) を作成する必要があります。このチュートリアルでは、AWS CloudFormation テンプレートを使用して、AWS と外部 IdP 間の信頼を確立する SAML IdP を作成する方法を説明します。
テンプレートは、IdP のメタデータドキュメントで設定された SAML IdP を作成します。その後、フェデレーション IAM ロールがこの IdP を参照して、外部 IdP から認証されたユーザーが AWS リソースにアクセスできるようにします。
デプロイされたリソースは、IdP のメタデータドキュメントとオプションの暗号化設定によって設定された SAML IdP で構成されます。
前提条件
このチュートリアルでは、以下を実行済みであることを前提としています。
-
このチュートリアルで IdP の SAML メタデータ XML ファイルをフォーマットするために使用する Python コマンドを実行するには、ローカル マシンに Python 3.6 以降がインストールされている必要があります。
-
外部 IdP からの SAML メタデータドキュメントを XML ファイルとして保存していること。
AWS CloudFormation を使用して SAML IdP を作成する
SAML IdP を作成するために、CloudFormation テンプレートを作成し、それを使用して IdP リソースが含まれるスタックを作成します。
テンプレートを作成する
まず、CloudFormation テンプレートを作成します。
-
テンプレート セクションで、[JSON] または [YAML] タブのコピーアイコンをクリックして、テンプレートの内容をコピーします。
-
テンプレートの内容を新しいファイルに貼り付けます。
-
ファイルをローカルに保存します。
スタックを作成します。
次に、保存したテンプレートを使用して CloudFormation スタックをプロビジョニングします。
-
https://console.aws.amazon.com/cloudformation
で AWS CloudFormation コンソール を開きます。 -
[スタック] ページでは、[スタックの作成] メニューで [新しいリソースを使用 (標準)] を選択します。
-
テンプレートを指定します。
-
[前提条件] で、[既存のテンプレートを選択] を選択します。
-
[テンプレートの指定] で、[テンプレートファイルのアップロード] を選択します。
-
[ファイルを選択] を選択し、テンプレートファイルに移動して選択します。
-
[次へ] を選択します。
-
-
次のスタックの詳細を指定します。
-
スタック名を入力します。
-
[IdentityProviderName] は、空のままにするとスタック名に基づいて名前を自動生成できます。または、SAML IdP のカスタム名を入力することもできます。カスタム名には、英数字、ピリオド、アンダースコア、ハイフンのみを含めることができます。
-
[IdentityProviderSAMLMetadataDocument] では、このフィールドに貼り付ける前に、SAML メタデータ XML ファイルを 1 行にフォーマットする必要があります。CloudFormation コンソールでコンソールパラメータを渡すときに XML コンテンツを 1 行にフォーマットする必要があるため、この処理が必要です。
次の Python コマンドを使用して、XML ファイルを再フォーマットします。
python3 -c "import sys, re; content=open(sys.argv[1]).read(); print(re.sub(r'>\s+<', '><', content.replace('\n', '').replace('\r', '').strip()))"
saml-metadata.xml
注記
IdP の SAML メタデータドキュメントは、コンソールパラメータ入力用に 1 行にフォーマットする必要があります。この Python コマンドは、改行と余分な空白を削除して、元のコンテンツと構造をすべて維持した状態で必要なフォーマットを作成します。
Python コマンドの出力をコピーし、[IdentityProviderSAMLMetadataDocument] フィールドに貼り付けます。
フォーマットされた SAML メタデータドキュメントの例 (抜粋):
<?xml version="1.0" encoding="UTF-8"?><md:EntityDescriptor xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata" entityID="https://portal.sso.example.com/saml/assertion/CompanyIdP"><md:IDPSSODescriptor WantAuthnRequestsSigned="false" protocolSupportEnumeration="urn:oasis:names:tc:SAML:2.0:protocol"><md:KeyDescriptor use="signing"><ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:X509Data><ds:X509Certificate>MIIDXTCCAkWgAwIBAgIJAJC1HiIAZAiIMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV...</ds:X509Certificate></ds:X509Data></ds:KeyInfo></md:KeyDescriptor><md:SingleLogoutService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/logout/CompanyIdP"/><md:NameIDFormat>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</md:NameIDFormat><md:SingleSignOnService Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Location="https://portal.sso.example.com/saml/assertion/CompanyIdP"/></md:IDPSSODescriptor></md:EntityDescriptor>
-
その他のパラメータについては、デフォルト値を受け入れるか、要件に応じて独自の値を入力します。
-
IdentityProviderAddPrivateKey – SAML アサーションを復号するためのオプションのプライベートキー
-
IdentityProviderAssertionEncryptionMode – 必要に応じて、SAML アサーションの暗号化モードを設定する (許可、必須、または空)
-
-
[次へ] を選択します。
-
-
スタックオプションを設定します。
-
[スタック障害オプション] で、[新しく作成されたリソースをすべて削除] を選択します。
注記
このオプションを選択すると、スタックの作成に失敗した場合でも削除ポリシーで保持するように指定されているリソースに対して、課金される可能性を防ぐことができます。
-
他はすべて、デフォルト値を受け入れます。
-
[機能] では、チェックボックスをオンにして、CloudFormation によってアカウントに IAM リソースが作成される場合があることを承認します。
-
[次へ] を選択します。
-
-
スタックの詳細を確認して、[送信] を選択します。
AWS CloudFormation によってスタックが作成されます。スタックの作成が完了すると、スタックリソースを使用する準備が整います。スタックの詳細ページの [リソース] タブを使用して、アカウントにプロビジョニングされたリソースを表示できます。
スタックは次の値を出力します。値は [出力] タブで確認できます。
-
ProviderARN: 作成された SAML IdP の ARN (
arn:aws:iam::123456789012:saml-provider/CompanyIdP
など)。このプロバイダーを信頼するロールを作成するときに、この ARN が必要になります。 -
ProviderName: 作成された SAML IdP の名前 (カスタム名を指定した場合は
CompanyIdP
、デフォルトの命名を使用した場合はmy-saml-stack-saml-provider
など)。
これらの出力もエクスポートされるため、Fn::ImportValue
関数を使用して他の AWS CloudFormation スタックにインポートできます。
SAML IdP を検証する
SAML IdP が作成されたら、その設定を検証し、フェデレーションロールで使用する ARN を書き留めます。
-
IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
ナビゲーションペインで、[ID プロバイダー] を選択します。
新しく作成された SAML IdP がリストに表示されるはずです。
-
IdP 名を選択すると、その詳細が表示されます。
IdP の詳細ページで、SAML メタデータドキュメントやその他の設定の詳細を確認できます。
-
詳細ページに表示される [プロバイダー ARN] を書き留めます。
この IdP を信頼するフェデレーション IAM ロールを作成するときに、この ARN が必要になります。
-
メタデータドキュメントを確認して、外部 IdP から提供した内容と一致することを確認します。
これで、SAML IdP をフェデレーション IAM ロールで使用する準備ができました。この IdP を信頼するロールを作成して、外部 IdP から認証されたユーザーがそれらのロールを引き受け、AWS リソースにアクセスできるように許可できます。
クリーンアップ: リソースを削除する
最後のステップとして、スタックとそれに含まれるリソースを削除します。
-
AWS CloudFormation コンソールを開きます。
-
[スタック] ページで、テンプレートから作成されたスタックを選択し、[削除] を選択してから、[削除] で確定します。
CloudFormation は、スタックとそれに含まれるすべてのリソースの削除を開始します。
CloudFormation テンプレートファイルの詳細
リソース
このチュートリアルで使用する AWS CloudFormation テンプレートでは、以下のリソースがアカウントに作成されます。
AWS::IAM::SAMLProvider
: AWS と外部 IdP の間の信頼を確立する SAML IdP。
設定
テンプレートには、以下の設定可能なパラメータが含まれています。
-
IdentityProviderName – SAML IdP の名前 (自動生成された名前にする場合は空のままにします)
例:
CompanyIdP
またはEnterpriseSSO
-
IdentityProviderSAMLMetadataDocument – 外部 IdP からの SAML メタデータドキュメント (1 行のフォーマット)
-
IdentityProviderAddPrivateKey – SAML アサーションを復号するためのオプションのプライベートキー
-
IdentityProviderAssertionEncryptionMode – 必要に応じて、SAML アサーションの暗号化モードを設定します
CloudFormation テンプレート
次の JSON または YAML コードを別のファイルとして保存し、このチュートリアルの CloudFormation テンプレートとして使用します。