環境変数のシークレットを Security Command Center に報告する

このページでは、Sensitive Data Protection の検出サービスを使用して、Cloud Run 環境変数にシークレットが存在するかどうかを確認する方法について説明します。機密データ保護により、検出結果が Security Command Center に脆弱性として報告されます。

Security Command Center の概要

Security Command Center は、Google Cloud の脆弱性と脅威の報告を一元的に行うサービスです。Security Command Center では、構成ミス、脆弱性、観測、脅威を特定することで、セキュリティ体制を強化できます。また、検出結果の調査と修正に関する推奨事項も提供します。

環境変数内のシークレットをスキャンする理由

環境変数は暗号化されないため、パスワードなどのシークレットを環境変数に保存することは安全な方法ではありません。これらの値が取得され、ログなどのさまざまなシステムで公開されるおそれがあります。シークレットの保存には Secret Manager を使用することをおすすめします。詳細については、シークレットの構成に関する Cloud RunCloud Run Functions のドキュメントをご覧ください。

仕組み

シークレットの検出を行うには、組織レベルまたはプロジェクト レベルで検出スキャン構成を作成します。選択したスコープ内で、機密データ保護により Cloud Run が定期的にスキャンされ、ビルドとランタイムの環境変数内にシークレットがあるか確認します。

環境変数にシークレットが存在する場合、機密データ保護によって Secrets in environment variables の脆弱性検出が Security Command Center に送信されます。データ プロファイルは生成されません。検出結果は Security Command Center でのみ確認できます。

Sensitive Data Protection は、リソースごとに最大 1 つの検出結果を生成します。たとえば、同じ Cloud Run 関数で 2 つの環境変数内にシークレットが見つかった場合、Security Command Center には 1 つの検出結果のみが生成されます。

Security Command Center では、次の操作を行うと Secrets in environment variables の検出結果を表示できます。

Google Cloud コンソールの Security Command Center 検出結果リスト内にある生成された検出結果

次の JSON は、Secrets in environment variables 検出結果の例を示しています。この例では、本機能に関連するフィールドのみを示しています。フィールドの包括的なリストは提供されません。

環境変数内のシークレット

{
  "finding": {
    "canonicalName": "projects/PROJECT_NUMBER/sources/SOURCE_ID/findings/FINDING_ID",
    "category": "SECRETS_IN_ENVIRONMENT_VARIABLES",
    "compliances": [
      {
        "standard": "cis",
        "version": "1.3",
        "ids": [
          "1.18"
        ]
      }
    ],
    "createTime": "DATE_TIME",
    "description": "The affected resource is storing credentials or other secret information in its environment variables. This is a security vulnerability because environment variables are stored unencrypted, and accessible to all users who have access to the code.",
    "eventTime": "DATE_TIME",
    "findingClass": "VULNERABILITY",
    "findingProviderId": "organizations/ORGANIZATION_ID/firstPartyFindingProviders/dlp",
    "mute": "MUTE_STATUS",
    "name": "organizations/ORGANIZATION_ID/sources/SOURCE_ID/findings/FINDING_ID",
    "parent": "organizations/ORGANIZATION_ID/sources/SOURCE_ID",
    "parentDisplayName": "Sensitive Data Protection",
    "resourceName": "//cloudfunctions.googleapis.com/projects/PROJECT_ID/locations/REGION/functions/FUNCTION_ID",
  },
  "resource": {
    "name": "//cloudfunctions.googleapis.com/projects/PROJECT_ID/locations/REGION/functions/FUNCTION_ID",
    "display_name": "projects/PROJECT_ID/locations/REGION/functions/FUNCTION_ID",
    "type": "google.cloudfunctions.CloudFunction",
    "project_name": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "project_display_name": "PROJECT_DISPLAY_NAME",
    "parent_name": "//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER",
    "parent_display_name": "PARENT_DISPLAY_NAME"
  }
}
    

検出生成のレイテンシ

Sensitive Data Protection でシークレット検出を有効にしてから、環境変数の初期スキャンが完了して Secrets in environment variables の検出結果が Security Command Center に表示されるまでに最大 12 時間かかることがあります。その後、Sensitive Data Protection は 24 時間ごとに環境変数をスキャンします。実際には、スキャンはそれよりも頻繁に実行される場合があります。

報告対象となるシークレットの種類

シークレットの例には、パスワード、認証トークン、Google Cloud 認証情報があります。本機能で機密データ保護のスキャン対象となるシークレット タイプの完全なリストについては、認証情報とシークレットをご覧ください。

サポートされているリソース

シークレットを検出するために、機密データ保護は Cloud Run functions(第 1 世代の Cloud Functions を含む)と Cloud Run サービスのリビジョンをサポートしています。

料金

本機能では、機密データ保護は無料で利用できます。サービスティアによっては、Security Command Center の料金が適用される場合があります。Sensitive Data Protection は、すべてのサービス ティアで Security Command Center と連携します。

データ所在地

スキャン構成を初めて作成するときに、機密データの保護がそれを保存する場所を指定します。それ以降に作成するスキャン構成は、すべて、同じリージョンに保存されます。機密データの保護は、スキャン構成が保存されているリージョンに Cloud Run メタデータをエクスポートしますが、関数またはサービスのリビジョン自体はエクスポートされません。

機密データ保護が環境変数内でシークレットを検出すると、検出結果は Security Command Center に送信され、データ処理プロセスの対象となります。

必要な IAM のロール

シークレットの検出を実行するには、データのプロファイリングに必須となる Identity and Access Management ロールが必要です。

また、Security Command Center の検出結果を操作するには、適切なロールが必要です。詳細については、Security Command Center ドキュメントの組織レベルでのアクティベーションのための IAM をご覧ください。

準備

  1. 組織の Security Command Center のアクティベーション レベルを確認します。Security Command Center にデータ プロファイルを送信するには、任意のサービス ティアの組織レベルで Security Command Center を有効にしている必要があります。詳細については、組織で Security Command Center を有効にするをご覧ください。

    プロジェクト レベルでのみ Security Command Center が有効になっている場合、機密データの保護からの検出結果は Security Command Center に表示されません。

  2. Security Command Center で、機密データ保護が統合サービスとして有効になっていることを確認します。詳細については、Google Cloud 統合サービスを追加するをご覧ください。

組織レベルでシークレットの検出を構成する

組織全体でシークレットの検出を有効にする場合は、次の操作を行います。プロジェクト レベルの検出については、プロジェクト レベルでシークレットの検出を構成するをご覧ください。

組織管理者(roles/resourcemanager.organizationAdmin)またはセキュリティ管理者(roles/iam.securityAdmin)のロールを付与されていなくても、スキャン構成を作成できます。ただし、スキャン構成を作成した後、これらのいずれかのロールを持つユーザーが、サービス エージェントに検出のアクセス権を付与する必要があります。

  1. [スキャン構成の作成] ページに移動します。

    [スキャン構成の作成] に移動

  2. 組織に移動します。ツールバーで、プロジェクト セレクタをクリックして組織を選択します。

    このページの各ステップを行った後で、[続行] をクリックします。

  3. [検出タイプの選択] で [シークレット / 認証情報の脆弱性] を選択します。

  4. [スコープの選択] で、組織全体をスキャンするかどうかを選択します。

  5. [サービス エージェント コンテナと課金の管理] で、サービス エージェント コンテナとして使用するプロジェクトを指定します。機密データの保護で新しいプロジェクトを自動的に作成することも、既存のプロジェクトを選択することもできます。

    • サービス エージェント コンテナとして使用するプロジェクトがない場合は、[サービス エージェント コンテナとして新しいプロジェクトを作成する] を選択します。機密データ保護によって、DLP サービス エージェント コンテナという新しいプロジェクトが作成されます。このプロジェクト内のサービス エージェントは、機密データ保護やその他の API への認証に使用されます。検出に関係のないオペレーションを含め、このプロジェクトに関連するすべての課金対象オペレーションに対して課金されるアカウントを選択するように求められます。

      プロジェクトの作成に必要な権限がない場合、[サービス エージェント コンテナとして新しいプロジェクトを作成する] オプションは無効になります。この場合は、既存のプロジェクトを選択するか、Google Cloud 管理者にプロジェクト作成者(roles/resourcemanager.projectCreator)のロールを付与してもらうよう依頼する必要があります。

    • 既存のサービス エージェント コンテナを再利用する場合は、[既存のサービス エージェント コンテナを選択する] を選択します。次に、[参照] をクリックして、サービス エージェント コンテナのプロジェクト ID を選択します。

  6. [構成の保存ロケーションを設定する] で、このスキャン構成を保存するリージョンを選択します。後で作成するすべてのスキャン構成も、このロケーションに保存されます。データ所在地に関する考慮事項については、このページのデータ所在地をご覧ください。

  7. 省略可: スキャン構成の作成後すぐにスキャンを開始しない場合は、[一時停止モードでスキャンを作成する] を選択します。

    この構成は、次のような場合に利用できます。

  8. [作成] をクリックします。

機密データ保護は、スキャン構成を作成するか、一時停止した構成を再開するとすぐに Cloud Run 環境変数のスキャンを開始します。検出結果が Security Command Center に表示されるまでの時間については、このページの検出生成のレイテンシをご覧ください。

組織管理者(roles/resourcemanager.organizationAdmin)またはセキュリティ管理者(roles/iam.securityAdmin)のいずれのロールも保持していない場合、検出開始前にどちらかのロールを持つユーザーが、サービス エージェントに検出のアクセス権を付与する必要があります。

プロジェクト レベルでシークレット検出を構成する

単一プロジェクトでシークレットの検出を有効にする場合は、次の手順を行います。組織レベルの検出については、組織レベルでシークレットの検出を構成するをご覧ください。

  1. [スキャン構成の作成] ページに移動します。

    [スキャン構成の作成] に移動

  2. プロジェクトに移動します。ツールバーで、プロジェクト セレクタをクリックしてプロジェクトを選択します。

    このページの各ステップを行った後で、[続行] をクリックします。

  3. [検出タイプの選択] で [シークレット / 認証情報の脆弱性] を選択します。

  4. [Select scope] で、[Scan entire project] が選択されていることを確認します。こちらが選択されていない場合は、プロジェクト ビューが表示されていることを確認します。

  5. [構成の保存ロケーションを設定する] で、このスキャン構成を保存するリージョンを選択します。後で作成するすべてのスキャン構成も、このロケーションに保存されます。データ所在地に関する考慮事項については、このページのデータ所在地をご覧ください。

  6. [作成] をクリックします。

機密データ保護は、スキャン構成を作成するか、一時停止した構成を再開するとすぐに Cloud Run 環境変数のスキャンを開始します。検出結果が Security Command Center に表示されるまでの時間については、このページの検出生成のレイテンシをご覧ください。

Secrets in environment variables 検出結果に対するクエリ

以下は、Security Command Center で Secrets in environment variables 検出結果を見つけるために使用できるクエリの例です。これらのクエリは [クエリエディタ] フィールドに入力できます。クエリエディタの詳細については、Security Command Center ダッシュボードで検出結果クエリを編集するをご覧ください。

すべての Secrets in environment variables 検出結果を一覧表示する

state="ACTIVE"
AND NOT mute="MUTED"
AND category="SECRETS_IN_ENVIRONMENT_VARIABLES"

特定プロジェクトのすべての Secrets in environment variables 検出結果を一覧表示する

state="ACTIVE"
AND NOT mute="MUTED"
AND category="SECRETS_IN_ENVIRONMENT_VARIABLES"
AND resource.project_name="//cloudresourcemanager.googleapis.com/projects/PROJECT_NUMBER"

次のように置き換えます。

  • PROJECT_NUMBER: クエリするプロジェクトの数値 ID