Vault SSH OTP

김재진·2023년 7월 12일
0

Vault

목록 보기
1/1

SSH OTP

설명

  • vault ssh secret engine과 ssh-helper를 사용하여 사용자가 server에 ssh 프로토콜을 이용하여 인증을 시도할 때 vault 가 발급해준 OTP를 통해서 2차 인증을 통해서 server에 접근할 수 있다.
  • 해당 문서는 다음 링크의 문서를 참고하여 진행 되었습니다.

구성도

준비사항

  1. ssh를 사용할 server와 클라이언트(유저), vault server 3곳에서 작업 진행할 예정

  2. 클라이언트에는 vault가 설치되어 있어야한다.

  3. 필요한 권한

    • ssh 활성화 및 유저 생성 권한 (관리자) >> root로 대체 가능

      # To enable secrets engines
      path "sys/mounts/*" {
        capabilities = [ "create", "read", "update", "delete" ]
      }
      
      # To configure the SSH secrets engine
      path "ssh/*" {
        capabilities = [ "create", "read", "update", "delete", "list" ]
      }
      
      # To enable the userpass auth method
      path "sys/auth/userpass" {
        capabilities = [ "update" ]
      }
      
      # To create the policy for the test user
      path "sys/policies/acl/test" {
        capabilities = [ "read", "update" ]
      }
      
      # To create the test user
      path "auth/userpass/users/ubuntu" {
        capabilities = [ "create", "update" ]
      }
    • ssh secret engine 접근 권한 (client)

      # To list SSH secrets paths
      path "ssh/*" {
        capabilities = [ "list" ]
      }
      # To use the configured SSH secrets engine otp_key_role role
      path "ssh/creds/otp_key_role" {
        capabilities = ["create", "read", "update"]
      }

vault server 생성

  1. vault server를 dev 모드로 실행
vault server -dev -dev-root-token-id root
export VAULT_ADDR=http://127.0.0.1:8200
export VAULT_TOKEN=root
💡 기존에 vault server가 있는 경우 해당과정은 필요가 없다. 우리 vault server 주소는 http://10.100.100.97:8200

1. ssh Secret Engine 활성화

CLI

#vault 서버에 로그인 후
vault secrets enable ssh
vault write ssh/roles/otp_key_role \
    key_type=otp \
    default_user=<호스트에서 사용할 유저id> \
    cidr_list=0.0.0.0/0

2. 클라이언트 인증 설정

  • 클라이언트가 사용할 vault server의 인증방식 및 권한 설정

    #hcl 확장자로 접근 권한파일 생성
    tee test.hcl <<EOF
    # To list SSH secrets paths
    path "ssh/*" {
      capabilities = [ "list" ]
    }
    # To use the configured SSH secrets engine otp_key_role role
    path "ssh/creds/otp_key_role" {
      capabilities = ["create", "read", "update"]
    }
    EOF
    
    #생성한 권한 파일을 vault server에 넣어주기
    vault policy write test ./test.hcl
    
    #userpass로 인증 방식 생성
    vault auth enable userpass
    
    #userpass로 인증할 ubuntu id와 password 설정, 사용할 정책 설정
    vault write auth/userpass/users/ubuntu password="training" policies="test"

3. 호스트 서버 설정

토글 순서대로 진행

접속할 호스트마다 ssh-helper 설치 및 config 설정

#ssh-helper를 설치하고 권한 설정 뒤 루트 바이너리로 옮겨주기
#ssh-helper의 config를 넣을 디렉토리도 생성
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 server의 주소 설정
VAULT_EXTERNAL_ADDR=<VAULT_EXTERNAL_ADDR>

[config 설정값 참고](https://github.com/hashicorp/vault-ssh-helper#vault-ssh-helper-configuration)
#ssh-helper config 작성
sudo tee /etc/vault-ssh-helper.d/config.hcl <<EOF
vault_addr = "$VAULT_EXTERNAL_ADDR"
tls_skip_verify = false
ssh_mount_point = "ssh"
allowed_roles = "*"
EOF

호스트의 PAM sshd 파일 수정

#백업은 필수다
sudo cp /etc/pam.d/sshd /etc/pam.d/sshd.orig
sudo vi /etc/pam.d/sshd

#sshd 파일 내부의 <@include common-auth>부분을 주석 처리해주어야함
	>> ubuntu에 접속하는 기본적인 인증 방식을 비활성화 처리한 것
#ssh-helper가 외부에서 해당 호스트에 접속할 때 인증처리할 수 있도록 해줌
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

![스크린샷 2022-04-05 오전 11.12.16.png](/Users/jaejin/Downloads/3c429029-1d20-417e-82b4-d9c99abcdce8Export-7d1737b3-82e7-4bd8-9f89-3421083eaccc/SSH - OTP 0d34a7e35e1d40c898d597d7691ab663/스크린샷_2022-04-05오전_11.12.16.png)

호스트의 sshd 파일 수정

#백업본 생성
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.orig
sudo vi /etc/ssh/sshd_config

#config 내부에 해당내용 확인후 수정 및 추가
ChallengeResponseAuthentication yes
UsePAM yes
PasswordAuthentication no

호스트의 sshd 재시작

sudo systemctl restart sshd

4. 클라이언트에서 호스트 접속하기

주의사항: vault의 ssh secret engine에서 생성하는 username이 호스트 서버의 user로 있어야 접속이 가능하다.

REMOTE_HOST_IP=<ssh-helper가 설치된 호스트 ip>

#볼트 로그인
vault login -method=userpass username=ubuntu password=training

#호스트의 otp 키 생성
vault write ssh/creds/otp_key_role ip=$REMOTE_HOST_IP

#키가 생성되면 프로토콜을 통해 password대신 키를 입력해준다.
ssh ubuntu@$REMOTE_HOST_IP
password: key(otp)
profile
주니어 엔지니어입니다.

0개의 댓글