본문 바로가기

리눅스

[draft] HashiCorp Vault의 SSH OTP 방식을 통해 SSH 접속을 관리하는 방법

728x90

HashiCorp Vault의 SSH OTP(One-Time Password) 방식을 통해 SSH 접속을 관리하는 방법

Architecture

출처-content.hashicorp.com

1. Vault 서버 설정 (Node141 - 192.168.0.141)

Vault 서버 주소와 인증 토큰 설정

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

Vault 로그인

vault login "$VAULT_TOKEN"

Vault 서버 상태 확인

vault status

활성화된 경로 확인

vault secrets list

SSH Secret Engine 활성화

vault secrets enable ssh

Role 생성(OTP Role 생성)

vault write ssh/roles/otp_key_role \
    key_type=otp \
    default_user=vuser2 \
    allowed_users=vuser2 \
    cidr_list="0.0.0.0/0" \
    key_bits=2048

Role 조회

vault list ssh/roles
Keys
----
otp_key_role

정책 파일 작성

tee otp_key_policy.hcl <<EOF
# SSH secrets paths 목록
path "ssh/*" {
  capabilities = [ "list" ]
}

# SSH secrets engine otp_key_role 역할
path "ssh/creds/otp_key_role" {
  capabilities = ["create", "read", "update"]
}
EOF

정책 적용

vault policy write otp-key-policy ./otp_key_policy.hcl

정책 목록 확인

vault policy list

인증 방식이 활성화된 경로 확인

vault auth list
vault auth list | grep userpass

사용자 패스워드 기반 인증(userpass) 활성화

vault auth enable userpass

사용자 생성 및 정책 할당

vault write auth/userpass/users/vuser2 \
  password="vuser2_password" \
  policies="otp-key-policy"

계정의 세부 정보 조회

vault read auth/userpass/users/vuser2

2. SSH 서버 설정 (Node142 - 192.168.0.142)

Vault 및 Vault SSH Helper 설치

sudo apt install -y unzip

wget https://releases.hashicorp.com/vault/1.18.0/vault_1.18.0_linux_amd64.zip
unzip vault_1.18.0_linux_amd64.zip
sudo mv vault /usr/local/bin/
vault version
sudo rm -f LICENSE.txt vault_1.18.0_linux_amd64.zip

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/
vault-ssh-helper version
sudo rm -f vault-ssh-helper_0.2.1_linux_amd64.zip

접속할 사용자 생성

sudo adduser vuser2
echo 'vuser2:vuser2_password' | sudo chpasswd
$ id vuser2
uid=1001(vuser2) gid=1001(vuser2) groups=1001(vuser2),100(users)

Vault 서버 주소와 인증 토큰 설정

export VAULT_ADDR=http://192.168.0.141:8200
export VAULT_TOKEN="hvs.YgdjykLHDpqdg4CbPzrP7P7K"

Vault Server와의 연결 확인

curl -s http://192.168.0.141:8200/v1/sys/health | jq

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.141:8200"
tls_skip_verify = true
ssh_mount_point = "ssh"
allowed_roles = "*"
EOF
sudo tee /etc/vault-ssh-helper.d/config.hcl > /dev/null <<EOF
vault_addr = "http://192.168.0.141:8200"
ssh_mount_point = "ssh"
namespace = ""
tls_skip_verify = true
allowed_roles = "*"
allowed_cidr_list = "0.0.0.0/0"
EOF

config.hcl 검토

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

PAM 구성 수정

/etc/pam.d/sshd 파일을 수정하여 Vault SSH Helper가 OTP 인증을 처리할 수 있도록 PAM 모듈을 추가합니다.

sudo vim /etc/pam.d/sshd
auth requisite pam_exec.so quiet expose_authtok log=/tmp/vaultssh.log /usr/local/bin/vault-ssh-helper -config=/etc/vault-ssh-helper.d/config.hcl -dev
auth optional pam_unix.so not_set_pass use_first_pass nodelay

SSH 설정 변경

/etc/ssh/sshd_config 파일에서 다음 설정을 추가/수정하여 OTP 인증을 활성화합니다.

sudo sed -i.bak 's/^KbdInteractiveAuthentication no/KbdInteractiveAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i.bak 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i.bak 's/^ChallengeResponseAuthentication no/ChallengeResponseAuthentication yes/' /etc/ssh/sshd_config

또는

echo "ChallengeResponseAuthentication yes" | sudo tee -a /etc/ssh/sshd_config

SSH 설정 확인

cat /etc/ssh/sshd_config | egrep -v '^#' | egrep 'KbdInteractiveAuthentication|PasswordAuthentication|ChallengeResponseAuthentication|UsePAM'
$ cat /etc/ssh/sshd_config | egrep -v '^#' | egrep 'KbdInteractiveAuthentication|PasswordAuthentication|ChallengeResponseAuthentication|UsePAM'
PasswordAuthentication no
KbdInteractiveAuthentication yes
UsePAM yes
ChallengeResponseAuthentication yes

SSH 서비스 재시작

sudo systemctl restart ssh

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

OTP 생성 (Vault 서버에서 실행)

vault write ssh/creds/otp_key_role ip="192.168.0.142"
Key                Value
---                -----
lease_id           ssh/creds/otp_key_role/pGKto8dIbCbSMaF4rBgm4Rja
lease_duration     768h
lease_renewable    false
ip                 192.168.0.142
key                69337254-babf-f72a-8ed9-7740e73583e6
key_type           otp
port               22
username           vuser2

OTP는 key 필드에 표시됩니다.

SSH 클라이언트 (Node143 - 192.168.0.143)에서 SSH 접속

export VAULT_ADDR=http://192.168.0.141:8200
export VAULT_TOKEN="hvs.YgdjykLHDpqdg4CbPzrP7P7K"
vault login -method=userpass username=vuser2 password=vuser2_password
vault write ssh/creds/otp_key_role ip=192.168.0.142

SSH 접속을 시도합니다.

ssh vuser2@192.168.0.142
$ ssh vuser2@192.168.0.142
vuser2@192.168.0.142's password:

Vault를 이용한 SSH 접속

vault ssh -role otp_key_role -mode otp vuser2@192.168.0.142
$ vault ssh -role otp_key_role -mode otp vuser2@192.168.0.142
Vault could not locate "sshpass". The OTP code for the session is displayed
below. Enter this code in the SSH password prompt. If you install sshpass,
Vault can automatically perform this step for you.
OTP for the session is: ce9aede0-8b0e-f8e2-1c35-21190b85b2cb
vuser2@192.168.0.142's password:

sshpass 패키지를 설치하면 즉시 비밀번호 기반 SSH 로그인 기능을 사용할 수 있습니다.

sudo apt -y install sshpass
$ vault ssh -role otp_key_role -mode otp vuser2@192.168.0.142

 

참고URL

- Hashicorp Documentation : One-Time SSH passwords

- hashicorp github : vault-ssh-helper

 

728x90