앱 커넥터를 사용하여 Google Cloud 이외의 애플리케이션 보호

이 페이지에서는 BeyondCorp Enterprise 앱 커넥터를 설정하고 사용하여 Google Cloud 이외의 애플리케이션을 보호하는 방법을 설명합니다.

개요

BeyondCorp Enterprise 앱 커넥터를 사용해서 Google Cloud 이외의 환경에서 실행되는 HTTPS 애플리케이션에 ID 및 컨텍스트 인식 액세스를 제공할 수 있습니다. BeyondCorp Enterprise 앱 커넥터는 BeyondCorp Enterprise 적용 영역과 기타 클라우드 및 온프레미스 환경에서 실행되는 애플리케이션 사이의 보안 인증 인터페이스입니다.

BeyondCorp Enterprise 앱 커넥터를 사용할 때는 방화벽을 열거나 사이트 간 Cloud VPN 연결을 설정할 필요가 없다는 이점이 있습니다.

아키텍처

다음은 BeyondCorp Enterprise 앱 커넥터의 기본 구성요소를 보여주는 개괄적인 아키텍처 다이어그램입니다.

BeyondCorp Enterprise 앱 커넥터 구성요소

BeyondCorp Enterprise 앱 커넥터 구성요소는 앱 커넥터, 앱 연결, 앱 게이트웨이라는 세 가지 기본 API 리소스를 사용해서 관리됩니다.

앱 커넥터
커넥터 리소스는 고유한 앱 커넥터 원격 에이전트를 정의합니다. 앱 커넥터 원격 에이전트는 다른 클라우드 및 온프레미스 환경과 같은 원격 엔터프라이즈 환경에 배포됩니다. 원격 에이전트는 Google Cloud에 대한 터널 세션을 시작 및 유지보수하고, Google Cloud에서 트래픽을 수신하고, 동일한 환경의 원격 애플리케이션 엔드포인트로 트래픽을 릴레이합니다.
앱 연결
연결 리소스는 Google Cloud에서 IP 주소:포트 또는 FQDN:포트를 사용하여 식별되는 특정 애플리케이션 엔드포인트로의 논리적 연결을 정의합니다. 연결 리소스는 지정된 애플리케이션 엔드포인트에 대해 할당된 관리형 앱 커넥터 게이트웨이 집합을 조정합니다. 게이트웨이는 Google Cloud에서 관리되고 더 이상 필요하지 않으면 원격 에이전트에서 터널 세션을 종료합니다.
앱 게이트웨이

앱 게이트웨이는 Google 관리형 서비스 제품입니다. 앱 커넥터 원격 에이전트는 앱 연결 및 앱 커넥터가 최종 사용자의 트래픽을 원격 에이전트로 릴레이할 수 있도록 허용하는 하나 이상의 게이트웨이에 연결됩니다. 동일한 앱 게이트웨이에서 호스팅되는 앱 연결에 대한 트래픽은 공통 가상 인프라를 통해 라우팅됩니다.

앱 커넥터를 사용하여 애플리케이션을 연결하면 앱 게이트웨이가 암시적으로 생성되고 관리됩니다. 앱 연결 리소스를 그룹으로 정리하려면 추가 앱 게이트웨이를 만들면 됩니다. 앱 게이트웨이는 앱 분리를 허용하기 위해 앱 연결을 그룹화하거나 분리할 수 있는 유연성을 제공합니다.

각 앱 게이트웨이는 동시 연결 수를 200,000개까지 최대 총 1Gbps를 지원할 수 있습니다. 고성능이 필요한 중요한 애플리케이션에 대해서는 전용 게이트웨이를 만드는 것이 좋습니다. 게이트웨이당 최대 10개의 앱을 할당할 수 있습니다.

최대 200,000개의 동시 연결과 총 1Gbps의 처리량을 지원하려면 8개 코어와 8GB 메모리로 구성된 전용 VM을 사용하여 앱 커넥터 원격 에이전트를 실행하는 것이 좋습니다. 예를 들어 각각 8개의 코어와 8GB의 메모리를 사용하는 HA 클러스터에 2개의 앱 커넥터 원격 에이전트를 전용으로 지정하여 전용 앱 게이트웨이(app_gateway1)가 있는 고성능 웹 애플리케이션(app1.examplecompany.com)을 지원할 수 있습니다. 각각 8개의 코어와 8GB 메모리가 있는 2개의 VM으로 구성된 다른 클러스터를 생성하여 사용량이 적은 10개의 앱과 다른 전용 애플리케이션 게이트웨이(app_gateway2)의 조합을 지원합니다.

앱 커넥터, 앱 연결, 앱 게이트웨이 리소스는 리전 리소스입니다. 리전별 컨텍스트 내에서만 사용할 수 있습니다. 예를 들어 리전 A에 있는 앱 커넥터를 리전 B에서 만든 앱 연결 또는 앱 게이트웨이에 할당할 수 없습니다.

시작하기 전에

BeyondCorp Enterprise 앱 커넥터는 HTTPS 애플리케이션에만 사용할 수 있습니다. 또한 HTTPS 부하 분산기에는 백엔드 연결에 대해 서버 이름 표시(SNI) 확장 프로그램이 사용되지 않습니다. 자세한 내용은 부하 분산기에서 백엔드로의 암호화를 참조하세요.

BeyondCorp Enterprise 앱 커넥터를 사용하려면 다음 항목이 필요합니다.

각 BeyondCorp Enterprise 앱 커넥터 에이전트는 Docker를 실행하는 Linux VM이 필요합니다. 다음 Linux 배포판이 권장됩니다.

  • Debian 10.7(buster)
  • Red Hat Enterprise Linux Server 7.8(Maipo) x86_64
  • Ubuntu 16.04 이상

Linux VM 하드웨어의 경우 최소 2개 CPU와 2GB RAM이 권장됩니다.

gcloud 및 API를 사용하거나 Google Cloud 콘솔을 사용하여 앱 커넥터를 설정하고 사용 설정할 수 있습니다. gcloud 및 API를 사용하려면 다음 단계를 완료합니다. Google Cloud 콘솔을 사용하려면 Google Cloud 콘솔을 사용하여 앱 커넥터 설정으로 이동합니다.

Google Cloud 프로젝트 설정

BeyondCorp Enterprise 앱 커넥터에 사용하도록 Google Cloud 프로젝트를 설정하려면 BeyondCorp Enterprise API를 사용 설정해야 합니다. 다음 단계를 완료하여 API를 사용 설정합니다.

gcloud CLI

다음 단계를 완료하기 전에 gcloud CLI SDK가 설치되었는지 확인합니다.

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    PROJECT_ID=my-project
    

    my-project를 Google Cloud 프로젝트 ID로 바꿉니다.

  2. 다음 명령어를 실행하여 API를 사용 설정합니다.

    gcloud config set project $PROJECT_ID
    gcloud services enable beyondcorp.googleapis.com
    

API

  1. 액세스 토큰을 가져오고 다음 명령어를 실행하여 필요한 환경 변수 및 별칭을 설정합니다.

    PROJECT_NUMBER=my-project-number
    ACCESS_TOKEN=my-access-token
    

    my-project를 Google Cloud 프로젝트 ID로 바꿉니다.

  2. 액세스 토큰을 사용하도록 편리한 별칭을 설정합니다.

    alias gcurl="curl -H 'Authorization: Bearer ${ACCESS_TOKEN}' -H 'Content-Type: application/json'"
    

  3. 다음 명령어를 실행하여 API를 사용 설정합니다.

    gcurl https://serviceusage.googleapis.com/v1/projects/${PROJECT_NUMBER}/services/beyondcorp.googleapis.com:enable -d "{}"
    

앱 커넥터 원격 에이전트 설치

BeyondCorp Enterprise로 보호하려는 애플리케이션을 호스팅하는 모든 네트워크 환경에 대해 앱 커넥터 원격 에이전트 VM을 배포해야 합니다. 만들려는 각 원격 에이전트에 대해 전용 VM 또는 Docker가 설치된 베어메탈 서버가 있어야 합니다.

원격 에이전트를 만들려면 다음 단계를 완료합니다.

  1. 애플리케이션 환경에서 VM 인스턴스를 만듭니다.
    1. 원격 에이전트 VM 네트워크 방화벽에서 IAP-TCP IP 범위 35.235.240.0/20에 대해 포트 443에서 시작된 모든 아웃바운드 트래픽이 허용되는지 확인합니다. 원격 에이전트 VM 방화벽이 아웃바운드 트래픽을 허용해야 하는 다른 도메인에 대해서는 방화벽 구성 확인을 참조하세요.
  2. 원격 에이전트를 설치합니다.

    1. curl을 사용하여 DNS가 올바르게 구성되었고 애플리케이션에 액세스할 수 있는지 확인합니다.
    2. Docker Engine을 설치합니다.
      1. (선택사항) 프록시를 사용하는 경우 Docker 데몬이 올바르게 구성되었는지 확인합니다.
    3. (선택사항) 프록시를 사용하는 경우 HTTP 및 HTTPS 프록시 환경 변수가 모두 설정되어 있고 http:// 스키마를 사용하는지 확인합니다.
    4. 원격 에이전트 VM에서 다음 명령어를 실행하여 원격 에이전트를 설치합니다.
      curl https://raw.githubusercontent.com/GoogleCloudPlatform/beyondcorp-applink/main/bash-scripts/install-beyondcorp-runtime -o ./install-beyondcorp-runtime && chmod +x ./install-beyondcorp-runtime && ./install-beyondcorp-runtime
      
    5. 셸에 bce-connctl 별칭을 추가하려면 다음 명령어를 실행합니다.
       source ~/.bce_alias
       
    6. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

      PROJECT_ID=my-project
      REGION=us-central1
      CONNECTOR_NAME=my-connector
      
      다음을 바꿉니다.

      • my-project: Google Cloud 프로젝트 ID
      • us-central1: 연결 및 게이트웨이를 배포할 리전
      • my-connector: 커넥터의 이름.
    7. 다음 사용자 인증 정보 유형 중 하나를 사용하여 커넥터를 등록합니다.

    서비스 계정

    1. bce-connctl CLI에서 다음 명령어를 실행하여 커넥터를 등록합니다.

      bce-connctl init --project=$PROJECT_ID --region=$REGION --connector=$CONNECTOR_NAME
      

    2. 화면에 표시된 안내에 따라 Cloud Shell 또는 gcloud CLI를 사용하여 등록 스크립트를 Google Cloud 프로젝트에 복사하여 붙여넣고 커넥터 등록을 완료합니다. 등록 스크립트를 실행하려면 프로젝트에 대해 Owner 권한이 있어야 합니다.

      등록 스크립트가 완료되었으면 런타임에 커넥터 구성이 자동으로 동기화됩니다.

    제휴 ID

    1. 워크로드 아이덴티티 제휴 가이드에 따라 서비스 계정 가장을 사용하여 Google Cloud에 대한 외부 ID 액세스 권한을 부여합니다.
    2. 클라이언트 라이브러리 구성을 다운로드하고 /var/beyondcorp/credentials/credentials.json의 원격 에이전트 VM에 파일을 배치합니다.
      1. AWS EC2 인스턴스를 원격 에이전트 VM으로 사용하는 경우 다음 중 하나를 수행합니다.
        1. EC2 인스턴스에서 IMDSv2를 선택사항으로 만듭니다.
        2. 클라이언트 라이브러리 구성 파일에서 credential_source 객체에 다음 줄을 추가합니다.
          "imdsv2_session_token_url": "http://169.254.169.254/latest/api/token"
          
    3. 원격 에이전트 VM의 bce-connctl CLI에서 다음 명령어를 실행합니다.
      bce-connctl config set project $PROJECT_ID
      bce-connctl config set region $REGION
      bce-connctl config set connector $CONNECTOR_NAME
      
    4. 다음 명령어를 실행하여 에이전트를 다시 시작하고 사용자 인증 정보를 가져옵니다.
      sudo systemctl restart beyondcorp
      
    5. Cloud Shell 또는 gcloud CLI 엔드포인트에서 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.
      SERVICE_ACCOUNT=my-service-account
      
      다음을 바꿉니다.
      • my-service-account: 외부 ID와 연결된 Google Cloud 서비스 계정.
    6. 다음 명령어를 실행하여 Google Cloud 서비스 계정에 BeyondCorp Connection Agent 역할을 부여합니다.

      gcloud projects add-iam-policy-binding $PROJECT_ID \
          --member="serviceAccount:$SERVICE_ACCOUNT" \
          --role="roles/beyondcorp.connectionAgent"
      
    7. 다음 명령어를 실행하여 Google Cloud 앱 커넥터 리소스를 만듭니다.

      gcloud alpha beyondcorp app connectors create $CONNECTOR_NAME \
          --project=$PROJECT_ID \
          --location=$REGION \
          --member="serviceAccount:$SERVICE_ACCOUNT" \
          --display-name=$CONNECTOR_NAME
      

      앱 커넥터 리소스가 생성되면 원격 에이전트 런타임에서 커넥터 구성을 자동으로 동기화합니다.

  3. 원격 에이전트 설치를 확인합니다.

    1. 다음 명령어를 실행하여 서비스가 실행 중인지 확인합니다.
      sudo systemctl status beyondcorp
      
    2. 원격 에이전트는 3개의 Docker 컨테이너인 bce-control-runtime, bce-logagent, bce-connector로 구성됩니다. 다음 명령어를 실행하여 컨테이너 3개가 모두 실행되는지 확인합니다.
      docker ps --filter name=bce
      
    3. (선택사항) 다음 명령어를 실행하여 Docker 컨테이너 로그 파일을 확인할 수 있습니다.
      docker logs -f CONTAINER_NAME
      
      CONTAINER_NAME을 Docker 컨테이너 이름으로 바꿉니다.

VPC에 원격 애플리케이션 연결

gcloud CLI

다음 단계를 완료하기 전 gcloud CLI SDK가 설치되었고 beyondcorp.admin 역할이 있는 계정으로 로그인되었는지 확인합니다.

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    PROJECT_ID=my-project
    REGION=us-central1
    APP_ENDPOINT=APP_HOST:APP_PORT
    

    다음을 바꿉니다.

    • my-connector: 이전 단계에서 정의된 커넥터의 이름
    • my-connection: 연결의 고유 이름
    • my-project: Google Cloud 프로젝트 ID
    • us-central1: 연결 및 게이트웨이를 배포할 리전
    • APP_HOST: 애플리케이션을 호스팅하는 온프레미스 IP 주소 또는 FQDN
    • APP_PORT: 애플리케이션에 연결할 포트 번호
  2. 애플리케이션과 VPC 사이의 연결을 만들려면 다음 명령어를 실행합니다.

    gcloud alpha beyondcorp app connections create $CONNECTION_NAME \
        --project=$PROJECT_ID \
        --location=$REGION \
        --application-endpoint=$APP_ENDPOINT \
        --type=tcp \
        --connectors=$CONNECTOR_NAME \
        --display-name=$CONNECTION_NAME
    

    이 단계는 완료하는 데 몇 분이 소요될 수 있습니다.

  3. 연결을 만든 후 다음 명령어를 실행하여 게이트웨이 URI를 검색합니다.

    GATEWAY_URI="$(gcloud alpha beyondcorp app connections describe $CONNECTION_NAME --project=$PROJECT_ID --location=$REGION --format='get(gateway.uri)')"
    GATEWAY_URI_L7="${GATEWAY_URI/bce-psc/bce-ps7}"
    

    GATEWAY_URI_L7은 전달 규칙을 만드는 데 사용됩니다. BeyondCorp Enterprise 앱 커넥터는 Private Service Connect를 사용해서 소비자 프로젝트를 Google 관리형 프로젝트의 관리형 리소스에 연결합니다.

API

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    PROJECT_ID=my-project
    REGION=us-central1
    APP_HOST=my-app-host
    APP_PORT=my-app-port
    

    다음을 바꿉니다.

    • my-connector: 이전 단계에서 정의된 커넥터의 이름
    • my-connection: 연결의 고유 이름
    • my-project: Google Cloud 프로젝트 ID
    • us-central1: 연결 및 게이트웨이를 배포할 리전
    • my-app-host: 애플리케이션을 호스팅하는 온프레미스 IP 주소 또는 FQDN
    • my-app-port: 애플리케이션에 연결할 포트 번호
  2. 애플리케이션과 VPC 사이의 연결을 만들려면 다음 명령어를 실행합니다.

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_NUMBER}/locations/${REGION}/appConnections?app_connection_id=${CONNECTION_NAME} \
    -d "{ \
        'application_endpoint': \
        { \
            'host': '${APP_HOST}', \
            'port': '${APP_PORT}' \
        }, \
        'type': 'TCP_PROXY', \
        'display_name': '${CONNECTION_NAME}' \
    }"
    

    이 단계는 완료하는 데 몇 분이 소요될 수 있습니다.

  3. 연결을 만든 후 다음 명령어를 실행하여 게이트웨이 URI를 검색합니다.

    GATEWAY_URI=$(gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_NUMBER}/locations/${REGION}/appConnections/${CONNECTION_NAME} | jq -r '.gateway.uri')
    GATEWAY_URI_L7="${GATEWAY_URI/bce-psc/'bce-ps7'}"
    

    GATEWAY_URI_L7은 전달 규칙을 만드는 데 사용됩니다. BeyondCorp Enterprise 앱 커넥터는 Private Service Connect를 사용해서 소비자 프로젝트를 Google 관리형 프로젝트의 관리형 리소스에 연결합니다.

외부 애플리케이션 부하 분산기 구성

HTTPS 애플리케이션만 외부 애플리케이션 부하 분산기에 연결할 수 있습니다. HTTP 애플리케이션은 지원되지 않습니다.

gcloud CLI

다음 단계를 완료하기 전 gcloud CLI SDK가 설치되었고 beyondcorp.admin 역할이 있는 계정으로 로그인되었는지 확인합니다.

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    LB_PREFIX=web-app
    PROJECT_ID=my-project
    REGION=us-central1
    DOMAIN_NAME=app.example.com
    
    다음을 바꿉니다.

    • web-app: 모든 부하 분산기 리소스의 이름에 붙여 있는 프리픽스
    • my-project: Google Cloud 프로젝트 ID
    • us-central1: 연결 및 게이트웨이를 배포할 리전
    • app.example.com: 애플리케이션의 도메인 이름
  2. 다음 명령어를 사용하여 Network Endpoint Group(NEG)을 만듭니다.

    gcloud beta compute network-endpoint-groups create $LB_PREFIX-neg \
        --region=$REGION \
        --network-endpoint-type=private-service-connect \
        --psc-target-service=$GATEWAY_URI_L7
    

    선택적 플래그:

    • NEG에서 네트워크 엔드포인트에 대해 네트워크 이름을 지정하도록 --network 플래그를 설정합니다. 지정하지 않으면 기본 프로젝트 네트워크가 사용됩니다.
    • NEG에서 네트워크 엔드포인트에 대해 서브네트워크 이름을 지정하도록 --subnet 플래그를 설정합니다. 지정하지 않으면 네트워크 엔드포인트는 네트워크 엔드포인트 그룹이 생성된 리전의 모든 서브네트워크에 포함될 수 있습니다.
  3. NEG 기반 백엔드 서비스를 만들고 다음 명령어를 실행해서 이를 Private Service Connect 서비스 첨부파일에 연결합니다.

    gcloud beta compute backend-services create $LB_PREFIX-backend-service \
        --global \
        --protocol=HTTPS \
        --load-balancing-scheme=EXTERNAL_MANAGED
    
    gcloud beta compute backend-services add-backend $LB_PREFIX-backend-service \
        --global \
        --network-endpoint-group=$LB_PREFIX-neg \
        --network-endpoint-group-region=$REGION
    
  4. 다음 명령어를 실행하여 도메인에 대해 Google 관리형 인증서를 만듭니다.

    gcloud compute addresses create $LB_PREFIX-static-ip \
        --ip-version=IPV4 \
        --global
    gcloud compute ssl-certificates create $LB_PREFIX-ssl-cert \
        --domains=$DOMAIN_NAME \
        --global
    
    LB_IP="$(gcloud compute addresses describe $LB_PREFIX-static-ip --global --format='value(address)')"
    
  5. 다음 명령어를 실행하여 이전 단계의 백엔드를 기준으로 외부 애플리케이션 부하 분산기를 만듭니다.

    gcloud compute url-maps create $LB_PREFIX-map-https \
        --default-service=$LB_PREFIX-backend-service
    
    gcloud compute target-https-proxies create $LB_PREFIX-https-lb-proxy \
        --url-map=$LB_PREFIX-map-https \
        --ssl-certificates=$LB_PREFIX-ssl-cert
    
    gcloud beta compute forwarding-rules create "$LB_PREFIX-https-lb-forwarding-rule" \
        --global \
        --target-https-proxy=$LB_PREFIX-https-lb-proxy \
        --address=$LB_IP \
        --ports=443 \
        --load-balancing-scheme=EXTERNAL_MANAGED
    

    외부 애플리케이션 부하 분산기가 생성된 후 해당 IP 주소로 인터넷을 통해 애플리케이션에 액세스할 수 있습니다.

  6. 외부 애플리케이션 부하 분산기가 생성된 후에는 Google Cloud가 SSL 인증서를 프로비저닝할 수 있도록 해당 IP 주소를 도메인 이름과 연결해야 합니다. IP 주소를 DNS 이름과 연결하는 방법은 DNS 제공업체 안내를 참조하세요. 다음 명령어를 실행하여 프로비저닝 상태를 확인합니다.

    1. DNS 제공업체에서 설정할 IP 주소를 표시합니다.
      echo "Load Balancer ip address - $LB_IP"
      
    2. DNS를 설정한 후 다음 명령어를 실행하여 도메인 이름이 IP 주소로 확인되는지 여부를 확인합니다.
      dig $DOMAIN_NAME
      
    3. 다음 명령어를 실행하여 프로비저닝 상태를 확인합니다.
    gcloud compute ssl-certificates describe $LB_PREFIX-ssl-cert \
        --global \
        --format="get(name,managed.status, managed.domainStatus)"
    

    SSL 인증서가 프로비저닝된 다음에는 DNS 이름을 사용해서 애플리케이션에 액세스할 수 있어야 합니다.

API

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    LB_PREFIX=web-app
    PROJECT_ID=my-project
    REGION=us-central1
    DOMAIN_NAME=app.example.com
    
    다음을 바꿉니다.

    • web-app: 모든 부하 분산기 리소스의 이름에 붙여 있는 프리픽스
    • my-project: Google Cloud 프로젝트 ID
    • us-central1: 연결 및 게이트웨이를 배포할 리전
    • app.example.com: 애플리케이션의 도메인 이름
  2. 다음 명령어를 사용하여 Network Endpoint Group(NEG)을 만듭니다.

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/regions/${REGION}/networkEndpointGroups \
    -d "{ \
        'name': '${LB_PREFIX}-neg', \
        'network_endpoint_type': 'private-service-connect', \
        'psc_target_service': '${GATEWAY_URI_L7}' \
    }"
    

    선택적 필드:

    • NEG에서 네트워크 엔드포인트에 대해 네트워크 URL을 지정하도록 network 필드를 설정합니다. 지정하지 않으면 기본 프로젝트 네트워크가 사용됩니다.
    • NEG에서 네트워크 엔드포인트에 대해 서브네트워크의 URL을 지정하도록 subnetwork 필드를 설정합니다. 지정하지 않으면 네트워크 엔드포인트는 네트워크 엔드포인트 그룹이 생성된 리전의 모든 서브네트워크에 포함될 수 있습니다.
  3. NEG 기반 백엔드 서비스를 만들고 다음 명령어를 실행해서 이를 Private Service Connect 서비스 첨부파일에 연결합니다.

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices \
    -d "{ \
        'name': '${LB_PREFIX}-backend-service', \
        'service_protocol': 'HTTPS', \
        'port_name': 'https', \
        'load_balancing_scheme': 'EXTERNAL_MANAGED' \
    }"
    
    gcurl -X PATCH https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices/${LB_PREFIX}-backend-service \
    -d "{ \
        'backends': \
        [{ \
            'group': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/regions/${REGION}/networkEndpointGroups/${LB_PREFIX}-neg' \
        }] \
    }"
    
  4. 다음 명령어를 실행하여 도메인에 대해 Google 관리형 인증서를 만듭니다.

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/addresses \
    -d "{ \
        'name': '${LB_PREFIX}-static-ip', \
        'ip_version': 'IPV4' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates \
    -d "{ \
        'name': '${LB_PREFIX}-ssl-cert', \
        'managed': \
        { \
            'domains': '${DOMAIN_NAME}' \
        }, \
        'type': 'MANAGED' \
    }"
    
    LB_IP=$(gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/addresses/${LB_PREFIX}-static-ip | jq -r '.address')
    
  5. 다음 명령어를 실행하여 이전 단계의 백엔드를 기준으로 외부 애플리케이션 부하 분산기를 만듭니다.

    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/urlMaps \
    -d "{ \
        'name': '${LB_PREFIX}-map-https', \
        'default_service': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/backendServices/${LB_PREFIX}-backend-service' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/targetHttpsProxies \
    -d "{ \
        'name': '${LB_PREFIX}-https-lb-proxy', \
        'url_map': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/urlMaps/${LB_PREFIX}-map-https', \
        'ssl_certificate': 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates/${LB_PREFIX}-ssl-cert' \
    }"
    
    gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/forwardingRules \
    -d "{ \
        'name': '${LB_PREFIX}-https-lb-forwarding-rule', \
        target: 'https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/targetHttpsProxies/${LB_PREFIX}-https-lb-proxy', \
        'ip_address': '${LB_IP}', \
        'port_range': '443-443', \
        'load_balancing_scheme': 'EXTERNAL_MANAGED' \
    }"
    

    외부 애플리케이션 부하 분산기가 생성된 후 해당 IP 주소로 인터넷을 통해 애플리케이션에 액세스할 수 있습니다.

  6. 외부 애플리케이션 부하 분산기가 생성된 후에는 Google Cloud가 SSL 인증서를 프로비저닝할 수 있도록 해당 IP 주소를 도메인 이름과 연결해야 합니다. IP 주소를 DNS 이름과 연결하는 방법은 DNS 제공업체 안내를 참조하세요. 다음 명령어를 실행하여 프로비저닝 상태를 확인합니다.

    1. DNS 제공업체에서 설정할 IP 주소를 표시합니다.
      echo "Load Balancer ip address - $LB_IP"
      
    2. DNS를 설정한 후 다음 명령어를 실행하여 도메인 이름이 IP 주소로 확인되는지 여부를 확인합니다.
      dig $DOMAIN_NAME
      
    3. 다음 명령어를 실행하여 프로비저닝 상태를 확인합니다.
    echo $(gcurl https://www.googleapis.com/compute/v1/projects/${PROJECT_NUMBER}/global/sslCertificates/${LB_PREFIX}-ssl-cert \
    | jq -r '.name + " " + .managed.status + " " + (.managed.domainStatus | keys[]) + "=" + .managed.domainStatus[]')
    

    SSL 인증서가 프로비저닝된 다음에는 DNS 이름을 사용해서 애플리케이션에 액세스할 수 있어야 합니다.

IAP(Identity-Aware Proxy) 사용 설정

IAP(Identity-Aware Proxy) 설정에 대해서는 IAP(Identity-Aware Proxy) 문서를 참조하세요. IAP를 설정한 후 다음 단계를 완료하여 백엔드 서비스에 대해 IAP를 사용 설정합니다.

  1. IAP 페이지로 이동합니다.
    IAP

  2. HTTPS 리소스에서 $LB_PREFIX-backend-service를 찾습니다. 이 리소스에 대해 IAP를 사용 설정하려면 IAP 열에서 전환을 클릭합니다. 표시되는 IAP 사용 창에서 체크박스를 선택하여 이 리소스의 구성 요구사항을 확인하고 사용을 클릭하여 IAP를 사용하여 리소스를 보호할지 확인합니다.

  3. 사용자가 애플리케이션에 액세스하도록 허용하려면 다음 단계를 수행하여 프로젝트에 대해 IAP 보안 웹앱 사용 역할을 부여해야 합니다.

    1. $LB_PREFIX-backend-service 체크박스를 선택합니다.
    2. 정보 패널에서 주 구성원 추가를 선택한 후 애플리케이션에 액세스해야 하는 그룹 또는 개별 사용자의 이메일 주소를 입력합니다.
    3. 역할 선택 드롭다운 목록에서 Cloud IAP > IAP 보안 웹앱 사용자를 선택한 후 저장을 클릭합니다.

이제 온프레미스 애플리케이션이 인터넷에 게시되고 BeyondCorp Enterprise로 보호됩니다.

Google Cloud 콘솔을 사용하여 앱 커넥터 설정

이 섹션의 절차에 따라 Google Cloud 콘솔을 사용하여 BeyondCorp Enterprise 앱 커넥터를 배포합니다.

애플리케이션 세부정보 입력

다음 단계를 완료하여 애플리케이션 세부정보를 추가합니다.

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

  2. 새 애플리케이션 연결 버튼을 클릭한 후 앱 커넥터를 통해 연결을 선택합니다.

  3. 애플리케이션 이름에 보호하려는 애플리케이션 이름을 입력합니다.

  4. 외부 공개 애플리케이션 URL에 사용자가 애플리케이션에 액세스할 수 있는 공개 액세스 가능한 URL을 입력합니다.

  5. 다음을 클릭합니다.

Google Cloud 연결 설정

다음 단계를 수행하여 Google Cloud 환경과 Google Cloud 이외의 환경 사이에 연결을 설정합니다.

  1. 앱 커넥터 만들기 버튼을 클릭하고 다음 정보를 입력합니다.

    • 앱 커넥터 이름: 커넥터의 이름입니다.
    • 리전: 연결 게이트웨이 및 커넥터를 배포할 리전입니다.
  2. 만들기 버튼을 클릭합니다.

  3. 가상 머신 프로비저닝 창의 안내에 따라 VM에 원격 에이전트를 배포합니다.

  4. 연결 상태 테스트 버튼을 클릭하여 연결을 테스트합니다.

  5. Google Cloud에서 애플리케이션을 찾을 수 있는 위치는 어디인가요?에 다음 정보를 입력하여 이전 단계에서 만든 커넥터를 구성합니다.

    • 내부 호스트 이름: 애플리케이션을 호스팅하는 온프레미스 IP 주소 또는 FQDN입니다.
    • 포트: 애플리케이션에 연결할 포트 번호입니다.

애플리케이션에 대한 액세스 권한 부여(선택사항)

  1. 새 주 구성원에 다음 중 하나 이상을 입력합니다.

    • Google 계정 이메일: user@gmail.com
    • Google 그룹: admins@googlegroups.com
    • 서비스 계정: server@example.gserviceaccount.com
    • Google Workspace 도메인: example.com
    • 모든 사람: 모든 사용자에게 액세스 권한을 부여하려면 allUsers를 입력합니다.
    • 모든 Google 계정: Google 계정에 로그인한 모든 사용자에게 액세스 권한을 부여하려면 allAuthenticatedUsers를 입력합니다.
  2. 액세스 수준을 하나 이상 선택한 후 다음을 클릭합니다.

애플리케이션 게시

  1. 애플리케이션을 게시하려면 안전하게 애플리케이션 게시 버튼을 클릭합니다.

  2. 애플리케이션을 게시한 후 안전하게 게시된 애플리케이션 확인이 표시되면 외부 공개 애플리케이션 URL이 프록시의 IP 주소를 가리키도록 DNS 레코드를 만들어야 합니다. 다음 단계를 완료하세요.

    • 2단계 - DNS 업데이트 섹션의 IP 주소 필드에서 IP 주소를 복사합니다. IP 주소를 DNS 이름과 연결하는 방법에 대한 DNS 제공업체 안내에 따라 주소를 사용하여 DNS 레코드를 만듭니다.
  3. DNS 레코드를 만든 후 테스트 버튼을 클릭하여 테스트합니다. DNS 테스트를 통과했습니다. 확인이 표시됩니다.

  4. 완료를 클릭합니다.

IAP 사용 설정

  1. IAP 페이지로 이동합니다.
    IAP로 이동

  2. 리소스 목록에서 애플리케이션을 찾은 후 IAP 열에서 버튼을 선택합니다.

  3. 표시된 IAP 사용 대화상자에서 구성 요구사항을 읽고 문서에 따라 백엔드 서비스를 구성했습니다. 체크박스를 선택한 후 사용을 클릭합니다.

이제 온프레미스 애플리케이션이 인터넷에 게시되고 BeyondCorp Enterprise로 보호됩니다.

앱 게이트웨이 만들기(선택사항)

앱 게이트웨이를 사용하여 애플리케이션을 연결할 때 앱 게이트웨이는 암시적으로 생성되고 관리됩니다. 또한 앱 연결 리소스를 그룹으로 구성하기 위해 자체 앱 게이트웨이를 만들 수 있습니다. 서로 다른 앱 게이트웨이에서 호스팅되는 앱 연결에 대한 트래픽은 별도의 가상 인프라를 통해 라우팅됩니다.

앱 게이트웨이를 만들고 지정하려면 다음 단계를 완료합니다.

gcloud CLI

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    CONNECTOR_NAME=CONNECTOR_NAME
    CONNECTION_NAME=CONNECTION_NAME
    GATEWAY_NAME=GATEWAY_NAME
    PROJECT_ID=PROJECT_ID
    REGION=REGION
    APP_ENDPOINT=APP_HOST:APP_PORT
    

    다음을 바꿉니다.

    • CONNECTOR_NAME: 이전 단계에서 정의된 커넥터의 이름
    • CONNECTION_NAME: 연결의 고유 이름
    • GATEWAY_NAME: 앱 게이트웨이의 이름
    • PROJECT_ID: Google Cloud 프로젝트 ID
    • REGION: 앱 게이트웨이를 배포할 리전(예: us-central1)
    • APP_HOST: 애플리케이션을 호스팅하는 온프레미스 IP 주소 또는 FQDN
    • APP_PORT: 애플리케이션에 연결할 포트 번호
  2. 다음 명령어를 실행하여 앱 게이트웨이를 만듭니다.

    gcloud beta beyondcorp app gateways create $GATEWAY_NAME \
    --project=$PROJECT_ID --location=$REGION --display-name=$GATEWAY_NAME
    
  3. 다음 명령어를 실행하여 연결 만들기 호출에서 앱 게이트웨이를 지정합니다.

    gcloud beta beyondcorp app connections create $CONNECTION_NAME \
    --project=$PROJECT_ID \
    --location=$REGION \
    --application-endpoint=$APP_ENDPOINT \
    --type=tcp \
    --connectors=$CONNECTOR_NAME \
    --display-name=$CONNECTION_NAME \
    --app-gateway=$GATEWAY_NAME
    

API

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    CONNECTOR_NAME=CONNECTOR_NAME
    CONNECTION_NAME=CONNECTION_NAME
    GATEWAY_NAME=GATEWAY_NAME
    PROJECT_ID=PROJECT_ID
    REGION=REGION
    APP_ENDPOINT=APP_HOST:APP_PORT
    

    다음을 바꿉니다.

    • CONNECTOR_NAME: 이전 단계에서 정의된 커넥터의 이름
    • CONNECTION_NAME: 연결의 고유 이름
    • GATEWAY_NAME: 앱 게이트웨이의 이름
    • PROJECT_ID: Google Cloud 프로젝트 ID
    • REGION: 앱 게이트웨이를 배포할 리전(예: us-central1)
    • APP_HOST: 애플리케이션을 호스팅하는 온프레미스 IP 주소 또는 FQDN
    • APP_PORT: 애플리케이션에 연결할 포트 번호
  2. 다음 명령어를 실행하여 앱 게이트웨이를 만듭니다.

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appGateways?app_gateway_id=${GATEWAY_NAME} \
    -d "{ \
    'type': 'TCP_PROXY', \
    'display_name': '${CONNECTION_NAME}' \
    }"
    
  3. 다음 명령어를 실행하여 연결 만들기 호출에서 앱 게이트웨이를 지정합니다.

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections?app_connection_id=${CONNECTION_NAME} \
    -d "{ \
    'application_endpoint': \
    { \
    'host': '${APP_HOST}', \
    'port': '${APP_PORT}' \
    }, \
    'gateway': { 'app_gateway' : 'projects/${PROJECT_ID}/locations/${REGION}/appGateways/${GATEWAY_NAME}'}, \
    'connectors':['projects/${PROJECT_ID}/locations/${REGION}/appConnectors/${CONNECTOR_NAME}'], \
    'type': 'TCP_PROXY', \
    'display_name': '${CONNECTION_NAME}' \
    

다음 단계

문제 해결

이전에 만든 리소스를 찾을 수 없음

gcloud CLI 버전 392.0.0 이상을 사용하는 경우 새로운 앱 커넥터 기본 리소스인 AppConnectorAppConnection을 사용합니다. 예를 들어 gcloud alpha beyondcorp app connectorsgcloud alpha beyondcorp app connections 모두 새 리소스를 나타냅니다.

392.0.0 버전 이전의 gcloud CLI 버전을 사용하여 생성된 레거시 리소스에 액세스하는 경우 legacy 키워드를 사용합니다. 예를 들어 gcloud alpha beyondcorp app legacy connectorsgcloud alpha beyondcorp app legacy connections 모두 레거시 리소스를 나타냅니다.

레거시 리소스를 사용하는 구성도 현재는 계속 작동하지만 이후에 지원이 중단됩니다.

  • 이 가이드의 절차에 따라 새 리소스를 구성합니다.
  • 구성에 레거시 리소스가 사용되는 경우 legacy 키워드를 사용하여 해당 리소스를 찾아 삭제합니다. 이 문서의 절차를 따라 리소스를 다시 만듭니다.
  • 레거시 리소스를 사용하는 불완전한 구성이 있는 경우 legacy 키워드를 사용해서 해당 리소스를 찾아 삭제합니다. 이 문서의 절차를 따라 리소스를 다시 만듭니다.

TLS/SSL 오류

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

브라우저에 ERR_SSL_VERSION_OR_CIPHER_MISMATCH 오류 또는 비슷한 TLS/SSL 오류가 표시되고 로그인 페이지로 리디렉션되지 않습니다.

  • Google Cloud 부하 분산기 세부정보 페이지에서 인증서 상태를 확인합니다.

    참고: Google 관리형 인증서를 프로비저닝하는 데 최대 60분이 걸릴 수 있습니다.

TLS error

로그인 페이지로 리디렉션한 후 브라우저에 upstream connect error or disconnect/reset before headers. retried and the latest reset reason: connection failure, transport failure reason: TLS error 오류 또는 비슷한 TLS/SSL 오류가 표시됩니다.

  • 연결에 사용된 애플리케이션 엔드포인트가 HTTPS인지 확인합니다.
  • curl을 사용하여 원격 에이전트 VM에서 앱 엔드포인트에 액세스할 수 있는지 확인합니다.

    curl https://$APP_ENDPOINT
    

    애플리케이션 인증서가 자체 서명된 경우 -k 플래그를 사용해야 할 수 있습니다.

방화벽 구성 확인

원격 에이전트와 인터넷 사이의 방화벽이 다음 도메인에 대한 아웃바운드 연결을 허용하는지 확인합니다.

연결 유형 도메인 포트
TCP raw.githubusercontent.com 443
TCP gcr.io 443
TCP *.googleapis.com 443
TCP tunnel.cloudproxy.app 443
TCP *.tunnel.cloudproxy.app 443
TCP accounts.google.com 443
TCP oauth2.googleapis.com 443

연결과 관련된 커넥터 변경

gcloud

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    REGION=us-central1
    PROJECT_ID=my-project
    

    다음을 바꿉니다.

    • my-connector: 커넥터의 이름. connector1,connector2처럼 쉼표로 구분된 목록일 수도 있습니다.
    • my-connection: 업데이트할 연결의 이름
    • us-central1: 연결이 배포되는 리전
    • my-project: Google Cloud 프로젝트 ID
  2. 연결과 관련된 커넥터를 변경하려면 다음 명령어를 실행하세요.

    gcloud alpha beyondcorp app connections update $CONNECTION_NAME \
        --project=$PROJECT_ID \
        --location=$REGION \
        --connectors=$CONNECTOR_NAME
    

API

  1. 다음 명령어를 실행하여 필요한 환경 변수를 설정합니다.

    CONNECTOR_NAME=my-connector
    CONNECTION_NAME=my-connection
    REGION=us-central1
    PROJECT_ID=my-project
    

    다음을 바꿉니다.

    • my-connector: 커넥터의 이름.
    • my-connection: 업데이트할 연결의 이름
    • us-central1: 연결이 배포되는 리전
    • my-project: Google Cloud 프로젝트 ID
  2. 연결과 관련된 커넥터를 변경하려면 다음 명령어를 실행하세요.

    gcurl -X PATCH \
    https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections/${CONNECTION_NAME}?update_mask=connectors \
    -d "{ \
        'connectors': ['projects/${PROJECT_ID}/locations/${REGION}/appConnectors/${CONNECTOR_NAME}'], \
    }"
    

    다음 명령어를 실행하고 출력의 connectors 필드를 확인하여 업데이트를 확인할 수 있습니다.

    gcurl https://beyondcorp.googleapis.com/v1/projects/${PROJECT_ID}/locations/${REGION}/appConnections/${CONNECTION_NAME}
    

프록시

프록시 지원은 2024년 초에 도입되었으며 BeyondCorp systemd 파일을 변경해야 합니다. 이 시간보다 이전에 원격 에이전트를 설치했고 프록시를 사용하려면 원격 에이전트를 다시 설치합니다.

  • Docker 데몬이 프록시를 사용하도록 올바르게 구성되었는지 확인하세요.

  • HTTP 및 HTTPS 프록시 환경 변수가 모두 설정되어 있고 둘 다 http:// 스키마를 사용하고 있는지 확인합니다. https:// 스키마와 기타 스키마는 지원되지 않습니다.

  • env 명령어를 실행하여 프록시 환경 변수가 하위 프로세스로 내보내졌는지 확인합니다.

  • HTTP_PROXY, HTTPS_PROXY, NO_PROXY 및 이에 상응하는 소문자만 지원됩니다.

  • 설치 후 프록시 설정을 업데이트해야 하는 경우 기본 beyondcorp 사용자를 사용하는 경우 /var/beyondcorp/env/PROXY에서 환경 변수를 업데이트합니다. 커스텀 사용자를 사용하는 경우 Docker 클라이언트 구성 지침에 따라 /home/$USER/.docker/config.json을 업데이트합니다. 프록시 변경사항을 적용하려면 다음 명령어를 사용하여 원격 에이전트를 다시 시작합니다.

    sudo systemctl restart beyondcorp
    

진단 도구

run-post-install-checks

run-post-install-checks는 원격 에이전트가 올바르게 설치 및 등록되었고 정상 상태인지 확인하는 /var/beyondcorp/scripts/에 설치된 스크립트입니다. app connection을 성공적으로 만들고 이를 원격 에이전트(커넥터)에 할당한 후 원격 에이전트 VM으로 이동하고 다음 명령어를 사용하여 run-post-install-checks를 실행합니다.

sudo /var/beyondcorp/scripts/run-post-install-checks

모든 것이 정상이면 스크립트가 성공 메시지를 출력합니다.

run-diagnostics

run-diagnostics는 원격 에이전트 VM에서 일반적인 문제를 진단하고 BeyondCorp Enterprise 지원팀과 공유할 수 있는 보고서를 출력하는 /var/beyondcorp/scripts/에 설치된 스크립트입니다. 이 진단 스크립트를 실행하려면 다음 명령어를 실행합니다.

sudo /var/beyondcorp/scripts/run-diagnostics

진단 보고서는 콘솔 외에도 ./diagnostics-report.txt에 기록됩니다.

원격 에이전트 CLI

bce-connctl은 원격 에이전트와 로컬로 상호작용하기 위한 원격 에이전트 관리자 명령줄 인터페이스(CLI)입니다. 이 CLI는 원격 에이전트 등록, 상태 확인, 구성 값 설정 등의 여러 명령어를 지원합니다.

Init 명령어

Init 명령어를 사용하여 원격 에이전트를 초기화하고 에이전트 등록 스크립트를 생성할 수 있습니다.

예를 들면 다음과 같습니다.

bce-connctl init --project=$PROJECT_ID --region=$REGION --connector=$CONNECTOR_NAME

상태 명령어

상태 명령어를 사용하여 원격 에이전트의 상태를 관리할 수 있습니다.

  • List: 이 명령어를 사용하여 원격 에이전트 상태 및 이 에이전트에서 지원되는 연결 상태를 나열합니다. 예를 들면 bce-connctl status list입니다.

구성 명령어

구성 명령어를 사용하여 원격 에이전트의 구성 값을 관리할 수 있습니다.

  • List: 이 명령어를 사용하여 원격 에이전트의 구성 값을 나열합니다. 예를 들면 bce-connctl config list입니다.
  • Set: 이 명령어를 사용하여 원격 에이전트의 구성 값을 설정합니다. 예를 들면 bce-connctl config set <key> <value>입니다.

등록 명령어

등록 명령어를 사용하여 원격 에이전트 등록을 관리할 수 있습니다.

  • Describe: 이 명령어를 사용하여 원격 에이전트의 등록 상태를 가져옵니다. 예를 들면 bce-connctl enrollment describe입니다.

    bce-connctl init의 등록 스크립트가 성공적으로 완료되고 공개 키가 성공적으로 업로드되면 상태가 ENROLLED입니다.

도움말

bce-connctl 명령어에 -h 또는 --help 플래그를 추가하여 사용량 정보를 출력할 수 있습니다.

bce-connctl init -h