본문 바로가기

리눅스

[draft] Hashicorp Vault를 사용하여 SSH CA를 구성하고 SSH 서버와 SSH 클라이언트를 연동하는 방법

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