タグを利用したEC2リソースのアクセス管理

## はじめに
先日自分のEC2を『終了』させて、ふと画面を見ると何故か自分のEC2は元気に『実行中』という体験をしました。はい、誰かのインスタンス削除してしまいました。ごめんなさい。
開発環境のため大事には至りませんでしたが、肝が冷えた第三システム部の稲村です。

そんなに肝を冷やさないためにも**『タグベースの認可』**について学んでいきたいと思います。

## タグベースの認可とは？
![](https://cloud5.jp/wp-content/uploads/2022/05/スクリーンショット-2022-05-03-19.13.11-640x401.png)

AWSのリソースにはタグ（キー＆値）を付与することが出来ます。単にリソースを見つけやすくするだけではなく、リソース自体の管理をしやすくなる戦略を執ることが可能です。

AWSにはリソースを実行するための、エンティティ（ポリシー（権限）を付与することができる対象のユーザ・グループ及びロール）というものがあります。

このエンティティに対して、**『特定のタグ（キー＆値）が付与されている、AWSリソースに対してのみ、アクションの実行が可能』**という**条件があるポリシー（権限）**を与えることが可能となります。

こうした**条件があるポリシー（権限）**を付与することを**『タグベースの認可』**と言います。

## ハンズオン
### 1.EC2インスタンスに特定のタグを追加する
#### 1.1 作成されたEC2コンソールを開き、「タグ」タブを選択して「タグを管理」を押下する
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651572572752.png)

#### 1.2 特定のタグ（キー：Auth　値：アカウント名）と入力する
リソースにタグを付けるときは事前にタグの制限をよく読んで理解してください。
**Amazon EC2 のタグは大文字と小文字が区別されます。**

AWSドキュメント：[Amazon EC2 リソースのタグ付け](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Using_Tags.html#tag-restrictions)
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651572653228.png)
### 2.特定のタグへのアクセスを許可するIAM ポリシーを作成する
#### 2.1 IAMの画面へ移動して「ポリシー」を選択、「ポリシーの作成」を押下する
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651546596736.png)
#### 2.2 ポップアップで画面が開き「ポリシーの作成」で、タブ「JSON」で作成、作成後ポリシーの名前を付けて作成する
**考慮点**
1.EC2を作成することが出来る（今回はすべてのEC2リソースを利用できるとしています）
2.ただしタグ（キー：**ec2:ResourceTag/Auth** 　値：**${aws:username}**がない場合は EC2 リソースへのアクセスは出来ません（必ずアカウント名が必要となる）
3.②の条件を利用して、値：**${aws:username}**がタグ付けされていないEC2は削除出来ないとしています
※他のアカウントの方が、もし私のアカウント名を付与した場合は削除出来てしまうので注意
※利用しているアカウント名はAWSコンソール画面左上辺りにあります
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651573512591.png)
##### IAMポリシー
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "CreateEC2",
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*"
        },
        {
            "Sid": "CannotBeCreatedWithoutTags",
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringNotLike": {
                    "aws:RequestTag/Auth": "${aws:username}"
                }
            }
        },
        {
            "Sid": "CannotDeleteWithoutTags",
            "Effect": "Deny",
            "Action": [
                "ec2:Terminate*",
                "ec2:Start*",
                "ec2:Reboot*",
                "ec2:Delete*",
                "ec2:Stop*"
            ],
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "ec2:ResourceTag/Auth": "${aws:username}"
                }
            }
        }
    ]
}
```
### 3.作成したポリシーをロールへ付与する
#### 3.1「ロール」を選択し「ロールを作成」を押下する
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651546815663.png)
#### 3.2 AWSアカウントを選択、「このアカウント」にチェックして「次へ」を押下する
「このアカウント」にチェックをすることで、こちらのロールを引き受けることを許可する、信頼されたエンティティが作成されます
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651546898087.png)
#### 3.3 作成したポリシーを選択して「次へ」を押下し、作成後ロールの名前を付けて作成する
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651547051609.png)

### 4.アクセスを許可するユーザーに、このIAMロールを付与する
#### 4.1 「ユーザー」を選択して、ロールを付与する「ユーザー」を選択する
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651573797607.png)
#### 4.2 「アクセス権限の追加」を選択して、ロールを付与する
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651574054813.png)

## 挙動の確認
### 1.EC2からタグを削除して削除をしてみる
#### 1.1 特定のタグ（キー：Auth　値：アカウント名）で入力したタグを一度削除する
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651574662585.png)
#### 1.2 特定のタグがないためERRORになる→OK
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651574747197.png)
### 2.EC2にタグを付与してから削除をしてみる
#### 2.1 特定のタグがあるため削除することが出来る→OK
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651574971338.png)
### 3.EC2作成時に特定のタグを付与しない
#### 3.1 特定のタグを入力しないで作成してみる
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651575099611.png)
#### 3.2 特定のタグがないためERRORになる→OK
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651575198241.png)
### 4.EC2作成時に特定のタグを付与して作成する
#### 4.1 特定のタグがあるため作成することが出来る→OK
![file](https://cloud5.jp/wp-content/uploads/2022/05/image-1651575289299.png)

## まとめ
・最初にポリシーの方向性を決めずに作成してしまい、記事の最後になるにつれてポリシーの構成が大きく変わっていきました。こんな記事でも何も考えずに書き始めると迷走するもんなので、ポリシーを先に決めることは大事なことだと学びました。

・EC2作成時に少し手間が増えますが、**消してはいけないEC2**を消してしまうような恐ろしい事態はこれで自衛できるはず（そもそも**消してはいけない**が、あること自体が変なんだけどね）。

## 参考資料
[タグを使用して Amazon EC2 リソースへのアクセスを管理する IAM ポリシーを作成するにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/iam-ec2-resource-tags/)
[このアクション、タグベースの認可 ないし リソースレベルのアクセス許可 に対応してる？ IAM ポリシービジュアルエディタでお手軽に確認しちゃおう](https://dev.classmethod.jp/articles/iam-visual-editor-reference/)