Vault를 사용하여 SSH CA 키를 관리하는 방법
HashiCorp Vault를 사용하여 SSH PEM 키를 관리하는 것은 보안적으로 매우 유용하며 중앙 집중식으로 키를 관리하고 접근 제어를 강화할 수 있습니다.
역할 | 호스트 이름 | 아이피 주소 | 비고 |
Vault 서버 | node211 | 192.168.0.211 | |
Vault 서버 | node212 | 192.168.0.212 | |
Vault 서버, SSH 서버 | node213 | 192.168.0.213 | |
클라이언트 | node214 | 192.168.0.214 |
1. Vault 설치 및 초기화
Vault 설치
- Vault를 설치합니다.
sudo apt-get install vault
Vault 초기화
- Vault 서버를 초기화하고 마스터 키를 백업합니다.
vault operator init | tee ~/vault_info.txt
Vault 언실
- 서버를 언실합니다. 여러 개의 언실 키를 사용하는 것이 일반적입니다.
vault operator unseal <unseal_key>
로그인
- 초기 루트 토큰을 사용하여 Vault에 로그인합니다.
vault login <root_token>
2. Vault SSH 플러그인 활성화
Vault의 SSH 기능을 사용하기 위해서는 SSH 엔진을 활성화해야 합니다. 이 엔진을 사용하면 SSH 키를 동적으로 생성하고 관리할 수 있습니다.
vault secrets enable -path=ssh-client-signer ssh
$ vault secrets enable -path=ssh-client-signer ssh
Success! Enabled the ssh secrets engine at: ssh-client-signer/
secrets 엔진 목록 확인
vault secrets list
3. SSH CA 키 생성
Vault에서 CA 키를 생성하고 저장합니다. CA 키를 생성하고 ssh/ca 경로에 저장합니다.
vault write ssh-client-signer/config/ca generate_signing_key=true
$ vault write ssh-client-signer/config/ca generate_signing_key=true
Key Value
--- -----
public_key ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfz/JhOMX1JHJ+Xw
4. SSH CA 역할 생성
SSH CA 역할을 생성하여 인증서 발급 정책을 설정합니다. my-role은 생성할 역할의 이름입니다.
vault write ssh-client-signer/roles/my-role -<<"EOH"
{
"algorithm_signer": "rsa-sha2-256",
"allow_user_certificates": true,
"allowed_users": "*",
"allowed_extensions": "permit-pty,permit-port-forwarding",
"default_extensions": {
"permit-pty": ""
},
"key_type": "ca",
"default_user": "ubuntu",
"ttl": "30m0s"
}
EOH
$ vault write ssh-client-signer/roles/my-role -<<"EOH"
{
"algorithm_signer": "rsa-sha2-256",
"allow_user_certificates": true,
"allowed_users": "*",
"allowed_extensions": "permit-pty,permit-port-forwarding",
"default_extensions": {
"permit-pty": ""
},
"key_type": "ca",
"default_user": "ubuntu",
"ttl": "30m0s"
}
EOH
Success! Data written to: ssh-client-signer/roles/my-role
5. 대상 서버 설정(SSH Server 설정)
---
환경 변수 적용
export VAULT_ADDR='http://192.168.0.211:8200'
export VAULT_TOKEN="hvs.tpD0q9s6BPtqOIfTN5ngSFWi"
영구적인 환경 변수 적용
echo -e "\n### VAULT ADDR, VAULT TOKEN" >> /etc/profile
echo -e "export VAULT_ADDR='http://192.168.0.211:8200'" >> /etc/profile
echo -e "export VAULT_TOKEN='hvs.tpD0q9s6BPtqOIfTN5ngSFWi'\n" >> /etc/profile
source /etc/profile
---
Vault에서 CA 공개 키 추출
- 대상 SSH 서버는 Vault에서 발급된 CA 인증서를 신뢰하도록 설정해야 합니다.
curl -fsSL http://192.168.0.211:8200/v1/ssh-client-signer/public_key -o /etc/ssh/trusted-CA.pem
SSH 서버 설정 변경
- SSH 서버의 sshd_config 파일을 수정하여 CA 키를 신뢰하도록 설정합니다.
echo "TrustedUserCAKeys /etc/ssh/trusted-CA.pem" | sudo tee -a /etc/ssh/sshd_config > /dev/null
SSH 서비스 재시작
- 설정을 적용하기 위해 SSH 서비스를 재시작합니다.
sudo systemctl restart sshd
6. 클라이언트 설정(SSH 클라이언트 설정)
최신 버전의 Vault를 바이너리로 설치
sudo apt-get update && sudo apt-get install -y unzip jq
LATEST_VERSION=$(curl -fsSL "https://api.github.com/repos/hashicorp/vault/releases/latest" | jq -r '.tag_name | ltrimstr("v")')
curl -fsSL https://releases.hashicorp.com/vault/${LATEST_VERSION}/vault_${LATEST_VERSION}_linux_amd64.zip -o vault_${LATEST_VERSION}.zip
unzip -q vault_${LATEST_VERSION}.zip
sudo mv vault /usr/local/bin/
rm -f LICENSE.txt vault_${LATEST_VERSION}.zip
Vault 버전 확인
vault version
환경 변수 설정
export VAULT_ADDR='http://192.168.0.211:8200'
export VAULT_TOKEN="hvs.tpD0q9s6BPtqOIfTN5ngSFWi"
환경 변수 설정 파일에 추가
sudo bash -c 'cat << EOF >> /etc/profile
### VAULT ADDR, VAULT TOKEN
export VAULT_ADDR="http://192.168.0.211:8200"
export VAULT_TOKEN="hvs.tpD0q9s6BPtqOIfTN5ngSFWi"
EOF'
sudo bash -c 'source /etc/profile'
Vault에서 CA 공개 키 추출
- 대상 SSH 서버는 Vault에서 발급된 CA 인증서를 신뢰하도록 설정해야 합니다.
curl -fsSL http://192.168.0.211:8200/v1/ssh-client-signer/public_key -o /etc/ssh/trusted-CA.pem
- 또는
vault read -field=public_key ssh-client-signer/config/ca | sudo tee /etc/ssh/trusted-CA.pem > /dev/null
Vault 로그인
vault login hvs.tpD0q9s6BPtqOIfTN5ngSFWi
SSH 서버 설정 변경
- SSH 서버의 sshd_config 파일을 수정하여 CA 키를 신뢰하도록 설정합니다.
echo "TrustedUserCAKeys /etc/ssh/trusted-CA.pem" | sudo tee -a /etc/ssh/sshd_config > /dev/null
SSH 서비스 재시작
- 설정을 적용하기 위해 SSH 서비스를 재시작합니다.
sudo systemctl restart sshd
SSH 키 생성
- 생성된 SSH 키 파일(/home/ubuntu/.ssh/id_rsa 및 /home/ubuntu/.ssh/id_rsa.pub)을 Vault에 저장합니다.
Ubuntu 사용자로 전환
su - ubuntu
SSH 키 생성
ssh-keygen -t rsa -b 2048 -C "ubuntu@vault" -N ""
환경 변수 적용
export VAULT_ADDR='http://192.168.0.211:8200'
export VAULT_TOKEN="hvs.tpD0q9s6BPtqOIfTN5ngSFWi"
Vault 로그인
vault login hvs.tpD0q9s6BPtqOIfTN5ngSFWi
SSH 키 서명 요청
- 클라이언트는 자신의 공개 키를 Vault에 제출하여 인증서를 요청할 수 있습니다. my-role은 위에서 설정한 역할 이름이고 public_key는 사용자의 공개 키입니다.
vault write ssh-client-signer/sign/my-role \
public_key=@$HOME/.ssh/id_rsa.pub \
valid_principals="ubuntu"
$ vault write ssh-client-signer/sign/my-role \
public_key=@$HOME/.ssh/id_rsa.pub \
valid_principals="ubuntu"
Key Value
--- -----
serial_number 66d4c243ad30383e
signed_key ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5
서명된 키 저장
- 발급된 인증서를 클라이언트의 SSH 키 디렉터리에 저장합니다. 예를 들어, id_rsa-cert.pub 파일을 저장할 수 있습니다.
vault write -field=signed_key ssh-client-signer/sign/my-role \
public_key=@$HOME/.ssh/id_rsa.pub > $HOME/.ssh/signed-cert.pub
chmod 644 $HOME/.ssh/signed-cert.pub
서명된 인증서 정보 확인
ssh-keygen -Lf ~/.ssh/signed-cert.pub
SSH 클라이언트 설정
- 클라이언트 측에서 ~/.ssh/config 파일을 설정하여 인증서 기반 인증을 사용하도록 합니다.
vim ~/.ssh/config
Host 192.168.0.213
HostName node213
User ubuntu
IdentityFile ~/.ssh/id_rsa
CertificateFile ~/.ssh/signed-cert.pub
SSH 접속 검증
ssh -i ~/.ssh/signed-cert.pub -i ~/.ssh/id_rsa ubuntu@192.168.0.213
Vault를 사용하여 SSH PEM 키를 관리하고 OTP 기반 SSH 접근을 설정할 수 있습니다. 이를 통해 SSH 키 관리를 중앙집중화하고 보안을 강화할 수 있습니다.
참고URL
- hashicorp Documentation : Signed SSH certificates
- hashicorp Documentation : Vault HA cluster with integrated storage
'리눅스' 카테고리의 다른 글
[draft] 우분투에서 cfssl와 cfssljson을 최신 버전으로 설치하는 방법 (0) | 2024.07.29 |
---|---|
[draft] 우분투에서 APT 패키지 매니저를 사용하여 etcd를 설치하는 방법 (0) | 2024.07.29 |
[draft] 우분투에서 사용자별 용량 제한을 설정하고 사용하는 방법 (0) | 2024.07.28 |
[draft] Vault 클러스터를 Consul을 백엔드 스토리지로 사용하여 구성하는 방법 (1) | 2024.07.25 |
[draft] 우분투에 HashiCorp Vault를 설치하고 클러스터를 구성하는 방법 (0) | 2024.07.24 |