Jenkins SSH 호스트/사용자 인증서 워크플로

Jenkins SSH 호스트/사용자 인증서 워크플로

일부 Ansible 단계가 실행될 때마다 SSH 키 서명 프로세스를 설정하는 방법은 무엇입니까? 아니면 적어도 어느 정도 간격을 두고 말이죠.

Terraform을 사용하여 VM을 생성한 다음 Ansible을 실행하는 파이프라인이 있습니다. cloud-init 단계에서는 호스트 키가 생성되고 서명되며 공개 사용자 CA 키가 구성됩니다. 클라이언트/호스트 CA 권한은 HashiCorp Vault에서 구성/실행됩니다. 따라서 이 시점에서는 어떤 VM이 프로비저닝되더라도 호스트 CA 공개 키가 @cert-authority *.example.com ecdsa-sha2-nistp521 AAAAB3NzaC1yc2EAAA...전역적으로 설정되어 있으므로 모든 VM에 SSH를 통해 연결할 수 있습니다 /etc/ssh/ssh_known_hosts. 내 TTL이 매우 짧기 때문에 내가 해야 할 일은 새 개인 키를 만들고 서명하는 것뿐입니다.

하지만 Jenkins에서는 이것이 작동하지 않습니다. Jenkins는 모든 SSH 키를 아래에 저장하며 /var/lib/jenkins/.ssh기본적으로 아무것도 없습니다. 테스트 목적으로 개인 사용자(또는 생성된) 키와 인증서 + SSH 구성 파일을 에 복사하면 /var/lib/jenkins/.sshJenkins가 Ansible을 원활하게 실행할 수 있습니다. 하지만 인프라 저장소에서 커밋을 수행할 때마다 젠킨스 키를 생성, 서명 및 복사할 수는 없습니다. 장수 인증서를 만드는 것도 좋은 냄새가 나지 않습니다.

SSH 키 서명 및 순환을 위한 관용적 자동화 워크플로우는 무엇입니까?

답변1

"나쁜" 솔루션을 직접 나열하겠습니다. 나쁜 점은 키 순환이 수동이고 우리가 게으르기 때문에 TTL이 길어질 가능성이 높기 때문입니다.

Vault에서 다음과 같은 TTL을 사용하여 새로운 "jenkins" SSH 역할을 생성해야 합니다.52w

그런 다음 이상적으로는 Jenkins 호스트 자체에서 새 키를 생성해야 합니다.

ssh-keygen -t ecdsa -b 521 -f /var/lib/jenkins/.ssh/id_ecdsa -C "jenkins@jenkins-01"

그런 다음 Vault에서 노래해

vault write -field=signed_key ssh-client-signer/sign/jenkinsrole public_key=/var/lib/jenkins/.ssh/id_ecdsa.pub > /var/lib/jenkins/.ssh/id_ecdsa-cert.pub

이는 Vault가 시스템에 있어야 함을 의미합니다. ... 딜레마입니다. 약간의 냄새가 나는 네트워크를 통해 SSH 키(개인 포함)를 복사하시겠습니까, 아니면 Jenkins 시스템에 Vault를 설치하시겠습니까? 그것은 당신에게 달려 있습니다.

인증서를 받은 후에는 id_ecdsa-cert.pub이를 검사하여 ssh-keygen -Lf /var/lib/jenkins/.ssh/id_ecdsa-cert.pub유효 기간, 주체 등을 확인할 수 있습니다.

인프라에 변동이 있을 가능성이 높으므로 SSH 구성을 정적으로 저장하는 것은 /var/lib/jenkins/.ssh/config어려울 것입니다.

ansible-ssh.cfg대신 다음 과 같은 내용으로 파일을 만들 수 있습니다 .

Host bastion
  HostName bastion.example.com
  IdentitiesOnly yes
  IdentityFile ~/.ssh/id_ecdsa
  CertificateFile ~/.ssh/id_ecdsa-cert.pub
  Port 22
  Protocol 2
  User ansible
  LogLevel INFO

이 파일은 나머지 Ansible 코드와 함께 위치할 수 있습니다(있어야 합니다).

그런 다음 파일에 ansible.cfgSSH 스탠자를 포함합니다.

[ssh_connection]
ssh_args = -F ./ansible-ssh.cfg

이런 식으로 Ansible은 항상 최신 SSH 구성을 선택합니다.

Terraform을 사용하는 경우 새 호스트와 포함하지 않는 호스트를 포함하도록 SSH 구성 파일을 동적으로 업데이트할 수 있습니다.

이 솔루션은 Vault에만 연결되어 있지 않습니다. 그 자체로 아주 쉽게 할 수 있습니다 ssh-keygen.

업데이트: 결국 나는 approle을 사용하여 인증을 수행한 다음 인증서에 서명하는 작은 쉘 스크립트로 끝났습니다. Systemd 서비스 및 타이머 장치는 매일 인증서 교체를 수행하는 쉘 스크립트를 실행합니다. 따라서 이 시점에서 Jenkins는 자체의 새로운 사용자 인증서를 사용하여 Terraform 및 Ansible을 실행합니다. https://stackoverflow.com/a/65875997/6651080

관련 정보