필드 수준 액세스 제어

이 문서에서는 필드 수준 액세스 제어를 설명하고 Logging 버킷에 이를 설정하는 방법을 보여줍니다. 필드 수준 액세스 제어를 사용하면 Google Cloud 프로젝트 사용자에게 개별 LogEntry 필드를 숨길 수 있으므로 사용자가 액세스할 수 있는 로그 데이터를 보다 세밀하게 제어할 수 있습니다.

개요

Logging은 필드 수준 액세스 제어를 사용하여 필드를 보는 데 필요한 권한이 없는 Cloud 프로젝트 사용자에게 LogEntry 필드를 숨깁니다. LogEntry 전체를 숨기는 로그 뷰와 달리, 필드 수준 액세스 제어는 LogEntry의 개별 필드를 숨깁니다. Logging 버킷에 필드 수준 액세스 제어와 로그 보기 권한을 모두 설정할 수 있습니다. gcloud 명령줄 도구를 사용하여 필드 수준 액세스 제어를 제한하고 관리합니다.

로그 필드에 대한 액세스를 제한하려면 다음 안내를 따르세요.

  • 로그 버킷에 제한된 LogEntry 필드를 구성합니다.
  • 제한된 필드를 조회해야 하는 사용자에게만 해당 필드 경로의 logging.fieldAccessor IAM 역할 또는 유사한 권한이 포함된 역할을 부여합니다.

Logging은 제한된 필드가 설정된 버킷의 로그를 사용자가 쿼리할 때 IAM 권한을 확인합니다. ACL이 구성된 필드는 해당 필드에 해당하는 logging.FieldAccessor가 없는 사용자에게 거부됩니다. 즉, 다음과 같습니다.

  • 사용자가 제한된 필드를 직접 쿼리하려고 시도하면 권한 거부 오류가 발생합니다.
  • 전체 검색에서는 거부된 필드의 내용을 고려하지 않습니다.
  • 반환된 LogEntry 결과에서 제한된 필드가 생략됩니다.

제한된 필드

다음 LogEntry 필드 조합으로 액세스를 제한할 수 있습니다.

LogEntry 필드 상위 LogEntry 필드의 중첩 필드
jsonPayload 사용자 정의
textPayload 없음
protoPayload 서비스별
httpRequest httpRequest 중첩된 필드
labels 사용자 정의
sourceLocation sourceLocation 중첩된 필드

중첩 필드(예: jsonPayload 또는 특정 jsonPayload 하위 경로)가 있는 필드에 대한 액세스를 제한하면 중첩된 경로에 대한 액세스도 제한됩니다.

시작하기 전에

필드 수준 액세스 제어 설정을 시작하기 전에 다음을 수행합니다.

필드 수준 액세스 제어 설정

필드 수준 제한은 버킷 수준에서 구성되며 기존 버킷에 적용하거나 새 버킷을 만들 때 적용할 수 있습니다.

새 버킷의 필드 제한

새 로그 버킷을 만들 때 다음 gcloud 도구 명령어를 실행하여 로그 필드를 제한합니다.

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 도구 명령어를 실행합니다.

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 역할이 포함된 커스텀 역할을 사용자에게 부여합니다.

Console

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 도구를 사용하여 사용자에게 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 권한을 구성해야 합니다.

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

Console

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 도구를 사용하여 제한된 필드에 대한 액세스 권한을 사용자에게 부여하려면 다음 단계를 완료하세요.

  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 도구 명령어를 실행합니다.

gcloud logging buckets describe  BUCKET_ID  --location=LOCATION

명령어 예시:

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

할당량 및 한도

필드 수준 액세스 제어를 설정하고 사용할 때 다음 사항에 유의하세요.

  • 제한된 필드의 수: 각 로그 버킷에서 최대 20개 필드를 제한할 수 있습니다.
  • 제한된 필드의 크기: 제한된 필드 경로는 길이가 800B 미만이어야 합니다.

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