このドキュメントでは、フィールド レベルのアクセス制御と、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.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
ロールを含むカスタムロールをユーザーに付与します。
Console
Google Cloud Console で logging.fieldAccessor
ロールをユーザーに付与するには、次の手順に従います。
- [権限の編集] ペインで、[ログフィールド アクセス者] を選択します。
[ADD CONDITION] を選択します。
[タイトル] フィールドと [説明] フィールドに、タイトルと説明を入力します。
[条件エディタ] タブを選択し、次の式を入力します。
resource.name.extract("locations/global/buckets/{bucket}/") == "BUCKET_NAME"
[Save] を選択します。
Identity and Access Management の権限はすぐに更新されます。
gcloud
gcloud CLI を使用してユーザーに logging.fieldAccessor
ロールを付与するには、次の手順を行います。
policy.json
ファイルを編集します。gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
追加のバインディングで
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)として表すことができます。
たとえば、
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 コンソールを使用して、制限付きフィールドへのアクセス権をユーザーに付与するには、次の手順を行います。
- [権限の編集] ペインで、[ログフィールド アクセス者] を選択します。
[ADD CONDITION] を選択します。
[タイトル] フィールドと [説明] フィールドに、タイトルと説明を入力します。
[条件エディタ] タブを選択し、次の式を入力します。
resource.name.extract("locations/global/buckets/BUCKET_ID /fields/{field}") == "RESTRICTED_FIELD"
[Save] を選択します。
Identity and Access Management の権限はすぐに更新されます。
gcloud
gcloud CLI を使用して、制限付きフィールドへのアクセス権をユーザーに付与するには、次の手順を行います。
policy.json
ファイルを編集します。gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
追加のバインディングで
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
は次のようになります。
制限付きフィールドを表示する権限がないユーザーの場合、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 の使用量に適用される上限の詳細は、割り当てと上限をご覧ください。