단기 사용자 인증 정보에 대한 권한 범위 줄이기

이 페이지에서는 단기 사용자 인증 정보가 사용할 수 있는 Cloud IAM(Cloud Identity and Access Management) 권한 범위를 줄이는, 즉 제한하는 방법을 설명합니다.

권한 범위를 줄이려면 단기 사용자 인증 정보가 액세스할 수 있는 리소스와 각 리소스에서 사용할 수 있는 권한의 상한값을 지정하는 사용자 인증 정보 액세스 경계를 정의합니다. 그런 다음 단기 사용자 인증 정보를 만든 다음, 사용자 인증 정보 액세스 경계를 준수하는 새 사용자 인증 정보로 교환할 수 있습니다.

다음 예시는 간단한 사용자 인증 정보 액세스 경계를 보여줍니다. Cloud Storage 버킷 example-bucket에 적용됩니다. 스토리지 객체 뷰어 역할(roles/storage.objectViewer)에 포함된 권한에 상한을 설정합니다.

{
      "accessBoundaryRules": [
        {
          "availablePermissions": [
            "inRole:roles/storage.objectViewer"
          ],
          "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
        }
      ]
    }
    

구성원에게 각 세션에 대한 고유한 권한 집합을 부여해야 하는 경우 사용자 인증 정보 액세스 경계를 사용하면 여러 서비스 계정을 만들고 각 서비스 계정에 다른 역할 집합을 부여하는 것보다 더 효율적일 수 있습니다. 예를 들어, 고객 중 한 명이 관리하는 Cloud Storage 데이터에 액세스해야 하는 경우 소유하고 있는 모든 Cloud Storage 버킷에 액세스할 수 있는 서비스 계정을 만든 다음 고객의 데이터가 있는 버킷에만 액세스할 수 있는 사용자 인증 정보 액세스 경계를 적용할 수 있습니다.

시작하기 전에

사용자 인증 정보 액세스 경계를 사용하기 전에 다음 요구 사항을 충족하는지 확인하세요.

  • 다른 Google Cloud 서비스가 아닌 Cloud Storage의 권한 범위만 줄여야 합니다.

    다른 Google Cloud 서비스의 권한 범위를 줄여야 하는 경우 여러 개의 서비스 계정을 생성하고 각 서비스 계정에 다른 역할 집합을 부여할 수 있습니다.

  • 객체 수준이 아닌 버킷 수준에서 권한 범위를 줄여야 합니다.

  • 균일한 버킷 수준 액세스를 사용하여 Cloud Storage 리소스에 대한 액세스를 관리합니다.

  • 인증에 OAuth 2.0 액세스 토큰을 사용할 수 있습니다. 다른 유형의 단기 사용자 인증 정보는 사용자 인증 정보 액세스 경계를 지원하지 않습니다.

범위가 축소된 단기 사용자 인증 정보 만들기

권한 범위가 축소된 OAuth 2.0 액세스 토큰을 만들려면 다음 단계를 따릅니다.

  1. 사용자 또는 서비스 계정에 적절한 Cloud IAM 역할을 부여합니다.
  2. 사용자 또는 서비스 계정에 사용할 수 있는 권한의 상한을 설정하는 사용자 인증 정보 액세스 경계 정의입니다.
  3. 사용자 또는 서비스 계정에 대한 OAuth 2.0 액세스 토큰을 만듭니다.
  4. 사용자 인증 정보 액세스 경계를 준수하는 새 토큰으로 OAuth 2.0 액세스 토큰을 교환합니다.

새로 만든 범위를 축소한 OAuth 2.0 액세스 토큰을 사용하여 Cloud Storage에 대한 요청을 인증할 수 있습니다.

Cloud IAM 역할 부여

사용자 인증 정보 액세스 경계는 리소스에 사용 가능한 권한의 상한을 설정합니다. 구성원의 권한을 뺄 수 있지만 구성원이 아직 보유하지 않은 권한은 추가할 수 없습니다.

따라서 구성원에게 Cloud Storage 버킷에서 또는 프로젝트와 같은 더 높은 수준의 리소스에서 필요한 권한을 제공하는 역할을 부여해야 합니다.

예를 들어 서비스 계정이 버킷에 객체를 만들 수 있도록 범위를 축소한 단기 사용자 인증 정보를 만들어야 한다고 가정합니다.

  • 최소한 스토리지 객체 생성자 역할(roles/storage.objectCreator)과 같은 storage.objects.create 권한이 포함된 역할을 서비스 계정에 부여해야 합니다. 또한 사용자 인증 정보 액세스 경계에 이 권한이 있어야 합니다.
  • 스토리지 객체 관리자 역할(roles/storage.objectAdmin)과 같은 더 많은 권한을 포함하는 역할을 부여할 수도 있습니다. 서비스 계정은 역할 부여 및 사용자 인증 정보 액세스 경계 둘 다에 표시되는 권한만 사용할 수 있습니다.

사용자 인증 정보 액세스 경계 정의

사용자 인증 정보 액세스 경계는 액세스 경계 규칙의 목록을 포함하는 JSON 객체입니다. 각 규칙에는 다음 정보가 포함됩니다.

  • 규칙이 적용되는 리소스
  • 해당 리소스에서 사용할 수 있는 권한의 상한

단기 사용자 인증 정보에 사용자 인증 정보 액세스 경계를 적용하면 사용자 인증 정보는 사용자 인증 정보 액세스 경계의 리소스에만 액세스할 수 있습니다. 다른 리소스에서 사용할 수 있는 권한이 없습니다.

사용자 인증 정보 액세스 경계는 최대 10 개의 액세스 경계 규칙을 포함할 수 있습니다. 각 단기 사용자 인증 정보에는 하나의 사용자 인증 정보 액세스 경계만 적용할 수 있습니다.

사용자 인증 정보 액세스 경계에는 다음과 같은 필드가 있습니다.

필드
accessBoundaryRules[]

object

단기 사용자 인증 정보에 적용할 액세스 경계 규칙의 목록입니다.

accessBoundaryRules[].availablePermissions[]

string

리소스에 사용 가능한 권한의 상한값을 정의하는 목록입니다.

각 값은 프리픽스 inRole:이 포함된 Cloud IAM 사전 정의된 역할 또는 커스텀 역할의 식별자입니다. 예: inRole:roles/storage.objectViewer. 이 역할의 권한만 사용할 수 있습니다.

accessBoundaryRules[].availableResource

string

규칙이 적용되는 Cloud Storage 버킷의 전체 리소스 이름입니다. //storage.googleapis.com/projects/_/buckets/[BUCKET_NAME] 형식을 사용합니다.

다음 예시는 여러 리소스에 대한 규칙을 포함하는 사용자 인증 정보 액세스 경계를 보여줍니다.

  • example-bucket-1 Cloud Storage 버킷. 이 버킷의 경우 스토리지 객체 뷰어 역할의 권한(roles/storage.objectViewer)만 사용할 수 있습니다.
  • example-bucket-2 Cloud Storage 버킷. 이 버킷의 경우 스토리지 객체 생성자 역할의 권한(roles/storage.objectCreator)만 사용할 수 있습니다.
{
      "accessBoundaryRules": [
        {
          "availablePermissions": [
            "inRole:roles/storage.objectViewer"
          ],
          "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-1"
        },
        {
          "availablePermissions": [
            "inRole:roles/storage.objectCreator"
          ],
          "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-2"
        }
      ]
    }
    

사용자 인증 정보 액세스 경계를 정의하는 JSON 파일을 만듭니다. 나중에 이 파일을 사용합니다.

OAuth 2.0 액세스 토큰 만들기

범위가 축소된 단기 사용자 인증 정보를 만들려면 일반 OAuth 2.0 액세스 토큰을 만들어야 합니다. 그러면 일반 사용자 인증 정보를 범위가 축소된 사용자 인증 정보와 교환할 수 있습니다. 액세스 토큰을 만들 때 OAuth 2.0 범위 https://www.googleapis.com/auth/cloud-platform을 사용합니다.

서비스 계정에 대한 액세스 토큰을 만들려면 서버 간 OAuth 2.0 흐름을 완료하거나 Service Account Credentials API를 사용하여 OAuth 2.0 액세스 토큰을 생성할 수 있습니다.

사용자의 액세스 토큰을 만들려면 OAuth 2.0 액세스 토큰 가져오기를 참조하세요. OAuth 2.0 Playground를 사용하여 자신의 Google 계정에 대한 액세스 토큰을 만들 수도 있습니다.

OAuth 2.0 액세스 토큰 교환

OAuth 2.0 액세스 토큰을 만든 후에는 액세스 토큰을 사용자 인증 정보 액세스 경계를 준수하는 새 토큰으로 교환할 수 있습니다. Identity Platform의 일부인 보안 토큰 서비스를 통해 액세스 토큰을 교환합니다.

액세스 토큰을 교환하려면 다음 HTTP 메서드 및 URL을 사용합니다.

POST https://securetoken.googleapis.com/v2beta1/token

application/x-www-form-urlencoded 요청에 Content-Type 헤더를 설정합니다. 요청 본문에 다음 필드를 포함합니다.

필드
access_boundary

string

퍼센트 인코딩된 사용자 인증 정보 액세스 경계입니다.

grant_type

string

urn:ietf:params:oauth:grant-type:token-exchange 값을 사용하세요.

requested_token_type

string

urn:ietf:params:oauth:token-type:access_token 값을 사용하세요.

subject_token

string

교환하려는 OAuth 2.0 액세스 토큰입니다.

subject_token_type

string

urn:ietf:params:oauth:token-type:access_token 값을 사용하세요.

응답은 다음 필드를 포함하는 JSON 객체입니다.

필드
access_token

string

사용자 인증 정보 액세스 경계를 준수하는 새로운 OAuth 2.0 액세스 토큰입니다.

expires_in

number

새 액세스 토큰이 만료될 때까지의 시간을 초 단위로 나타낸 값입니다.

이 필드는 원래 액세스 토큰이 서비스 계정을 나타내는 경우에만 존재합니다. 이 필드가 없으면 새 액세스 토큰의 만료 시간이 원래 액세스 토큰의 만료 시간과 같습니다.

issued_token_type

string

urn:ietf:params:oauth:token-type:access_token 값을 포함합니다.

token_type

string

Bearer 값을 포함합니다.

예를 들어, 사용자 인증 정보 액세스 경계가 ./access-boundary.json 파일에 저장되는 경우, 다음 curl 명령어를 사용하여 액세스 토큰을 교환합니다. [ORIGINAL_TOKEN]을 원래 액세스 토큰과 바꿉니다.

curl -H "Content-Type:application/x-www-form-urlencoded" \
        -X POST \
        https://securetoken.googleapis.com/v2beta1/token \
        -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange&subject_token_type=urn:ietf:params:oauth:token-type:access_token&requested_token_type=urn:ietf:params:oauth:token-type:access_token&subject_token=[ORIGINAL_TOKEN]" \
        --data-urlencode "access_boundary=$(cat ./access-boundary.json)"

응답은 다음 예시와 비슷합니다.

{
      "access_token": "ya29.dr.AbCDeFg-123456...",
      "issued_token_type": "urn:ietf:params:oauth:token-type:access_token",
      "token_type": "Bearer",
      "expires_in": 3600
    }
    

다음 단계