Ssh

每使用者 SSH 密碼身份驗證中的奇怪行為

  • May 1, 2020

我正在使用 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 工作方式的具體資訊,請在評論中提及,我會將其添加到答案中。

引用自:https://unix.stackexchange.com/questions/562807