이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

Tool 사용법/SSH

HashiCorp Vault를 이용한 SSH 공개키 인증

이쿠우우 2022. 2. 5. 16:22
반응형

 

 

 
 

HashiCorp Vault를 이용한 SSH 공개키 인증

 

목표

Hashcorp vault를 사용해서 ssh 연결을 시도.
 
 

 

인증 방식

 

 

1. Private Key, Public key 생성
2. Vault server 접속(token)
3. Client의 Public key를 vault server로 전달해서 signed(서명) 요청
4. Vault Server의 CA로 public key를 signed해서 client로 전달
    해당 signed public key는 유효기간이 존재함. 
 
1. Vault server 접속(token)
2. CA의 signed된 Public key를 받아와서 저장함. 
    이후 해당 public key를 통해 SSH Client 연결을 위해 사용하는 public key가 서명된 key인지 확인함.
    그리고 public key의 signed 유효기간을 확인함.
 
5. Signed Public key로 SSH Server 접속 요청
6. SSH Server에 있던 CA 공개키로 Signed Public key가 정상적으로 서명된 key인지, 유효기간이 정상인지 확인
7. 정상적으로 서명되어있는 key라면 연결 허용

 

hashicorp vault 공식 그림을 참고함.

 
 
 

 

Test 환경

 
HashiCorp Vault
version : 1.9.3
 
Vault Server
IP : 10.0.2.10
OS : CentOS 7.5
 
SSH-Server
IP : 10.0.2.7
OS : CentOS 7.5
접속 대상(remote 서버)
 
SSH-Client
IP : 10.0.2.15
OS : CentOS 7.5
Server에 접속하려고 하는 host
 

 
 

모든 Server에서 작업

 

HashiCorp Vault 설치

 

hashicorp_vault 설치 (Operations Host에 설치함)

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install vault
 
다른 OS 설치 방법 참고
 

hashicorp_vault 설치 확인

vault -v

 

 
 

 

Vault Server 작업

 
 

vault server start

vault server -dev -dev-listen-address 0.0.0.0:8200 

[-dev 옵션 설명]
vault 테스트 서버로 구동하는 옵션으로
프로덕션 모드에서는 이 옵션 사용을 권장하지 않음.
미리 준비된 설정으로 서버를 구동.
모든 데이터는 in-memory 저장.
암호화.
localhost 로 listen 되며 TLS 가 없음.
자동 봉인 해제.
봉인 해제된 키와 엑세스 토큰을 보여줌.
 
 
 

다른 터미널을 하나 더 열어서 환경변수 추가

export VAULT_ADDR=http://127.0.0.1:8200
export VAULT_TOKEN="s.PlXbSf7VlFEQ1Gg5ua2RE2yx"
VAULT_TOKEN 값은 Root Token 값임.

 

 

Vault secret engine 활성화

vault secrets enable -path=ssh-client-signer ssh

 
 

CA 생성

vault write ssh-client-signer/config/ca generate_signing_key=true

 
 

SSH-Server에서 key를 read할 수 있도록 정책 설정

 

policy.tf 파일 생성

path "ssh-client-signer/config/ca" {
  capabilities = ["read"]
}
 

 

정책 적용

vault policy write ssh-pubkey-read policy.tf

 

Token 생성

vault token create -policy=ssh-pubkey-read
token 값 별도로 저장해놓아야함. (SSH-Server 작업에서 사용함.)

 

 
 

SSH-Client에서 Vault에 CA사인 요청할 수 있도록 설정

 

사인 요청에 대한 세부 설정

vault write ssh-client-signer/roles/my-role -<<"EOH"
{
  "allow_user_certificates": true,
  "allowed_users": "*",
  "default_extensions": [
    {
      "permit-pty": ""
    }
  ],
  "key_type": "ca",
  "default_user": "root",
  "ttl": "5m0s"
}
EOH

 

옵션 설명

 
[default_user]
지금은 SSH 로그인에 사용될 유저 이름이 root로 고정되어 있기 때문에 
default_user에 root를 입력했지만, 
만약 여러 사용자에 대해 허용할 것이라면 
valid_principals 항목을 따로 정의해서 사용할 수도 있음.
 
[ttl] 
CA가 사인한 키의 유효 기간을 의미함. 
위의 role을 통해 생성된 SSH 키는 5분동안만 유효함.
 
 

sign-policy.tf 파일 생성

path "ssh-client-signer/sign/my-role" {
  capabilities = ["update"]
}

 

정책 적용

vault policy write require-ssh-sign sign-policy.tf

 
 

Token 생성

vault token create -policy=require-ssh-sign
token 값 별도로 저장해놓아야함. (SSH-Client 작업에서 사용함.)

 
 
 
 

 
 
 

SSH-Server 작업

 
 

Vault server 접근 환경변수 설정

상위에서 작업한 vault server ip : 10.0.2.10
VAULT_TOKEN 값은 상위의 SSH-Server에서 key를 read할 수 있도록 정책 설정
에서 진행했던  "vault token create -policy=ssh-pubkey-read" 명령의
결과값으로 확인했던 Token 값을 사용.
export VAULT_ADDR=http://10.0.2.10:8200
export VAULT_TOKEN="s.blAM0osqXXcoNk36EHLe6KGL"

 

CA의 public Key를 받아온 뒤, ssh-server의 /etc/ssh/sshd_config에 설정

 

CA Public Key를 받아옴

vault read -field=public_key ssh-client-signer/config/ca > /etc/ssh/trusted-user-ca-keys.pem

 

SSH 설정

 
vi /etc/ssh/sshd_config
TrustedUserCAKeys /etc/ssh/trusted-user-ca-keys.pe
설정 추가

 
 

SSH 재기동

systemctl restart sshd
 
 
 
 

 
 

SSH-Client 작업

 
 

Vault server 접근 환경변수 설정

상위에서 작업한 vault server ip : 10.0.2.10
VAULT_TOKEN 값은 상위의 SSH-Client에서 Vault에 CA사인 요청할 수 있도록 설정
에서 진행했던  "vault token create -policy=require-ssh-sign" 명령의
결과값으로 확인했던 Token 값을 사용.
export VAULT_ADDR=http://10.0.2.10:8200
export VAULT_TOKEN="s.NS5NLxZAXYqSNiDI8XtSx2HU"

 
 

SSH key 생성

ssh-keygen
모두 enter로 넘어감

 
 

생성한 key를 Vault server에 사인 요청하고 응답 결과 key를 저장.

vault write -field=signed_key ssh-client-signer/sign/my-role \
  public_key=@/root/.ssh/id_rsa.pub > /root/.ssh/id_rsa-cert.pub

 
 
 

SSH-Client 에서 SSH-Server로 접속 확인

결과 정상 접속

 
vault server에서 
sign 유효 시간을 5분으로 설정함.
이를 test하기 위해 5분 뒤에 생성했던 id_rsa-cert.pub로 접속 시도해봄.

인증서 서명 유효기간이 만료되어 password로 접속 시도 하는 것을 확인 할 수 있음.

 

 

구성 완료.

 

 

반응형

'Tool 사용법 > SSH' 카테고리의 다른 글

SSH authorized_keys 파일 설정  (0) 2022.04.15
HashiCorp Vault Container로 실행  (0) 2022.04.07
AWS EC2 SSH  (0) 2022.01.27
SSH란?  (0) 2022.01.27