STSについて

Last-modified: Tue, 03 Nov 2020 13:20:21 JST (1271d)
Top > 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を経由して本来持っていない権限ロールの一時アカウントを取得するサンプルを作成し、動かしてみることで動きを理解します。
  1. まずはSDKを実行するIAMユーザを作成します。
    ここはサンプルとして、EC2インスタンス一覧を取得できる権限を設定します。
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Action": [
    "ec2:DescribeInstances"
    ],
    "Resource": [
    "*"
    ]
    }
    ]
    }
    こんな感じ。IAMユーザはdeveropとしました。ここで作成したIAMユーザのARNは後で必要になるのでメモっておきます。
  2. 次にSTSで割り当てるロールを作成します。
    今回はサンプルとして、S3の読み取り専用権限を付与します。これがSTSで割り当てられる最大権限になります。
    sts01.jpg
    sts02.jpg
    sts03.jpg
  3. 作成したロールに対し、先ほど作成したIAMユーザからのみ権限付与を許可するように設定します。
    信頼関係タブから信頼関係の編集をクリックします。
    sts04.jpg
    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)

ロールに権限がないので、アクセスが拒否されました。

このように、ロールを超えて権限を取得することはできません。


Counter: 659, today: 2, yesterday: 1

このページの参照回数は、659です。