본문 바로가기

리눅스

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

반응형

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
반응형