보안 이야기

Vault OTP를 이용한 서버 접근

지기(ZIGI) 2025. 7. 13. 10:06

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]

 

 

Vault Seret Engint 마운트
  • secrets enable로 Secret Engine을 활성화합니다.
  • -path 옵션을 이용해서, 마운트 지점을 설정하는 데, 이는 SSH Secret Engine이 사용할 논리 경로
  • -path 옵션을 사용해서, 서로 다른 설정을 여러 번 마운트 가능
    예를 들어서, 이번 포스팅에서 다루는 SSH 인증서 방식과 다음 포스팅에서 다룰 OTP 인증서 방식을 각각 구성 가능
vault secrets enable -path=otp-key-ssh ssh

 

OTP Key Role 생성
  • 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

 

 
SSH Client가 OTP 요청을 위한 정책 설정
  • 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 #추가

 

sshd 설정에서 Vault OTP 인증을 위해 다음을 설정 
  • 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

OTP 발급 후, 유효 시간 이후 접속 시 접속 불가

 

OTP 발급 후, 유효 시간 내 접속 시도 시 정상 접속.