Federatedユーザを利用して貸出用アカウントを運用してみる(Powershell編)

2015.08.19

西澤です。開発担当が本番環境での確認を行う際や、外部ベンダにAWS環境の構築作業を依頼する際、ワンタイムのデモを行う際などには、一時的にAWSアカウントを貸し出して運用したい場面があると思います。AssumeRoleを利用しての運用が一般的だと思いますが、事前にIAMロールを用意したり、Trust Relationshipsを設定したりと、仕込みがやや面倒です。そこで、Federatedユーザを利用して、テンポラリなAWSアカウント権限の貸出を、AWS Tools for Windows PowerShellを使ってやってみることにしました。

概要

以下の流れでAWSアカウントを貸し出しするフローを、Powershellを利用してやってみたいと思います。

  • 管理者ユーザがSTSにFederatedユーザを作成要求
  • STSがFederationユーザ用の一時クレデンシャルを返す
  • 担当者が一時クレデンシャルを受領
  • 担当者は一時クレデンシャルを利用してAWS環境を利用

Federatedユーザ利用イメージ

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へのアクセス権以外付与されていないことも確認しておきましょう。

feduser_amc_login

ちなみにCloudTrailでは以下のように記録されるようです。federatedユーザでログインしたことが記録されていますね。sessionIssuerには、FederationTokenを発行したユーザの情報も記録されるようです。

fdeuser_login_cloudtrail

fdeuser_login_cloudtrail_event

まとめ

Powershellに限らず、AWS CLIや他のSDKからもFederatedユーザを利用することが可能です。IAMユーザもIAMロールも用意することなく利用できるのが良いですね。本来はアプリケーションからAWSを利用する為の仕組みなのですが、使い方次第では有効活用できそうです。ぜひ試してみてください。