現場のエンジニアへ:最小権限の原則(PoLP)は「気合」ではなく「構造」で縛れ
インフラ担当や開発者が陥りやすい最大の罠は、「とりあえず動く」権限をIAMに与えてしまうことだ。君たちが深夜にデバッグで疲れている時、AdministratorAccessを付与した開発環境のIAMキーがGitHubに流出したらどうなるか? 攻撃者はそのキーを使い、数分で全リージョンのEC2をマイニングサーバーに変え、全S3バケットを暗号化するだろう。
今日は、教科書的な「最小権限の原則(PoLP)」を、泥臭い実務レベルでどう実装し、SCP(Service Control Policies)でガードレールを敷くか、その極意を伝授する。
—
1. 攻撃者の視点:なぜ「インラインポリシー」は悪なのか
インラインポリシーは、特定のIAMユーザーやロールに直接紐付く「その場限りの権限」だ。これの何が危険か? それは「棚卸しが不可能」という点に尽きる。
攻撃者がWebアプリケーションの脆弱性(LFIやSSRF)を突き、メタデータサービス(IMDSv2)から一時的な認証情報を奪取したとしよう。もしそのロールにインラインポリシーで過剰な権限が付与されていたら、調査担当者はIAMコンソールのUIを一つずつ開いて、数千行のJSONを読み解く羽目になる。インシデント発生時の「有事」において、インラインポリシーは防御側を麻痺させる毒薬だ。
対策の鉄則
- インラインポリシーは禁止せよ: 全てマネージドポリシー、または顧客管理ポリシーとして切り出せ。
- 名前で管理せよ:
App-ReadOnly-Accessのように、用途と権限レベルが一目でわかる命名規則を強制する。
—
2. 実装:Terraformによる「管理された」IAMポリシー定義
開発者がインラインポリシーを書く隙を与えないために、TerraformなどのIaCで型を強制する。以下は、S3バケットへの読み取り専用アクセスのみを許可する、堅牢なポリシーのテンプレートだ。
# 顧客管理ポリシーの定義(再利用可能かつ可視化されている)
resource "aws_iam_policy" "read_only_s3_policy" {
name = "AppS3ReadOnlyPolicy"
description = "特定のバケットのみ読み取りを許可する最小権限"
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = [
"s3:Get*",
"s3:List*"
]
Effect = "Allow"
Resource = [
"arn:aws:s3:::my-secure-data-bucket",
"arn:aws:s3:::my-secure-data-bucket/*"
]
}
]
})
}
—
3. SCPによるガードレール:開発者の「ミス」を物理的に封じる
いくらIAMポリシーを厳格にしても、誰かが権限昇格を試みれば終わりだ。ここで登場するのがSCPだ。SCPは、AWS Organizations配下の全アカウントに対し、「たとえルートユーザーであっても拒否する」という最強の境界線を作る。
例えば、「リージョンを固定する」「IAMポリシーの変更を特定ロール以外禁止する」といったルールを、SCPで組織全体に適用する。
SCPサンプル:IAM設定の改ざん禁止
以下のポリシーをルートOU(組織単位)に適用すれば、悪意ある開発者や乗っ取られたアカウントが、自ら権限を広げようとする試みを即座に AccessDenied で弾ける。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyIAMPolicyModification",
"Effect": "Deny",
"Action": [
"iam:CreatePolicyVersion",
"iam:SetDefaultPolicyVersion",
"iam:DeletePolicy"
],
"Resource": "*",
"Condition": {
"StringNotLike": {
"aws:PrincipalArn": "arn:aws:iam::*:role/SecurityAdminRole"
}
}
}
]
}
*※この設定により、SecurityAdminRole 以外のユーザーによる権限変更が完全にブロックされる。*
—
4. エンジニアへのアドバイス:権限付与のフローを変えろ
「この機能を作るのにS3への書き込み権限が必要だから、とりあえず全部許可してくれ」という開発者からの依頼に対し、君たちはどう答えるべきか?
1. 「なぜ」を問う: その機能が本当に s3:PutObject を必要としているか?
2. スコープを絞る: Resource を * にせず、特定のプレフィックス(例: uploads/*)に限定できないか?
3. IAM Access Analyzerを活用する: 過去90日間のアクセスログを分析し、実際に使われていない権限を機械的に削ぎ落とせ。
最後に
セキュリティは「性善説」で回るものではない。IAMポリシーやSCPという「コードによる制約」をシステムに組み込むことで初めて、エンジニアは心理的な負荷から解放され、よりクリエイティブな開発に集中できるのだ。
明日の朝、君たちのAWS環境で、インラインポリシーが一つでも残っていないか確認してほしい。それが、プロのセキュリティエンジニアとしての第一歩だ。
コメント