IAM(Identity and Access Management)は、クラウド環境におけるセキュリティの根幹です。Gartnerの予測では、2025年までにクラウドセキュリティインシデントの99%はユーザー側の設定ミスに起因するとされています。その中でもIAMの設定ミスが最も多い原因の一つです。
適切なIAMポリシー設計は、データ漏洩、不正アクセス、権限昇格攻撃を防ぐための最も基本的かつ効果的な対策です。本記事ではAWSを例に、IAMポリシー設計のベストプラクティスを解説します。
IAM設計の基本原則は「最小権限の原則(Principle of Least Privilege)」です。ユーザーやサービスには、タスクの遂行に必要最小限の権限のみを付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowS3ReadSpecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::my-app-data",
"arn:aws:s3:::my-app-data/*"
]
}
]
}
この例では、特定のS3バケットに対する読み取りのみを許可しています。s3:*のようなワイルドカードや、Resource: “*”の使用は避けるべきです。
IAMユーザーに直接ポリシーをアタッチするのではなく、IAMロールを活用するのがベストプラクティスです。特にサービス間の連携では、IAMロールの引き受け(AssumeRole)を使います。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "lambda.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "123456789012"
}
}
}
]
}
Conditionブロックで信頼関係を制限することで、混乱した代理攻撃(Confused Deputy Attack)を防止できます。aws:SourceAccountやaws:SourceArnの条件を追加して、意図しないサービスからのロール引き受けを防ぎましょう。
AWS Organizationsを使った複数アカウント管理では、SCP(Service Control Policies)が重要です。SCPはアカウントレベルで権限の上限を設定し、個々のIAMポリシーを超えた制御を提供します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyLeaveOrganization",
"Effect": "Deny",
"Action": "organizations:LeaveOrganization",
"Resource": "*"
},
{
"Sid": "DenyRootUserActions",
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
"StringLike": {
"aws:PrincipalArn": "arn:aws:iam::*:root"
}
}
}
]
}
このSCPは、組織からの離脱とrootユーザーの使用を禁止しています。組織全体のセキュリティベースラインを強制するのに有効です。
IAMポリシーは一度設計して終わりではありません。IAM Access Analyzerを使って未使用のアクセス権限を検出し、定期的に権限を棚卸しましょう。CloudTrailのログを分析して、実際に使用されているAPIアクションのみを許可するポリシーに絞り込むことで、最小権限を継続的に維持できます。