[アップデート] AWS CodeBuild 向けに様々な IAM 条件コンテキストキーが追加され、IAM ポリシーを使った細かい権限制御ができるようになりました
いわさです。
AWS では IAM 条件コンテキストキーを使うことで、AWS サービスを操作する際の様々な条件でアクションの許可や拒否を行うことができます。
これまで AWS CodeBuild では以下のようなビルドやプロジェクトの ARN 程度しか条件コンテキストキーにサポートされておらず、細かい許可/拒否設定を IAM を使って行うことが難しい状況でした。
aws:RequestTag/${TagKey}aws:ResourceTag/${TagKey}aws:TagKeyscodebuild:buildArncodebuild:projectArn
これが今朝のアップデートで CodeBuild 専用の大量のコンテキストキーがサポートされ、かなり細かい権限制御をできるようになりました。
今回追加されたのは以下の 104 個のキーです。CodeBuild プロジェクトのほとんどのプロパティがサポートされていることがわかると思います。
codebuild:artifactscodebuild:artifacts.bucketOwnerAccesscodebuild:artifacts.encryptionDisabledcodebuild:artifacts.locationcodebuild:authTypecodebuild:autoRetryLimitcodebuild:buildBatchConfigcodebuild:buildBatchConfig.restrictions.computeTypesAllowedcodebuild:buildBatchConfig.restrictions.fleetsAllowedcodebuild:buildBatchConfig.serviceRolecodebuild:buildTypecodebuild:cachecodebuild:cache.locationcodebuild:cache.modescodebuild:cache.typecodebuild:computeConfigurationcodebuild:computeConfiguration.diskcodebuild:computeConfiguration.instanceTypecodebuild:computeConfiguration.machineTypecodebuild:computeConfiguration.memorycodebuild:computeConfiguration.vCpucodebuild:computeTypecodebuild:concurrentBuildLimitcodebuild:encryptionKeycodebuild:environmentcodebuild:environment.certificatecodebuild:environment.computeConfigurationcodebuild:environment.computeConfiguration.diskcodebuild:environment.computeConfiguration.instanceTypecodebuild:environment.computeConfiguration.machineTypecodebuild:environment.computeConfiguration.memorycodebuild:environment.computeConfiguration.vCpucodebuild:environment.computeTypecodebuild:environment.environmentVariablescodebuild:environment.environmentVariables.namecodebuild:environment.environmentVariables.valuecodebuild:environment.environmentVariables/${name}.valuecodebuild:environment.fleet.fleetArncodebuild:environment.imagecodebuild:environment.imagePullCredentialsTypecodebuild:environment.privilegedModecodebuild:environment.registryCredentialcodebuild:environment.registryCredential.credentialcodebuild:environment.registryCredential.credentialProvidercodebuild:environment.typecodebuild:environmentTypecodebuild:exportConfig.s3Destination.bucketcodebuild:exportConfig.s3Destination.bucketOwnercodebuild:exportConfig.s3Destination.encryptionDisabledcodebuild:exportConfig.s3Destination.encryptionKeycodebuild:exportConfig.s3Destination.pathcodebuild:fileSystemLocations.identifiercodebuild:fileSystemLocations.locationcodebuild:fileSystemLocations.typecodebuild:fileSystemLocations/${identifier}.locationcodebuild:fileSystemLocations/${identifier}.typecodebuild:fleetServiceRolecodebuild:imageIdcodebuild:logsConfigcodebuild:logsConfig.s3Logscodebuild:logsConfig.s3Logs.bucketOwnerAccesscodebuild:logsConfig.s3Logs.encryptionDisabledcodebuild:logsConfig.s3Logs.locationcodebuild:logsConfig.s3Logs.statuscodebuild:manualCreationcodebuild:projectVisibilitycodebuild:scopeConfiguration.domaincodebuild:scopeConfiguration.namecodebuild:scopeConfiguration.scopecodebuild:secondaryArtifactscodebuild:secondaryArtifacts.artifactIdentifiercodebuild:secondaryArtifacts.bucketOwnerAccesscodebuild:secondaryArtifacts.encryptionDisabledcodebuild:secondaryArtifacts.locationcodebuild:secondaryArtifacts/${artifactIdentifier}.bucketOwnerAccesscodebuild:secondaryArtifacts/${artifactIdentifier}.encryptionDisabledcodebuild:secondaryArtifacts/${artifactIdentifier}.locationcodebuild:secondarySourcescodebuild:secondarySources.auth.resourcecodebuild:secondarySources.auth.typecodebuild:secondarySources.buildStatusConfig.contextcodebuild:secondarySources.buildStatusConfig.targetUrlcodebuild:secondarySources.buildspeccodebuild:secondarySources.insecureSslcodebuild:secondarySources.locationcodebuild:secondarySources.sourceIdentifiercodebuild:secondarySources/${sourceIdentifier}.auth.resourcecodebuild:secondarySources/${sourceIdentifier}.auth.typecodebuild:secondarySources/${sourceIdentifier}.buildStatusConfig.contextcodebuild:secondarySources/${sourceIdentifier}.buildStatusConfig.targetUrlcodebuild:secondarySources/${sourceIdentifier}.buildspeccodebuild:secondarySources/${sourceIdentifier}.insecureSslcodebuild:secondarySources/${sourceIdentifier}.locationcodebuild:serverTypecodebuild:serviceRolecodebuild:shouldOverwritecodebuild:sourcecodebuild:source.auth.resourcecodebuild:source.auth.typecodebuild:source.buildStatusConfig.contextcodebuild:source.buildStatusConfig.targetUrlcodebuild:source.buildspeccodebuild:source.insecureSslcodebuild:source.locationcodebuild:tokencodebuild:usernamecodebuild:vpcConfigcodebuild:vpcConfig.securityGroupIdscodebuild:vpcConfig.subnetscodebuild:vpcConfig.vpcId
公式ドキュメントはこちらになります。
これを使うことで、例えば特定のインスタンスサイズのみ許可するとか、特定の VPC へのみ接続を許可するとか、BuildSpec のオーバーライドを禁止するとか、様々な権限制御のユースケースに対応できるようになります。
特定 VPC 以外に接続する CodeBuild プロジェクトの作成を拒否してみた
今回こちらを使って、特定 VPC 以外を利用するプロジェクトの作成を禁止してみました。
IAM コンソールのサービスレベルの条件キーを確認してみると、codebuildプレフィックスで様々なキーが選択できるようになっていることが確認できると思います。

今回私は次のように VPC ID を固定で指定した拒否ポリシーを作成してみました。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Action": [
"codebuild:CreateProject",
"codebuild:CreateFleet"
],
"Resource": "*",
"Condition": {
"ForAllValues:StringNotEquals": {
"codebuild:vpcConfig.vpcId": [
"vpc-3b4cab5d"
]
}
}
}
]
}

許可される VPC
まずは、条件キーで指定した VPC ID を指定して CodeBuild プロジェクトを作成してみます。

この場合は次のようにプロジェクトを作成することが出来ました。

拒否される VPC
続いて上記以外のプロジェクトを指定してみます。

今度は拒否されましたね。

セキュリティ上の理由で専用 VPC 以外の利用は許可したくない時などに使うことができると思います。
さいごに
本日は AWS CodeBuild 向けに様々な IAM 条件コンテキストキーが追加され、IAM ポリシーを使った細かい権限制御ができるようになったので使ってみました。
AWS CodeBuild を使わせつつ、特定条件の操作を禁止したい時 SCP などで使えそうです。






