はじめに
IAMポリシーによるEC2インスタンスの操作制限について調べた内容の記事です。
IAMポリシーについて
IAMポリシーはAWSリソースに対する操作権限を記述したもので、IAMユーザー・IAMグループ・IAMロールに対しアタッチすることで操作権限を制御することができます。ポリシーはjson形式で記述されます。
操作制限の具体例
今回はIAMポリシーによる操作制御の具体例として、EC2インスタンスに対して以下の操作を許可するために必要なポリシーを調べました。各操作はマネージメントコンソールから行うことを想定しています。
- EC2インスタンスが見れるだけ
- 既存のEC2インスタンスの起動・停止を許可
- EC2インスタンスの作成を許可
- 既存のIAMロールをアタッチしたEC2インスタンスの作成を許可
EC2インスタンスが見れるだけ
AWS管理ポリシーの arn:aws:iam::aws:policy/ReadOnlyAccess のみをアタッチします。
これはAWSリソースに対する読み取りアクセスのみを許可するポリシーです。
既存のEC2インスタンスの起動・停止を許可
既存のEC2インスタンスの起動・停止を許可するポリシーです。
許可する対象としてEC2インスタンスに自身のユーザー名のOwnerタグがつけられているものに限定しています。
ポリシーは以下の2つの記述からなります。
- EC2インスタンスの起動・停止の許可
- EC2インスタンスの情報表示の許可
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:StartInstances",
"ec2:StopInstances"
],
"Resource": "arn:aws:ec2:*:*:instance/*",
"Condition": {
"StringEquals": {
"ec2:ResourceTag/Owner": "${aws:username}"
}
}
},
{
"Effect": "Allow",
"Action": "ec2:DescribeInstances",
"Resource": "*"
}
]
}
EC2インスタンスの作成を許可
EC2インスタンスの作成を許可するポリシーです。
以下の2つの記述からなります。
- EC2インスタンスの情報表示・コンソール出力の許可
- EC2インスタンスの作成の許可
ちなみにこのポリシー下では既存のIAMロールをEC2インスタンスにアタッチすることができません。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:GetConsole*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:ec2:*:*:subnet/*",
"arn:aws:ec2:*:*:network-interface/*",
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*::image/ami-*",
"arn:aws:ec2:*:*:key-pair/*",
"arn:aws:ec2:*:*:security-group/*"
]
}
]
}
既存のIAMロールをアタッチしたEC2インスタンスの作成を許可
既存のIAMロールをアタッチしたEC2インスタンスの作成を許可するポリシーです。
1つ上で説明したポリシーに加え以下の3つのアクションを許可しています。
- iam:Get*
- iam:List*
- iam:PassRole
上の2つはIAMの情報取得のための権限です。
iam:PassRoleはサービスにロールを渡す権限で、EC2インスタンスにIAMロールを設定する際に必要となります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"ec2:GetConsole*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ec2:RunInstances",
"Resource": [
"arn:aws:ec2:*:*:subnet/*",
"arn:aws:ec2:*:*:network-interface/*",
"arn:aws:ec2:*:*:instance/*",
"arn:aws:ec2:*:*:volume/*",
"arn:aws:ec2:*::image/ami-*",
"arn:aws:ec2:*:*:key-pair/*",
"arn:aws:ec2:*:*:security-group/*"
]
},
{
"Effect": "Allow",
"Action": [
"iam:Get*",
"iam:List*",
"iam:PassRole"
],
"Resource": "*"
}
]
}