Hashicorp Vault를 사용하여 SSH CA(Certificate Authority)를 구성하고 SSH 서버와 SSH 클라이언트를 연동하는 방법
HashiCorp Vault의 SSH Secret Engine (SSH CA) 기능을 활용하여 SSH 키를 중앙에서 관리하고, 인증서 기반 SSH 접속을 구성하는 방법입니다.
시스템 구성도
| 역할 | 호스트 이름 | 아이피 주소 | 비고 |
| Vault 서버 | node211 | 192.168.0.212 | SSH CA |
| SSH 서버 | node212 | 192.168.0.212 | 접속 대상 |
| 클라이언트 | node213 | 192.168.0.213 | 사용자 |
1. Vault 설치 및 기본 구성
필수 패키지 설치
sudo apt-get update && sudo apt-get install -y unzip jq
Vault 최신 버전 가져오기
LATEST_VERSION=$(curl -fsSL "https://api.github.com/repos/hashicorp/vault/releases/latest" | jq -r '.tag_name | ltrimstr("v")')
Vault 다운로드 및 설치
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/
vault version
rm -f LICENSE.txt vault_${LATEST_VERSION}.zip
Vault 설정
mkdir -p /etc/vault.d
Vault 설정 샘플(config.hcl)
vim /etc/vault.d/vault.hcl
ui = true
disable_mlock = true
storage "raft" {
path = "/opt/vault/data"
node_id = "<NODE 이름>" # 이 값을 각 서버에 맞게 조정
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
api_addr = "http://<서버_IP>:8200"
cluster_addr = "http://<서버_IP>:8201"
tee /etc/vault.d/vault.hcl <<EOF
ui = true
disable_mlock = true
storage "raft" {
path = "/opt/vault/data"
node_id = "node211"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = "true"
}
api_addr = "http://127.0.0.1:8200"
cluster_addr = "https://127.0.0.1:8201"
EOF
데이터 디렉토리 및 권한 설정
mkdir -p /opt/vault/data
sudo chown -R vault:vault /opt/vault/data
sudo chmod -R 750 /opt/vault/data
환경 변수
echo "VAULT_ADDR='http://127.0.0.1:8200'" | sudo tee /etc/vault.d/vault.env
Vault 서비스 기동 및 초기화
sudo systemctl daemon-reload
sudo systemctl --now enable vault
Vault 초기화
vault operator init | tee ~/vault_info.txt
$ vault operator init | tee ~/vault_info.txt
Unseal Key 1: 8e+pwVtblE9yA3lS9UY3/jm2nSvEeQTSELQTvUtUSbex
Unseal Key 2: 6ajPMxRn9CYC81MVNP9Fc8xX49vzR2Cm2zRjZohsVHC2
Unseal Key 3: SohdHqtp3wRpOjkVyRAGXU0KSaKQXKk2yI8MCo3vcHrR
Unseal Key 4: DpcpYHu8mSjzqfWe5fWe22ER04mkjpHcFIgJzbz6xy9Q
Unseal Key 5: +cyOQe1RIvR/C5/qHfKVOP6oXCIR2+4vQx0uSrvwvav1
Initial Root Token: hvs.PhEPK6pUQm6wjDP5y35wO7RG
Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.
Vault does not store the generated root key. Without at least 3 keys to
reconstruct the root key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.
환경 변수 설정
export VAULT_ADDR='http://127.0.0.1:8200'
export VAULT_TOKEN="hvs.cTqNmrjszzsoWEzP4xvLaq7X"
Vault 언실
vault operator unseal <Unseal Key>
vault operator unseal 8e+pwVtblE9yA3lS9UY3/jm2nSvEeQTSELQTvUtUSbex
vault operator unseal 6ajPMxRn9CYC81MVNP9Fc8xX49vzR2Cm2zRjZohsVHC2
vault operator unseal SohdHqtp3wRpOjkVyRAGXU0KSaKQXKk2yI8MCo3vcHrR
vault operator unseal DpcpYHu8mSjzqfWe5fWe22ER04mkjpHcFIgJzbz6xy9Q
vault operator unseal +cyOQe1RIvR/C5/qHfKVOP6oXCIR2+4vQx0uSrvwvav1
Vault 서버의 상태를 확인
vault status
Vault 서버에 로그인
vault login <root_token>
vault login hvs.PhEPK6pUQm6wjDP5y35wO7RG
vault operator members
Vault에서 SSH CA 구성(node211)
SSH Secret Engine 활성화
- SSH Secret Engine을 활성화합니다
vault secrets enable -path=ssh-client-signer ssh
SSH CA 키 생성
- SSH CA 키 쌍을 생성합니다.
vault write ssh-client-signer/config/ca generate_signing_key=true
Role 생성
- 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 read ssh-client-signer/roles/my-role
2. SSH 서버와 클라이언트 구성
SSH 서버 구성(node212, node213)
SSH 서버의 CA 공개 키 가져오기
- CA 공개 키를 가져옵니다.
vault read -field=public_key ssh-client-signer/config/ca > /etc/ssh/trusted-CA.pem
- 또는
curl -fsSL http://192.168.0.211:8200/v1/ssh-client-signer/public_key -o /etc/ssh/trusted-CA.pem
SSH 서버 설정
- SSH 서버 설정 파일 (/etc/ssh/sshd_config)을 편집합니다.
echo "TrustedUserCAKeys /etc/ssh/trusted-CA.pem" | sudo tee -a /etc/ssh/sshd_config > /dev/null
SSH 서버 재시작
- SSH 서버를 재시작합니다.
sudo systemctl restart sshd
SSH 클라이언트 구성(node213)
환경 변수 설정
- 영구 적용
sudo bash -c 'cat << EOF >> /etc/profile
### VAULT ADDR, VAULT TOKEN
export VAULT_ADDR="http://192.168.0.211:8200"
export VAULT_TOKEN="hvs.PhEPK6pUQm6wjDP5y35wO7RG"
EOF'
sudo bash -c 'source /etc/profile'
- 임시 적용
export VAULT_ADDR="http://192.168.0.211:8200"
export VAULT_TOKEN="hvs.PhEPK6pUQm6wjDP5y35wO7RG"
인증서 요청
- SSH 클라이언트에서 인증서를 요청합니다. 이는 Vault에서 인증서를 발급받는 과정입니다.
su - ubuntu
ssh-keygen -t rsa -b 2048 -C "ubuntu@vault" -N ""
vault login hvs.PhEPK6pUQm6wjDP5y35wO7RG
vault write ssh-client-signer/sign/my-role \
public_key=@$HOME/.ssh/id_rsa.pub \
valid_principals="ubuntu"
- Vault는 인증서를 발급하고 이를 클라이언트로 반환합니다. 반환된 인증서를 파일로 저장합니다.
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 클라이언트 설정 파일 (~/.ssh/config)을 편집하여 인증서 파일을 사용하도록 설정합니다.
vim ~/.ssh/config
Host 192.168.0.212
HostName node212
User ubuntu
IdentityFile ~/.ssh/id_rsa
CertificateFile ~/.ssh/signed-cert.pub
SSH 연결 테스트
- SSH 서버에 연결을 시도하여 올바르게 설정되었는지 확인합니다.
ssh -i ~/.ssh/signed-cert.pub -i ~/.ssh/id_rsa ubuntu@192.168.0.212
ubuntu@node213:~$ ssh -i ~/.ssh/signed-cert.pub -i ~/.ssh/id_rsa ubuntu@192.168.0.212
Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.0-117-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Mon Jul 29 10:11:31 AM KST 2024
System load: 0.07861328125 Processes: 133
Usage of /: 10.7% of 78.96GB Users logged in: 1
Memory usage: 6% IPv4 address for enp0s3: 192.168.0.212
Swap usage: 0%
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
* Introducing Expanded Security Maintenance for Applications.
Receive updates to over 25,000 software packages with your
Ubuntu Pro subscription. Free for personal use.
https://ubuntu.com/pro
Expanded Security Maintenance for Applications is not enabled.
0 updates can be applied immediately.
Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
Last login: Mon Jul 29 09:03:54 2024 from 192.168.0.2
ubuntu@node212:~$
HashiCorp Vault를 사용하여 SSH CA를 설정하고 SSH 서버와 클라이언트를 연동할 수 있습니다. 이를 통해 SSH 키 관리의 보안성을 높이고 관리의 복잡성을 줄일 수 있습니다.
참고URL
- hashicorp Documentation : Signed SSH certificates
'리눅스' 카테고리의 다른 글
| [draft] Zabbix에서 그래프에 한글이 깨지는 문제를 해결하는 방법 (0) | 2026.02.18 |
|---|---|
| [draft] command 명령어 (0) | 2026.02.18 |
| [draft] jq 명령어 (0) | 2026.02.18 |
| [draft] CentOS 7에서 Apache를 소스 코드로 설치하고 HTTP/2를 활성화하는 방법 (0) | 2026.02.18 |
| [draft] Zabbix를 사용하여 syslog(messages) 로그 파일을 모니터링하는 방법 (0) | 2026.02.18 |