ども、おはようございます。
最近欧州No.1サッカークラブを決めるトーナメント ”チャンピオンズリーグ(略して CL )” の予選が始まり、寝れない日々が続いている新卒のまつもとです。
只今、絶賛お客様からのお問い合わせ対応で修行中の身であり、ある日、
「 IAM ポリシーで、リージョンとリソースへのアクセス制限をしたいが、うまくいかない!」というお問い合わせをいただきました。
そこで本ブログでは、お客様がアクセス制限できなかった原因を調べ、お客様の IAM ポリシーを元に、リージョンとリソースへのアクセス制限ができる IAM ポリシーの作成をしていきます。
※お客様から頂いた IAM ポリシーの要件と IAM ポリシー(JSON)は一部改変しています。
作成したい IAM ポリシーの要件について
作成したい IAM ポリシーの要件は以下の4点です。
- 大阪リージョンにアクセス不可
- 東京リージョンの EC2 のみ操作可能
- できる操作は EC2 の開始と停止のみ
- EC2 の CloudWatch メトリクスを表示
お客様が作成した IAM ポリシーでアクセス制限の確認
IAM ポリシー( JSON ) の見方に関しては、当社のこちらのブログで簡単にまとめていますので、是非ご覧ください。
それでは、お客様が作成した IAM ポリシー( JSON )を確認してみます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "ap-northeast-3" } } }, ~~~ここまでがリージョンの制限に関する内容~~~ { "Effect": "Allow", "Action": [ "cloudwatch:DescribeAlarms", "cloudwatch:GetMetricStatistics" ], "Resource": "arn:aws:ec2:ap-northeast-1: 123456789101 :instance/*" }, ~~~ここまでが EC2 の CloudWatch メトリクスの表示に関する内容~~~ { "Effect": "Allow", "Action": [ "ec2:Describe*", "ec2:StartInstances", "ec2:StopInstances" ], "Resource": "arn:aws:ec2:ap-northeast-1: 123456789101 :instance/i-0780b15213d764866" } ] } ~~~ここまでが EC2 の操作に関する内容~~~
この IAM ポリシーをアタッチした IAM ユーザーを作成して、要件確認を行います。
以下の通り、"大阪リージョンにアクセス不可" は満たしていました。
次に東京リージョンにアクセスを行うと、東京リージョンへのアクセスは” Deny ”していないのですが、アクセスすることができませんでした。
リソースのアクセス制限がうまくいかない原因は?
IAM ポリシーのビジュアルエディタを見ると、いくつかのアクションにエラーが出ていました。
結論としては、アクションによってリソースの制限の仕様が異なるようです。
今回使用しているアクションは以下の5つになります。
- "cloudwatch:DescribeAlarms"
- "cloudwatch:GetMetricStatistics"
- "ec2:Describe*"
- "ec2:StartInstances"
- "ec2:StopInstances"
それぞれのアクションについて AWS ドキュメントで確認していきます。
- "cloudwatch:DescribeAlarms"
このアクションは、リソースの制限をすることができます。
ただ、リソースの ARN の書き方が決まっており、以下のようになっています。
arn:${Partition}:cloudwatch:${Region}:${Account}:alarm:${AlarmName}
- "cloudwatch:GetMetricStatistics"
このアクションは、リソースの制限をすることができません。
そのため、"Resource": の後は、"*" (すべてのリソースという意味)でなければなりません。
- "ec2:StartInstances"
- "ec2:StopInstances"
この2つのアクションは、リソースの制限をすることが可能です。
ただ、リソースの ARN の書き方が決まっており、以下のようになっています。
arn:${Partition}:ec2:${Region}:${Account}:instance/${InstanceId}
- "ec2:Describe*"
続いて、アクセス制限がうまくいかなかった原因であるこのアクションについてです。
Describe の後ろに ”*” があることで、”Describe から始まるすべてのアクション”を意味します。Describe から始まるアクションはとても多く、それぞれでリソースの ARN の書き方も異なります。
そのため、リソースの ARN の書き方を一意に定めることができず、リソースの制限をすることができません。
以上のことから IAM ポリシー( JSON )では、リソースの制限できるアクションかどうかで、記述を分けるなどの対応をする必要があります。
IAM ポリシーを修正してみた
上記を踏まえて、IAM ポリシーを書き換えてみます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:RequestedRegion": "ap-northeast-3" } } }, { "Effect": "Allow", "Action": [ "cloudwatch:DescribeAlarms", "cloudwatch:GetMetricStatistics", "ec2:Describe*" ], "Resource": "*" <-制御できないアクションをまとめて、Resourse を "*" に変更 }, { "Effect": "Allow", "Action": [ "ec2:StartInstances", "ec2:StopInstances" ], "Resource": "arn:aws:ec2:ap-northeast-1: 123456789101 :instance/i-0780b15213d764866" } ] }
"cloudwatch:DescribeAlarms" はリソースの制限ができるアクションですが、今回は制限していません。また、対象リソースが EC2 ではなく、作製したアラームですので、正確にはこちらのアクションも "ec2:Describe*" などと分けて記述した方がいいのかもしれません。
もう一度東京リージョンにアクセスすると、無事 EC2 リソースの表示に成功しました。
また、指定の EC2 のインスタンスの停止、それ以外の EC2 の操作が不可であること、 CloudWatch メトリクスの表示も確認できました。バンザーイ。
まとめ
本ブログでは、IAM ポリシー( JSON )で、"リソース" と "リージョン" へのアクセス制限をしてみました。各 AWS サービスのアクションごとにリソースの制限方法が異なるので、少し大変ですが、AWS ドキュメントをしっかり確認していきましょう!
あまり IAM ポリシーの AWS ドキュメントを眺める機会がなかったため、いい勉強になりました。
AWS ドキュメント万歳!!
・参考にしたブログ
まつもととしゆき(執筆記事の一覧)
アプリケーションサービス部ラーニングエクスペリエンス課 2022年新卒入社。後回し癖を治したい(切実)