Jenkins SSH ホスト/ユーザー証明書ワークフロー

Jenkins SSH ホスト/ユーザー証明書ワークフロー

Ansible ステージが実行されるたびに、または少なくとも一定の間隔で SSH キー署名プロセスを設定する方法。

Terraform を使用して VM を作成し、Ansible を実行するパイプラインがあります。cloud-init ステージでは、ホスト キーが作成および署名され、公開ユーザー CA キーが構成されます。クライアント/ホスト CA 機関は、HashiCorp Vault で構成/実行されます。したがって、この時点では、ホスト CA 公開キーがグローバル@cert-authority *.example.com ecdsa-sha2-nistp521 AAAAB3NzaC1yc2EAAA...に設定されているため、プロビジョニングされている VM に関係なく、すべての VM に SSH 接続できます/etc/ssh/ssh_known_hosts。TTL が非常に短いため、必要なのは新しい個人キーを作成して署名することだけです。

しかし、これは Jenkins では機能しません。Jenkins はすべての SSH キーを に保存します/var/lib/jenkins/.sshが、デフォルトでは何もありません。テスト目的のためだけに、個人のユーザー (または生成した) キーと証明書 + SSH 構成ファイルを にコピーすると/var/lib/jenkins/.ssh、Jenkins は Ansible を問題なく実行できます。しかし、インフラ リポジトリでコミットするたびに Jenkins キーを生成、署名、コピーすることはできません。長期間有効な証明書を作成するのも、良いことではありません。

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.cfgファイルにSSHスタンザを含めます

[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

関連情報