Ao tentar juntar um Ubuntu 22 ao nosso domínio AD via SSSD, encontrei uma situação estranha em que qualquer usuário AD pode fazer login no sistema sem nenhum prompt de senha e nenhuma configuração de chave ssh no host. No exemplo abaixo, USER1 é um nome de conta higienizado sem diretório .ssh nem configuração de authorized_keys no host Ubuntu.
Acredito que seja um problema de configuração do PAM, mas não tenho certeza do que especificamente nas configurações do PAM precisaria ser atualizado para forçar um prompt de senha.
/etc/ssh/sshd_config
inclui:
HostbasedAuthentication no
IgnoreRhosts yes
PermitEmptyPasswords no
PasswordAuthentication yes
ChallengeResponseAuthentication yes
KerberosAuthentication no
GSSAPIAuthentication no
GSSAPICleanupCredentials no
UsePAM yes
AllowTcpForwarding yes
X11Forwarding no
PermitUserEnvironment no
ClientAliveInterval 900
ClientAliveCountMax 0
UseDNS no
MaxStartups 10:30:100
Saída do log de depuração SSHD quando o USER1 efetua login no host com sucesso, sem nenhuma solicitação de senha no lado do cliente.
sshd[157624]: debug1: Forked child 158343.
sshd[158343]: debug1: Set /proc/self/oom_score_adj to 0
sshd[158343]: debug1: rexec start in 4 out 4 newsock 4 pipe 6 sock 7
sshd[158343]: debug1: inetd sockets after dupping: 4, 4
sshd[158343]: Connection from 172.30.128.205 port 64416 on 10.63.129.197 port 22 rdomain ""
sshd[158343]: debug1: Local version string SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.7
sshd[158343]: debug1: Remote protocol version 2.0, remote software version OpenSSH_9.7
sshd[158343]: debug1: compat_banner: match: OpenSSH_9.7 pat OpenSSH* compat 0x04000000
sshd[158343]: debug1: permanently_set_uid: 106/65534 [preauth]
sshd[158343]: debug1: list_hostkey_types: rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp256,ssh-ed25519 [preauth]
sshd[158343]: debug1: SSH2_MSG_KEXINIT sent [preauth]
sshd[158343]: debug1: SSH2_MSG_KEXINIT received [preauth]
sshd[158343]: debug1: kex: algorithm: [email protected] [preauth]
sshd[158343]: debug1: kex: host key algorithm: ssh-ed25519 [preauth]
sshd[158343]: debug1: kex: client->server cipher: [email protected] MAC: <implicit> compression: none [preauth]
sshd[158343]: debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none [preauth]
sshd[158343]: debug1: expecting SSH2_MSG_KEX_ECDH_INIT [preauth]
sshd[158343]: debug1: SSH2_MSG_KEX_ECDH_INIT received [preauth]
sshd[158343]: debug1: ssh_packet_send2_wrapped: resetting send seqnr 3 [preauth]
sshd[158343]: debug1: rekey out after 134217728 blocks [preauth]
sshd[158343]: debug1: SSH2_MSG_NEWKEYS sent [preauth]
sshd[158343]: debug1: Sending SSH2_MSG_EXT_INFO [preauth]
sshd[158343]: debug1: expecting SSH2_MSG_NEWKEYS [preauth]
sshd[158343]: debug1: ssh_packet_read_poll2: resetting read seqnr 3 [preauth]
sshd[158343]: debug1: SSH2_MSG_NEWKEYS received [preauth]
sshd[158343]: debug1: rekey in after 134217728 blocks [preauth]
sshd[158343]: debug1: KEX done [preauth]
sshd[158343]: debug1: userauth-request for user USER1 service ssh-connection method none [preauth]
sshd[158343]: debug1: attempt 0 failures 0 [preauth]
sshd[158343]: debug1: PAM: initializing for "USER1"
sshd[158343]: debug1: PAM: setting PAM_RHOST to "172.30.128.205"
sshd[158343]: debug1: PAM: setting PAM_TTY to "ssh"
sshd[158343]: debug1: userauth_send_banner: sent [preauth]
sshd[158343]: debug1: userauth-request for user USER1 service ssh-connection method publickey [preauth]
sshd[158343]: debug1: attempt 1 failures 0 [preauth]
sshd[158343]: debug1: userauth_pubkey: publickey test pkalg rsa-sha2-512 pkblob RSA SHA256:IvAkAVaIAXzi48uZEHICHHUVZgYQ5QozSfi/YwvJeUM [preauth]
sshd[158343]: debug1: temporarily_use_uid: 219435810/219400513 (e=0/0)
sshd[158343]: debug1: trying public key file /home/USER1/.ssh/authorized_keys
sshd[158343]: debug1: Could not open authorized keys '/home/USER1/.ssh/authorized_keys': No such file or directory
sshd[158343]: debug1: restore_uid: 0/0
sshd[158343]: Failed publickey for USER1 from 172.30.128.205 port 64416 ssh2: RSA SHA256:IvAkAVaIAXzi48uZEHICHHUVZgYQ5QozSfi/YwvJeUM
sshd[158343]: debug1: userauth-request for user USER1 service ssh-connection method keyboard-interactive [preauth]
sshd[158343]: debug1: attempt 2 failures 1 [preauth]
sshd[158343]: debug1: keyboard-interactive devs [preauth]
sshd[158343]: debug1: auth2_challenge: user=USER1 devs= [preauth]
sshd[158343]: debug1: kbdint_alloc: devices 'pam' [preauth]
sshd[158343]: debug1: auth2_challenge_start: trying authentication method 'pam' [preauth]
sshd[158345]: debug1: do_pam_account: called
sshd[158345]: pam_access(sshd:account): cannot resolve hostname "cron"
sshd[158345]: pam_access(sshd:account): cannot resolve hostname "crond"
sshd[158345]: pam_faillock(sshd:account): Unknown option: unlock
sshd[158343]: debug1: PAM: num PAM env strings 2
sshd[158343]: Postponed keyboard-interactive for USER1 from 172.30.128.205 port 64416 ssh2 [preauth]
sshd[158343]: debug1: do_pam_account: called
sshd[158343]: Accepted keyboard-interactive/pam for USER1 from 172.30.128.205 port 64416 ssh2
sshd[158343]: debug1: monitor_child_preauth: user USER1 authenticated by privileged process
sshd[158343]: debug1: monitor_read_log: child log fd closed
sshd[158343]: debug1: PAM: establishing credentials
sshd[158343]: pam_unix(sshd:session): session opened for user USER1(uid=219435810) by (uid=0)
systemd-logind[660]: New session 2938 of user USER1.
systemd: pam_faillock(systemd-user:account): Unknown option: unlock
systemd: pam_unix(systemd-user:session): session opened for user USER1(uid=219435810) by (uid=0)
sshd[158343]: User child is on pid 158357
sshd[158357]: debug1: SELinux support disabled
sshd[158357]: debug1: PAM: establishing credentials
sshd[158357]: debug1: permanently_set_uid: 219435810/219400513
sshd[158357]: debug1: rekey in after 134217728 blocks
sshd[158357]: debug1: rekey out after 134217728 blocks
sshd[158357]: debug1: ssh_packet_set_postauth: called
sshd[158357]: debug1: active: key options: agent-forwarding port-forwarding pty user-rc x11-forwarding
sshd[158357]: debug1: Entering interactive session for SSH2.
sshd[158357]: debug1: server_init_dispatch
sshd[158357]: debug1: server_input_channel_open: ctype session rchan 0 win 1048576 max 16384
sshd[158357]: debug1: input_session_request
sshd[158357]: debug1: channel 0: new [server-session]
sshd[158357]: debug1: session_new: session 0
sshd[158357]: debug1: session_open: channel 0
sshd[158357]: debug1: session_open: session 0: link with channel 0
sshd[158357]: debug1: server_input_channel_open: confirm session
sshd[158357]: debug1: server_input_global_request: rtype [email protected] want_reply 0
sshd[158357]: debug1: server_input_channel_req: channel 0 request pty-req reply 1
sshd[158357]: debug1: session_by_channel: session 0 channel 0
sshd[158357]: debug1: session_input_channel_req: session 0 req pty-req
sshd[158357]: debug1: Allocating pty.
sshd[158343]: debug1: session_new: session 0
sshd[158343]: debug1: SELinux support disabled
sshd[158357]: debug1: session_pty_req: session 0 alloc /dev/pts/5
sshd[158357]: debug1: Ignoring unsupported tty mode opcode 11 (0xb)
sshd[158357]: debug1: Ignoring unsupported tty mode opcode 17 (0x11)
sshd[158357]: debug1: server_input_channel_req: channel 0 request env reply 0
sshd[158357]: debug1: session_by_channel: session 0 channel 0
sshd[158357]: debug1: session_input_channel_req: session 0 req env
sshd[158357]: debug1: server_input_channel_req: channel 0 request env reply 0
Conteúdo do arquivo SSSD.conf:
[sssd]
domains = my.domain.com
config_file_version = 2
services = nss, pam
override_space = _
#default_domain_suffix = my.domain.com
domain_resolution_order = my.domain.com
debug_level = 9
full_name_format=%1$s
[nss]
#cache_first = True
[domain/my.domain.com]
#default_shell = /bin/bash
#krb5_store_password_if_offline = True
#cache_credentials = True
#krb5_realm = my.domain.com
#realmd_tags = manages-system joined-with-adcli
#id_provider = ad
#fallback_homedir = /home/%u
#ad_domain = my.domain.com
use_fully_qualified_names = False
ldap_id_mapping = True
access_provider = ad
default_shell = /bin/bash
krb5_store_password_if_offline = True
cache_credentials = True
krb5_realm = my.domain.com
realmd_tags = manages-system joined-with-adcli
id_provider = ad
fallback_homedir = /home/%u
ad_domain = my.domain.com
ad_enabled_domains = my.domain.com
ignore_group_members = True
subdomain_inherit = ignore_group_members
ldap_referrals = False
dyndns_update = false
ad_gpo_access_control = disabled
dyndns_update_ptr = false
ldap_opt_timeout = 20
ldap_network_timeout = 20
dns_resolver_timeout = 20
ad_use_ldaps = false
/etc/pam.d/sshd
# grep -v "#" /etc/pam.d/sshd
@include common-auth
account required pam_nologin.so
account required pam_access.so
@include common-account
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
session required pam_loginuid.so
session optional pam_keyinit.so force revoke
@include common-session
session required pam_limits.so
session required pam_env.so user_readenv=1 envfile=/etc/default/locale
session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
@include common-password
autenticação comum
auth [default=4 success=ok] pam_localuser.so
auth [success=2 default=ignore] pam_unix.so nullok
auth [success=1 default=ignore] pam_sss.so use_first_pass
auth requisite pam_deny.so
auth required pam_permit.so
auth optional pam_cap.so
senha-comum
password [success=2 default=ignore] pam_unix.so obscure yescrypt
password sufficient pam_sss.so use_authtok
password requisite pam_deny.so
password required pam_permit.so
conta comum
account [success=1 new_authtok_reqd=done default=ignore] pam_unix.so
account requisite pam_deny.so
account required pam_permit.so
account sufficient pam_localuser.so
account [default=bad success=ok user_unknown=ignore] pam_sss.so
account required pam_faillock.so
Os arquivos de configuração do PAM são processados linha por linha, portanto, a ordenação das linhas (do mesmo tipo, ou seja
auth
,account
,session
oupassword
) é importante.Todas as
auth
linhas aplicáveis estão nocommon-auth
arquivo:A primeira linha significa: se o usuário estiver listado em
/etc/passwd
(ou seja, uma conta local), então defina o resultado geral provisoriamente para PAM_SUCCESS e prossiga para a próxima linha. Caso contrário, não ajuste o resultado geral do que era antes e pule as próximas 4 linhas. Como resultado, para um usuário não local, a próxima linha serápam_cap.so
, que éoptional
e a última, então a tentativa de autenticação terá passado por toda aauth
fase sem nenhuma autenticação real.Isso corresponde ao que você está vivenciando e parece uma configuração claramente incorreta. Você provavelmente deve comentar a
pam_localuser.so
linha e, em seguida, tentar descobrir o motivo pelo qual ela foi adicionada. Se você apenas seguiu cegamente algumas instruções que encontrou na internet, deve tratar essas instruções como não confiáveis. Em geral, nunca aplique nenhuma configuração que você não entenda primeiro.O restante das
auth
linhas parece razoável: tantopam_unix.so
(autenticação local) quantopam_sss.so
(autenticação AD) pularão a rejeição incondicional dopam_deny.so
, chegandopam_permit.so
a qual marcará todo o processo de autenticação como bem-sucedido.É uma sexta-feira à noite e eu posso precisar de mais cafeína, mas também me parece que a
pam_faillock.so
configuração nocommon-account
arquivo está incompleta: parece que só entra em vigor em contas do AD e pode não contar corretamente os logins com falha de qualquer maneira, já que apenas a parte da configuração que zera o contador de falhas em um login bem-sucedido está presente. Vejaman pam_faillock
para exemplos sobre a configuração correta.Nota: tenha muito cuidado ao editar o
common-auth
arquivo! Se você cometer um erro de digitação, o pior caso é que qualquer coisa que exija autenticação pare de funcionar, e você terá que inicializar o sistema usando uma mídia de inicialização ao vivo para corrigir seu erro.Depois de fazer suas edições e salvá-las, mas antes de sair do editor , você provavelmente deve testar suas alterações usando uma segunda janela de terminal ou console virtual para fazer uma segunda conexão com o sistema e verificar se tanto um usuário local quanto um usuário baseado no AD conseguirão se autenticar com sucesso e se uma senha é realmente solicitada de ambos.