STSについて
- AWSには、STS(AWS Security Token Service)という仕組みがあります。
これは簡単に言うとsudoです。(ぇ
ようは、SDKなどで権限が必要な時に、一時的に時限付きの認証情報を付与する仕組みになります。
この仕組みを使うとこんなこともできます。すごい!!
例えば、EC2内で動作するプログラムが使用する最大権限を持ったロールをEC2に付与することにより、
プログラム内では必要な権限をSTSを通じ、一時アカウントを取得することにより、セキュリティキーを保持しなくてもよくなります。
- IAMユーザを作って認証情報を使用するのと変わらないではないのか?
- 結局EC2インスタンスに付与する最大ロール権限で動くのなら、細かくIAMユーザで設定すればいいのではないか?
などと思うかもしれません。STSではアカウントの有効期限が最大1時間と短く、また呼び出す度にキーの内容が変わります。
つまり、ワンタイムパスワードになっているのです。
IAMユーザを作成して権限を付与する場合、確かに最低限の権限を与えられます。漏洩しても最小限の権限ですみます。
しかし、どこかにセキュリティキーを保持する必要があります。また、一度作ってしまうと、IAMユーザのセキュリティキーを
変更することは容易ではありません。またIAMユーザが増えてきて管理が煩雑になります。
EC2へのロール付与にしておけば、IAMのパスワード管理をしなくてもよくなりますし、紛失や漏洩(EC2内で動くアプリの脆弱性でIAMが漏洩した事案がありました)もありません。
ただし、どのEC2インスタンスにどのIAMロールが適用されているかは中々分かりにくいのと、
おいそれとロールのポリシーを変更するとアタッチしている全インスタンスへ影響するので、用途に合わせて、
IAMロールかIAMユーザかを選択すればいいと思います。
当然、STSの仕組み自体はなにもEC2ロールでないと動作しないわけではなく、指定されたIAMユーザから呼び出すこともできます。
やってみよう
- ここでは、EC2ロールではなく、指定したIAMユーザからSTSを経由して本来持っていない権限ロールの一時アカウントを取得するサンプルを作成し、動かしてみることで動きを理解します。
- まずはSDKを実行するIAMユーザを作成します。
ここはサンプルとして、EC2インスタンス一覧を取得できる権限を設定します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeInstances" ], "Resource": [ "*" ] } ] }
こんな感じ。IAMユーザはdeveropとしました。ここで作成したIAMユーザのARNは後で必要になるのでメモっておきます。 - 次にSTSで割り当てるロールを作成します。
今回はサンプルとして、S3の読み取り専用権限を付与します。これがSTSで割り当てられる最大権限になります。 - 作成したロールに対し、先ほど作成したIAMユーザからのみ権限付与を許可するように設定します。
信頼関係タブから信頼関係の編集をクリックします。 Principalの箇所を以下のように変更します。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "<作成したdeveropのARN>" }, "Action": "sts:AssumeRole" } ] }
以上で準備は完了です。
動かしてみよう
では動かしてみます。
- IAMユーザでのアクセス
まずはSTSを使わずIAMでアクセスします。
適当にプログラムをでっちあげてます。
$ ruby sts_samle.rb "EC2アクセス" "i-03a6993618ef56f11" [#] "S3へアクセス" /home/hoge_user/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/aws-sdk-core-3.7.0/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call': Access Denied (Aws::S3::Errors::AccessDenied)
S3へのアクセスは権限がないので拒否されています。
- STSを使用したアクセス
では、STSを使って一時アカウントをGetしてみましょう。
"EC2アクセス" "i-03a6993618ef56f11" [#] "S3へアクセス" "sts-sample-bucket" "File" "hgegile.txt"
無事アクセスできました。
- STSでロールを絞る
STSでは、ロールを最大権限として、取得する権限を絞ることができます。
こんな感じでポリシーのJSONを渡してあげます。
$ ruby sts_samle.rb "EC2アクセス" "i-03a6993618ef56f11" [#] "S3へアクセス" "sts-sample-bucket" "File" /home/hoge_user/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/aws-sdk-core-3.7.0/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call': Access Denied (Aws::S3::Errors::AccessDenied)
ファイル取得権限がないので拒否されています。
- ロール以上の権限取得について
では、ロールにない権限を設定してみましょう。
先ほどのIAMロールから、AmazonS3ReadOnlyAccessポリシーを削除し、
カスタムポリシーを以下のように作成します。
(AmazonS3ReadOnlyAccess からs3:List*を削除しています)
{ "Version": "2012-10-17", "Statement": [
{ "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": "*" } ] }
動かしてみます
$ ruby sts_samle.rb "EC2アクセス" "i-03a6993618ef56f11" [#] "S3へアクセス" /home/hoge_user/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/aws-sdk-core-3.7.0/lib/seahorse/client/plugins/raise_response_errors.rb:15:in `call': Access Denied (Aws::S3::Errors::AccessDenied)
ロールに権限がないので、アクセスが拒否されました。
このように、ロールを超えて権限を取得することはできません。
このページの参照回数は、1056です。