IAM Policyで利用できる条件コンテキストキー

IAM PolicyのCondition句を記述する際に、例えばec2:InstanceTypeの条件ってどのアクションに適用できるんだっけ、と
どのアクションにどの条件が適用できたかわからなくなることが多いので、
よく参照する公式のドキュメントを備忘録として残しておきます。

公式のドキュメント
------------------

よく参照する公式のドキュメントはこのあたり。

- IAM ポリシー変数の概要
  - http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_variables.html
- IAM ポリシーで使用できる AWS サービスアクションと条件コンテキストキー
  - http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_actionsconditions.html
- 条件に利用可能なキー (共通で使えるもの)
  - http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements.html#AvailableKeys
- 各サービス固有の利用可能なキーと対応するアクション
  - EC2: http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html
  - RDS: http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAM.ResourcePermissions.html
  - S3: http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/amazon-s3-policy-keys.html#object-keys-in-amazon-s3-policies
- 各サービスのPolicy記述の例
  - EC2: http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/iam-policies-ec2-console.html
  - RDS: http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/UsingWithRDS.IAM.Conditions.html
  - CloudFormation: http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/using-iam-template.html#d0e6710

よく使う例
----------

ついでにIAM Policyを書く際によく忘れるCondition句の書き方の例も。

### 特定のUserリソースに対する許可

Condition句では無いですが変数の利用例として。
各ユーザ自身のリソースに限定して操作を許可する場合によく使います。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "***********",
      "Effect": "Allow",
      "Action": [
        "iam:Get*",
        "iam:List*"
      ],
      "Resource": "*"
    },
    {
      "Sid": "***********",
      "Effect": "Allow",
      "Action": [
        "iam:*AccessKey*"
      ],
      "Resource": "arn:aws:iam::<account>:user/${aws:username}"
    }
  ]
}
```

### 特定のSourceIPに対する制限

特定の拠点以外からの操作を制限したい場合などに。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "***********",
      "Effect": "Deny",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": "arn:aws:iam::<account>:role/IAMAdministrator",
      "Condition": {
        "NotIpAddress": {
          "aws:SourceIp": "xxx.xxx.xxx.xxx/24"
        }
      }
    }
  ]
}
```

### MFAが利用されていない場合に対する制限

MFAが有効でないユーザからの操作を制限したい場合などに。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "***********",
      "Effect": "Deny",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": "arn:aws:iam::<account>:role/IAMAdministrator",
      "Condition": {
        "Null": {
          "aws:MultiFactorAuthPresent": true
        }
      }
    }
  ]
}
```

### 特定のタグに対する制限

誤操作防止などに。
ただしタグを変更する操作にはこの制限が適用できないので、
タグを変更すれば迂回して操作可能になります。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "***********",
      "Effect": "Deny",
      "Action": [
        "ec2:RebootInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/Environment": "production"
        }
      }
    }
  ]
}
```

### 特定のInstanceTypeに対する制限

高額なInstanceTypeを起動する前に一言相談が欲しい場合などに。
ドキュメントを見る限り、現時点ではModifyInstanceAttributeやRequestSpotInstancesなどに
対応していないように見えるので今後に期待です。

```
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "***********",
      "Effect": "Deny",
      "Action": [
        "ec2:RunInstances"
      ],
      "Resource": "*",
      "Condition": {
        "StringLike": {
          "ec2:InstanceType": "*xlarge"
        }
      }
    }
  ]
}
```