액세스 수준 생성 및 IAP 보안 리소스에 대한 적용

이 페이지에서는 Access Context Manager를 사용하여 액세스 수준을 만들고 이를 IAP(Identity-Aware Proxy) 보안 리소스에 적용하는 방법을 설명합니다.

개요

액세스 수준은 출처에 따라 요청에 할당되는 일련의 속성입니다. 기기 유형, IP 주소, 사용자 ID와 같은 정보를 사용하여 부여할 액세스 수준을 지정할 수 있습니다. 예를 들어 회사 네트워크 내부에서 시작된 연결에는 'High_Trust' 수준을 할당하고 승인된 운영체제를 실행하는 외부 기기에는 'Medium_Trust' 수준을 할당할 수 있습니다.

엔드포인트 확인을 설정하면 기기 정보가 액세스 수준에서 수집 및 참조됩니다. 엔드포인트 확인은 회사 리소스에 액세스하는 모든 회사 및 개인 기기의 인벤토리를 만듭니다.

액세스 수준은 IAP 보안 리소스의 Identity and Access Management(IAM) 조건으로 추가하여 적용됩니다. IAP를 사용하면 네트워크 수준의 방화벽을 사용하는 대신 세분화된 리소스 수준의 액세스 제어 모델을 적용할 수 있습니다. 예를 들어 대부분의 리소스에 'Medium_Trust'를 요구하되, 더욱 민감한 특정 리소스에는 'High_Trust' 수준을 요구하도록 지정할 수 있습니다.

자세한 내용은 Access Context Manager 개요를 참조하세요.

시작하기 전에

시작하기 전에 다음을 수행해야 합니다.

  • IAP로 리소스를 보호합니다.
  • 엔드포인트 확인 설정하기 이는 저장소 암호화 상태와 같은 사용자 기기 정보를 기반으로 리소스에 대한 액세스를 제한하려는 경우에만 필요합니다.
  • 프로젝트에 다음 역할 중 하나가 부여되었는지 확인하세요.

    • Access Context Manager 관리자
    • Access Context Manager 편집자

액세스 수준 만들기

다음 프로세스는 액세스 수준을 만듭니다.

이 예시에서는 내부 감사관 그룹에서 프로젝트의 Google Cloud Observability에 액세스할 수 있도록 허용하는 액세스 수준을 만든다고 가정합니다. 감사인의 모든 기기에는 203.0.113.0~203.0.113.127 사이의 서브넷 IP가 할당됩니다. 또한 기기의 암호화 여부를 확인하려고 합니다. 감사인이 사용하는 기기가 아닌 다른 기기는 이 서브넷에 할당되지 않습니다.

콘솔

  1. Google Cloud 콘솔에서 Access Context Manager 페이지로 이동합니다.

    Access Context Manager 페이지로 이동

  2. 메시지가 표시되면 조직을 선택합니다.

  3. Access Context Manager 페이지의 맨 위에 있는 새 항목을 누릅니다.

  4. 새 액세스 수준 창의 조건 섹션에서 속성 추가를 클릭한 후 기기 정책을 클릭합니다.

  5. 저장소 암호화 드롭다운을 클릭하고 암호화를 선택합니다. 이 규칙은 직원의 기기에서 엔드포인트 확인을 설정한 후에만 작동합니다.

  6. 속성 추가를 다시 클릭하고 IP 서브네트워크를 선택합니다.

  7. IP 서브네트워크 상자에 CIDR 블록으로 형식화된 IPv4 또는 IPv6 범위를 한 개 이상 입력합니다.

    이 예시에서는 감사인으로만 액세스 권한을 제한하기 위해 IP 서브네트워크 상자에 203.0.113.0/25를 입력합니다.

  8. 저장을 클릭합니다.

gcloud

  1. CIDR 블록 형식으로 된 IPv4 또는 IPv6 범위를 한 개 이상 포함하는 액세스 수준의 .yaml 파일을 만듭니다.

    이 예에서는 감사인으로만 액세스 권한을 제한하기 위해 .yaml 파일에 다음을 입력합니다.

    - ipSubnetworks:
        - 203.0.113.0/25
    - devicePolicy:
        allowedEncryptionStatuses
          - ENCRYPTED
    

    액세스 수준 속성 및 YAML 형식의 목록은 액세스 수준 속성을 참조하세요. 가능한 모든 속성의 포괄적인 YAML 파일은 이 액세스 수준 YAML 파일 예시를 참조하세요.

    devicePolicy 규칙은 직원의 기기에 엔드 포인트 확인을 설정한 후에만 작동합니다.

  2. 파일을 저장합니다. 이 예에서 이 파일의 이름은 CONDITIONS.yaml입니다.

  3. 액세스 수준을 만듭니다.

    gcloud access-context-manager levels create NAME \
       --title TITLE \
       --basic-level-spec CONDITIONS.yaml \
       --policy=POLICY_NAME

    각 항목의 의미는 다음과 같습니다.

    • NAME은 액세스 수준의 고유한 이름입니다. 이 이름은 문자로 시작해야 하며 문자, 숫자, 밑줄만 포함할 수 있습니다.

    • TITLE은 인간이 읽을 수 있는 제목입니다. 이 제목은 정책에 고유해야 합니다.

    • POLICY_NAME은 조직의 액세스 정책 이름입니다.

    다음과 비슷한 출력이 표시됩니다.

    Create request issued for: NAME
    Waiting for operation [accessPolicies/POLICY_NAME/accessLevels/NAME/create/1521594488380943] to complete...done.
    Created level NAME.
    

API

  1. CIDR 블록 형식으로 된 한 개 이상의 IPv4 또는 IPv6 범위와 암호화된 저장소가 필요한 기기 정책을 포함하는 AccessLevel 리소스를 만들도록 요청 본문을 작성합니다.

    이 예에서는 감사인으로만 액세스 권한을 제한하기 위해 요청 본문에 다음을 입력합니다.

    {
     "name": "NAME",
     "title": "TITLE",
     "basic": {
       "conditions": [
         {
           "ipSubnetworks": [
             "203.0.113.0/25"
           ]
         },
         {
         "devicePolicy": [
           "allowedEncryptionStatuses": [
             "ENCRYPTED"
           ]
         ]
         }
       ]
     }
    }

    각 항목의 의미는 다음과 같습니다.

    • NAME은 액세스 수준의 고유한 이름입니다. 이 이름은 문자로 시작해야 하며 문자, 숫자, 밑줄만 포함할 수 있습니다.

    • TITLE은 인간이 읽을 수 있는 제목입니다. 이 제목은 정책에 고유해야 합니다.

  2. accessLevels.create를 호출하여 액세스 수준을 만듭니다.

    POST https://accesscontextmanager.googleapis.com/v1/accessPolicies/POLICY_NAME/accessLevels

    각 항목의 의미는 다음과 같습니다.

    • POLICY_NAME은 조직의 액세스 정책 이름입니다.

액세스 수준 적용

IAP 보안 리소스에는 IAP 역할을 리소스에 바인딩하는 IAM 정책이 있습니다.

IAM 정책에 IAM 조건부 바인딩을 추가하면 요청 속성에 따라 리소스에 대한 액세스가 더욱 제한됩니다. 이러한 요청 속성에는 다음이 포함됩니다.

  • 액세스 수준
  • URL 호스트/경로
  • 날짜/시간

IAM 조건부 binding에서 지정된 request.hostrequest.path와 비교되는 요청 값은 정확하게 일치해야 합니다. 예를 들어 /internal admin으로 시작하는 경로에 대한 액세스를 제한할 경우 /internal%20admin으로 이동하여 제한을 우회할 수 있습니다. 자세한 내용은 호스트 이름 및 경로 조건 사용을 참조하세요.

다음 단계는 IAM 정책을 업데이트하여 IAP 보안 리소스에 액세스 수준을 추가하는 방법을 보여줍니다.

콘솔

  1. IAP 관리자 페이지로 이동하세요.

    IAP 관리자 페이지로 이동

  2. IAM 권한을 업데이트하려는 리소스 옆의 체크박스를 선택합니다.

  3. 오른쪽 정보 패널에서 주 구성원 추가를 클릭합니다.

  4. 새 주 구성원 상자에 역할을 할당할 주 구성원을 입력합니다.

  5. 역할 선택 드롭다운 목록에서 IAP 보안 웹 앱 사용자 역할을 선택합니다.

  6. 기존 액세스 수준을 지정하려면 액세스 수준 드롭다운 목록에서 액세스 수준을 선택합니다. IAP 보안 웹 앱 사용자 역할을 선택해야 하고, 기존 액세스 수준을 볼 수 있는 조직 수준의 권한이 있어야 합니다.

    리소스에 여러 액세스 수준을 적용하면 선택한 액세스 수준 중 하나 이상에 지정된 조건(목록에 있는 액세스 수준의 논리적 OR)을 충족할 때 사용자에게 리소스에 대한 액세스 권한이 부여됩니다. 사용자가 둘 이상의 액세스 수준 조건(논리적 AND 관계의 액세스 수준)을 충족하도록 하려면 여러 액세스 수준을 포함하는 하나의 액세스 수준을 만듭니다.

  7. 주 구성원에 역할을 더 추가하려면 다른 역할 추가를 클릭합니다.

  8. 역할 추가가 완료되었으면 저장을 클릭합니다.

gcloud

현재는 gcloud CLI를 사용하여 프로젝트 수준의 조건부 바인딩만 설정할 수 있습니다.

조건부 바인딩을 설정하려면 아래 프로세스에 따라 프로젝트의 policy.yaml 파일을 수정하세요.

  1. 다음 gcloud 명령어를 사용하여 앱의 IAM 정책을 엽니다.

    gcloud projects get-iam-policy PROJECT_ID > policy.yaml
  2. policy.yaml 파일을 편집하여 다음을 지정하세요.

    • IAM 조건을 적용할 사용자 및 그룹
    • 리소스에 대한 액세스 권한을 부여하는 iap.httpsResourceAccessor 역할
    • 액세스 수준의 IAM 조건

    다음 조건은 ACCESS_LEVEL_NAME 액세스 수준 요구사항이 충족되고 리소스 URL 경로가 /로 시작되는 경우에만 사용자 및 그룹에 액세스 권한을 부여합니다.

    ...
    - members:
    - group:EXAMPLE_GROUP@GOOGLE.COM
    - user:EXAMPLE_USER@GOOGLE.COM
    role: roles/iap.httpsResourceAccessor
    condition:
        expression: "accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")
        title: CONDITION_TITLE
    ...
  3. set-iam-policy 명령어를 사용하여 정책을 앱에 결합합니다. gcloud projects set-iam-policy PROJECT_ID policy.yaml

API

앱의 policy.json 파일을 편집하려면 앱 유형에 대한 아래 프로세스를 따르세요. IAM API를 사용하여 액세스 정책을 관리하는 방법에 대한 자세한 내용은 IAP 보안 리소스 액세스 관리를 참조하세요.

아래의 앱별 API 단계를 완료하기 전에 다음 변수를 내보냅니다.

 export PROJECT_NUM=PROJECT_NUMBER
 export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/iap_web
 # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
 export JSON_NEW_POLICY=POLICY_FILE.JSON
 

App Engine

  1. 다음 App Engine 변수를 내보냅니다.

    # The APP_ID is usually the project ID
    export GAE_APP_ID=APP_ID
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}

  2. getIamPolicy 메서드를 사용하여 App Engine 앱의 IAM 정책을 가져옵니다. 마지막에 비어 있는 데이터 비트는 curl 요청을 GET 대신 POST로 전환합니다.

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -d '' ${GAE_BASE_URL}/:getIamPolicy

  3. IAM 조건부 결합을 IAM 정책 JSON 파일에 추가합니다. 다음은 iap.httpsResourceAccessor 역할을 두 사용자에게 바인딩하여 BeyondCorp Enterprise 보안 리소스에 대한 액세스 권한을 사용자에게 부여하는 수정된 policy.json 파일의 예시입니다. ACCESS_LEVEL_NAME 액세스 수준 요구사항이 충족되고 리소스 URL 경로가 /로 시작되는 경우에만 리소스에 대한 액세스 권한을 부여하기 위해 IAM 조건이 추가됩니다. 결합별로 조건은 하나만 있을 수 있습니다.

    예시 policy.json 파일

    {
    "policy": {
      "bindings": [
            {
              "role": "roles/iap.httpsResourceAccessor",
              "members": [
                  "group:EXAMPLE_GROUP@GOOGLE.COM",
                  "user:EXAMPLE_USER@GOOGLE.COM"
              ],
              "condition": {
                "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
                "title": "CONDITION_NAME"
              }
            }
        ]
      }
    }

  4. setIamPolicy 메서드를 사용하여 새 policy.json 파일을 설정합니다.

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    ${GAE_BASE_URL}:setIamPolicy -d @${JSON_NEW_POLICY}

App Engine 서비스 및 버전

App Engine 서비스, 모든 버전, 서비스의 특정 버전에 대한 IAM 정책을 업데이트할 수도 있습니다. 서비스의 특정 버전에 대해 이 작업을 수행하려면 다음 단계를 따르세요.

  1. 다음 추가 변수를 내보냅니다.
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
  2. 내보낸 GAE_BASE_URL 변수를 업데이트합니다.
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
  3. 위에 표시된 getIamPolicysetIamPolicy 명령어를 사용하여 버전의 IAM 정책을 가져오고 설정합니다.

GKE 및 Compute Engine

  1. 백엔드 서비스의 프로젝트 ID를 내보냅니다.

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. getIamPolicy 메서드를 사용하여 Compute Engine 앱의 IAM 정책을 가져옵니다. 마지막에 비어 있는 데이터 비트는 curl 요청을 GET 대신 POST로 전환합니다.

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
     -d ''

  3. IAM 조건부 결합을 IAM 정책 JSON 파일에 추가합니다. 다음은 iap.httpsResourceAccessor 역할을 두 사용자에게 바인딩하여 BeyondCorp Enterprise 보안 리소스에 대한 액세스 권한을 사용자에게 부여하는 수정된 policy.json 파일의 예시입니다. ACCESS_LEVEL_NAME 액세스 수준 요구사항이 충족되고 리소스 URL 경로가 /로 시작되는 경우에만 리소스에 대한 액세스 권한을 부여하기 위해 IAM 조건이 추가됩니다. 결합별로 조건은 하나만 있을 수 있습니다.


    예시 policy.json 파일

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.httpsResourceAccessor",
            "members": [
              "group":EXAMPLE_GROUP@GOOGLE.COM,
              "user:EXAMPLE_USER@GOOGLE.COM"
            ],
            "condition": {
              "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }

  4. setIamPolicy 메서드를 사용하여 새 policy.json 파일을 설정합니다.

    curl -i -H "Content-Type:application/json" \
         -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}