意外とやりがちなIAM権限設定の「落とし穴」
!!!!!!!あと18日!!!!!!!

前談
AWSでIAM権限を設定するとき、こんな風に考えたことありませんか?
- 「AdminロールとWriteロールで分けてるから安全でしょ」
- 「PowerUserAccessなら、Administratorより安全だよね」
- 「IAM操作できないようにしてるから大丈夫」
でも実際、「なんでこんなに権限あるの?」って設定になってませんか?
「一応セキュリティ考えてるつもりだけど...」って感じで。
今回は、実際のAWS環境でよく見かける「実はかなり危険」なIAM設定について、わかりやすく解説していきます!
PowerUserAccessという名前の罠
PowerUserAccessって何?
まず、よく使われるPowerUserAccessというマネージドポリシーについて見てみましょう。
AWSの公式説明はこちら📕
Provides full access to AWS services and resources, but does not allow management of Users and groups.
わかりやすく説明すると「IAMユーザー管理以外は全部できる権限」です。
会社の部長で例えると
PowerUserAccessの危険性を身近な例で考えてみましょう。

つまり、「人事権がない部長」みたいなもの。でも会社のリソースは使い放題。
これって本当に安全ですか?
PowerUserAccessでも同じ
実際の環境では、PowerUserAccessをそのまま使っていることも多いです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"NotAction": [
"iam:*",
"organizations:*",
"account:*"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"account:GetAccountInformation",
"account:GetPrimaryEmail",
"account:ListRegions",
"iam:CreateServiceLinkedRole",
"iam:DeleteServiceLinkedRole",
"iam:ListRoles",
"organizations:DescribeEffectivePolicy",
"organizations:DescribeOrganization"
],
"Resource": "*"
}
]
}
NotActionで「これ以外は全部OK」という書き方になっています。
IAM操作を除外しているので、一見安全そうに見えますよね。
でも、結局のところ本番環境のリソースは触り放題なんです。
さらに危険:IAMFullAccessという爆弾💣
ここからが本当にヤバい話です。
スーパーサイヤ人になれるボタン
実際の環境で、writeRoleにこんな権限がついていることがあります⚠️⚠️
IAMFullAccess = 自分の権限を自由に変更できる権限
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iam:*",
"organizations:DescribeAccount",
"organizations:DescribeOrganization",
"organizations:DescribeOrganizationalUnit",
"organizations:DescribePolicy",
"organizations:ListChildren",
"organizations:ListParents",
"organizations:ListPoliciesForTarget",
"organizations:ListRoots",
"organizations:ListPolicies",
"organizations:ListTargetsForPolicy"
],
"Resource": "*"
}
]
}
ゲームのチートコードみたいなもの

つまり、こんなことができちゃいます。
# 自分のロールにAdministratorAccessを付与
aws iam attach-role-policy \
--role-name writeRole \
--policy-arn arn:aws:iam::aws:policy/AdministratorAccess
# これで実質Admin権限獲得
「writeRole」という控えめな名前なのに、実質的にはAdmin権限を持っているのと同じなんです。
他の制限も意味がない
例えば、こんな感じで特定のS3バケットのみアクセス可能に制限していたとします。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSpecificS3BucketOnly",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::dev-bucket",
"arn:aws:s3:::dev-bucket/*"
]
}
]
}
「開発用バケットしかアクセスできないようにした!安全!」
でも、IAMFullAccessがあったら、、、
# 制限を自分で外せちゃう
aws iam put-role-policy \
--role-name writeRole \
--policy-name AllowAllS3Access \
--policy-document '{
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}]
}'
せっかく設定した制限が、全部無意味になります。
こんな事故が起こります
「ちょっと確認だけ...」事故
よくある場面
開発者-「本番のEC2、ちょっと状況確認するだけ...」
👉 間違えてEC2を削除
👉 PowerUserAccessがあるので、本当に削除されちゃう
内部犯行のリスク
もし悪意を持った人がいたら
- 自分にAdmin権限を付与
- データを全部ダウンロードして持ち出し
IAMFullAccessがあると、全部できちゃいます。
ハッキング被害の拡大
もしwriteRoleの認証情報が漏れたら
攻撃者:「おっ、IAMFullAccessついてるじゃん」
👉 即座に自分にAdmin権限を付与
👉 完全にアカウント乗っ取り完了
被害が一気に拡大します。
どう改善すべきか
その1,Permissions Boundaryを設定する
Permissions Boundary(権限の境界)を使うと、ロールが持てる権限の上限を設定できます。
カスタムPermissions Boundaryポリシーを作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:Describe*",
"s3:List*",
"rds:Describe*",
"cloudwatch:*",
"logs:*"
],
"Resource": "*"
}
]
}
注意: AWSには特定サービス用の管理Permissions Boundary(AmazonBedrockStudioPermissionsBoundary等)がありますが、これは汎用的な権限制限には使えないと思ってください。独自のポリシーを作成することをお勧めします!
その2,IAM操作は別ロールに限定
writeRoleからIAMFullAccessを外して、IAM操作は本当のadminロールだけに限定します。
adminRole: IAM操作も含めて全部できる(少数の管理者のみ)
writeRole: リソース操作はできるが、IAM操作はできない
readRole: 参照のみ
その3,環境ごとにロールを分ける
本番環境と開発環境で、ロールを完全に分けるのも有効です。
prod-writeRole: 本番環境のみ操作可能
dev-writeRole: 開発環境のみ操作可能
その4,段階的に移行する
いきなり権限を厳しくすると、開発が止まってしまいます。
- 本当に必要な権限だけをリストアップ
- テスト環境で試してから本番に適用
- 定期的に見直す
まとめ
-
PowerUserAccessは「ほぼAdmin」と思った方がいい
- IAM操作以外は何でもできる
- 本番環境のリソースも触り放題
-
IAMFullAccessがあると、実質Admin権限
- 自分の権限を自由に昇格できる
- 他の制限も自分で外せる
-
ロール名に騙されない
- 「writeRole」という名前でも、実質Adminということはある
- 実際にどんな権限がついているか確認する
-
Permissions Boundaryで上限を設定
- たとえIAMFullAccessがあっても、境界は超えられない
- 段階的に権限を見直していく
IAM権限の設定は、一度設定したら終わりではありません。
定期的に見直して、本当に必要な権限だけを付与するようにしましょう。
Discussion