CodeBuildプロジェクト環境で特権モードが無効化されていない場合の設定修正手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。

この記事では、CodeBuildプロジェクト環境で特権モードが有効になっている状態について、そのリスクと対策を解説します。

ポリシーの説明

まず、AWS Security Hubによるポリシーの説明は以下の通りです。

[CodeBuild.5] CodeBuild プロジェクト環境では特権モードを有効にしないでください

Security Hub コントロール CodeBuild – AWS Security Hub

このコントロールは、 AWS CodeBuild プロジェクト環境で特権モードが有効か無効かをチェックします。 CodeBuild プロジェクト環境で特権モードが有効になっている場合、コントロールは失敗します。

リスクとしては、privilegedMode(特権モード)がtrueに設定されている場合、AWS CodeBuildで実行されるDockerコンテナは、ホストシステム上で特権が必要な操作を実行することができる。 これにより、意図しないシステムリソースや操作にアクセスできるようになるためセキュリティ上のリスクが増大する可能性があります。

そのため、特権モードを使用する必要性がない場合は無効化することが望ましいです。

修復方法

AWSコンソールでの修正手順

① CodeBuild > ビルドプロジェクトに移動し、対象のビルドプロジェクトを選択する。

② 「プロジェクトの詳細」をクリックし、「環境」の設定画面に遷移する。
この時、特権付与が「真」となっていることを確認する。

③ 右上の「編集」をクリックする。

④ 追加設定のプルダウンメニューをクリックし、「特権付与」のチェックボックスのチェックをオフにする。

⑤ 「環境の更新」をクリックし、内容を更新する。

Terraformでの修復手順

CodeBuildプロジェクトの特権モード設定を適切に構成するためのTerraformコードを作成します。

# CodeBuildプロジェクトの基本設定
resource "aws_codebuild_project" "secure_project" {
  name           = "secure-build-project"
  description    = "Secure CodeBuild project without privileged mode"
  build_timeout  = "60"
  queued_timeout = "480"
  service_role   = aws_iam_role.codebuild_role.arn

  # アーティファクトの設定
  artifacts {
    type = "NO_ARTIFACTS"
  }

  # ソースの設定
  source {
    type            = "GITHUB"
    location        = "<https://github.com/your-repo/your-project.git>"
    git_clone_depth = 1

    git_submodules_config {
      fetch_submodules = true
    }
  }

  # 環境設定 - ここが重要
  environment {
    compute_type                = "BUILD_GENERAL1_SMALL"
    image                      = "aws/codebuild/standard:5.0"
    type                       = "LINUX_CONTAINER"
    image_pull_credentials_type = "CODEBUILD"

    # 特権モードの設定 - Dockerビルドが必要な場合のみtrueに設定
    privileged_mode = false

    # 環境変数の設定
    environment_variable {
      name  = "ENV"
      value = "production"
    }
  }

  # ログの設定
  logs_config {
    cloudwatch_logs {
      group_name  = "/aws/codebuild/secure-build"
      stream_name = "build-log"
      status      = "ENABLED"
    }
  }

  # VPC設定(必要な場合)
  vpc_config {
    vpc_id = var.vpc_id

    subnets = var.private_subnet_ids

    security_group_ids = var.security_group_ids
  }

  # タグ設定
  tags = {
    Environment = "Production"
    Security    = "Hardened"
  }
}

# Dockerビルドが必要な場合のプロジェクト設定
resource "aws_codebuild_project" "docker_build_project" {
  name           = "docker-build-project"
  description    = "CodeBuild project for Docker image building with privileged mode"
  build_timeout  = "60"
  queued_timeout = "480"
  service_role   = aws_iam_role.codebuild_role.arn

  artifacts {
    type = "NO_ARTIFACTS"
  }

  source {
    type            = "GITHUB"
    location        = "<https://github.com/your-repo/your-docker-project.git>"
    git_clone_depth = 1
  }

  # Docker用の環境設定
  environment {
    compute_type                = "BUILD_GENERAL1_SMALL"
    image                      = "aws/codebuild/amazonlinux2-x86_64-standard:3.0"
    type                       = "LINUX_CONTAINER"
    image_pull_credentials_type = "CODEBUILD"

    # Dockerビルド用に特権モードを有効化
    privileged_mode = true

    environment_variable {
      name  = "ENV"
      value = "production"
    }
  }
}

# CodeBuild用のIAMロール
resource "aws_iam_role" "codebuild_role" {
  name = "codebuild-secure-role"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "codebuild.amazonaws.com"
        }
      }
    ]
  })
}

# CodeBuild用の基本的なIAMポリシー
resource "aws_iam_role_policy" "codebuild_policy" {
  role = aws_iam_role.codebuild_role.name

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Resource = ["*"]
        Action = [
          "logs:CreateLogGroup",
          "logs:CreateLogStream",
          "logs:PutLogEvents"
        ]
      },
      {
        Effect = "Allow"
        Resource = ["*"]
        Action = [
          "s3:GetObject",
          "s3:PutObject",
          "s3:GetObjectVersion"
        ]
      }
    ]
  })
}

# 必要な変数の定義
variable "vpc_id" {
  type        = string
  description = "VPC ID for CodeBuild project"
}

variable "private_subnet_ids" {
  type        = list(string)
  description = "List of private subnet IDs"
}

variable "security_group_ids" {
  type        = list(string)
  description = "List of security group IDs"
}

修正すべき重要なポイントと手順を説明します:

1. 特権モード設定の確認と修正:

environment {
  # Dockerビルドが必要ない場合
  privileged_mode = false

  # Dockerビルドが必要な場合のみ
  privileged_mode = true
}

2. プロジェクトの用途による分離:

  • 一般的なビルド用プロジェクト(特権モード無効)
  • Docker専用ビルドプロジェクト(特権モード有効)

3. セキュリティ強化のポイント:

  • 環境設定:
environment {
  compute_type = "BUILD_GENERAL1_SMALL"
  # 最新の安定版イメージを使用
  image        = "aws/codebuild/standard:5.0"
  type         = "LINUX_CONTAINER"
}
  • ログ設定:
logs_config {
  cloudwatch_logs {
    status = "ENABLED"
  }
}
  • VPC設定(推奨):
vpc_config {
  vpc_id             = var.vpc_id
  subnets            = var.private_subnet_ids
  security_group_ids = var.security_group_ids
}

4. IAMロールの最小権限設定:

aws_iam_role_policy {
  # 必要最小限の権限のみを付与
  Statement = [
    {
      Effect = "Allow"
      Resource = ["*"]
      Action = [
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ]
    }
  ]
}

このTerraformコードを使用することで、CodeBuildプロジェクトのセキュリティを適切に設定できます。プロジェクトの要件に応じて、必要な部分を選択して使用してください。

最後に

今回は、CodeBuildプロジェクト環境で特権モードが有効になっている時のリスクとその対策についてご紹介しました。 不必要に特権級の権限をCodeBuildプロジェクトに付与しておくと、意図しないシステムリソースの書き換えや参照、操作ができてしまうリスクがあるため、設定されていた場合は本記事を参考に修正してみてください。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。

運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る