728x90
Hashicorp Vault를 사용하여 SSH CA(Certificate Authority)를 구성하고 SSH 서버와 SSH 클라이언트를 연동하는 방법
역할 | 호스트 이름 | 아이피 주소 | 비고 |
Vault 서버 | node211 | 192.168.0.212 | |
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/
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
728x90
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
728x90
'리눅스' 카테고리의 다른 글
우분투에서 Go 언어를 설치하는 방법 (0) | 2023.06.02 |
---|---|
Nginx에서 POST 데이터를 Nginx 로그에 기록하는 방법 (0) | 2023.06.02 |
[draft] 리눅스 플랫폼, 아키텍처, 시스템의 비트를 확인하는 방법 (0) | 2023.06.01 |
[draft] Vault SSH 플러그인을 설치하는 방법 (0) | 2023.06.01 |
[리눅스] httpie 명령어 (0) | 2023.05.31 |