
Preciso configurar registros SSHFP no DNS do meu host. Fiz algumas pesquisas, mas não encontrei nenhum bom exemplo.
- O que são registros SSHFP?
- Como são os registros SSHFP?
- Como faço para criar registros SSHFP?
Responder1
O que são registros SSHFP?
Os registros SSHFP são registros DNS que contêm impressões digitais para chaves públicas usadas para SSH. Eles são usados principalmente com domínios habilitados para DNSSEC. Quando um cliente SSH se conecta a um servidor, ele verifica o registro SSHFP correspondente. Se a impressão digital dos registros corresponder aos servidores, o servidor é legítimo e é seguro conectar-se.
Como são os registros SSHFP?
Os registros SSHFP consistem em três coisas:
- Algoritmo de chave pública
- Tipo de impressão digital
- Impressão digital (em hexadecimal)
Algoritmo de chave pública
Existem cinco algoritmos diferentes definidos em SSHFPa partir de 2021. Cada algoritmo é representado por um número inteiro.Os algoritmos são:
- 1 – RSA
- 2 – DSA
- 3 – ECDSA
- 4 - Ed25519
- 6 - Ed448
Tipo de impressão digital
Dois tipos de impressão digital são definidos no SSHFPa partir de 2012. Cada tipo de impressão digital é representado por um número inteiro.Estes são:
- 1 - SHA-1
- 2-SHA-256
Como faço para gerar registros SSHFP?
Você pode usarssh-keygenlocalmente para gerar os registros usando o -r
parâmetro, seguido pelo nome do host (que não afeta as impressões digitais, então você pode especificar o que quiser).
Você pode usar ssh-keyscan para gerar registros para um servidor remoto usando o -D
parâmetro, seguido pelo nome do host.
Exemplo
Usando ssh-keygen
e CentOS:
[root@localhost ~]# ssh-keygen -r my.domain.com
my.domain.com IN SSHFP 1 1 450c7d19d5da9a3a5b7c19992d1fbde15d8dad34
my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4
Observação
Às vezes, ssh-keygen
solicitará a localização do certificado público. Se for solicitado, você terá que executar ssh-keygen
várias vezes e sempre especificar um certificado diferente para garantir a geração de todos os registros SSHFP necessários. Suas chaves públicas geralmente estão localizadas em /etc/ssh
.
Responder2
Não tenho certeza se ssh-keygen
funciona com chaves existentes. Caso contrário, você ainda pode montá-los facilmente em seu shell (que eu prefiro) e sem software sofisticado ou interfaces remotas.
Registros como os mencionados...
my.domain.com IN SSHFP 2 1 72d30d211ce8c464de2811e534de23b9be9b4dc4
...existe em 6 partes:
part 1: hostname
part 2: Usually "IN" for internet
part 3: "SSHFP", the RR name for type 44
part 4: RSA keys = "1"
DSA keys = "2"
ECDSA keys = "3"
Ed25519 keys = "4"
Ed448 keys = "6"
part 5: The algorithm type:
SHA-1 = "1"
SHA-256 = "2"
part 6: You can generate, for example:
$ awk '{print $2}' /etc/ssh/ssh_host_dsa_key.pub | \
openssl base64 -d -A | openssl sha1
Para utilizá-lo, coloque VerifyHostKeyDNS ask
a configuração do seu cliente SSH, geralmente ~/.ssh/config
.
Responder3
Versões mais antigas do ssh-keygen não geram todas as chaves disponíveis (por exemplo, não há suporte para ecdsa e sha256). Este script cria todos os registros para todas as chaves disponíveis em /etc/ssh/
:
#!/bin/bash
#
# Creates SSHFP Records for all available keys
#
HOST="${1-$(hostname -f)}"
if [[ "$1" == "-h" || "$1" == "--help" ]]
then
echo "Usage: sshfpgen <hostname>"
fi
if which openssl >/dev/null 2>&1
then
if ! which sha1sum >/dev/null 2>&1
then
sha1sum() {
openssl dgst -sha1 | grep -E -o "[0-9a-f]{40}"
}
fi
if ! which sha256sum >/dev/null 2>&1
then
sha256sum() {
openssl dgst -sha256 | grep -E -o "[0-9a-f]{64}"
}
fi
fi
for pubkey in /etc/ssh/ssh_host_*_key.pub /etc/ssh_host_*_key.pub
do
case "$(cut -d _ -f3 <<< "$pubkey")"
in
rsa)
echo "$HOST IN SSHFP 1 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum | cut -f 1 -d ' ')"
echo "$HOST IN SSHFP 1 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum | cut -f 1 -d ' ')"
;;
dsa)
echo "$HOST IN SSHFP 2 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum | cut -f 1 -d ' ')"
echo "$HOST IN SSHFP 2 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum | cut -f 1 -d ' ')"
;;
ecdsa)
echo "$HOST IN SSHFP 3 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum | cut -f 1 -d ' ')"
echo "$HOST IN SSHFP 3 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum | cut -f 1 -d ' ')"
;;
ed25519)
echo "$HOST IN SSHFP 4 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum | cut -f 1 -d ' ')"
echo "$HOST IN SSHFP 4 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum | cut -f 1 -d ' ')"
;;
ed448)
echo "$HOST IN SSHFP 6 1 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha1sum | cut -f 1 -d ' ')"
echo "$HOST IN SSHFP 6 2 $(cut -f2 -d ' ' "$pubkey" | base64 --decode | sha256sum | cut -f 1 -d ' ')"
;;
esac
done
Editar: Nova versão com PR de alex-dupuy com suporte *BSD.
Responder4
Se você usa o Puppet, facter
ele possui suporte integrado parasshfp
. Além disso, se você estiver usando o PuppetDB, poderá extrair facilmente essas informações para todos os seus hosts.
facter | grep -i sshfp
sshfp_dsa => SSHFP 2 1 e1a3e639d6dbd48d3964ebfb772d2d11f1065682
SSHFP 2 2 4f620ce2bc97d91ae5eff42fba621d65b677ab725f275f56b2abd1303c142b73
sshfp_rsa => SSHFP 1 1 a78351af371faf3f19533c3a4a9e967543d7d2f5
SSHFP 1 2 795943a6ee8b53c818cfef5781209e25a6eb4bc386813db60d3ff2c1569692fc