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

このドキュメントでは、フィールド レベルのアクセス制御と、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 の形式は 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 の形式は 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 の使用量に適用される上限の詳細は、割り当てと上限をご覧ください。