Cloud Native Solution/[Hashicorp] Vault

[Vault][Secret Engine] SSH - OTP 구성 방식

Cloud Engineer 2022. 8. 19. 18:19

00. 개요

사용자는 Vault를 활용하여 Backend Storage에 데이터를 저장, 생성 및 암호화하기 위해 Secret Engine을 사용합니다. Vault에서는 SSH 관련 기능으로 OTP 방식과 동적 키 방식 2가지를 제공하고 있습니다. 본 포스팅에서는 SSH OTP 방식에 대해 알아보겠습니다.

01. OTP 방식

사용자가 서버를 접속할 때마다 Vault에게 일회성 비밀번호(One Time Password)를 요청하고 응답받은 패스워드를 입력하여 접속하는 방식입니다. 이 때, 시스템 관리자는 접속 대상 서버에 vault-ssh-helper라는 유틸리티를 설치해야 됩니다.

02. vault-ssh-helper를 활용한 인증 프로세스

사용자와 접속 서버 그리고 Vault와의 인증 방식은 다음과 같습니다.

사용자가 vault-ssh-helper를 통해 OTP 인증을 받는 프로세스

① 사용자는 Vault에게 SSH OTP 패스워드를 요청합니다.

② Vault는 사용자에게 OTP 패스워드를 발급해줍니다.

③ 사용자는 Vault로부터 발급받은 OTP 패스워드를 통해 원격 서버에 접속합니다.

④ 원격 서버는 본 서버에 설치된 vault-ssh-helper를 통해 Vault 서버로부터 OTP 패스워드 유효성 검사를 수행합니다.

03. OTP 인증 구성 실습

실제 Vault 서버와 접속할 원격 서버에서 어떤 구성을 수행해야 되는지에 대한 실습을 진행하겠습니다.  

03-1. Secret Engine 마운트 (Vault 서버)

먼저 Vault 서버에서 Secret Engine - SSH 방식을 마운팅합니다. Path는 고유 이름(ssh-path)로 지정해줍니다.

$ vault secrets enable -path=ssh-otp ssh

03-2. Role 생성 (Vault 서버)

생성한 Secret Engine에 적용할 Role을 생성해줍니다. 본 Role을 토대로 접속 가능한 사용자 IP 및 계정 등이 구성됩니다. 

$ vault write ssh/roles/test_ssh_otp_role \
	key_type=otp \
	default_user=testuser \
	allowed_users=testuser \
	cidr_list=0.0.0.0/0
  • key_type : 어떤 방식으로 사용자 인증을 수행할지를 지정 (otp, dynamic, ca)
  • default_user : 인증을 성공한 사용자가 기본적으로 접속할 유저를 지정
  • allowed_users : 인증을 성공한 사용자가 접속할 수 있는 리눅스 유저를 지정 (본 포스팅에서는 testuser만 접속 가능하도록 지정)
  • cidr_list : 해당 role 적용이 가능한 IP 대역

위 옵션에 대해 자세히 학습하고 싶으신 분들은 링크를 클릭하여 확인하시면 됩니다. Vault에서는 공식 문서로 원론적인 내용을 다루는 부분과 API 명세를 다루는 부분을 나누어 제공하고 있습니다.

03-3. vault-ssh-helper 설치 (접속 대상 서버)

접속 대상 서버에서 vault-ssh-helper를 설치해줍니다. wget 명령어를 통해 URL을 통한 설치를 진행하겠습니다.

# 1. 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

# 2. 파일 이동
$ mv vault-ssh-helper /usr/local/bin/vault-ssh-helper

/usr/local/bin : 동으로 설치한 컴파일 시스템 패키지를 넣는 공간

03-4. vault-ssh-helper 구성 (접속 대상 서버)

vault-ssh-helper에서 바라보는 vault 서버와 사용자 인증에 적용할 SSH 마운트 포인트 및 Role 등을 구성합니다.

# 1. vault-ssh-helper에서 사용할 디렉토리 생성
$ mkdir /etc/vault-ssh-helper.d

# 2. 구성 파일 생성
$ vi /etc/vault-ssh-helper.d/config.hcl
vault_addr = "http://{{vault 서버 주소}}:8200"
ssh_mount_point = "ssh-otp"
tls_skip_verify=true
allowed_cidr_list="0.0.0.0/0"
allowed_roles="test_ssh_otp_role"
  • vault_addr : vault 서버 주소를 지정 (IP 또는 도메인네임)
  • ssh_mount_point : 사용자가 인증 수행 시 vault-ssh-helper에서 연동할 SSH Secret Engine 마운팅포인트
  • tls_skip_verify : 사용자가 인증 수행 시 TLS를 통한 신뢰성 검증을 skip할지에 대한 여부 지정
  • allow_cidr_list : 허용할 CIDR
  • allowed_roles : 사용자가 인증 수행 시 vault-ssh-helper에서 연동할 Role (SSH Secret Engine에 구성된 Role)

03-5. vault-ssh-helper 구성 검증 수행

03-4에서 작성한 config 파일을 통해 vault-ssh-helper와 vault 서버 간 정상적으로 작동되는지 확인합니다.

$ vault-ssh-helper -verify-only -config=/etc/vault-ssh-helper.d/config.hcl -dev
2022/08/19 02:00:55 ==> WARNING: Dev mode is enabled!
2022/08/19 02:00:55 [INFO] using SSH mount point: ssh-otp
2022/08/19 02:00:55 [INFO] using namespace:
2022/08/19 02:00:55 [INFO] vault-ssh-helper verification successful!

03-6. PAM 인증 구성

vault-ssh-helper가 PAM에서 인증 역할의 일부를 수행하기 때문에 /etc/pam.d/sshd 파일 내용이 다음과 될 수 있도록 해줍니다.

[주의] SELinux를 비활성화해주거나 별도의 예외처리를 해주셔야 로그 파일이 정상적으로 append됩니다.

$ vi /etc/pam.d/sshd
#%PAM-1.0
auth    requisite pam_exec.so quiet expose_authtok log=/var/log/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
auth       required     pam_sepermit.so
# auth       substack     password-auth
auth       include      postlogin
# Used with polkit to reauthorize users in remote sessions
-auth      optional     pam_reauthorize.so prepare
account    required     pam_nologin.so
account    include      password-auth
# password   include      password-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open env_params
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      password-auth
session    include      postlogin
# Used with polkit to reauthorize users in remote sessions
-session   optional     pam_reauthorize.so prepare

03-7. SSH 데몬 구성 변경

vault-ssh-helper 정상 작동을 할 수 있도록 /etc/ssh/sshd_config 파일에서 구성을 변경해줍니다.

$ vi /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
UsePAM yes
PasswordAuthentication no

03-8. SSH 접속 테스트

vault 서버에서 credential 생성 후 해당 IP로 접속해본 결과 정상 접속이 됨을 확인할 수 있습니다!

$ vault write ssh-otp/creds/test_ssh_otp_role ip={{접속 대상 서버 IP 주소}}
Key                Value
---                -----
lease_id           ssh-otp/creds/test_ssh_otp_role/rEuhGXE2xwrhfdbHFiVwxAwHH
lease_duration     768h
lease_renewable    false
ip                 {{접속 대상 서버 IP 주소}}
key                4910ff5d-4616-f857-b741-b14e57ac6997
key_type           otp
port               22
username           testuser
$ ssh testuser@{{접속 대상 서버 IP 주소}}
Password: {{key 입력}}
Last login: Fri Aug 19 02:32:40 2022 from x.x.x.x
$ exit

04. 마무리

SSH Secret Engine에는 2가지 인증 방식(OTP 인증, Signed RSA 인증)이 존재합니다. 본 포스팅에서는 OTP 인증 방식을 다뤘으며 실제로 Vault에서는 해당 방식을 권장하고 있습니다.

 

[출처]

- https://faun.pub/generating-ssh-one-time-passwords-with-vault-7aa7fab0032

- https://www.vaultproject.io/docs

- https://www.vaultproject.io/api-docs