STSについて

Last-modified: Wed, 27 Dec 2017 17:36:06 JST (22d)
  • 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"
[#<struct Aws::EC2::Types::Tag key="Name", value="AmazonLinux2">]
"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"
[#<struct Aws::EC2::Types::Tag key="Name", value="AmazonLinux2">]
"S3へアクセス"
"sts-sample-bucket"
"File"
"hgegile.txt"

無事アクセスできました。

  • STSでロールを絞る
    STSでは、ロールを最大権限として、取得する権限を絞ることができます。
    こんな感じでポリシーのJSONを渡してあげます。
$ ruby sts_samle.rb
"EC2アクセス"
"i-03a6993618ef56f11"
[#<struct Aws::EC2::Types::Tag key="Name", value="AmazonLinux2">]
"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"
[#<struct Aws::EC2::Types::Tag key="Name", value="AmazonLinux2">]
"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: 47, today: 1, yesterday: 0

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