필드 수준 액세스 구성

이 문서에서는 필드 수준 액세스 제어에 대해 그리고 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 역할이 포함된 커스텀 역할을 사용자에게 부여합니다.

콘솔

Google Cloud Console을 사용하여 사용자에게 logging.fieldAccessor 역할을 부여하려면 다음 단계를 완료합니다.

  1. 권한 수정 창에서 로그 필드 접근자를 선택합니다.
  2. 조건 추가를 선택합니다.

    로그 필드 접근자 권한을 추가합니다.

  3. 제목설명 필드에 제목과 설명을 입력합니다.

  4. 조건 편집기 탭을 클릭하고 다음 표현식을 입력합니다.

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

    권한에 조건을 추가합니다.

  5. 저장을 선택합니다.

Identity and Access Management 권한은 즉시 업데이트됩니다.

gcloud

gcloud CLI를 사용하여 사용자에게 logging.fieldAccessor 역할을 부여하려면 다음 단계를 완료합니다.

  1. policy.json 파일을 수정합니다.

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. 추가 binding으로 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"
        }
    ]
    

    binding 예시:

    "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 아래의 필드 이름은 맵 문자열 키이므로 jsonPayload.fooBar 필드는 jsonPayload.foo_bar와는 다른 필드를 참조합니다. 하지만 json_payload.fooBar는 참조합니다.

    필드 경로가 동일한 필드에 대한 유효한 참조이더라도 제한사항 및 IAM 권한을 구성할 때 맞춤법, 대문자, 대소문자를 일치시켜야 합니다. 예를 들어 jsonPayload.foo에 제한을 지정하는 경우 json_payload.foo가 아닌 jsonPayload.foo에 IAM 권한을 구성해야 합니다.

유효한 로그 필드 유형에 대한 자세한 내용은 로깅 쿼리 언어: 값 및 변환을 참조하세요.

콘솔

Google Cloud Console을 사용하여 제한된 필드에 대해 액세스 권한을 사용자에게 부여하려면 다음 단계를 완료합니다.

  1. 권한 수정 창에서 로그 필드 접근자를 선택합니다.
  2. 조건 추가를 선택합니다.

    로그 필드 접근자 권한을 추가합니다.

  3. 제목설명 필드에 제목과 설명을 입력합니다.

  4. 조건 편집기 탭을 클릭하고 다음 표현식을 입력합니다.

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

    제한된 필드의 하위 집합을 추가합니다.

  5. 저장을 선택합니다.

Identity and Access Management 권한은 즉시 업데이트됩니다.

gcloud

gcloud CLI를 사용하여 제한된 필드에 대한 액세스 권한을 사용자에게 부여하려면 다음 단계를 완료하세요.

  1. policy.json 파일을 수정합니다.

    gcloud projects get-iam-policy PROJECT_ID --format=json > policy.json
    
  2. 추가 binding으로 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"
        }
    ]
    

    binding 예시:

    "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개 필드를 제한할 수 있습니다.
  • 제한된 필드의 크기: 제한된 필드 경로는 길이가 800B 미만이어야 합니다.

Cloud Logging에 적용될 수 있는 한도에 대한 자세한 내용은 할당량 및 한도를 참조하세요.