每使用者 SSH 密碼身份驗證中的奇怪行為
我正在使用 NixOS。這是我的 SSHd 配置:
services.openssh.enable = true; services.openssh.passwordAuthentication = false; services.openssh.challengeResponseAuthentication = false; services.openssh.permitRootLogin = "no"; services.openssh.extraConfig = '' Match User dropbox PasswordAuthentication yes '';
如您所見,我不允許使用密碼進行 SSH 登錄,但作為例外,允許使用者使用 SSH 登錄
dropbox
。此 Nix 語法導致以下 sshd_config:UsePAM yes AddressFamily any Port 22 X11Forwarding no Subsystem sftp /nix/store/6fkb47ri4xndlpszjrbw8ggd3vmb6in7-openssh-8.1p1/libexec/sftp-server PermitRootLogin no GatewayPorts no PasswordAuthentication no ChallengeResponseAuthentication no PrintMotd no # handled by pam_motd AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 /etc/ssh/authorized_keys.d/%u HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ed25519_key KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256 Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com LogLevel VERBOSE UseDNS no Match User dropbox PasswordAuthentication yes
從表面上看,這似乎奏效了。它不允許其他使用者使用密碼登錄,但允許
dropbox
. 這是與ssh -v dropbox@poi
:debug1: Next authentication method: password dropbox@poi's password: debug1: Authentications that can continue: publickey,password Permission denied, please try again.
但是,它不接受
dropbox
的密碼。這是允許我登錄的完全相同的密碼(簡單的三個字母的玩具密碼),所以密碼沒有錯。我什至複製粘貼它以避免大寫鎖定陷阱。允許登錄的相同密碼不允許SSH登錄。但是,如果我
passwordAuthentication
為所有使用者設置了允許,那麼dropbox
神奇地能夠使用它的密碼登錄。我已驗證該Match
部分始終位於 末尾sshd_config
,因此這與訂購問題無關。我從來沒有聽說過這種行為。有什麼技巧可以讓我調試嗎?
如果您查看這裡的 nix 原始碼,您可以看到他們正在使用 passwordAuthentication 來設置 PAM 規則。有效地:
security.pam.services.sshd.unixAuth = <passwordAuthentication>;
我無法想出在 sshd 配置中禁用 PAM**$$ note 2 $$**,nix 模組將“UsePAM yes”中的硬編碼到文件頂部。相反,我們可以做的是覆蓋該設置,以便 PAM 接受您的密碼。
services.openssh.enable = true; services.openssh.permitRootLogin = "no"; services.openssh.passwordAuthentication= false; services.openssh.challengeResponseAuthentication = false; services.openssh.extraConfig = " Match User bootstrap PasswordAuthentication yes Match All "; security.pam.services.sshd.unixAuth = pkgs.lib.mkForce true;
解釋:
PAM 是大多數 Linux 系統上提供的一種服務,可處理使用者身份驗證等。它可以配置為以各種方式進行身份驗證。從 NixOS 選項參考:
security.pam.services.<name?>.unixAuth Description: Whether users can log in with passwords defined in /etc/shadow. Default value: true
需要challengeResponseAuthentication 行來真正防止密碼登錄,因為challengeResponseAuthentication 和passwordAuthentication 指的是兩種不同的基於“密碼”的登錄模式,並且它們是獨立啟用/禁用的。
**注意:**如果你忘記使用 mkForce(或類似的東西),nix 會罵你:
error: The option `security.pam.services.sshd.unixAuth' has conflicting definitions, in `/nix/var/nix/profiles/per-user/root/channels/nixos/nixos/modules/services/networking/ssh/sshd.nix' and `/etc/nixos/configuration.nix'.
**注意 2:**某些(可能是全部,IDK)openssh 選項在配置文件中設置後無法更改。相同值的後續定義將被忽略。因此,在您的 extraConfig 中輸入“UsePAM no”沒有任何效果,因為“UsePAM”已經在 sshd_config 的頂部設置為“yes”。
注 3: NixOS v20.03.1619 (Markhor),OpenSSH_8.2p1
如果有人有更多關於 PAM 或 sshd 配置或 NixOS 工作方式的具體資訊,請在評論中提及,我會將其添加到答案中。