Conectando-se a um membro do pool sobre SSH com um certificado de host válido apenas para o nome do pool

1

Estou usando certificados OpenSSH para um pool de hosts. Ou seja, em ~/.ssh/known_hosts , há uma entrada que parece assim:

@cert-authority service.redacted.com ssh-rsa ...

... e service.redacted.com é uma entrada DNS round-robin para a qual cada sistema envolvido possui um certificado de host (consulte a entrada HostCertificate em man sshd_config ) assinado como válido para service.redacted.com .

Isso funciona perfeitamente quando se deseja conectar a um sistema selecionado aleatoriamente do pool - mas e se alguém quiser se conectar a um sistema único e específico do pool, validando sua chave de host como legítima usando a autoridade de certificação fornecida?

Uma coisa que tentei foi:

service_name=service.redacted.com
specific_host=1.2.3.4
ssh -v -oHostKeyAlias="$service_name" "$specific_host"

... o que resulta no seguinte:

debug1: Host 'service.redacted.com' is known and matches the RSA-CERT host certificate
Certificate invalid: name is not a listed principal
The authenticity of host 'service.redacted.com (1.2.3.4)' can't be established.

service.redacted.com certamente é uma entidade listada no certificado; 1.2.3.4 não é.

    
por Charles Duffy 19.02.2015 / 00:03

1 resposta

2

A partir do atual mestre portável do OpenSSH ( link ), isso não é possível.

A lógica relevante está na a função check_host_key () , que chama check_host_cert() apenas uma vez - com o nome do host que foi originalmente passado para ssh_login() modificado apenas pela normalização de todos os caracteres para minúsculas. Esse mesmo nome de host passou por resolve_host() para obter a estrutura addrinfo * usada para a conexão real; resolve_host() respeita algumas opções (selecionando a família de endereços a ser usada), mas, por outro lado, não fornece um mecanismo de substituição.

Dito isto, a alteração necessária é curta (presentemente submetida à lista de discussão do upstream e à revisão pendente):

From 367fd8323d864daaf486047850f93c2167c66f37 Mon Sep 17 00:00:00 2001
From: Charles Duffy <[email protected]>
Date: Tue, 17 Feb 2015 09:49:32 -0600
Subject: [PATCH] Allow HostKeyAlias to match a host certificate principal if
 HostName does not

---
 sshconnect.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/sshconnect.c b/sshconnect.c
index df921be..666c3ff 100644
--- a/sshconnect.c
+++ b/sshconnect.c
@@ -902,7 +902,8 @@ check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port,
                debug("Found %s in %s:%lu", want_cert ? "CA key" : "key",
                    host_found->file, host_found->line);
                if (want_cert && !check_host_cert(hostname, host_key))
-                       goto fail;
+                       if (options.host_key_alias == NULL || !check_host_cert(options.host_key_alias, host_key))
+                               goto fail;
                if (options.check_host_ip && ip_status == HOST_NEW) {
                        if (readonly || want_cert)
                                logit("%s host key for IP address "
--
2.0.0
    
por 19.02.2015 / 20:14

Tags