HackToTech

Hack To Technology

IAMで特定のロールからのみAsuume Roleをさせる方法

IAMで特定のロールからのみAsuume Roleをさせる方法

Assume元を再作成した場合にも出来るようにしたくて試行錯誤したついでにメモを残す

Principalを使用する方法

公式にも書いてある方法
基本的に一番よく使うのはこれだと思う

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    // 対象のアカウント及びロール
    "Principal": { "AWS": "arn:aws:iam::123456789012:root" },
    "Action": "sts:AssumeRole",
    "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } }
  }
}

ただこれを使った場合

"Principal": { "AWS": "arn:aws:iam::123456789012:root" },

ここでUserやRoleを指定することになるが、これは保存時に自動的にPrincipalIDに変更される(ドキュメントにも書いてあるが)

Principal 要素に特定の IAM ロールまたはユーザーの ARN が含まれている場合、この ARN はポリシーの保存時に一意のプリンシパル ID に変換されます。 これにより、第三者がロールやユーザーを削除して再作成することで、そのユーザーのアクセス許可をエスカレートするリスクを緩和できます。 したがって、信頼ポリシーの Principal 要素で指し示しているユーザーまたはロールを削除し、再作成する場合、ロールを編集して ARN を置き換える必要があります。

ので、再作成したりしない or 再作成してもPrincipalを更新するので問題がない場合はこれでOK
ただ再作成してもAssumeできるようにしたいなら次のように実装しないとできなかった

Principal + Conditionを使用する方法

さっきと同様にPrincipalでまずアカウントを絞り込む
その上で、元となるロールをConditionのArnEqualsで更に絞り込む
こうすることによってそのアカウントのロールが再作成されてもAssumeできる

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        // 対象のアカウント
        "AWS": "arn:aws:iam::123456789012:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "ArnEquals": {
          // 対象のアカウントのロール
          "aws:PrincipalArn": "arn:aws:iam::123456789012:role/assume-from"
        }
      }
    }
  ]
}