フィールド レベルのアクセスを構成する

このドキュメントでは、フィールド レベルのアクセス制御と、Logging のバケットでそれらを設定する方法について説明します。フィールド レベルのアクセス制御を使用すると、Google Cloud プロジェクトのユーザーに対して個々の LogEntry フィールドを非表示にして、ユーザーがアクセスできるログデータをより細かく制御できます。

概要

Logging では、フィールド レベルのアクセス制御を使用して、フィールドを表示するために必要な権限がない Google Cloud プロジェクトのユーザーに対して LogEntry フィールドを非表示にします。LogEntry 全体を表示しないログビューとは異なり、フィールド レベルのアクセス制御では LogEntry の個々のフィールドを非表示にします。Logging バケットに対して、フィールド レベルのアクセス制御とログビュー権限の両方を設定できます。Google Cloud CLI を使用して、フィールド レベルのアクセス制御を制限および管理します。

ログフィールドへのアクセスを制限するには、次の操作を行います。

  • ログバケットに対する制限付き LogEntry フィールドを構成します。
  • 制限付きフィールドを表示する必要があるユーザーのみに、そのフィールドパスの logging.fieldAccessor IAM ロール、または同様の権限を含むロールを付与します。

Logging は、制限付きフィールドが設定されたバケットからユーザーがログをクエリしたときに IAM 権限を確認します。ACL が構成されているフィールドは、そのフィールドに対応する logging.FieldAccessor がないユーザーにより拒否されます。つまり、次のようになります。

  • 制限付きフィールドを直接クエリしようとすると、ユーザーは権限拒否エラーを受け取ります。
  • グローバル検索では、拒否されたフィールドの内容が考慮されません。
  • 返された LogEntry の結果では、制限付きフィールドはすべて省略されます。

制限付きフィールド

アクセスは、次の LogEntry フィールドの組み合わせに制限できます。

LogEntry フィールド LogEntry フィールドのネストされたフィールド
jsonPayload ユーザー定義
textPayload なし
protoPayload 個別のサービス
httpRequest httpRequest ネストされたフィールド
labels ユーザー定義
sourceLocation sourceLocation ネストされたフィールド

ネストされたフィールド(jsonPayload や特定の jsonPayload サブパスなど)があるフィールドへのアクセスを制限すると、それらのネストされたパスへのアクセスも制限されます。

始める前に

フィールド レベルのアクセス制御の設定を開始する前に、次の操作を行います。

  • gcloud --version が、Google Cloud CLI のバージョンを 362.0.0 以降として報告していることを確認します。

    gcloud CLI の最新バージョンをインストールするには、次の update コマンドを実行します。

    gcloud components update

    gcloud CLI をインストールする手順については、Google Cloud CLI のインストールをご覧ください。

  • バケットを含む Google Cloud プロジェクトに、次のいずれかの IAM ロールがあることを確認します。

    IAM ロールの設定については、Logging のアクセス制御ガイドをご覧ください。

フィールド レベルのアクセス制御の設定

フィールド レベルの制限はバケット レベルで構成し、既存のバケット、または新しいバケットの作成時に適用できます。

新しいバケットのフィールドの制限

新しいログバケットを作成するときにログフィールドを制限するには、次の gcloud CLI コマンドを実行します。

gcloud logging buckets create BUCKET_NAME --location=LOCATION \
--description=DESCRIPTION --restricted-fields=RESTRICTED_FIELDS

コマンドの例:

gcloud logging buckets create new-log-bucket --location=global \
--description="New bucket with restricted fields" --restricted-fields="jsonPayload.data.ssn,httpRequest.status"

既存のバケットのフィールドの制限

既存のログバケットでログフィールドを制限するには、次の gcloud CLI コマンドを実行します。

gcloud logging buckets update BUCKET_NAME --location=LOCATION \
--restricted-fields=RESTRICTED_FIELDS

コマンドの例:

gcloud logging buckets update my-existing-log-bucket --location=global \
--restricted-fields="jsonPayload.data.ssn,httpRequest.status"

既存の制限にフィールドを追加する場合は、更新コマンドで、制限付きフィールドのセット全体を再度リストする必要があります。上記の例で、すでに制限されたフィールド jsonPayload.data.ssnhttpRequest.status に加え、フィールド jsonPayload.data.entryDate へのアクセスを制限する場合は、コマンドは次のようになります。

gcloud logging buckets update my-existing-log-bucket --location=global \
--restricted-fields="jsonPayload.data.ssn,jsonPayload.data.entryDate,httpRequest.status"

すでに制限されているフィールドを再度一覧表示せず、jsonPayload.data.entryDate だけを一覧表示すると、jsonPayload.data.ssnhttpRequest.status の両方が制限付きフィールドとして削除されます。

制限付きフィールドへのアクセスの管理

デフォルトでは、Logging は logging.fieldAccessor ロールまたは同様の権限があるロールを持たないユーザーに対して、すべての制限付きフィールドを非表示にします。Logging は、バケット内のログを表示する権限と logging.fieldAccessor ロールの両方を持つユーザーに対して、制限付きフィールドを公開します。

デフォルトの動作を変更して、制限付きフィールドのサブセットを特定のユーザーに限定できます。

すべての制限付きフィールドに対する権限の付与

すべての制限付きフィールドに権限を付与するには、logging.fieldAccessor ロールまたは logging.fieldAccessor ロールを含むカスタムロールをユーザーに付与します。

Console

Google Cloud Console で logging.fieldAccessor ロールをユーザーに付与するには、次の手順に従います。

  1. [権限の編集] ペインで、[ログフィールド アクセス者] を選択します。
  2. [ADD CONDITION] を選択します。

    ログフィールド アクセス者の権限を追加します。

  3. [タイトル] フィールドと [説明] フィールドに、タイトルと説明を入力します。

  4. [条件エディタ] タブを選択し、次の式を入力します。

    resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_NAME"
    

    権限に条件を追加します。

  5. [Save] を選択します。

Identity and Access Management の権限はすぐに更新されます。

gcloud

gcloud CLI を使用してユーザーに logging.fieldAccessor ロールを付与するには、次の手順を行います。

  1. policy.json ファイルを編集します。

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. 追加のバインディングで policy.json ファイルを更新します。

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/{bucket}/\") == 'BUCKET_NAME'",
            "title": "TITLE"
          },
          "members": [
            "user":"USER_ID@DOMAIN.com"
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    バインディングの例:

    "bindings": [
      {
        "condition": {
          "description": "Grants access to all restricted fields in a log bucket",
          "expression": "resource.name.extract(\"locations/global/buckets/{bucket}/\") == 'log-bucket-with-sensitive-data'",
          "title": "Log bucket condition for restricted fields"
        },
        "members": [
          "user":"222larabrown@gmail.com"
        ],
        "role": "roles/logging.fieldAccessor"
      }
    ]
    

Identity and Access Management の権限はすぐに更新されます。

制限付きフィールドのサブセットに対する権限の付与

制限付きフィールドのサブセットに対する権限をユーザーに付与するには、logging.fieldAccessor ロールを付与するときや、logging.fieldAccessor を含むカスタムロールを設定するときに、ユーザーがアクセスできるフィールドを設定します。

次の点にご注意ください。

  • バケット構成に表示される制限付きフィールドのスペルと大文字小文字は、IAM 権限名の制限付きフィールドのスペルと大文字小文字と一致している必要があります。たとえば、制限付きフィールドを jsonPayload に設定した場合、Jsonpayload フィールドではなく jsonPayload フィールドに対する権限を付与する必要があります。

  • マップキー文字列を含むフィールドパスでは大文字と小文字が区別されますが、protobuf フィールドパスは大文字と小文字を区別しないスネークケース(snake_case)または大文字と小文字を区別するキャメルケース(camelCase)として表すことができます。

    たとえば、logNameLogEntry protobuf のフィールドであり、log_name は同じフィールドを参照します。jsonPayload の下にあるフィールド名はマップ文字列キーであるものの、json_payload.fooBar を参照するため、フィールド jsonPayload.fooBarjsonPayload.foo_bar とは異なるフィールドを参照します。

    フィールドパスが同じフィールドへの有効な参照であっても、制限と IAM 権限を構成するときは、スペル、大文字小文字、格が一致している必要があります。たとえば、jsonPayload.foo に対して制限を指定する場合は、json_payload.foo ではなく jsonPayload.foo に対して IAM 権限を構成する必要があります。

有効なログフィールド タイプの詳細については、Logging のクエリ言語: 値と変換をご覧ください。

コンソール

Google Cloud コンソールを使用して、制限付きフィールドへのアクセス権をユーザーに付与するには、次の手順を行います。

  1. [権限の編集] ペインで、[ログフィールド アクセス者] を選択します。
  2. [ADD CONDITION] を選択します。

    ログフィールド アクセス者の権限を追加します。

  3. [タイトル] フィールドと [説明] フィールドに、タイトルと説明を入力します。

  4. [条件エディタ] タブを選択し、次の式を入力します。

    resource.name.extract("locations/global/buckets/BUCKET_ID /fields/{field}") == "RESTRICTED_FIELD"
    

    制限付きフィールドのサブセットを追加します。

  5. [Save] を選択します。

Identity and Access Management の権限はすぐに更新されます。

gcloud

gcloud CLI を使用して、制限付きフィールドへのアクセス権をユーザーに付与するには、次の手順を行います。

  1. policy.json ファイルを編集します。

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. 追加のバインディングで policy.json ファイルを更新します。

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/BUCKET_NAME/fields/{field}\") == 'RESTRICTED_FIELD'",
            "title": "TITLE"
          },
          "members": [
            "user":"USER_ID@DOMAIN.com"
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    バインディングの例:

    "bindings": [
      {
        "condition": {
          "description": "Give access to one restricted field that contains sensitive information",
          "expression": "resource.name.extract(\"locations/global/buckets/my-log-bucket/fields/{field}\") == 'jsonPyaload.data.ssn'",
          "title": "Access to restricted field"
        },
        "members": [
          "user":"222larabrown@gmail.com"
        ],
        "role": "roles/logging.fieldAccessor"
      }
    ]
    

Identity and Access Management の権限はすぐに更新されます。

出力例

次の例は、LogEntry フィールドのサブセットへのアクセスが制限されているユーザーに対して、LogEntry がどのように表示されるかを示しています。

バケットで次のフィールドが制限されているとします。

  • jsonPayload
  • httpRequest
  • labels

すべての制限付きフィールドにアクセスできる権限を持つユーザーには、LogEntry は次のようになります。

すべてのログフィールドが表示されています。

制限付きの jsonPayload LogEntry フィールドのみにアクセスする権限を持つユーザーの場合、LogEntry は次のようになります。

jsonPayload フィールドのみが表示されます。

制限付きフィールドを表示する権限がないユーザーの場合、LogEntry は次のようになります。

すべてのフィールドが制限されています。

ユーザーが制限付きフィールドを含む LogEntry を返すグローバル制限に入ると、Logging はフィールドだけでなく LogEntry 全体を非表示にします。

制限付きフィールドの一覧表示

ログバケットの制限フィールドを一覧表示するには、次の gcloud CLI コマンドを実行します。

gcloud logging buckets describe  BUCKET_ID  --location=LOCATION

コマンドの例:

gcloud logging buckets describe my-log-bucket --location=global

割り当てと上限

フィールド レベルのアクセス制御を設定して使用する場合は、次の点に注意してください。

  • 制限付きフィールドの数: ログバケットごとに最大 20 個のフィールドに制限できます。
  • 制限付きフィールドのサイズ: 制限付きフィールドパスの長さは 800 B より小さくなければなりません。

Cloud Logging の使用量に適用される上限の詳細は、割り当てと上限をご覧ください。