리눅스

Vault를 사용하여 SSH CA 키를 관리하는 방법

변군이글루 2024. 7. 25. 21:15
반응형

Vault를 사용하여 SSH CA 키를 관리하는 방법

HashiCorp Vault를 사용하여 SSH PEM 키를 관리하는 것은 보안적으로 매우 유용하며 중앙 집중식으로 키를 관리하고 접근 제어를 강화할 수 있습니다.

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/
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.10.111:8200'
export VAULT_TOKEN="hvs.TpDlVyyfv7LPBad2NzYL3cmM"

영구적인 환경 변수 적용

echo -e "\n### VAULT ADDR, VAULT TOKEN" >> /etc/profile
echo -e "export VAULT_ADDR='http://192.168.10.111:8200'" >> /etc/profile
echo -e "export VAULT_TOKEN='hvs.TpDlVyyfv7LPBad2NzYL3cmM'\n" >> /etc/profile
source /etc/profile

---

  • 대상 SSH 서버는 Vault에서 발급된 CA 인증서를 신뢰하도록 설정해야 합니다. Vault에서 CA 공개 키를 추출합니다.
curl -fsSL http://127.0.0.1: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 서비스를 재시작합니다.

sudo systemctl restart sshd
728x90

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 version

환경 변수 적용

export VAULT_ADDR='http://192.168.10.111:8200'
export VAULT_TOKEN="hvs.TpDlVyyfv7LPBad2NzYL3cmM"

영구적인 환경 변수 적용

sudo bash -c 'cat << EOF >> /etc/profile

### VAULT ADDR, VAULT TOKEN
export VAULT_ADDR="http://192.168.10.111:8200"
export VAULT_TOKEN="hvs.TpDlVyyfv7LPBad2NzYL3cmM"
EOF'
sudo bash -c 'source /etc/profile'
  • 대상 SSH 서버는 Vault에서 발급된 CA 인증서를 신뢰하도록 설정해야 합니다. Vault에서 CA 공개 키를 추출합니다.
vault read -field=public_key ssh-client-signer/config/ca > /etc/ssh/trusted-CA.pem

또는

vault read -field=public_key ssh-client-signer/config/ca | sudo tee /etc/ssh/trusted-CA.pem > /dev/null

SSH 서버 설정 변경

  • SSH 서버의 sshd_config 파일을 수정하여 CA 키를 신뢰하도록 설정합니다.
echo "TrustedUserCAKeys /etc/ssh/trusted-CA.pem" | sudo tee -a /etc/ssh/sshd_config > /dev/null

설정을 적용하기 위해 SSH 서비스를 재시작합니다.

sudo systemctl restart sshd

SSH 키 생성

  • 생성된 SSH 키 파일(/home/ubuntu/.ssh/id_rsa 및 /home/ubuntu/.ssh/id_rsa.pub)을 Vault에 저장합니다.
su - ubuntu
ssh-keygen -t rsa -b 2048 -C "ubuntu@vault" -N ""

인증서 요청

  • 클라이언트는 자신의 공개 키를 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 example
    HostName example.com
    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.10.113

 

Vault를 사용하여 SSH PEM 키를 관리하고 OTP 기반 SSH 접근을 설정할 수 있습니다. 이를 통해 SSH 키 관리를 중앙집중화하고 보안을 강화할 수 있습니다.

 

참고URL

- hashicorp Documentation : Signed SSH certificates

 

 

728x90
반응형