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

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

概要

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

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

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

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

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

制限付きフィールド

jsonPayload フィールドへのアクセスを制限すると、ネストされたパスへのアクセスも制限されます。

次のリーフ フィールドへのアクセスも制限できます。

たとえば、labels.check_id フィールドへのアクセスを制限できます。

始める前に

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

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

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

    gcloud components update
    

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

  • gcloud config set を実行して、Google Cloud CLI コマンドのデフォルトのGoogle Cloud プロジェクトを構成します。コマンドを実行する前に、次のように置き換えます。

    • PROJECT_ID: プロジェクトの ID。

    コマンド:

    gcloud config set project PROJECT_ID
    
  • バケットを含む Google Cloud プロジェクトに、次のいずれかの IAM ロールが付与されていることを確認します。

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

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

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

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

新しいログバケットを作成するときにログフィールドを制限するには、gcloud logging buckets create コマンドを実行します。コマンドを実行する前に、次のように置き換えます。

  • BUCKET_ID: ログバケットの名前または ID。
  • LOCATION: ログバケットのロケーション。
  • DESCRIPTION: ログバケットの説明。
  • RESTRICTED_FIELDS: 制限されているフィールドのカンマ区切りのリスト。

コマンド:

gcloud logging buckets create BUCKET_ID --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 logging buckets update コマンドを実行します。

gcloud logging buckets update BUCKET_ID --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 ロールを含むカスタムロールをユーザーに付与します。

コンソール

Google Cloud コンソールを使用してユーザーに logging.fieldAccessor ロールを付与するには、次の操作を行います。

  1. Google Cloud コンソールで [IAM] ページに移動します。

    [IAM] に移動

    このページを検索バーで検索する場合は、小見出しが「IAM と管理」の結果を選択します。

  2. プリンシパルを選択し、[編集] をクリックします。
  3. [権限の編集] ペインで、ロールに [ログフィールド アクセス者] を選択します。
  4. [IAM の条件を追加] を選択します。
  5. [タイトル] フィールドと [説明] フィールドに、タイトルと説明をそれぞれ入力します。
  6. [条件エディタ] タブをクリックし、次の式を入力します。

    resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_ID"
    
  7. [保存] を選択します。

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

gcloud

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

  1. 現在の IAM ポリシー情報をファイルに保存するには、gcloud projects get-iam-policy コマンドを実行して出力をファイルに保存します。

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    

    上記のコマンドは、policy.json というファイルに情報を保存します。

  2. 追加のバインディングで policy.json ファイルを更新します。

    次の例では、expression フィールドにログバケットのみがリストされます。したがって、そのログバケットに保存されているログエントリのすべてのフィールドには、members セクションにリストされているプリンシパルがアクセスできます。

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

    上の例で、フィールドの意味は次のとおりです。

    • PRINCIPAL: ロールを付与するプリンシパルの ID。通常、プリンシパル ID の形式は PRINCIPAL-TYPE:ID です。例: user:my-user@example.comPRINCIPAL に使用できる形式の一覧については、プリンシパル ID をご覧ください。policy.json ファイルの members フィールドで、"PRINCIPAL-TYPE":"ID" 形式を使用します。
    • DESCRIPTION: 条件の説明。
    • TITLE: 条件のタイトル。
  3. 更新された policy.json ファイルを適用するには、gcloud projects set-iam-policy コマンドを実行します。

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

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. Google Cloud コンソールで [IAM] ページに移動します。

    [IAM] に移動

    このページを検索バーで検索する場合は、小見出しが「IAM と管理」の結果を選択します。

  2. プリンシパルを選択し、[編集] をクリックします。
  3. [権限の編集] ペインで、ロールに [ログフィールド アクセス者] を選択します。
  4. [IAM の条件を追加] を選択します。
  5. [タイトル] フィールドと [説明] フィールドに、タイトルと説明をそれぞれ入力します。
  6. [条件エディタ] タブをクリックし、次の式を入力します。

    resource.name.extract("locations/global/buckets/BUCKET_ID/fields/{field}") == "RESTRICTED_FIELDS"
    
  7. [保存] を選択します。

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

gcloud

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

  1. IAM 情報をファイルに保存するには、gcloud projects get-iam-policy コマンドを実行して出力をファイルに保存します。

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    

    上記のコマンドは、policy.json というファイルに情報を保存します。

  2. 追加のバインディングで policy.json ファイルを更新します。

    以下では、expression フィールドに特定のフィールドのリストが含まれています。したがって、指定されたログバケットに保存されているログエントリのフィールドにアクセスできるのは、members セクションにリストされているプリンシパルのみです。

    "bindings": [
        {
          "condition": {
            "description": "DESCRIPTION",
            "expression": "resource.name.extract(\"locations/global/buckets/BUCKET_ID/fields/{field}\") == 'RESTRICTED_FIELDS'",
            "title": "TITLE"
          },
          "members": [
            PRINCIPAL
          ],
          "role": "roles/logging.fieldAccessor"
        }
    ]
    

    上の例で、フィールドの意味は次のとおりです。

    • PRINCIPAL: ロールを付与するプリンシパルの ID。通常、プリンシパル ID の形式は PRINCIPAL-TYPE:ID です。例: user:my-user@example.comPRINCIPAL に使用できる形式の一覧については、プリンシパル ID をご覧ください。policy.json ファイルの members フィールドで、"PRINCIPAL-TYPE":"ID" 形式を使用します。
    • DESCRIPTION: 条件の説明。
    • TITLE: 条件のタイトル。
  3. 更新された policy.json ファイルを適用するには、gcloud projects set-iam-policy コマンドを実行します。

    gcloud projects set-iam-policy PROJECT_ID policy.json
    

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

ログバケットが jsonPayload フィールド、特定のラベル、特定の httpRequest サブフィールドを制限しているとします。ユーザーがログエントリを調べているときに、次の処理が行われます。

  • すべての制限付きフィールドにアクセスできる権限を持つユーザーの場合、ログエントリ内のすべてのフィールドが表示されます。

  • 制限付き jsonPayload LogEntry フィールドのみにアクセスする権限を持つユーザーの場合、制限なしのフィールドはすべて表示され、jsonPayload フィールドも表示されます。

  • 制限付きフィールドを表示する権限のないユーザーの場合、制限なしのフィールドのみが表示されます。

ユーザーがグローバル制限を使用してクエリを作成した場合、制限付きフィールドを含むログエントリはレスポンスから除外されます。

制限付きフィールドの一覧取得

ログバケットの制限付きフィールドを一覧表示するには、次の gcloud logging buckets describe を実行します。

gcloud logging buckets describe BUCKET_ID --location=LOCATION

コマンドの例:

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

割り当てと上限

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

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

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