クラウドの「信頼」をハックする者たち:IAMとSCPで強制する最小権限の現実解
数多のインシデントハンドリングを手がけてきた経験上、クラウド環境におけるセキュリティ侵害の9割以上は、アプリケーションのゼロデイ脆弱性ではなく、「アイデンティティとアクセス管理(IAM)の設計ミス」に起因している。
攻撃者は洗練されたエクスプロイトコードを書くまでもなく、単に野良IAMロールに付与された過剰な権限(*の乱用)を悪用し、sts:AssumeRoleを踏み台にしてマネージメントコンソールを我が物顔で歩き回る。脆弱なパスワードや漏洩したアクセスキーは、最小権限の原則(PoLP: Principle of Least Privilege)が鉄壁に守られた環境であれば、単なる「一過性のノイズ」で終わるはずなのだ。
今回は、AWS環境においてこのPoLPを理想論で終わらせず、組織全体で強制するための実践的なアーキテクチャ、すなわち「インラインポリシーの完全排除」と「Service Control Policies(SCP)によるガードレール」の構築手法を、現場の泥臭い知見を交えて徹底的に解説する。
—
1. なぜ「インラインポリシー」は悪なのか?
AWS IAMポリシーの付与方法には、マネージドポリシーとインラインポリシーがある。セキュリティ監査の現場で最も頭痛の種となるのが、この「インラインポリシー」の存在だ。
インラインポリシーは特定のユーザー、グループ、ロールに直接埋め込まれるため、以下の致命的なセキュリティリスクを孕む。
- ライフサイクル管理の欠如: アイデンティティの削除とともにポリシーが消滅するため、再利用や監査のトレーサビリティが著しく低下する。
- 変更管理のブラックボックス化: TerraformやCloudFormationなどのIaC(Infrastructure as Code)管理外で、コンソールからアドホックに権限が追加されやすい。
- バージョン管理の不在: マネージドポリシーと異なり、過去のバージョンへのロールバック(
aws iam rollback-policy-version)が効かない。
対策:IAMリソースの完全なIaC化とSCPによる制限
インラインポリシーを根絶するためには、開発者やクラウドエンジニアがコンソールからポチポチとポリシーを追加できない状態を強制する必要がある。これには、AWS OrganizationsのSCPが唯一にして最強の武器となる。
—
2. SCP(Service Control Policies)によるガードレールの設計
SCPは、AWSアカウントの最大権限境界(Permission Boundary)を定義するためのメカニズムである。IAMポリシーが「何を許可するか」を決定するのに対し、SCPは「組織内のアカウントが絶対に実行できないこと(拒否の境界)」を定義する。
ここで重要なのは、SCP単体では権限を「付与」せず、あくまで境界(Guardrail)として機能する点だ。
実践的SCP:インラインポリシーの作成・変更を物理的にブロックする
以下のSCPは、組織内の特定のアカウント(あるいは全メンバーアカウント)において、インラインポリシーの作成やアタッチをAPIレベルで拒否する設定である。これをルートOU(Organization Unit)またはワークロードOUに適用する。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyInlinePolicyCreation",
"Effect": "Deny",
"Action": [
"iam:PutUserPolicy",
"iam:PutGroupPolicy",
"iam:PutRolePolicy"
],
"Resource": "*"
},
{
"Sid": "DenyFullAdministratorAccessGrant",
"Effect": "Deny",
"Action": [
"iam:AttachUserPolicy",
"iam:AttachGroupPolicy",
"iam:AttachRolePolicy"
],
"Resource": "*",
"Condition": {
"ArnEquals": {
"iam:PolicyArn": "arn:aws:iam::aws:policy/AdministratorAccess"
}
}
}
]
}
このSCPのキモは、iam:Put*Policy アクションを完全に封じつつ、マネージドポリシーであっても危険な AdministratorAccess のアタッチを条件分岐(ArnEquals)で弾いている点だ。これにより、現場のエンジニアがどれだけ権限昇格を試みようとも、AWSのAPIレイヤーで弾かれることになる。
—
3. IAMポリシーにおける「ワイルドカード(*)」の呪縛と正しい権限分離
PoLPを実装する上で、もう一つ避けて通れないのがワイルドカードの乱用だ。例えば、S3バケットへのアクセスを許可する際に、以下のようなポリシーを書いていないだろうか。
❌ 悪しきアンチパターン
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": "*"
}
]
}
これでは、S3のデータプレーン(オブジェクトの読み書き)だけでなく、コントロールプレーン(バケットの削除や暗号化設定の変更)まで全権限を与えていることになる。万が一、この権限を持つコンテナが踏み台にされた場合、環境全体のデータが暗号化ランサムウェアの餌食になるか、完全消去される。
⭕ 正しい最小権限の設計(リソースベースとアクションの限定)
特定のアプリケーションが特定のS3バケットに対してのみ、オブジェクトのputとgetを行う場合の正しいポリシー設計は以下の通りだ。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSpecificBucketObjectOperations",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:AbortMultipartUpload"
],
"Resource": [
"arn:aws:s3:::my-company-secure-workload-bucket-prod/*"
]
},
{
"Sid": "AllowListBucketOnly",
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-company-secure-workload-bucket-prod"
]
}
]
}
ここでは、バケット自体のメタデータを操作する権限(ListBucketなど)と、バケット内のオブジェクトを操作する権限(GetObjectなど)の Resource のパス(末尾の /* の有無)を厳密に分離している。このレベルの粒度をすべてのリソース(DynamoDB、Lambda、KMS等)で徹底するのが真のPoLPである。
—
4. 監査と継続的モニタリング:アクセスアナライザーの活用
どれだけ厳密に設計しても、組織が拡大するにつれてシャドーITや権限の肥大化(Permission Creep)は必ず発生する。これを人間が目視で監査するなど不可能なため、IAM Access Analyzerを活用した自動化を組み込む。
インフラストラクチャをIaC(Terraformなど)でデプロイする際、CI/CDパイプライン上でIAMポリシーの静的解析を行うツール(例: Conftest や Checkov)を必ず組み込むべきだ。
以下は、Checkovを使用してTerraformコード内の過剰な権限(Action: * や Resource: *)を検出し、ビルドを失敗させるための設定例(カスタムポリシーの概念)だ。
# checkov カスタムチェックの例 (IAMポリシーで * を禁止する)
metadata:
id: CKV_AWS_CUSTOM_001
name: "Ensure IAM policies do not allow full administrative privileges"
category: "IAM"
definition:
cond_type: "attribute"
resource_types:
- "aws_iam_policy"
- "aws_iam_role_policy"
attribute: "policy"
operator: "json_contains"
value: "Action: *"
eval_switch: false
—
5. まとめ:セキュリティは「性善説」を捨てた構造から始まる
クラウドセキュリティの本質は、エンジニアのモラルやセキュリティ意識に依存することではなく、「ミスや不正が構造的にできない環境」をコードとポリシーで強制することにある。
インラインポリシーの排除と、SCPによる組織的なガードレールの敷設は、そのための最も確実な第一歩だ。「便利さ」と引き換えにセキュリティをトレードオフにする時代は終わった。今すぐ組織のAWS Organizationsを見直し、野放しになっている権限の境界線を再定義してほしい。あなたの背後で狙っているアタッカーは、その「甘い設定」を今日も静かにスキャンしているのだから。
コメント