Em que ordem o OpenSSH testa chaves privadas?

4

Estou com dificuldades para encontrar os documentos adequados na ordem em que o cliente OpenSSH tenta chaves privadas para autenticação em um servidor, já que todos dos seguintes itens estão presentes:

  • arquivos-chave com nomes padrão em ~/.ssh , por exemplo ~/.ssh/id_rsa ,
  • arquivos-chave com nomes não padrão configurados para serem usados com um host específico por meio de ~/.ssh/config ,
  • chaves gerenciadas por ssh-agent .

Todos esses locais são sempre tentados (desde que o host corresponda a uma entrada em ~/.ssh/config ) e em qual ordem?

Histórico: tenho ~/.ssh/id_rsa , que só pode ser usado para autenticação no servidor A , e tenho outra chave gerenciada por ssh-agent que só pode ser usada para autenticação no servidor B . Ao tentar ssh para B , as autenticações falham, aparentemente porque apenas ~/.ssh/id_rsa é tentado. Não parece haver uma alternativa para tentar a chave gerenciada por ssh-agent .

    
por sschuberth 11.05.2017 / 22:24

2 respostas

6

I know about the -v, -vv etc. options, but I'd like to know before I try how ssh is going to behave. There must be a saner method to find out than trial and error.

Use a fonte, Luke!

O OpenSSH é de código aberto, portanto, em vez de tentativa de erro, você pode ler o código para entender melhor o que está acontecendo lá. ssh.c é um bom lugar para começar. Tem uma função load_public_identity_files(void) , que cuida disso. Em primeiro lugar, as chaves do PKCS # 11 (Smartcard, HSM) são usadas:

(nkeys = pkcs11_add_provider(options.pkcs11_provider, NULL,

e, em seguida, as chaves fornecidas por options.identity_files :

for (i = 0; i < options.num_identity_files; i++) {

Esta variável está definida em readconf.c :

if (options->num_identity_files == 0) {
    add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_RSA, 0);
    add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_DSA, 0);
#ifdef OPENSSL_HAS_ECC
    add_identity_file(options, "~/", _PATH_SSH_CLIENT_ID_ECDSA, 0);
#endif
    add_identity_file(options, "~/",
        _PATH_SSH_CLIENT_ID_ED25519, 0);
}

Os caminhos reais dos arquivos são definidos em pathnames.h :

#define _PATH_SSH_USER_DIR  ".ssh"
[...]
#define _PATH_SSH_CLIENT_ID_DSA     _PATH_SSH_USER_DIR "/id_dsa"
#define _PATH_SSH_CLIENT_ID_ECDSA   _PATH_SSH_USER_DIR "/id_ecdsa"
#define _PATH_SSH_CLIENT_ID_RSA     _PATH_SSH_USER_DIR "/id_rsa"
#define _PATH_SSH_CLIENT_ID_ED25519 _PATH_SSH_USER_DIR "/id_ed25519"

Para a questão de fundo:

É exatamente por isso que a opção IdentitiesOnly existe e por que você deve usá-la no ~/.ssh/config se tiver mais de uma chave para gerenciar. As identidades ssh-agent são usadas após as identidades padrão.

    
por 12.05.2017 / 09:46
1

Se você quiser ver como o cliente SSH tenta chaves privadas para autenticação em um servidor, você pode executá-lo com a opção -v.

No meu caso, parece que:

debug1: Trying private key: /Users/atolkachev/.ssh/id_rsa
debug1: Trying private key: /Users/atolkachev/.ssh/id_dsa
debug1: Trying private key: /Users/atolkachev/.ssh/id_ecdsa
debug1: Trying private key: /Users/atolkachev/.ssh/id_ed25519
    
por 11.05.2017 / 23:00