반응형
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 -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 |