Windows PowerShellをつかってAWSへのフェデレーションによるAPIアクセスを設定する方法
組織のなかでAWSリソースにアクセスするときに、セキュリティ、監査、コンプライアンス、およびロールとアカウントの分離をサポートすることができるようにするため、標準的で繰り返せる認証方式を使用することをおすすめしています。わたしはAWSプロフェッショナルサービス契約のなかで、AWSのお客様へAWS Management Consoleへのフェデレーションによるアクセスをつかった認証メカニズムの構築をお手伝いしてきました。それは便利ですが、多くのお客様ではあわせてAPIをつかってAWSリソースにアクセスできるようになる必要がありました。しかしながら、フェデレーションによるAPIアクセスがなければAWS Identity and Access Management (IAM)ユーザーを作成する必要があり、そうするとフェデレーションを使用する目的が損なわれてしまいます。
このブログ記事では、新規にSAMLサポートが追加されたAWS Tools for PowerShellをつかって、Windows Active DirectoryのユーザーにWindows PoweShellからフェデレーションによるAPIアクセスを提供する方法について紹介します。
この記事はQuint Van Demanのブログ記事、How to Implement a General Solution for Federated API/CLI Access Using SAML 2.0(日本語訳:SAML2.0を用いたAPI/CLIへのフェデレーテッドアクセスに関する汎用的なソリューションの実装)と同様のストラテジーを使用しています。フェデレーションされたAPIアクセスの汎用的なやり方について興味があれば、この記事を読むことをおすすめします。
前提条件
この記事のなかでは、以下を前提としています:
- Active Directory Federation Services (AD FS)が組織のクレデンシャルだけを使用したコンソールアクセスができるように正常にAWSアカウントとインテグレートされていること。インテグレーションについての手引きが必要であれば、Enabling Federation to AWS Using Windows Active Directory, AD FS, and SAML 2.0を参照してください。AD FS 3.0を使っている場合も同様の手順になります。
- AWS Tools for Windows PowerShellのバージョン3.1.31.0、またはそれ以降がローカルのワークステーションにインストールされていること。
Active DirectoryユーザーのAWSサービスAPIへのフェデレーションによるアクセス有効化の概要
上記のダイアグラムはActive DirectoryユーザーがAWSリソースへのフェデレーションされたアクセスを取得する方法をしめしたものです:
- AD FSがフェデレーションユーザーを認証します。
- 認証が成功すると、ユーザーにSecurity Assertion Markup Languate (SAML)のアサーションを送信します。
- SAMLアサーションがAWS Secure Token Service (STS)にAssumeRoleWithSAMLリクエストの形式で送信されます。
- リクエストが正当なものであれば、AWS STSはAWSテンポラリクレデンシャルをふくんだAssumeRoleWithSAMLレスポンスを返します。
- AWSテンポラリクレデンシャルがAWS Tools for Windows PowerShellなどのツールによってAWSサービスAPIとの連携に使用することが可能になります。
Windows PowerShell SAMLサポートの動作
Windows PowerShellモジュールを使用する前に、上記のダイアグラムをウォークスルーしてAWS Tools for Windows PowerShellのSAMLサポートを使用した時にどのようなプロセスが動作するのかをみていきましょう:
- Windows PowerShellモジュールがWindowsユーザーの現在のクレデンシャルを使って、またはコマンドラインからインタラクティブにコマンドレットが実行されたときにAD FSに対して認証を行います。
- AD FSがユーザーを認証します。
- AD FSはユーザーを特定するアサーションをふくんだSAMLの認証レスポンスを生成してユーザーに関する情報を提供します。するとWindows PowerShellコマンドレットによってユーザーがSAMLアサーションから権限をあたえられたロールのリストが展開されます。AD FSはSAMLアサーションと選択したAWSロールのAmazon Resource Name (ARN)をもとに生成されたSAML認証リクエストを作成します。
- AD FSはAssumeRoleWithSAMLRequest APIコールを使用してAWS STSにSAMLリクエストを送信します。
- SAMLリクエストが正当なものであれば、AWSのAccessKeyID、SecretAccessKeyとSessiontokenをふくんだSAMLレスポンスが返されます。デフォルトでは、これらのクレデンシャルは有効期限が3600秒(1時間)に設定されています。
- これでAWS Tools for Windows PowerShellのもつクレデンシャルによってIAMロールによってアクセスが認可された任意のAWSサービスAPIとやり取りができるようになりました。AWS Tools for Windows PowerShellは自動的にこのクレデンシャルを一連のAWS APIコールに使用して期限が切れたときに自動的に更新します。
Windows PowerShell SAMLコマンドレットの使用方法
はじめる準備ができていれば、新規にWindows PowerShellセッションをひらいてAWS Tools for Windows PowerShellモジュールをインポートしましょう。
PS > Import-Module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1"
Windows PowerShell SAMLコマンドレットの実行方法
AD FSシステムのエンドポイント設定を構成しましょう。AD FSエンドポイントを指定するときに、endpointパラメータのexample AD FS hostnameを自分の実際のAD FSホスト名で置き換えるようにしてください。
PS > $endpoint = "https://adfs.example.com/adfs/ls/Id
pInitiatedSignOn.aspx?loginToRp=urn:amazon:webservices"
エンドポイント設定のオブジェクトを生成するためには、Set-AWSSamlEndpointコマンドレットを呼び出してAuthenticationTypeパラメータを指定します。サポートされる型はBasic、Digest、Kerberos、Negotiate、および NTLMがあり、指定がなければデフォルトでKerberosになります。
PS > $epName = Set-AWSSamlEndpoint -Endpoint $endpoint -StoreAs ADFS-Demo -AuthenticationType NTLM
さあ、Set-AWSSamlRoleProfileコマンドレットをつかってAD FSアイデンティティプロバイダからテンポラリAWSクレデンシャルを取得する方法をみていきましょう。
ドメインに参加しているアカウントのプロファイルをセットアップするためには、クレデンシャルを提供する必要はありません。
PS > Set-AWSSamlRoleProfile -StoreAs SAMLDemoProfile -EndpointName $epName
もしくは、ドメインに参加していないアカウントのためにインタラクティブにWindows Active Directoryクレデンシャルを入力してユーザーがアクセスできるAWSロールを選択することができます。これは個別のActive Directoryユーザーを組織内で職務とロールを分離するために使用するときに役立ちます(たとえば、管理権限など)。
PS > $credential = Get-Credential -Message "Enter the domain credentials for the endpoint" Set-AWSSamlRoleProfile -EndpointName $epName -NetworkCredential $credential -StoreAs SAMLDemoProfile
どちらのケースでもコマンドレットからどのロールをプロファイルに保存するかについて入力をうながされます。以下の例では、ADFS-Devロールを選択しています。
Select Role Select the role to be assumed when this profile is active [1] 1 - ADFS-Dev [2] 2 - ADFS-Production [?] Help (default is "1"): 1
特定のロールは、RoleARN、PrincipalARN、およびオプションでNetworkCredentialパラメータを指定することで入力することなく設定することができます(ロールは認証した後のアサーションにあらわれます)。
PS > $params = @{ "NetworkCredential"=$credential, "PrincipalARN"="arn:aws:iam::012345678912:saml-provider/ADFS" "RoleARN"=" arn:aws:iam::012345678912:role/ADFS-Dev" } PS > $epName | Set-AWSSamlRoleProfile @params -StoreAs SAMLDemoProfile1 -Verbose
ドメインに参加しているコンピュータでは、すべてのロールのプロファイルを一度に作成することができます(ロール名がプロファイル名として使用されます)。
PS > Set-AWSSamlRoleProfile -EndpointName $epName -StoreAllRoles ADFS-Dev ADFS-Production
ロールプロファイルの名前はプロファイルに詳細があるロールに自動的にテンポラリAWSクレデンシャルを取得するためにSet-AWSCredentials(またはコマンドレットの –ProfileNameパラメータ)で指定したものとなります。
SAMLDemoProfileを使用したAWSサービスAPIとのやり取り
さあ、SAMLDemoProfileプロファイルから取得したテンポラリAWSクレデンシャルを使用してAWSサービスAPIとやり取りしてみましょう。
例1:
この例では、指定したロールにもとづくAWSアカウントですべての利用可能なAmazon S3バケットをリストします。これはWindows PowerShellコマンドラインからS3を管理するときの一般的なタスクです。
PS > Get-S3Bucket –ProfileName SAMLDemoProfile CreationDate BucketName ------------ ---------- 7/25/2013 3:16:56 AM mybucket1 4/15/2015 12:46:50 AM mybucket2 4/15/2015 6:15:53 AM mybucket3 1/12/2015 11:20:16 PM mybucket4
Get-S3Bucketコマンドレットを実行するときに -ProfileNameを指定する方法に注意してください。プロファイルマネージャーがコマンドレットで有効なテンポラリクレデンシャルを生成します。
これらのクレデンシャルは1時間(これはAWS STSによって強制される制限です)で期限切れになります。しかしながら、AWS Tool for Windows PowerShellは現在のクレデンシャルが期限切れになったことを検出した時にあたらしいSAMLアサーションを取得することによって自動的にクレデンシャルを更新します。
ドメインに参加しているユーザーでは、Windowsクレデンシャルを入力する必要がないためこのプロセスは不可視になります。ドメインに参加していないユーザーでは、あたらしいアサーションを取得してユーザーを再認証するために、Windows PowerShellクレデンシャルのプロンプトがポップアップしてユーザーのパスワードを要求します。
例2:
さあ、ADFS-Productionプロファイルを使用してシドニーリージョンにあるすべてのAmazon EC2インスタンスをリストしてみましょう。自分のEC2フリートを管理するためにリージョン内のすべてのEC2インスタンスをリストしたいことがあります。
PS > (Get-Ec2Instance –ProfileName ADFS-Production –Region ap-southeast-2).Instances | Select InstanceType, @{Name="Servername";Expression={$_.tags | where key -eq "Name" | Select Value -Expand Value}} InstanceType Servername ------------ ---------- t2.small DC2 t1.micro NAT1 t1.micro RDGW1 t1.micro RDGW2 t1.micro NAT2 t2.small DC1 t2.micro BUILD
これらの例はWindows PowerShellのSAMLサポートが提供するテンポラリクレデンシャルをつかってAWSリソースを管理する多くのやり方のうち2つだけについて説明しています。AWS Tools for Windows PowerShellによって提供されるすべてのコマンドレットは–ProfileNameによってセットされたテンポラリクレデンシャリを利用することができます。このアプローチはIAMユーザーアカウントを作成して管理することなくAWSリソースを操作することを効率化し、短期間のテンポラリクレデンシャルをつねに使用することでセキュリティを強化します。
自分自身のWindows PowerShellコマンドレットやC#アプリケーションでAWSへのフェデレーションされたAPIアクセスを実装することに興味がある場合は、GitHubレポジトリの aws-saml-adfs-cmdlet-sampleを参照してください。
いつでもフィードバックは歓迎ですので、ご質問やご意見を以下の"コメント"セクションに書き込んでください。またはIAM forumに質問やコメントすることもできます。
- Daniel(翻訳はSA渡邉(@gentaw0)が担当しました。原文はHow to Set Up Federated API Access to AWS by Using Windows PowerShell)
コメント