このドキュメントでは、フィールド レベルのアクセス制御と、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.ssn
と httpRequest.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.ssn
と httpRequest.status
の両方が制限付きフィールドとして削除されます。
制限付きフィールドへのアクセスの管理
デフォルトでは、Logging は logging.fieldAccessor
ロールまたは同様の権限があるロールを持たないユーザーに対して、すべての制限付きフィールドを非表示にします。Logging は、バケット内のログを表示する権限と logging.fieldAccessor
ロールの両方を持つユーザーに対して、制限付きフィールドを公開します。
デフォルトの動作を変更して、制限付きフィールドのサブセットを特定のユーザーに制限できます。
すべての制限付きフィールドに対する権限の付与
すべての制限付きフィールドに権限を付与するには、logging.fieldAccessor
ロールまたは logging.fieldAccessor
ロールを含むカスタムロールをユーザーに付与します。
コンソール
Google Cloud コンソールで logging.fieldAccessor
ロールをユーザーに付与するには、次の手順に従います。
-
Google Cloud コンソールの [IAM] ページに移動します。
検索バーを使用してこのページを検索する場合は、小見出しが [IAM と管理者] である結果を選択します。
- プリンシパルを選択し、[編集] をクリックします。
- [権限の編集] ペインで、ロールの [ログフィールド アクセス者] を選択します。
- [IAM の条件を追加] を選択します。
- [タイトル] フィールドと [説明] フィールドに、タイトルと説明を入力します。
[条件エディタ] タブを選択し、次の式を入力します。
resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_ID"
[保存] を選択します。
Identity and Access Management の権限はすぐに更新されます。
gcloud
gcloud CLI を使用してユーザーに logging.fieldAccessor
ロールを付与するには、次の手順を行います。
現在の IAM ポリシー情報をファイルに保存するには、
gcloud projects get-iam-policy
コマンドを実行して出力をファイルに保存します。gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
上記のコマンドは、
policy.json
というファイルに情報を保存します。追加のバインディングで
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.com
。PRINCIPAL
に使用できる形式の完全なリストについては、プリンシパル ID をご覧ください。policy.json
ファイルのmembers
フィールドで、"PRINCIPAL-TYPE":"ID"
の形式を使用します。 - DESCRIPTION: 条件の説明。
- TITLE: 条件のタイトル。
- PRINCIPAL: ロールを付与するプリンシパルの識別子。通常、プリンシパル ID の形式は
更新された
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)として表すことができます。
たとえば、
logName
はLogEntry
protobuf のフィールドであり、log_name
は同じフィールドを参照します。jsonPayload
の下にあるフィールド名はマップ文字列キーであるものの、json_payload.fooBar
を参照するため、フィールドjsonPayload.fooBar
はjsonPayload.foo_bar
とは異なるフィールドを参照します。フィールドパスが同じフィールドへの有効な参照であっても、制限と IAM 権限を構成するときは、スペル、大文字小文字、格が一致している必要があります。 たとえば、
jsonPayload.foo
に対して制限を指定する場合は、json_payload.foo
ではなくjsonPayload.foo
に対して IAM 権限を構成する必要があります。
有効なログフィールドの種類の詳細については、Logging クエリ言語: 値と変換をご覧ください。
コンソール
Google Cloud コンソールを使用して、制限付きフィールドへのアクセス権をユーザーに付与するには、次の手順を行います。
-
Google Cloud コンソールの [IAM] ページに移動します。
検索バーを使用してこのページを検索する場合は、小見出しが [IAM と管理者] である結果を選択します。
- プリンシパルを選択し、[編集] をクリックします。
- [権限の編集] ペインで、ロールの [ログフィールド アクセス者] を選択します。
- [IAM の条件を追加] を選択します。
- [タイトル] フィールドと [説明] フィールドに、タイトルと説明を入力します。
[条件エディタ] タブを選択し、次の式を入力します。
resource.name.extract("locations/global/buckets/BUCKET_ID/fields/{field}") == "RESTRICTED_FIELDS"
[保存] を選択します。
Identity and Access Management の権限はすぐに更新されます。
gcloud
gcloud CLI を使用して、制限付きフィールドへのアクセス権をユーザーに付与するには、次の手順を行います。
IAM 情報をファイルに保存するには、
gcloud projects get-iam-policy
コマンドを実行して出力をファイルに保存します。gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
上記のコマンドは、
policy.json
というファイルに情報を保存します。追加のバインディングで
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.com
。PRINCIPAL
に使用できる形式の完全なリストについては、プリンシパル ID をご覧ください。policy.json
ファイルのmembers
フィールドで、"PRINCIPAL-TYPE":"ID"
の形式を使用します。 - DESCRIPTION: 条件の説明。
- TITLE: 条件のタイトル。
- PRINCIPAL: ロールを付与するプリンシパルの識別子。通常、プリンシパル ID の形式は
更新された
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 の使用量に適用される上限の詳細は、割り当てと上限をご覧ください。