TCP 전달을 위한 IAP 사용

이 페이지에서는 IAP TCP 전달을 사용하여 공개 IP 주소가 없거나 인터넷을 통한 직접 액세스를 허용하지 않는 VM 인스턴스에 대한 관리 액세스를 사용 설정하는 방법에 대해 설명합니다.

IAP TCP 전달을 사용하면 SSH, RDP, 기타 트래픽을 VM 인스턴스로 전달할 수 있는 암호화된 터널을 설정할 수 있습니다. IAP TCP 전달은 또한 터널을 설정할 수 있는 사용자와 사용자가 연결할 수 있는 VM 인스턴스를 세부적으로 제어할 수 있게 합니다.

IAP TCP 전달 작동 방법에 대한 자세한 내용은 TCP 전달 개요를 참조하세요.

IAP TCP 전달을 위한 프로젝트 준비

이 섹션에서는 Google Cloud 프로젝트에서 IAP TCP 전달을 사용 설정하는 데 필요한 단계를 안내합니다.

방화벽 규칙 만들기

IAP가 VM 인스턴스에 연결하도록 하려면 다음과 같은 방화벽 규칙을 만드세요.

  • IAP를 사용하여 액세스할 수 있는 모든 VM 인스턴스에 적용됩니다.
  • IP 범위 35.235.240.0/20에서의 인그레스 트래픽을 허용합니다. 이 범위에는 IAP가 TCP 전달을 위해 사용하는 모든 IP 주소가 포함됩니다.
  • IAP TCP 전달을 사용하여 액세스할 수 있는 모든 포트(예: SSH의 경우 포트 22 및 RDP의 경우 포트 3389)에 대한 연결을 허용합니다.

Console

네트워크의 모든 VM 인스턴스에 대한 RDP 및 SSH 액세스를 허용하려면 다음 안내를 따르세요.

  • 방화벽 규칙 페이지를 열고 방화벽 규칙 만들기를 클릭하세요.

    방화벽 규칙 페이지 열기

  • 다음 설정을 구성합니다.

    • 이름: allow-ingress-from-iap
    • 트래픽 방향: 인그레스
    • 대상: 네트워크의 모든 인스턴스
    • 소스 필터: IP ranges
    • 소스 IP 범위: 35.235.240.0/20
    • 프로토콜 및 포트: TCP를 선택하고 22,3389를 입력하여 RDP 및 SSH를 모두 허용하세요.
  • 만들기를 클릭합니다.

gcloud

네트워크의 모든 VM 인스턴스에 대한 RDP 액세스를 허용하려면 다음을 실행하세요.

gcloud compute firewall-rules create allow-rdp-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:3389 \
  --source-ranges=35.235.240.0/20

SSH 액세스의 경우 다음을 실행하세요.

gcloud compute firewall-rules create allow-ssh-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:22 \
  --source-ranges=35.235.240.0/20

다른 프로토콜의 경우 다음을 실행하세요.

gcloud compute firewall-rules create allow-ingress-from-iap \
  --direction=INGRESS \
  --action=allow \
  --rules=tcp:PORT \
  --source-ranges=35.235.240.0/20

여기서 PORT는 프로토콜이 사용하는 포트입니다.

IAP 사용 권한 부여

IAP TCP 전달을 사용할 수 있는 사용자 및 그룹과 연결할 수 있는 VM 인스턴스를 제어하려면 ID 및 액세스 관리(IAM) 권한을 구성하세요.

프로젝트 수준에서 IAM 권한을 구성하여 프로젝트의 모든 VM 인스턴스에 대한 사용자 또는 그룹 액세스 권한을 부여할 수 있습니다.

Console

  1. Cloud Console에서 IAM 및 관리자 페이지를 엽니다.

    IAM 및 관리자 페이지 열기

  2. 추가를 클릭하고 다음을 구성하세요.

    • 새 구성원: 액세스 권한을 부여할 사용자 또는 그룹을 지정합니다.
    • 역할 선택 Cloud IAP > IAP 보안 터널 사용자를 선택합니다.
  3. 저장을 클릭합니다.

gcloud

사용자에게 iap.tunnelResourceAccessor 역할을 부여합니다.

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:EMAIL \
    --role=roles/iap.tunnelResourceAccessor

다음을 바꿉니다.

  • PROJECT_ID: 프로젝트의 ID
  • EMAIL: 액세스 권한을 부여하려는 사용자의 이메일 주소(예: user@example.com)

API

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

  1. 서비스 계정의 사용자 인증 정보 파일을 다운로드합니다.

    1. 서비스 계정 페이지로 이동합니다.
      서비스 계정 페이지로 이동

    2. 서비스 계정의 이메일 주소를 클릭합니다.

    3. 수정을 클릭합니다.

    4. 키 만들기를 클릭합니다.

    5. 키 유형으로 JSON을 선택합니다.

    6. 만들기를 클릭하고 표시되는 확인 창을 닫아 새 키를 만드세요.

    JSON 사용자 인증 정보 파일이 이제 다운로드되었습니다.

  2. 다음 변수를 내보냅니다.

    export IAP_BASE_URL=https://iap.googleapis.com/v1/projects/PROJECT_NUMBER/iap_tunnel
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
    export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  3. 다음 명령어를 실행하여 Oauth2l를 사용해서 서비스 계정 사용자 인증 정보 JSON 파일을 OAuth 액세스 토큰으로 전환합니다.

    oauth2l header --json ${JSON_CREDS} cloud-platform

  4. 위 명령어를 처음 실행할 경우 메시지가 표시되면 다음을 수행합니다.

    1. 표시된 링크를 클릭하고 코드를 복사하여 확인 코드를 가져옵니다.
    2. 확인 코드를 앱 프롬프트에 붙여넣습니다.
    3. 반환된 Bearer 토큰을 복사합니다.
    4. 반환된 Bearer 토큰의 값에 할당된 새 변수를 내보냅니다.
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  5. 이 명령어를 이전에 실행한 경우에는 다음 변수를 내보냅니다.

    export CLOUD_OAUTH_TOKEN="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

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

    curl -i -H "${CLOUD_OAUTH_TOKEN}" \
         ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:getIamPolicy \
         -d ''

  7. IAM 정책 JSON 파일을 수정하여 구성원에게 iap.tunnelResourceAccessor 역할을 부여합니다.

  8. 필요한 경우 IAM 조건액세스 수준에 따라 구성원 제한사항을 추가합니다.

    다음은 iap.tunnelResourceAccessor 역할을 VM 인스턴스 관리자 그룹에 바인딩하여 IAP 보안 터널 리소스에 대한 액세스 권한을 부여하는 수정된 policy.json 파일의 예시입니다. destination.ipdestination.port IAM 조건을 사용하여 포트 22에서 비공개 IP 주소가 10.0.0.1인 VM 인스턴스 관리자 그룹의 구성원만 리소스에 액세스할 수 있도록 IAM 조건이 추가되었습니다. 또한 ACCESS_LEVEL_NAME 액세스 수준의 요구 사항을 충족해야 합니다.

    구성원에게 소유자 역할이 있는 경우 TCP 전달에 IAP를 사용할 수 있는 권한이 있습니다.


    예시 policy.json 파일

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.tunnelResourceAccessor",
            "members": ["group:instance-admins@example.com"],
            "condition": {
              "expression": "\"accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME\" in request.auth.access_levels && destination.ip == \"10.0.0.1\" && destination.port == 22",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }

    정책 이름을 찾으려면 accessPolicies.list를 호출합니다.

    GET https://accesscontextmanager.googleapis.com/v1/accessPolicies
    
  9. setIamPolicy 메서드를 사용하여 새 policy.json 파일을 설정합니다.

    curl -i -H "Content-Type:application/json" \
              -H "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
              ${IAP_BASE_URL}/zones/ZONE_NAME/instances/INSTANCE_ID or INSTANCE_NAME:setIamPolicy \
              -d @${JSON_NEW_POLICY}
    

또는 VM별로 IAM 권한을 개별적으로 구성할 수도 있습니다.

Console

  1. IAP 관리 페이지를 열고 SSH 및 TCP 리소스 탭을 선택합니다.

    IAP 관리 페이지 열기

  2. 구성하려는 VM 인스턴스를 선택합니다.
  3. 정보 패널이 보이지 않으면 정보 패널 표시를 클릭합니다.
  4. 구성원 추가를 클릭하고 다음을 구성하세요.

    • 새 구성원: 액세스 권한을 부여할 사용자 또는 그룹을 지정합니다.
    • 역할 선택 Cloud IAP > IAP 보안 터널 사용자를 선택합니다.
  5. 필요한 경우 조건 추가을 클릭하고 구성원 제한을 구성합니다.

    • 제목: 제한 이름을 입력하세요.
    • 표현식: IAM TCP 전달을 사용하려면 사용자가 충족해야 하는 조건을 입력합니다.

    예를 들어 다음 CEL 표현식은 포트 22에 대한 액세스를 제한합니다.

    destination.port == 22
    

    액세스 수준으로 액세스를 제한할 수도 있습니다.

    destination.port == 22 && "FULL_ACCESS_LEVEL_NAME" in request.auth.access_levels
    

    FULL_ACCESS_LEVEL_NAME은 기존 액세스 수준이며 accessPolicies/POLICY_NAME/accessLevels/ACCESS_LEVEL_NAME 형식을 사용합니다.

  6. 저장을 클릭합니다.

SSH 연결 터널링

IAP를 통해 SSH 트래픽을 터널링하여 공개 IP 주소가 없는 Linux 인스턴스에 연결할 수 있습니다.

Console

인스턴스에 연결하려면 Cloud Console에서 SSH 버튼을 사용합니다. 인스턴스의 액세스 구성(IAM 권한을 통해 정의)은 IAP를 통한 TCP 터널링을 허용해야 합니다.

gcloud

인스턴스에 연결하려면 gcloud compute ssh 명령어를 사용합니다. 인스턴스의 액세스 구성(IAM 권한을 통해 정의)은 IAP를 통한 TCP 터널링을 허용해야 합니다.

gcloud compute ssh INSTANCE_NAME

INSTANCE_NAME을 SSH를 통해 연결할 인스턴스의 이름으로 바꿉니다.

인스턴스에 공개 IP 주소가 없는 경우 연결은 자동으로 IAP TCP 터널링을 사용합니다. 인스턴스에 공개 IP 주소가 있는 경우 연결은 IAP TCP 터널링 대신 공개 IP 주소를 사용합니다.

gcloud compute ssh가 항상 IAP TCP 터널링을 사용하도록 --tunnel-through-iap 플래그를 사용할 수 있습니다.

gcloud compute ssh가 IAP TCP 터널링을 사용하지 않고 VM의 내부 IP에 직접 연결하도록 --internal-ip 플래그를 사용합니다. 이렇게 하면 대상 VM과 동일한 VPC 네트워크에 연결된 클라이언트에 유용합니다.

RDP 연결 터널링

IAP를 통해 RDP 트래픽을 터널링하여 공개 IP 주소가 없는 Windows 인스턴스에 연결할 수 있습니다.

IAP 데스크톱

IAP 데스크톱을 사용하여 IAP TCP 전달을 통해 하나 이상의 VM 인스턴스의 원격 데스크톱에 연결할 수 있습니다.

  1. 애플리케이션에서 파일 > Google Cloud 프로젝트 추가를 선택합니다.

  2. 프로젝트의 ID 또는 이름을 입력하고 확인을 클릭합니다.

  3. 프로젝트 탐색기 창에서 연결하려는 VM 인스턴스를 마우스 오른쪽 단추로 클릭하고 연결을 선택합니다.

IAP 데스크톱

IAP 데스크톱에 대한 자세한 내용은 GitHub 프로젝트 페이지를 참조하세요.

gcloud

VM 인스턴스의 원격 데스크톱에 연결하려면 먼저 터널을 만듭니다.

  1. gcloud compute start-iap-tunnel 명령어를 사용하여 VM 인스턴스의 RDP 포트에 대한 암호화된 터널을 만듭니다.

    gcloud compute start-iap-tunnel INSTANCE_NAME 3389 \
        --local-host-port=localhost:LOCAL_PORT \
        --zone=ZONE
    

    INSTANCE_NAME을 연결하려는 VM 인스턴스의 이름으로 바꿉니다. LOCAL_PORT를 프록시를 결합하려는 localhost 포트로 바꾸거나 0을 사용하여 사용되지 않은 포트를 자동으로 선택합니다. ZONE을 VM 인스턴스가 있는 영역으로 바꿉니다.

  2. gcloud는 터널을 열고 포트 번호를 표시합니다.

    Listening on port [LOCAL_PORT].
    

    localhost:LOCAL_PORT로 전송된 모든 트래픽은 VM 인스턴스로 전달됩니다. 포트는 로컬 컴퓨터에서 실행 중인 애플리케이션에서만 액세스할 수 있습니다.

  3. gcloud를 실행 중인 상태로 두고 Microsoft Windows 원격 데스크톱 연결 앱을 엽니다.

  4. 컴퓨터 이름으로 터널 엔드포인트를 입력합니다.

    localhost:LOCAL_PORT
    

    LOCAL_PORT를 터널이 gcloud로 열렸을 때 표시된 포트 번호로 바꿉니다.

  5. 연결을 클릭합니다.

다른 TCP 연결 터널링

gcloud compute start-iap-tunnel 명령어를 사용하여 로컬 포트를 할당하여 다른 TCP 기반 프로토콜에 IAP TCP 전달을 사용할 수 있습니다. 로컬 포트는 HTTPS 스트림에서 로컬 머신으로부터 원격 머신으로의 데이터 트래픽을 터널링합니다. 그런 다음 IAP가 데이터를 수신하고 액세스 제어를 적용하고 래핑 해제된 데이터를 원격 포트로 전달합니다. 반대로 원격 포트의 모든 데이터도 래핑되어 로컬 포트로 전송되고 이후 래핑 해제됩니다.

gcloud

VM 인스턴스의 포트에 암호화된 터널을 만듭니다.

gcloud compute start-iap-tunnel INSTANCE_NAME INSTANCE_PORT \
    --local-host-port=localhost:LOCAL_PORT \
    --zone=ZONE

INSTANCE_NAMEINSTANCE_PORT를 연결할 VM 인스턴스의 이름과 포트로 바꿉니다. LOCAL_PORT를 프록시를 결합하려는 localhost 포트로 바꿉니다. ZONE을 VM 인스턴스가 있는 영역으로 바꿉니다.

gcloud는 터널을 열고 포트 번호를 표시합니다.

Listening on port [LOCAL_PORT].

localhost:LOCAL_PORT로 전송된 모든 트래픽은 VM 인스턴스로 전달됩니다. 포트는 로컬 컴퓨터에서 실행 중인 애플리케이션에서만 액세스할 수 있습니다.

제한 사항

대역폭: IAP의 TCP 전달 기능은 대량의 데이터 전송을 위한 것이 아닙니다. IAP는 사용자의 이 서비스 남용 방지를 위해 용량을 제한할 수 있는 권리가 있습니다.

연결 길이: 1시간 동안 활동이 없으면 IAP가 세션 연결을 자동으로 끊습니다. 연결이 끊어지는 경우 터널을 다시 설정하도록 애플리케이션에 로직을 설정하는 것이 좋습니다.

다음 단계