SSH ProxyCommand

SSH ProxyCommand

Boundary를 사용하면 SSH ProxyCommand 옵션으로 대상에 대한 SSH 연결을 프록시할 수 있어요. 그래서 boundary connect ssh를 직접 실행하는 대신 ssh <target>을 실행할 수 있죠. .ssh/ssh_config를 구성해서 대상을 ID나 도메인으로 참조할 수 있어요.

출처: HashiCorp Boundary docs

본문

대상에 연결하는 다른 방법은 연결 워크플로우을 참고하세요.

대상 ID로 호스트 구성하기

  • .ssh/ssh_config에 대상 ID와 일치하는 Host 항목을 추가해요.
  • boundary connect를 -exec nc 플래그로 호출하고 {{boundary.ip}}와 {{boundary.port}}를 nc에 전달하도록 ProxyCommand를 설정해요.
  • ssh <target-id>를 실행해서 세션을 시작해요.

SSH ProxyCommand를 사용하려면 .ssh/ssh_config에 localhost에 대한 Host 항목을 구성해야 해요.

다음 예시에서 ProxyCommand는 SSH 클라이언트가 boundary connect를 호출하도록 구성해요. 이 명령은 -exec nc 플래그를 boundary connect에 전달해 netcat을 감싸고, boundary.ip와 boundary.port 환경 변수를 nc의 인자로 전달해요. 이 명령은 SSH 연결을 Boundary 세션으로 관리되는 로컬 netcat 터널을 통해 프록시하게 해줘요:

.ssh/ssh_config

Host ttcp_*
  ProxyCommand sh -c "boundary connect -target-id %n -exec nc -- {{boundary.ip}} {{boundary.port}}"

이 구성을 사용하면, ssh ttcp_1234567890을 실행해 ID ttcp_1234567890인 대상에 연결할 때 SSH가 boundary connect를 호출하고, 감싸진 netcat 세션에서 로컬 Boundary 프록시를 통해 트래픽을 터널링해요. Boundary는 대상 ID를 호스트 이름으로 boundary 명령에 전달해요.

ssh를 사용해 boundary connect를 호출하기 전에 Boundary에 인증해야 한다는 점을 유의하세요.

대상 ID로 대상에 SSH

명령이 구성되면 평소처럼 ssh를 실행할 수 있고, 모든 트래픽이 Boundary 프록시를 통해 대상 머신으로 프록시돼요:

$ ssh ttcp_1234567890
Password:
Last login: Thu Nov 19 10:32:09 2023
➜  ~

컨트롤러에서는 세션이 호출되는 것을 로그에서 볼 수 있어요:

controller.worker-handler: connection established: session_id=s_WkaQbqmrJx connection_id=sc_RDYNFFI2M4 client_tcp_address=127.0.0.1 client_tcp_port=57421 endpoint_tcp_address=::1 endpoint_tcp_port=22

CLI에서도 세션을 검사할 수 있어요:

$ boundary sessions read -id $(boundary sessions list -scope-id p_1234567890 -format json | jq '.[0]["id"]' | tr -d '"')

Session information:
  Auth Token ID:       at_a8itRfDSyV
  Created Time:        Thu, 19 Nov 2023 10:52:44 PST
  Endpoint:            tcp://localhost:22
  Expiration Time:     Thu, 19 Nov 2023 18:52:44 PST
  Host ID:             hst_1234567890
  Host Set ID:         hsst_1234567890
  ID:                  s_WkaQbqmrJx
  Status:              active
  Target ID:           ttcp_1234567890
  Type:                tcp
  Updated Time:        Thu, 19 Nov 2023 10:52:47 PST
  User ID:             u_1234567890
  Version:             2

  Scope:
    ID:                p_1234567890
    Name:              Generated project scope
    Parent Scope ID:   o_1234567890
    Type:              project

  States:
    Start Time:        Thu, 19 Nov 2023 10:52:47 PST
    Status:            active

    End Time:          Thu, 19 Nov 2023 10:52:47 PST
    Start Time:        Thu, 19 Nov 2023 10:52:44 PST
    Status:            pending

대상 도메인으로 호스트 구성하기

  • 대상에 대한 세션을 승인하고 토큰을 환경 변수에 저장해요.
  • 저장된 토큰을 사용해 boundary connect를 호출하도록 .ssh/ssh_config에 Host 항목을 구성해요.
  • ssh user@localhost를 실행해서 세션을 시작해요.

도메인 이름을 사용해 대상에 SSH하려면 대상 ID 대신 Host 값을 대상 도메인으로 설정할 수 있어요.

이 방법은 추가 단계가 필요해요. SSH 명령의 일부로 대상 ID를 전달하지 않으므로, 대상에 대한 세션을 승인하고 환경에 저장해야 해요. 세션을 승인하면 Boundary가 authorize-session 명령으로 만든 토큰에서 대상 정보를 가져올 수 있어요.

세션 승인하기

다음 예시는 대상 ttcp_1234567890에 대한 세션을 승인하고 토큰을 BOUNDARY_CONNECT_AUTHZ_TOKEN 환경 변수에 저장해요. SSH가 호출될 때 Boundary가 이 토큰을 사용해요:

$ export BOUNDARY_CONNECT_AUTHZ_TOKEN=$(boundary targets authorize-session -id ttcp_1234567890 -format json | jq '.authorization_token' | tr -d '"')

호스트 구성하기

SSH ProxyCommand를 사용하려면 .ssh/ssh_config에 localhost에 대한 Host 항목을 구성해야 해요.

다음 예시에서 ProxyCommand는 SSH 클라이언트가 boundary connect를 호출하도록 구성해요. 이 명령은 -exec nc 플래그를 boundary connect에 전달해 netcat을 감싸고, boundary.ip와 boundary.port 환경 변수를 nc의 인자로 전달해요. 이 명령은 SSH 연결을 Boundary 세션으로 관리되는 로컬 netcat 터널을 통해 프록시하게 해줘요:

.ssh/ssh_config

Host localhost
    # requires BOUNDARY_CONNECT_AUTHZ_TOKEN to be set from authorize-session command
    ProxyCommand sh -c "boundary connect -exec nc -- {{boundary.ip}} {{boundary.port}}"

이 구성을 사용하면, 세션을 승인한 대상에 ssh user@localhost를 실행해 연결할 때 SSH가 boundary connect를 호출하고, 감싸진 netcat 세션에서 로컬 Boundary 프록시를 통해 트래픽을 터널링해요. Boundary는 대상 도메인을 호스트 이름으로 boundary 명령에 전달해요.

ssh를 사용해 boundary connect를 호출하기 전에 Boundary에 인증해야 한다는 점을 유의하세요.

대상 도메인으로 대상에 SSH

명령이 구성되면 평소처럼 ssh를 실행할 수 있고, 모든 트래픽이 Boundary 프록시를 통해 대상 머신으로 프록시돼요:

$ ssh user@localhost
Password:
Last login: Thu Nov 19 10:32:09 2023
➜  ~

문제 해결(Troubleshooting)

ssh가 boundary connect를 호출하지 않는다면, .ssh/ssh_config의 Host 패턴이 대상 ID나 도메인과 정확히 일치하는지 확인하세요.

더 알아보기 (Learn more)