HashiCorp Vault는 민감한 자격 증명, API 키, 암호화 키 등을 안전하게 저장하고 접근 제어를 제공하는 비밀 관리 시스템입니다. 그중에서도 SSH Secrets Engine은 SSH 접속을 보다 안전하게 제어할 수 있도록 지원하는 기능으로, OTP 방식 또는 SSH 인증서 서명 방식으로 서버 접근을 중앙에서 관리할 수 있습니다.
이번 포스팅에서는 Vault에 SSH Secrets Engine을 OTP 방식으로 서버에 접근하는 방법에 대한 내용을 다룹니다.
Vault 설치
- Vault Server, SSH Server, SSH Client 공통 - Vault 1.20.0(Latest) 설치
- Ubuntu 24.04 기준
wget -O - https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install vault
Vault Server 설정
- vault를 개발 모드로 구동하는 옵션
- 미리 준비된 설정으로 서버를 구동하며, 모든 데이터는 In-memory에 저장 됨.
- 서비스는 Localhost로 Listen되고, TLS를 사용하지 않으며, unseal 상태로 구동되기 때문에 별도의 잠금 해제 과정 필요 없음.
- 다만, 테스트 환경에서만 사용하고, 사용 환경에서는 사용하지 않도록 해야 함.
vault server -dev -dev-listen-address 0.0.0.0:8200
※ 비 개발모드 구동은 기존 포스팅 참고( https://zigispace.net/1327 )
Vault - Signed SSH certificates를 이용한 서버 접근
HashiCorp Vault는 민감한 자격 증명, API 키, 암호화 키 등을 안전하게 저장하고 접근 제어를 제공하는 비밀 관리 시스템입니다. 그중에서도 SSH Secrets Engine은 SSH 접속을 보다 안전하게 제어할 수 있도
zigispace.net
Vault 서버 로그인
- Vault 사용을 위해 개발 모드 실행 시, 생성된, Root token으로 로그인 수행
- 별도 로그인 대신에, VAULT_TOKEN 환경 변수에 token 값을 선언해서 사용하는 것도 가능
export VAULT_ADDR=http://Vault_ServerIP:8200
vault login [root token]
-
secrets enable로 Secret Engine을 활성화합니다.
-
-path 옵션을 이용해서, 마운트 지점을 설정하는 데, 이는 SSH Secret Engine이 사용할 논리 경로
- -path 옵션을 사용해서, 서로 다른 설정을 여러 번 마운트 가능
예를 들어서, 이번 포스팅에서 다루는 SSH 인증서 방식과 다음 포스팅에서 다룰 OTP 인증서 방식을 각각 구성 가능
vault secrets enable -path=otp-key-ssh ssh
- Vault Security Engine에 OTP를 Key로 사용하기 위한 역할(Role)을 생성
- default_user는 발급된 OTP를 통해 접속할 때 사용할 기본 사용자 계정
-
cidr_list=0.0.0.0/0 은모든 IP 주소에서 접속 가능하도록 허용
vault write otp-key-ssh/roles/otp_key_role \
key_type=otp \
default_user=zigi \
allowed_user=zigi \
cidr_list=10.0.0.0/22
- otp-key-ssh/creds/otp_key_role : create, read, update 권한
- SSH Client가 Vault를 통해 OTP를 생성하거나 조회할 수 있도록 허용
- sys/leases/revoke : update 권한
- SSH Client가 발급받은 OTP의 리스(Lease)를 수동으로 종료할 수 있도록 허용
# otp-key-role.hcl
path "otp-key-ssh/creds/otp_key_role" {
capabilities = ["create", "read", "update"]
}
path "sys/leases/revoke" {
capabilities = ["update"]
}
정책을 Vault에 등록
vault policy write otp-key-role ./otp-key-role.hcl
Vault에서 Username & Password 인증 방식을 활성
- Vault에 인증을 userpass 인증 방식이 되도록 활성화 하고, 계정 및 계정에 적용되는 정책을 할당
- 실제 보안상 좋은 방법은 아니기 때문에 상용에서는 다른 인증 방식 활용하는 것이 좋음.
vault auth enable userpass
vault write auth/userpass/users/zigi_vault password="zigip@ssw0rd" policies="default,otp-key-role"
SSH Server 설정
Vault-ssh-helper 설치
- Vault-ssh-helper은 PAM을 통해 Vault와 연동하여 OTP 기반 인증 처리를 위한 도구
- 최신 vault-ssh-helper 바이너를 다운 받아서, 사용 할 수 있도록 준비
- SSH 로그인 시에, PAM 호출에 따라 Vault에 OTP 검증 요청을 전달하는 역할
wget https://releases.hashicorp.com/vault-ssh-helper/0.2.1/vault-ssh-helper_0.2.1_linux_amd64.zip
sudo unzip -q vault-ssh-helper_0.2.1_linux_amd64.zip -d /usr/local/bin
sudo chmod 0755 /usr/local/bin/vault-ssh-helper
sudo chown root:root /usr/local/bin/vault-ssh-helper
sudo mkdir /etc/vault-ssh-helper.d/
Vault SSH Helper 설정 파일 작성
- SSH Server가 Vault 서버와 통신하고, OTP 인증 요청을 처리할 수 있도록 설정 파일을 작성
- vault_addr : Vault 서버의 정보
- tls_skip_verify : 인증서 검증 생략 여부
- ssh_mount_point : SSH Security Engine의 경로(마운트 포인트)
- allowed_roles : 이 서버에 접근 가능한 역할
# /etc/vault-ssh-helper.d/config.hcl
vault_addr = "http://VAULT_Server:8200"
tls_skip_verify = true
ssh_mount_point = "otp-key-ssh"
allowed_roles = "*"
Vault를 통한 인증을 위해 vault-ssh-helper를 PAM(PAM: Pluggable Authentication Module)에 추가
- OpenSSH 서버의 PAM 설정 파일(/etc/pam.d/sshd)에 vault-ssh-helper를 인증 방식으로 등록
#sudo nano /etc/pam.d/sshd
#@include common-auth #비활성화 처리
auth requisite pam_exec.so quiet expose_authtok log=/var/log/vault-ssh.log /usr/local/bin/vault-ssh-helper -dev -config=/etc/vault-ssh-helper.d/config.hcl #추가
auth optional pam_unix.so not_set_pass use_first_pass nodelay #추가
- SSH 설정에서, Vault OTP 인증을 위해 다음의 값을 설정
- KbdInteractiveAuthentication(키보드-대화형 인증) : 활성화
- Vault OTP 인증을 포함한 PAM 기반 인증 : 활성화
- 패스워드 인증 : 비활성화(OTP로만 인증하게 할 경우)
#/etc/ssh/sshd_config
KbdInteractiveAuthentication yes
UsePAM yes
PasswordAuthentication no
SSH 서비스 재기동
sudo systemctl restart ssh
SSH Client 설정
Vault Server 환경 변수 설정 및 로그인
- Vault Server에 연결하기 위한 환경 변수 설정 및 ID/Pass로 로그인
export VAULT_ADDR=http://Vault_IP:8200
vault login -method=userpass username=zigi_vault password=zigip@ssw0rd
OTP 발급 요청
- Vault의 SSH Secrets Engine에 OTP 발급 요청
- SSH Secrets Engine이 마운트 된 경로를 지정하고, 접속하고자 하는 서버의 IP를 지정하면,
아래의 출력 결과의 예시와 같이 (OTP) key가 발급 됨.
vault write otp-key-ssh/creds/otp_key_role ip=접속할_서버_IP
OTP를 사용하여 서버 접속
- SSH 명령어로 서버에 접근하고, Password에 발급된 OTP Key를 입력하여 서버 접속
ssh 계정@IP주소
자동화 서버 접속
- OTP Key를 발급 받고, 입력하는 과정 없이 서버 접속 자동화 수행 가능
- 단, sshpass 패키지 사전 설치 필요
vault ssh \
-mount-point=otp-key-ssh\
-role otp_key_role \
-mode otp \
-strict-host-key-checking=no \
zigi@IP주소
OTP 시간 조정
- OTP Key는 기본 값으로 768시간이 유효
- OTP는 일회성 인증 수단으로 사용해야 하기 때문에 유효 시간을 짧게 조정 필요.
- OTP Key의 유효 시간을 조정하기 위해서 Vault Server에서 다음과 같이 설정
#lease TTL 조정
vault secrets tune -default-lease-ttl=60s -max-lease-ttl=60s otp-key-ssh/
#조정된 TTL 확인
vault read sys/mounts/otp-key-ssh/tune
조정된 Lease 확인 및 접속 (Client)
- OTP를 받은 발급 받은 이후에 유효 시간(lease_duration : 1분) 이후 서버 접속 시에 접속이 불가함.
- OTP 발급 이후에 유효 시간 내에 접속을 시도해야 정상 접속 가능
vault write otp-key-ssh/creds/otp_key_role ip=10.0.0.5