SSH 연결 설정하기

SSH 연결 설정하기

ssh 커뮤니케이터를 사용해 Packer가 만든 머신에 SSH 연결을 맺고, 파일 업로드나 스크립트 실행 같은 작업을 수행하는 방법을 설명하는 문서예요.

출처: Packer 공식 문서

본문

소개 (Introduction)

커뮤니케이터(communicator)는 Packer가 만들어지는 머신에 파일을 업로드하고 스크립트를 실행하는 등의 작업을 수행하기 위해 사용하는 메커니즘이에요. 빌더 섹션 안에서 구성됩니다.

ssh 커뮤니케이터는 SSH 프로토콜을 사용해 이 작업을 수행해요. 대부분의 빌더에서 기본 커뮤니케이터로 사용됩니다.

Packer를 실행하는 호스트에 SSH agent가 구성되어 있고, 커뮤니케이터 설정에서 SSH agent 인증이 활성화되어 있다면, Packer는 SSH agent를 원격 호스트로 자동 전달해 줘요.

ssh 커뮤니케이터 사용 준비

ssh 커뮤니케이터는 대부분의 빌더에서 기본 커뮤니케이터이지만, 빌더에 따라서는 "그대로" 바로 동작하지 않을 수도 있어요.

클라우드 이미지에서 빌드한다면(예: Amazon에서 빌드) 클라우드 제공자가 이미지에 SSH를 미리 구성해 뒀을 가능성이 높아요. 그러면 Packer 템플릿에서 커뮤니케이터만 구성하면 됩니다.

하지만 완전히 새롭고 구성되지 않은 운영체제 이미지에서 빌드한다면, 게스트 머신에 SSH를 구성하기 위해 거의 항상 추가 작업을 해야 해요. 대부분의 OS 배포판에서 이 작업은 운영체제를 설치할 때 평소 대화형으로 묻는 질문에 답을 제공하는 파일을 참조하는 부트 커맨드로 수행됩니다. 이 파일의 이름은 OS마다 달라요. 흔한 예로 Debian이 요구하는 "preseed" 파일, CentOS가 요구하는 "kickstart" 파일, Windows가 요구하는 "answer file"(Autounattend.xml이라고도 함)이 있습니다. 편의상 이 문서의 나머지 부분에서는 이 파일을 "preseed" 파일이라고 부를게요.

이미지의 자동 부트스트래핑을 위한 preseed 파일 사용법이 익숙하지 않다면, 이미지 부트스트래핑에 대한 빠른 가이드를 보거나 특정 게스트 OS의 자동 구성을 조사해 보세요. 운영체제를 자동으로 초기화하는 방법을 아는 것은 Packer를 성공적으로 사용하는 데 매우 중요합니다.

ssh 커뮤니케이터 레퍼런스

ssh 커뮤니케이터는 SSH로 호스트에 연결합니다. Packer를 실행하는 호스트에 SSH agent가 구성되어 있고, 커뮤니케이터 설정에서 SSH agent 인증이 활성화되어 있다면, Packer는 SSH agent를 원격 호스트로 자동 전달해 줘요.

ssh 커뮤니케이터는 다음 옵션들을 가집니다.

  • ssh_host (string) - SSH로 연결할 주소. 보통은 빌더가 자동으로 구성해 줘요.
  • ssh_port (int) - SSH로 연결할 포트. 기본값은 22.
  • ssh_username (string) - SSH로 연결할 때 사용하는 사용자 이름. SSH를 사용한다면 필수예요.
  • ssh_password (string) - SSH로 인증하는 데 사용할 평문 비밀번호.
  • ssh_ciphers ([ ]string) - Golang이 기본으로 지원하는 ciphers 값을 덮어써요. 기본값은 [ "[email protected]", "[email protected]", "aes128-ctr", "aes192-ctr", "aes256-ctr" ]. 유효한 ciphers 옵션: "aes128-ctr", "aes192-ctr", "aes256-ctr", "[email protected]", "[email protected]", "arcfour256", "arcfour128", "arcfour", "aes128-cbc", "3des-cbc".
  • ssh_clear_authorized_keys (bool) - true면 Packer가 임시 키를 ~/.ssh/authorized_keys와 /root/.ssh/authorized_keys에서 제거하려 시도해요. 이 옵션은 대체로 장식적인데, 사용자가 -debug 플래그를 설정하지 않는 한 Packer가 호스트 시스템에서 임시 개인 키를 어차피 삭제하기 때문이에요. 기본값은 "false"이며, 현재 sed가 설치된 게스트에서만 동작합니다.
  • ssh_key_exchange_algorithms ([ ]string) - 설정하면 Packer가 Golang이 기본으로 지원하는 키 교환(kex) 알고리즘 값을 덮어써요. 허용 값: "[email protected]", "ecdh-sha2-nistp256", "ecdh-sha2-nistp384", "ecdh-sha2-nistp521", "diffie-hellman-group14-sha1", "diffie-hellman-group1-sha1".
  • ssh_certificate_file (string) - SSH로 인증하는 데 사용하는 사용자 인증서의 경로. 경로에 ~를 쓸 수 있으며 현재 사용자의 홈 디렉터리로 확장됩니다.
  • ssh_pty (bool) - true면 SSH 연결에 PTY가 요청돼요. 기본값은 false.
  • ssh_timeout (duration string | ex: "1h5m2s") - SSH가 사용 가능해질 때까지 기다리는 시간. Packer는 이걸로 머신이 부팅됐는지 판단하므로 보통 꽤 깁니다. 예시 값: 10m. 기본값은 5m이며, ssh_handshake_attempts가 설정되면 다릅니다.
  • ssh_disable_agent_forwarding (bool) - true면 SSH agent 전달이 비활성화돼요. 기본값은 false.
  • ssh_handshake_attempts (int) - 연결된 뒤 SSH와 시도할 핸드셰이크 횟수. 기본값은 10이며, ssh_timeout이 설정되면 다릅니다.
  • ssh_bastion_host (string) - 실제 SSH 연결에 사용할 배스천(bastion) 호스트.
  • ssh_bastion_port (int) - 배스천 호스트의 포트. 기본값은 22.
  • ssh_bastion_agent_auth (bool) - true면 로컬 SSH agent가 배스천 호스트 인증에 사용돼요. 기본값은 false.
  • ssh_bastion_username (string) - 배스천 호스트에 연결할 사용자 이름.
  • ssh_bastion_password (string) - 배스천 호스트 인증에 사용할 비밀번호.
  • ssh_bastion_interactive (bool) - true면 keyboard-interactive 방식으로 배스천 호스트에 인증해요.
  • ssh_bastion_private_key_file (string) - 배스천 호스트 인증에 사용할 PEM 인코딩 개인 키 파일의 경로. 경로에 ~를 쓸 수 있으며 현재 사용자의 홈 디렉터리로 확장됩니다.
  • ssh_bastion_certificate_file (string) - 배스천 호스트 인증에 사용할 사용자 인증서의 경로. 경로에 ~를 쓸 수 있으며 현재 사용자의 홈 디렉터리로 확장됩니다.
  • ssh_file_transfer_method (string) - scp 또는 sftp - 파일을 전송하는 방법. Secure copy(기본값) 또는 SSH File Transfer Protocol. 참고: Win32-OpenSSH v9.1.0.0p1-Beta를 사용하는 Windows 게스트에서는 MOTW를 설정할 수 없어 scp(데이터 복사 기본 프로토콜)가 0이 아닌 오류 코드를 반환해서 파일 전송이 실패할 수 있어요. 이 경우 대신 전송 프로토콜을 SFTP로 재정의하면 됩니다: ssh_file_transfer_method = "sftp".
  • ssh_proxy_host (string) - SSH 연결에 사용할 SOCKS 프록시 호스트.
  • ssh_proxy_port (int) - SOCKS 프록시의 포트. 기본값은 1080.
  • ssh_proxy_username (string) - 프록시 서버 인증에 사용할 선택적 사용자 이름.
  • ssh_proxy_password (string) - 프록시 서버 인증에 사용할 선택적 비밀번호.
  • ssh_keep_alive_interval (duration string | ex: "1h5m2s") - 서버에 "keep alive" 메시지를 보내는 주기. 음수 값(-1s)으로 설정하면 비활성화돼요. 예시 값: 10s. 기본값은 5s.
  • ssh_read_write_timeout (duration string | ex: "1h5m2s") - 원격 커맨드가 끝날 때까지 기다리는 시간. 예를 들어 packer가 재부팅 후 연결에서 멈추는 경우 유용할 수 있어요. 예시: 5m. 기본적으로 비활성화돼 있습니다.
  • ssh_remote_tunnels ([ ]string) - 원격 터널은 로컬 머신의 포트를 인스턴스로 전달해요. 형식: ["REMOTE_PORT:LOCAL_HOST:LOCAL_PORT"] 예시: "9090:localhost:80"은 머신의 localhost:9090을 인스턴스의 80번 포트로 전달합니다.
  • ssh_local_tunnels ([ ]string) - 로컬 터널은 인스턴스의 포트를 로컬 머신으로 전달해요. 형식: ["LOCAL_PORT:REMOTE_HOST:REMOTE_PORT"] 예시: "8080:localhost:3000"은 인스턴스가 localhost:8080을 통해 로컬 머신의 3000번 포트에 접근할 수 있게 합니다.
  • ssh_keypair_name (string) - 지정하면 머신과의 SSH에 사용될 키예요. 키는 원격에 로드된 키 페어 이름과 일치해야 합니다. 기본적으로 비어 있으며, ssh_password를 사용하지 않으면 Packer가 임시 키페어를 생성해요. ssh_keypair_name을 사용할 때는 ssh_private_key_file 또는 ssh_agent_auth를 지정해야 합니다.
  • ssh_agent_auth (bool) - true면 로컬 SSH agent가 소스 인스턴스에 대한 연결 인증에 사용돼요. 임시 키페어는 생성되지 않고, ssh_password와 ssh_private_key_file의 값은 무시됩니다. 이 옵션이 제대로 동작하려면 SSH_AUTH_SOCK 환경 변수가 설정되어 있어야 해요.
  • temporary_key_pair_name (string) - 생성할 임시 키 페어의 이름. 기본적으로 Packer는 packer_<UUID>처럼 생긴 이름을 생성하며, 여기서 <UUID>는 36자 고유 식별자입니다.
  • ssh_private_key_file (string) - SSH 인증에 사용할 PEM 인코딩 개인 키 파일의 경로. 경로에 ~를 쓸 수 있으며 현재 사용자의 홈 디렉터리로 확장됩니다.

Note: ssh_keypair_name, ssh_agent_auth, temporary_key_pair_name, ssh_private_key_file 옵션은 커뮤니케이터가 지원하지만, 모든 빌더에서 지원되지는 않을 수 있어요. 지원되는 옵션은 빌더 문서를 참고하세요.

ssh 커뮤니케이터 세부사항

Packer는 publickey와, ssh_password를 사용하면 password와 keyboard-interactive(둘 다 비밀번호를 보냄) 중 하나의 인증 방법만 사용해요. 다시 말해, Packer는 AuthenticationMethods로 여러 인증 방법이 구성된 sshd와는 동작하지 않습니다.

Packer가 지원하는 MAC은 다음과 같아요.

Packer가 지원하는 ciphers에 대한 자세한 내용은 ssh_ciphers 템플릿 옵션 문서를 확인하세요.