Login SSH via IPv6 bem-sucedido durante o uso do IPv4 para o mesmo host gera “Permissão negada”

5

Atualmente estou perplexo com um problema estranho ... Eu tenho um host de pilha dupla para o qual eu quero SSH. Se eu me conectar via IPv6, tudo funciona como esperado

datenwolf@foo ~/ > ssh -6 bar.example.com
Password:

datenwolf@bar ~/ >

No entanto, ao fazer o mesmo via IPv4, ele falha

datenwolf@foo ~/ > ssh -4 bar.example.com
Password:
Permission denied (publickey,keyboard-interactive).

datenwolf@foo ~/ >

Trecho de /var/log/sshd para o login com falha

Apr 24 16:34:03 [sshd] SSH: Server;Ltype: Version;Remote: www.xxx.yyy.zzz-38427;Protocol: 2.0;Client: OpenSSH_5.9p1 Debian-5ubuntu1
Apr 24 16:34:03 [sshd] SSH: Server;Ltype: Kex;Remote: www.xxx.yyy.zzz-38427;Enc: aes128-ctr;MAC: hmac-md5;Comp: none [preauth]
Apr 24 16:34:04 [sshd] SSH: Server;Ltype: Authname;Remote: www.xxx.yyy.zzz-38427;Name: wolfgangd [preauth]
Apr 24 16:34:07 [sshd] pam_access(sshd:account): access denied for user 'datenwolf' from 'foo.example.com'
Apr 24 16:34:07 [sshd] error: PAM: User account has expired for datenwolf from foo.example.com
Apr 24 16:34:07 [sshd] Connection closed by www.xxx.yyy.zzz [preauth]

É claro que a conta não expirou e eu posso logar perfeitamente via IPv6. Usando o Google, encontrei vários relatórios sobre as mensagens de log, mas nenhum deles correspondia ao meu problema (no sentido de que a aplicação das soluções propostas não funcionou no meu caso).

Estou praticamente sem ideias aqui.

Atualizar

/var/log/sshd para login IPv6 bem-sucedido na mesma máquina de destino :

Apr 24 16:56:42 [sshd] SSH: Server;Ltype: Version;Remote: 2001:x:x:x:x:x:x:x-46025;Protocol: 2.0;Client: OpenSSH_5.9p1 Debian-5ubuntu1
Apr 24 16:56:42 [sshd] SSH: Server;Ltype: Kex;Remote: 2001:x:x:x:x:x:x:x-46025;Enc: aes128-ctr;MAC: hmac-md5;Comp: none [preauth]
Apr 24 16:56:43 [sshd] SSH: Server;Ltype: Authname;Remote: 2001:x:x:x:x:x:x:x-46025;Name: datenwolf [preauth]
Apr 24 16:56:47 [sshd] Accepted keyboard-interactive/pam for datenwolf from 2001:x:x:x:x:x:x:x port 46025 ssh2
Apr 24 16:56:47 [sshd] pam_unix(sshd:session): session opened for user datenwolf by (uid=0)

Eu tentei fazer login de várias máquinas com o mesmo resultado: o IPv6 funciona, o IPv4 não.

Atualização 2

Para referência, estas são as tabelas de IP usadas. Note que estes são testados em batalha , isto é, eles estão em uso há vários anos e não foram alterados recentemente. Login remoto via IPv4 fez trabalhar com eles.

iptables IPv4:

Chain INPUT (policy ACCEPT 2144 packets, 336K bytes)
 pkts bytes target     prot opt in     out     source               destination         
  132 20762 fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
  12M   14G ACCEPT     all  --  ppp0   *       0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
 3111 95984 ACCEPT     icmp --  ppp0   *       0.0.0.0/0            0.0.0.0/0           
18692 1123K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:22
    2   112 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:1194
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:1194
 4633  288K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpts:6880:6899
 2826  154K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpts:6880:6899
    4   160 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:123
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:123
44165 3069K REJECT     all  --  ppp0   *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT 48032 packets, 44M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:631 reject-with icmp-port-unreachable
    0     0 REJECT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:515 reject-with icmp-port-unreachable
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:631 reject-with icmp-port-unreachable
    0     0 REJECT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:515 reject-with icmp-port-unreachable
    0     0 REJECT     all  --  ppp0   ppp0    0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
 133K 8347K TCPMSS     tcp  --  *      ppp0    0.0.0.0/0            0.0.0.0/0            tcp flags:0x06/0x02 TCPMSS clamp to PMTU

Chain OUTPUT (policy ACCEPT 14378 packets, 2172K bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain fail2ban-SSH (1 references)
 pkts bytes target     prot opt in     out     source               destination         
  132 20762 RETURN     all  --  *      *       0.0.0.0/0            0.0.0.0/0 

IPv6 ip6tables

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all      *      *       ::/0                 ::/0                 rt type:0 segsleft:0
 484K   86M ACCEPT     icmpv6   *      *       ::/0                 ::/0                
 105K 7943K ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:22
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpt:1194
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:1194
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpts:6880:6899
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpts:6880:6899
    0     0 ACCEPT     tcp      *      *       ::/0                 ::/0                 tcp dpt:123
    0     0 ACCEPT     udp      *      *       ::/0                 ::/0                 udp dpt:123
    0     0 ACCEPT     all      ppp0,sixxs *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
4164K  466M ACCEPT     all      !ppp0,sixxs *       ::/0                 ::/0                
    0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all      *      *       ::/0                 ::/0                 rt type:0 segsleft:0
 2864  311K ACCEPT     icmpv6   *      *       ::/0                 ::/0                
    0     0 REJECT     tcp      *      *       ::/0                 ::/0                 multiport ports 631 reject-with icmp6-port-unreachable
    0     0 REJECT     udp      *      *       ::/0                 ::/0                 multiport ports 631 reject-with icmp6-port-unreachable
    0     0 REJECT     tcp      *      *       ::/0                 ::/0                 multiport ports 515 reject-with icmp6-port-unreachable
    0     0 REJECT     udp      *      *       ::/0                 ::/0                 multiport ports 515 reject-with icmp6-port-unreachable
    0     0 REJECT     all      ppp0,sixxs ppp0,sixxs  ::/0                 ::/0                 reject-with icmp6-port-unreachable
    0     0 accept_with_pmtu_clamp  tcp      ppp0,sixxs *      !2001:x:x::/48   2001:x:x::/48   tcp dpt:22
  18M   14G accept_with_pmtu_clamp  all      *      *       ::/0                 ::/0                 ctstate RELATED,ESTABLISHED
65503 5289K accept_with_pmtu_clamp  all      !ppp0,sixxs *       ::/0                 ::/0                
    0     0 REJECT     all      *      *       ::/0                 ::/0                 reject-with icmp6-port-unreachable

Chain OUTPUT (policy ACCEPT 8099K packets, 11G bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all      *      *       ::/0                 ::/0                 rt type:0 segsleft:0

Chain accept_with_pmtu_clamp (3 references)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 TCPMSS     tcp      *      ppp0,sixxs  ::/0                 ::/0                 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
  18M   14G ACCEPT     all      *      *       ::/0                 ::/0 

Atualização 3

Isso é /etc/sshd/sshd_config do sistema ao qual eu tento me conectar, sem todos os comentários:

Port 22
ListenAddress 0.0.0.0
ListenAddress ::

PubkeyAuthentication yes
PasswordAuthentication no
UsePAM yes

AllowAgentForwarding yes
AllowTcpForwarding yes
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
PrintMotd no
PrintLastLog no
UseDNS yes

Subsystem       sftp    /usr/lib64/misc/sftp-server
    
por datenwolf 24.04.2013 / 16:38

2 respostas

4

Depois de as coisas ficarem mais estranhas e estranhas (veja o tópico de comentários na minha pergunta) eu finalmente descobri. Primeiras coisas primeiro: O processo de autenticação fez falhar em pam_access.so, mas não devido a alguma configuração incorreta em /etc/security/access.conf como foi sugerido.

Para entender o motivo, devemos observar a configuração dessa caixa em particular: ela age como um roteador para o IPv4, que passa nativamente pelo link PPP e IPv6, que é um túnel 6in4. Também esta caixa funciona como um resolvedor recursivo de DNS, e aqui está ficando interessante. Eu configurei o resolvedor de forma que as pesquisas reversas do IPv4 sejam resolvidas recursivamente, começando pelos servidores raiz IPv4 e as pesquisas inversas IPv6 começam com os servidores raiz IPv6. Essa configuração funcionou quando eu a instalei pela primeira vez.

Agora, meu ISP insere as fotos e pessoas que não entendem como funcionam os ataques de amplificação de DNS. Para encurtar a história: eu sei com certeza que meu ISP mexe com os pacotes DNS recebidos aleatoriamente, isto é, algumas coisas precisam ser resolvidas por seus próprios resolvedores por algum tempo, enquanto resolvem outros endereços DNS recursivamente em seus próprios trabalhos - o oficial A razão é mitigar os ataques de amplificação do DNS, mas eles estão fazendo errado então ^ 1.

Desde que eu não queria mudar minha configuração em grande parte, eu joguei os resolvedores de DNS do meu ISP no final do meu resolvedor DNS local como redirecionamento não-recursivo, então se a tentativa de resolução recursiva expirar tente os resolvedores do meu ISP. Isso funciona até agora. Mas quando eu configurei isso, cometi um pequeno erro: entrei nos resolvedores DNS do ISP para trabalhar apenas com hosts dentro do meu escopo local, ou seja, 192.168.0.0/16, mas esqueci do localhost, também conhecido como meu roteador, que é o host que tentei SSH em, para o qual o resolvedor não considera os resolvedores do ISP.

pam_access.so tenta uma pesquisa inversa no endereço dos peers; e isso fecha o círculo: Como para a pesquisa reversa do IPv6, os servidores-raiz do DNS IPv6 seriam acessados, os pacotes entrariam no túnel 6in4 sem que o meu provedor mexesse com eles, obtendo uma resposta. Mas a pesquisa inversa IPv4 não seria feita pelos resolvedores do ISP por conta própria, o que não receberia nenhuma resposta e acabaria por relatar um NXHOST (ou seria executado em um tempo limite). De qualquer forma pam_access.so não vai ver algo que gosta e apenas diz "você não deve passar".

Depois de consertar a configuração do resolvedor, tudo agora funciona como um encanto novamente. Mas eu realmente tenho que entrar nos dedos do meu provedor agora ...

Sobre como resolvi isso? Bem, levantando verbosidade de registro estudando intensamente /var/log/everything para ver em que ordem as coisas se desdobraram. Quando vi meu resolvedor registrando as tentativas de pesquisa reversa, soube o que estava acontecendo.

1: de um ponto de vista de mitigação de amplificação de DNS isso é um absurdo completo, porque eu testei e os pacotes de saída de DNS passaram muito bem - no entanto, esses são os pacotes que eles devem filtrar. Na verdade, todo provedor de serviços ao cliente final deve descartar todos os pacotes UDP cujo endereço do remetente não corresponde aos de seus clientes

    
por 25.04.2013 / 13:40
1

A configuração do sshd no servidor é uma das coisas mais interessantes de se ver se você tem esse tipo de problema. Normalmente, é em /etc/ssh/sshd_config .

Existe uma boa chance de que em seu arquivo de configuração exista uma seção:

Match Address 10.*.*.*,192.168.0.*
    PasswordAuthentication no

Isso tem algumas regras específicas para essas sub-redes (o Address em seu arquivo provavelmente será diferente). Essas regras só se aplicam a endereços IPv4 se forem as únicas que correspondem (e não IPv6) e as regras da correspondência se aplicam apenas ao endereço IP correspondente. Então, dependendo se você se conecta via IPv4 e IPv6, o sshd tem regras diferentes.

Nem todas as coisas podem ser definidas em Match , mas são suficientes para fazer a diferença:

AllowAgentForwarding, AllowTcpForwarding, AuthorizedKeysFile,
AuthorizedPrincipalsFile, Banner, ChrootDirectory, ForceCommand,
GatewayPorts, GSSAPIAuthentication, HostbasedAuthentication,
HostbasedUsesNameFromPacketOnly, KbdInteractiveAuthentication,
KerberosAuthentication, MaxAuthTries, MaxSessions,
PasswordAuthentication, PermitEmptyPasswords, PermitOpen,
PermitRootLogin, PermitTunnel, PubkeyAuthentication,
RhostsRSAAuthentication, RSAAuthentication, X11DisplayOffset,
X11Forwarding, X11UseLocalHost
    
por 24.04.2013 / 20:25

Tags