
Agente SSH che crea e gestisce chiavi sigillate TPM per l'autenticazione vincolata all'hardware, supportando generazione, importazione, wrapping, protezione tramite PIN e fallback proxy.
ssh-tpm-agent è un agente compatibile con ssh-agent che consente di creare chiavi
tramite il Trusted Platform Module (TPM) per l'autenticazione verso server SSH.
Le chiavi sigillate dal TPM sono chiavi private create all'interno del Trusted Platform Module
(TPM) e sigillate in file con suffisso .tpm. Sono legate all'hardware su cui
vengono prodotte e non possono essere trasferite ad altre macchine.
Ciò consente di utilizzare un client nativo invece di dover caricare lateralmente librerie PKCS11 esistenti nell'ssh-agent e/o nel client ssh.
Il progetto utilizza TPM 2.0 Key Files
implementati tramite il progetto go-tpm-keyfiles.
ssh-agent funzionante.ssh-agent per fallback.Invece di utilizzare direttamente il TPM, puoi usare --swtpm o export SSH_TPM_AGENT_SWTPM=1 per creare un'identità basata su
swtpm che verrà archiviata in
/var/tmp/ssh-tpm-agent.
Nota che swtpm non fornisce alcuna proprietà di sicurezza e dovrebbe essere usato solo per
test.
Il modo più semplice per installare questo plugin è eseguire il seguente comando:
go install github.com/foxboron/ssh-tpm-agent/cmd/...@latest
In alternativa, scarica i binari precompilati.
# Crea chiave
$ ssh-tpm-keygen
Generazione di una coppia di chiavi ecdsa pubblica/privata sigillata.
Inserisci il file in cui salvare la chiave (/home/fox/.ssh/id_ecdsa):
Inserisci la passphrase (vuota per nessuna passphrase):
Inserisci di nuovo la stessa passphrase:
La tua identificazione è stata salvata in /home/fox/.ssh/id_ecdsa.tpm
La tua chiave pubblica è stata salvata in /home/fox/.ssh/id_ecdsa.pub
L'impronta della chiave è:
SHA256:NCMJJ2La+q5tGcngQUQvEOJP3gPH8bMP98wJOEMV564
L'immagine randomart della chiave è il colore della televisione, sintonizzata su un canale morto.
$ cat /home/fox/.ssh/id_ecdsa.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOTOsMXyjTc1wiQSKhRiNhKFsHJNLzLk2r4foXPLQYKR0tuXIBMTQuMmc7OiTgNMvIjMrcb9adgGdT3s+GkNi1g=
# Utilizzo del socket
$ ssh-tpm-agent -l /var/tmp/tpm.sock
$ export SSH_AUTH_SOCK="$(ssh-tpm-agent --print-socket)"
$ ssh [email protected]
Nota: Per ssh-tpm-agent puoi specificare la password del proprietario del TPM usando i
flag della riga di comando -o o --owner-password, che sono preferiti.
In alternativa, puoi usare la variabile d'ambiente
SSH_TPM_AGENT_OWNER_PASSWORD.
Utile se vuoi eseguire il backup della chiave in un archivio remoto sicuro mentre la usi quotidianamente dal TPM.
# Crea una chiave, o usane una esistente
$ ssh-keygen -t ecdsa -f id_ecdsa
Generazione di una coppia di chiavi ecdsa pubblica/privata.
Inserisci la passphrase (vuota per nessuna passphrase):
Inserisci di nuovo la stessa passphrase:
La tua identificazione è stata salvata in id_ecdsa
La tua chiave pubblica è stata salvata in id_ecdsa.pub
L'impronta della chiave è:
SHA256:bDn2EpX6XRX5ADXQSuTq+uUyia/eV3Z6MW+UtxjnXvU fox@framework
L'immagine randomart della chiave è:
+---[ECDSA 256]---+
| .+=o..|
| o. oo.|
| o... .o|
| . + .. ..|
| S . . o|
| o * . oo=*|
| ..+.oo=+E|
| .++o...o=|
| .++++. .+ |
+----[SHA256]-----+
# Importa la chiave
$ ssh-tpm-keygen --import id_ecdsa
Sigillatura di una coppia di chiavi ecdsa pubblica/privata esistente.
Inserisci la passphrase (vuota per nessuna passphrase):
Inserisci di nuovo la stessa passphrase:
La tua identificazione è stata salvata in id_ecdsa.tpm
L'impronta della chiave è:
SHA256:bDn2EpX6XRX5ADXQSuTq+uUyia/eV3Z6MW+UtxjnXvU
L'immagine randomart della chiave è il colore della televisione, sintonizzata su un canale morto.
I servizi attivati tramite socket consentono di avviare ssh-tpm-agent quando necessario per il tuo sistema.
# Utilizzo del socket
$ ssh-tpm-agent --install-user-units
Installato /home/fox/.config/systemd/user/ssh-tpm-agent.socket
Installato /home/fox/.config/systemd/user/ssh-tpm-agent.service
Abilita con: systemctl --user enable --now ssh-tpm-agent.socket
$ systemctl --user enable --now ssh-tpm-agent.socket
$ export SSH_AUTH_SOCK="$(ssh-tpm-agent --print-socket)"
$ ssh [email protected]
# Avvia il solito ssh-agent
$ eval $(ssh-agent)
# Crea una chiave RSA forte
$ ssh-keygen -t rsa -b 4096 -f id_rsa -C ssh-agent
...
L'impronta della chiave è:
SHA256:zLSeyU/6NKHGEvyZLA866S1jGqwdwdAxRFff8Z2N1i0 ssh-agent
$ ssh-add id_rsa
Identità aggiunta: id_rsa (ssh-agent)
# Stampa la chiave looooonnnga
$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc[...]8TWynQ== ssh-agent
# Crea chiave sul TPM
$ ssh-tpm-keygen -C ssh-tpm-agent
Generazione di una coppia di chiavi ecdsa pubblica/privata sigillata.
Inserisci il file in cui salvare la chiave (/home/fox/.ssh/id_ecdsa):
Inserisci la passphrase (vuota per nessuna passphrase):
Conferma passphrase:
La tua identificazione è stata salvata in /home/fox/.ssh/id_ecdsa.tpm
La tua chiave pubblica è stata salvata in /home/fox/.ssh/id_ecdsa.pub
L'impronta della chiave è:
SHA256:PoQyuzOpEBLqT+xtP0dnvyBVL6UQTiQeCWN/EXIxPOo
L'immagine randomart della chiave è il colore della televisione, sintonizzata su un canale morto.
# Avvia ssh-tpm-agent con un socket proxy
$ ssh-tpm-agent -A "${SSH_AUTH_SOCK}" &
$ export SSH_AUTH_SOCK="$(ssh-tpm-agent --print-socket)"
# ssh-tpm-agent sta facendo da proxy per le chiavi da ssh-agent
$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc[...]8TWynQ== ssh-agent
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNo[...]q4whro= ssh-tpm-agent
$ ssh-tpm-agent --no-load &
2023/08/12 13:40:50 In ascolto su /run/user/1000/ssh-tpm-agent.sock
$ export SSH_AUTH_SOCK="$(ssh-tpm-agent --print-socket)"
$ ssh-add -L
L'agente non ha identità.
$ ssh-tpm-add $HOME/.ssh/id_ecdsa.tpm
Identità aggiunta: /home/user/.ssh/id_ecdsa.tpm
$ ssh-add -L
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJCxqisGa9IUNh4Ik3kwihrDouxP7S5Oun2hnzTvFwktszaibJruKLJMxHqVYnNwKD9DegCNwUN1qXCI/UOwaSY= test
Sul lato client crea una chiave primaria sotto una gerarchia. Questo esempio utilizzerà la gerarchia del proprietario con un SRK.
Il file di output srk.pem deve essere trasferito all'estremità remota che
crea la chiave. Questo potrebbe essere fatto come parte del provisioning del client.
$ tpm2_createprimary -C o -G ecc -g sha256 -c prim.ctx -a 'restricted|decrypt|fixedtpm|fixedparent|sensitivedataorigin|userwithauth|noda' -f pem -o srk.pem
Sull'estremità remota creiamo una chiave ssh p256, senza password, e la impacchettiamo con
ssh-tpm-keygen usando il srk.pem dal lato client.
$ ssh-keygen -t ecdsa -b 256 -N "" -f ./ecdsa.key
# OPPURE con openssl
$ openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:prime256v1 -out ecdsa.key
# Impacchetta con ssh-tpm-keygen
$ ssh-tpm-keygen --wrap-with srk.pub --wrap ecdsa.key -f wrapped_id_ecdsa
Sul lato client possiamo spacchettare wrapped_id_ecdsa in una chiave caricabile.
$ ssh-tpm-keygen --import ./wrapped_id_ecdsa.tpm -f id_ecdsa.tpm
$ ssh-tpm-add id_ecdsa.tpm
ssh-tpm-agent supporta anche l'archiviazione delle chiavi host all'interno del TPM.
$ sudo ssh-tpm-keygen -A
2023/09/03 17:03:08 INFO Generazione di una nuova chiave host ECDSA
2023/09/03 17:03:08 INFO Scritto /etc/ssh/ssh_tpm_host_ecdsa_key.tpm
2023/09/03 17:03:08 INFO Generazione di una nuova chiave host RSA
2023/09/03 17:03:15 INFO Scritto /etc/ssh/ssh_tpm_host_rsa_key.tpm
$ sudo ssh-tpm-hostkeys --install-system-units
Installato /usr/lib/systemd/system/ssh-tpm-agent.service
Installato /usr/lib/systemd/system/ssh-tpm-agent.socket
Installato /usr/lib/systemd/system/ssh-tpm-genkeys.service
Abilita con: systemctl enable --now ssh-tpm-agent.socket
$ sudo ssh-tpm-hostkeys --install-sshd-config
Installato /etc/ssh/sshd_config.d/10-ssh-tpm-agent.conf
Riavvia sshd: systemd restart sshd
$ systemctl enable --now ssh-tpm-agent.socket
$ systemd restart sshd
$ sudo ssh-tpm-hostkeys
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCLDH2xMDIGb26Q3Fa/kZDuPvzLzfAH6CkNs0wlaY2AaiZT2qJkWI05lMDm+mf+wmDhhgQlkJAHmyqgzYNwqWY0= root@framework
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAoMPsv5tEpTDFw34ltkF45dTHAPl4aLu6HigBkNnIzsuWqJxhjN6JK3vaV3eXBzy8/UJxo/R0Ml9/DRzFK8cccdIRT1KQtg8xIikRReZ0usdeqTC+wLpW/KQqgBLZ1PphRINxABWReqlnbtPVBfj6wKlCVNLEuTfzi1oAMj3KXOBDcTTB2UBLcwvTFg6YnbTjrpxY83Y+3QIZNPwYqd7r6k+e/ncUl4zgCvvxhoojGxEM3pjQIaZ0Him0yT6OGmCGFa7XIRKxwBSv9HtyHf5psgI+X5A2NV2JW2xeLhV2K1+UXmKW4aXjBWKSO08lPSWZ6/5jQTGN1Jg3fLQKSe7f root@framework
$ ssh-keyscan -t ecdsa localhost
# localhost:22 SSH-2.0-OpenSSH_9.4
localhost ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCLDH2xMDIGb26Q3Fa/kZDuPvzLzfAH6CkNs0wlaY2AaiZT2qJkWI05lMDm+mf+wmDhhgQlkJAHmyqgzYNwqWY0=
È possibile utilizzare le chiavi pubbliche create da ssh-tpm-keygen all'interno delle configurazioni
ssh.
L'esempio seguente utilizza ssh-tpm-agent e passa anche la chiave pubblica per garantire
che non tutte le identità vengano divulgate dall'agente.
Host example.com
IdentityAgent $SSH_AUTH_SOCK
Host *
IdentityAgent /run/user/1000/ssh-tpm-agent.sock
IdentityFile ~/.ssh/id_ecdsa.pub
Concesso in licenza con la licenza MIT. Vedi LICENSE o https://opensource.org/licenses/MIT