[アップデート] AWS CodeBuild 向けに様々な IAM 条件コンテキストキーが追加され、IAM ポリシーを使った細かい権限制御ができるようになりました
いわさです。
AWS では IAM 条件コンテキストキーを使うことで、AWS サービスを操作する際の様々な条件でアクションの許可や拒否を行うことができます。
これまで AWS CodeBuild では以下のようなビルドやプロジェクトの ARN 程度しか条件コンテキストキーにサポートされておらず、細かい許可/拒否設定を IAM を使って行うことが難しい状況でした。
aws:RequestTag/${TagKey}
aws:ResourceTag/${TagKey}
aws:TagKeys
codebuild:buildArn
codebuild:projectArn
これが今朝のアップデートで CodeBuild 専用の大量のコンテキストキーがサポートされ、かなり細かい権限制御をできるようになりました。
今回追加されたのは以下の 104 個のキーです。CodeBuild プロジェクトのほとんどのプロパティがサポートされていることがわかると思います。
codebuild:artifacts
codebuild:artifacts.bucketOwnerAccess
codebuild:artifacts.encryptionDisabled
codebuild:artifacts.location
codebuild:authType
codebuild:autoRetryLimit
codebuild:buildBatchConfig
codebuild:buildBatchConfig.restrictions.computeTypesAllowed
codebuild:buildBatchConfig.restrictions.fleetsAllowed
codebuild:buildBatchConfig.serviceRole
codebuild:buildType
codebuild:cache
codebuild:cache.location
codebuild:cache.modes
codebuild:cache.type
codebuild:computeConfiguration
codebuild:computeConfiguration.disk
codebuild:computeConfiguration.instanceType
codebuild:computeConfiguration.machineType
codebuild:computeConfiguration.memory
codebuild:computeConfiguration.vCpu
codebuild:computeType
codebuild:concurrentBuildLimit
codebuild:encryptionKey
codebuild:environment
codebuild:environment.certificate
codebuild:environment.computeConfiguration
codebuild:environment.computeConfiguration.disk
codebuild:environment.computeConfiguration.instanceType
codebuild:environment.computeConfiguration.machineType
codebuild:environment.computeConfiguration.memory
codebuild:environment.computeConfiguration.vCpu
codebuild:environment.computeType
codebuild:environment.environmentVariables
codebuild:environment.environmentVariables.name
codebuild:environment.environmentVariables.value
codebuild:environment.environmentVariables/${name}.value
codebuild:environment.fleet.fleetArn
codebuild:environment.image
codebuild:environment.imagePullCredentialsType
codebuild:environment.privilegedMode
codebuild:environment.registryCredential
codebuild:environment.registryCredential.credential
codebuild:environment.registryCredential.credentialProvider
codebuild:environment.type
codebuild:environmentType
codebuild:exportConfig.s3Destination.bucket
codebuild:exportConfig.s3Destination.bucketOwner
codebuild:exportConfig.s3Destination.encryptionDisabled
codebuild:exportConfig.s3Destination.encryptionKey
codebuild:exportConfig.s3Destination.path
codebuild:fileSystemLocations.identifier
codebuild:fileSystemLocations.location
codebuild:fileSystemLocations.type
codebuild:fileSystemLocations/${identifier}.location
codebuild:fileSystemLocations/${identifier}.type
codebuild:fleetServiceRole
codebuild:imageId
codebuild:logsConfig
codebuild:logsConfig.s3Logs
codebuild:logsConfig.s3Logs.bucketOwnerAccess
codebuild:logsConfig.s3Logs.encryptionDisabled
codebuild:logsConfig.s3Logs.location
codebuild:logsConfig.s3Logs.status
codebuild:manualCreation
codebuild:projectVisibility
codebuild:scopeConfiguration.domain
codebuild:scopeConfiguration.name
codebuild:scopeConfiguration.scope
codebuild:secondaryArtifacts
codebuild:secondaryArtifacts.artifactIdentifier
codebuild:secondaryArtifacts.bucketOwnerAccess
codebuild:secondaryArtifacts.encryptionDisabled
codebuild:secondaryArtifacts.location
codebuild:secondaryArtifacts/${artifactIdentifier}.bucketOwnerAccess
codebuild:secondaryArtifacts/${artifactIdentifier}.encryptionDisabled
codebuild:secondaryArtifacts/${artifactIdentifier}.location
codebuild:secondarySources
codebuild:secondarySources.auth.resource
codebuild:secondarySources.auth.type
codebuild:secondarySources.buildStatusConfig.context
codebuild:secondarySources.buildStatusConfig.targetUrl
codebuild:secondarySources.buildspec
codebuild:secondarySources.insecureSsl
codebuild:secondarySources.location
codebuild:secondarySources.sourceIdentifier
codebuild:secondarySources/${sourceIdentifier}.auth.resource
codebuild:secondarySources/${sourceIdentifier}.auth.type
codebuild:secondarySources/${sourceIdentifier}.buildStatusConfig.context
codebuild:secondarySources/${sourceIdentifier}.buildStatusConfig.targetUrl
codebuild:secondarySources/${sourceIdentifier}.buildspec
codebuild:secondarySources/${sourceIdentifier}.insecureSsl
codebuild:secondarySources/${sourceIdentifier}.location
codebuild:serverType
codebuild:serviceRole
codebuild:shouldOverwrite
codebuild:source
codebuild:source.auth.resource
codebuild:source.auth.type
codebuild:source.buildStatusConfig.context
codebuild:source.buildStatusConfig.targetUrl
codebuild:source.buildspec
codebuild:source.insecureSsl
codebuild:source.location
codebuild:token
codebuild:username
codebuild:vpcConfig
codebuild:vpcConfig.securityGroupIds
codebuild:vpcConfig.subnets
codebuild: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 などで使えそうです。