今日やったこと

  • IAMロールにおける信頼ポリシーと権限ポリシーの違いを整理した
  • 信頼ポリシーは「誰がこのロールを引き受けてよいか」を決めるものだと確認した
  • 権限ポリシーは「このロールを引き受けたあと、何ができるか」を決めるものだと確認した
  • 信頼ポリシーで使われる Principal の意味を整理した
  • IAMロールを理解するには、「誰が使えるか」と「使ったあと何ができるか」を分けて考える必要があると分かった

学んだこと

IAMロールには2つのポリシーの観点がある

IAMロールを理解するときは、次の2つを分けて考えると分かりやすい。

1. 誰がこのロールを引き受けてよいか
2. このロールを引き受けたあと、何ができるか

1つ目を決めるのが 信頼ポリシー
2つ目を決めるのが 権限ポリシー

信頼ポリシーとは

信頼ポリシーは、IAMロールに設定するポリシーで、

誰がこのIAMロールを引き受けてよいか

を決める。

たとえば EC2 にロールを使わせたい場合、信頼ポリシーでは Principal に EC2 サービスを指定する。

{
  "Effect": "Allow",
  "Principal": {
    "Service": "ec2.amazonaws.com"
  },
  "Action": "sts:AssumeRole"
}

この例は、

EC2 がこのロールを引き受けてよい

という意味になる。

Principal とは

Principal は、ざっくり言うと、

誰が操作するのか

を表す要素。

信頼ポリシーでは、Principal を見れば「誰がこのロールを引き受けられるのか」が分かる。

たとえば、

"Principal": {
  "Service": "ec2.amazonaws.com"
}

なら、EC2 サービスが対象になる。

権限ポリシーとは

権限ポリシーは、

ロールを引き受けたあと、何ができるか

を決めるポリシー。

たとえば、S3 の特定バケットを読み取らせたい場合は、以下のような権限ポリシーを付ける。

{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::example-bucket/*"
}

これは、

example-bucket 配下のオブジェクトを読み取ってよい

という意味になる。

信頼ポリシーと権限ポリシーの違い

整理すると、以下のようになる。

種類 決めること
信頼ポリシー 誰がロールを引き受けてよいか
権限ポリシー 引き受けたあと何ができるか

つまり、

信頼ポリシー:
  誰に使わせるか

権限ポリシー:
  使ったあと何を許可するか

という違い。

IAMロールでは、この2つがそろって初めて意味を持つ。

たとえば EC2 から S3 を読みたい場合は、

信頼ポリシー:
  EC2 がロールを引き受けてよい

権限ポリシー:
  S3 の特定バケットを読んでよい

という両方の設定が必要になる。

信頼ポリシーだけでは、ロールを引き受けたあと何ができるかは決まらない。
逆に、権限ポリシーだけでは、誰がそのロールを使えるかは決まらない。

IAMロールを読むときは、

1. 信頼ポリシーで、誰が引き受けられるかを見る
2. 権限ポリシーで、引き受けたあと何ができるかを見る

という順番で確認すると理解しやすそう。

あいまいなこと

  • Principal に指定できる値の種類をもう少し整理したい
  • arn:aws:iam::123456789012:root が正確に何を表すのかをもう少し理解したい
  • 信頼ポリシーで Condition を使うケースを整理したい
  • 権限ポリシー、リソースベースポリシー、信頼ポリシーの関係をもう少し整理したい
  • クロスアカウントで IAMロールを引き受ける場合の流れを確認したい

次にやること

  • Principal に指定できる値の種類を整理する
  • arn:aws:iam::123456789012:root の意味を確認する
  • 信頼ポリシーで Condition を使うケースを整理する
  • aws sts assume-role を手動で実行する方法を確認する
  • IAM Identity Center とは何かを確認する