この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
西澤です。開発担当が本番環境での確認を行う際や、外部ベンダにAWS環境の構築作業を依頼する際、ワンタイムのデモを行う際などには、一時的にAWSアカウントを貸し出して運用したい場面があると思います。AssumeRoleを利用しての運用が一般的だと思いますが、事前にIAMロールを用意したり、Trust Relationshipsを設定したりと、仕込みがやや面倒です。そこで、Federatedユーザを利用して、テンポラリなAWSアカウント権限の貸出を、AWS Tools for Windows PowerShellを使ってやってみることにしました。
概要
以下の流れでAWSアカウントを貸し出しするフローを、Powershellを利用してやってみたいと思います。
- 管理者ユーザがSTSにFederatedユーザを作成要求
- STSがFederationユーザ用の一時クレデンシャルを返す
- 担当者が一時クレデンシャルを受領
- 担当者は一時クレデンシャルを利用してAWS環境を利用
Federatedユーザ作成要求
Get-STSFederationTokenコマンドを利用して、Federatedユーザ用の一時クレデンシャルを要求します。
- Federatedユーザの名前(任意)を指定
- Tokenの有効期限を設定(15m〜36h、デフォルト12h)
- Federatedユーザの権限(Policy)を指定
Tokenは一度発行してしまうと、有効期限が切れるまで無効化することができない為、ご注意ください。また、Federatedユーザに割り当てるアクセス権限は、GetFederationTokenを呼び出すユーザの権限内に規定されます。詳しくは公式ドキュメントをご確認ください。
$feduser="feduser" #Federatedユーザ名
$expire=60 * 60 * 3 #有効期間を3時間
$policy=@"
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
"@ #S3フルアクセスのみ
$fedtoken=Get-STSFederationToken -Name $feduser -DurationInSeconds $expire -policy $policy
こんな結果が返ってきました。
PS C:\tmp> $fedtoken | Format-List
LoggedAt : 2015/08/19 12:08:25
Credentials : Amazon.SecurityToken.Model.Credentials
FederatedUser : Amazon.SecurityToken.Model.FederatedUser
PackedPolicySize : 5
ResponseMetadata : Amazon.Runtime.ResponseMetadata
ContentLength : 1156
HttpStatusCode : OK
PS C:\tmp> $fedtoken.Credentials
AccessKeyId Expiration SecretAccessKey SessionToken
----------- ---------- --------------- ------------
ASIAJGZIBHFYG42N6RTQ 2015/08/19 15:08:25 UlI2dnyVHRiMJ25joUxevQDImReny4Y+w... AQoDYXdzEGwaoAKXwf2bFVF9YF9+AwyRo...
PS C:\tmp> $fedtoken.Credentials | Format-List
AccessKeyId : ASIAJGZIBHFYG42N6RTQ
Expiration : 2015/08/19 15:08:25
SecretAccessKey : UlI2dnyVHRiMJ25joUxevQDImReny4Y+wYfxgUG4
SessionToken : AQoDYXdzEGwaoAKXwf2bFVF9YF9+AwyRoVCVc8aMkbIBncf/SjmfwNeLPzoZPPPFU1H6xXxWcVFA8jbQaHhA8DPNSeJ50p/KxdzbvmQT7V38sP04ruHUgOAPUzfQubWlyMa
y1ycoWwuWKlkScJyqF57T4grCerGNOI2DIm1xu5zqoye7Kv4BhY6ZoimFu7RcH7RDh6ii6ZLPcWMEBPApib0cdPnrpEUXYTKsQAkeV5xLlmvqnd/+ILFrh97JOUf6FgtKlI
vPhD5b4X5cUVN9o5uhEk68oUYjZvAI2Xv2FWr2TsauTUAE1p/Ke4uzEbtO24Zim25b6RfPKPZVgLoBEcblf6xKIvbW7VrklBPj08ALW+CcmPvS7R305y8NFiseylWqyGdi+
1PdqgcgqebPrgU=
PS C:\tmp> $fedtoken.Credentials | ConvertTo-Json
{
"AccessKeyId": "ASIAJGZIBHFYG42N6RTQ",
"Expiration": "\/Date(1439964505000)\/",
"SecretAccessKey": "UlI2dnyVHRiMJ25joUxevQDImReny4Y+wYfxgUG4",
"SessionToken": "AQoDYXdzEGwaoAKXwf2bFVF9YF9+AwyRoVCVc8aMkbIBncf/SjmfwNeLPzoZPPPFU1H6xXxWcVFA8jbQaHhA8DPNSeJ50p/KxdzbvmQT7V38sP04ruHUgOAPUzfQubW
lyMay1ycoWwuWKlkScJyqF57T4grCerGNOI2DIm1xu5zqoye7Kv4BhY6ZoimFu7RcH7RDh6ii6ZLPcWMEBPApib0cdPnrpEUXYTKsQAkeV5xLlmvqnd/+ILFrh97JOUf6FgtKlIvPhD5b4X5cUVN9
o5uhEk68oUYjZvAI2Xv2FWr2TsauTUAE1p/Ke4uzEbtO24Zim25b6RfPKPZVgLoBEcblf6xKIvbW7VrklBPj08ALW+CcmPvS7R305y8NFiseylWqyGdi+1PdqgcgqebPrgU="
}
Federatedユーザ権限の利用
この結果を担当者に渡して、利用してもらいましょう。AccessKeyId, SecretAccessKey, SessionTokenの3つを利用すれば、Federatedユーザ権限でのAWSリソースへのアクセスが可能です。同一ターミナル上であれば、変数に入れた値をそのまま利用するのが簡単です。
$fedcred=$fedtoken.Credentials
Set-AWSCredentials -Credential $fedcred
もしくは以下のようにして、3つの情報を直接設定することでも利用可能です。
$accesskey=$fedcred.AccessKeyId
$secretkey=$fedcred.SecretAccessKey
$sessiontoken=$fedcred.SessionToken
Set-AWSCredentials -AccessKey $accesskey -SecretKey $secretkey -SessionToken $sessiontoken
Powershellに限らず、AWS CLIや各種SDKからも一時クレデンシャルを利用することが可能です。AWS CLIでの利用例は、下記もご覧ください。
FederatedユーザでAWS Managemenet Console
Federatedユーザ用の一時クレデンシャルを利用してAWS Management Consoleにログインすることも可能です。詳細は下記ドキュメントの通りですが、Powershellでもログイン用URLを作成できるかやってみました。
#前述の一時クレデンシャルが変数に格納済の想定
$credjson=@"
{"sessionId":"$accesskey","sessionKey":"$secretkey","sessionToken":"$sessiontoken"}
"@
#FederationエンドポイントへのリクエストURL作成
$requrl="https://signin.aws.amazon.com/federation"
$action="getSigninToken"
$credencoded=[System.Uri]::EscapeDataString($credjson)
$formedurl=$requrl + "?Action=" + $action + "&Session=" + $credencoded
#Federationエンドポイントへのリクエスト
$ret=Invoke-WebRequest -Uri $formedurl
#取得したサインイントークンを使ってログイン用URL生成
$rettoken=$ret.Content | ConvertFrom-Json | % {$_.SigninToken}
$requrl="https://signin.aws.amazon.com/federation"
$action="login"
$issuser=[System.Uri]::EscapeDataString("https://mysignin.internal.mycompany.com/")
$destination=[System.Uri]::EscapeDataString("https://console.aws.amazon.com/")
$signintoken=[System.Uri]::EscapeDataString($rettoken)
$formedurl=$requrl+ "?Action=" + $action + "&Issuser=" + $issuser + "&Destination=" + $destination + "&SigninToken=" + $signintoken
#ログイン用URLをファイルに出力して利用者に提供
$formedurl | Tee-Object loginurl.txt ; Start-Process loginurl.txt
動作確認
それでは生成されたURLを使ってブラウザからアクセスしてみます。Federatedユーザには、S3へのアクセス権以外付与されていないことも確認しておきましょう。
ちなみにCloudTrailでは以下のように記録されるようです。federatedユーザでログインしたことが記録されていますね。sessionIssuerには、FederationTokenを発行したユーザの情報も記録されるようです。
まとめ
Powershellに限らず、AWS CLIや他のSDKからもFederatedユーザを利用することが可能です。IAMユーザもIAMロールも用意することなく利用できるのが良いですね。本来はアプリケーションからAWSを利用する為の仕組みなのですが、使い方次第では有効活用できそうです。ぜひ試してみてください。