본문 바로가기

리눅스

HashiCorp Vault의 OTP 방식을 이용하여 SSH 인증을 구성하는 방법

반응형

HashiCorp Vault의 OTP(One-Time Password) 방식을 이용하여 SSH 인증을 구성하는 방법

Vault가 SSH 접속용 일회용 비밀번호(OTP)를 발급하고, SSH 서버는 vault-ssh-helper를 통해 Vault에 OTP를 검증시켜 사용자를 로그인시키는 방식입니다.

테스트 환경

  • Vault Server 192.168.0.11
  • SSH Server 192.168.0.121
  • SSH Client 192.168.0.2

1. Vault 서버 설정 (192.168.0.11, Docker 컨테이너)

Vault 컨테이너 접속

docker compose exec vault sh

Vault 환경 설정

export VAULT_ADDR=http://127.0.0.1:8200
export VAULT_TOKEN="hvs.CYPEufMwYRd7deQvn8K2KyeW"

Vault 서버 상태 확인

vault status

Vault 로그인(Root 토큰)

vault login "$VAULT_TOKEN"

SSH Secret Engine 활성화

vault secrets enable ssh

OTP 역할 생성

vault write ssh/roles/otp_key_role \
  key_type=otp \
  default_user=ubuntu \
  cidr_list=0.0.0.0/0
  • key_type=otp : OTP 인증 방식 지정.
  • default_user=ubuntu : SSH 서버에서 사용할 기본 사용자 이름.
  • cidr_list=0.0.0.0/0 : OTP가 허용되는 IP 범위(SSH 서버와 클라이언트가 포함된 네트워크).

정책 생성 및 토큰 발급

tee ssh-policy.hcl > /dev/null <<EOF
path "ssh/creds/otp_key_role" {
    capabilities = ["create", "read", "update"]
}
EOF
vault policy write ssh-policy ssh-policy.hcl
vault token create -policy=ssh-policy -format=json | jq -r '.auth.client_token'
728x90

2. SSH 서버 설정 (192.168.0.121)

sudo apt update
sudo apt install -y unzip curl jq

vault-ssh-helper 설치

wget https://releases.hashicorp.com/vault-ssh-helper/0.2.1/vault-ssh-helper_0.2.1_linux_amd64.zip
unzip vault-ssh-helper_0.2.1_linux_amd64.zip
sudo mv vault-ssh-helper /usr/local/bin/
sudo chmod +x /usr/local/bin/vault-ssh-helper
rm -f vault-ssh-helper_0.2.1_linux_amd64.zip
vault-ssh-helper --version
vault-ssh-helper v0.2.1

vault-ssh-helper 설정 파일 생성

sudo mkdir -p /etc/vault-ssh-helper.d
sudo tee /etc/vault-ssh-helper.d/config.hcl > /dev/null <<EOF
vault_addr = "http://192.168.0.11:8200"
tls_skip_verify = true
ssh_mount_point = "ssh"
allowed_roles = "otp_role"
EOF

설정 테스트

vault-ssh-helper -dev -verify-only -config=/etc/vault-ssh-helper.d/config.hcl

PAM 구성 수정

sudo vim /etc/pam.d/sshd
# PAM configuration for the Secure Shell service
 
# Standard Un*x authentication.
# @include common-auth

# Use vault-ssh-helper for OTP authentication
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
...

(또는)

sudo tee -a /etc/pam.d/sshd > /dev/null <<EOF

# Use vault-ssh-helper for OTP authentication
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
EOF

SSH 설정 변경

sudo tee -a /etc/ssh/sshd_config > /dev/null <<EOF

ChallengeResponseAuthentication yes
PasswordAuthentication no
UsePAM yes
EOF

SSH 재시작

sudo systemctl restart ssh

3. OTP 생성 및 SSH 접속 테스트

Vault 서버 (192.168.0.11)에서 OTP 생성(또는 클라이언트가 수행)

export VAULT_ADDR=http://127.0.0.1:8200
export VAULT_TOKEN="hvs.CYPEufMwYRd7deQvn8K2KyeW"
vault write ssh/creds/otp_key_role ip=192.168.0.121

SSH 클라이언트 (192.168.0.2)에서 SSH 접속

ssh ubuntu@192.168.0.121

 

728x90
반응형