저는 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 로그인을 허용하지 않지만 예외적으로 사용자 로그인을 허용하고 있습니다 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 [email protected],diffie-hellman-group-exchange-sha256
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
MACs [email protected],[email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
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
그러나 비밀번호는 허용되지 않습니다 . 이것은 내가 로그인할 때 사용하는 비밀번호(간단한 3글자 장난감 비밀번호)와 똑같으므로 비밀번호에 실수가 없습니다. Caps Lock 트랩을 피하기 위해 복사하여 붙여넣기도 했습니다. 로그인을 허용하는 동일한 비밀번호는 SSH 로그인을 허용하지 않습니다.
passwordAuthentication
그러나 모든 사용자를 허용하도록 설정하면 dropbox
마술처럼 해당 사용자는 자신의 비밀번호를 사용하여 로그인할 수 있습니다. 해당 Match
섹션은 항상 끝에 있으므로 sshd_config
이는 주문 문제와 관련이 없음을 확인했습니다 .
나는 이런 행동에 대해 들어본 적이 없습니다. 이를 디버깅하는 데 사용할 수 있는 트릭이 있나요?
답변1
nix 소스코드를 보면여기PAM 규칙을 설정하기 위해 비밀번호 인증을 사용하고 있는 것을 볼 수 있습니다.효과적으로:
security.pam.services.sshd.unixAuth = <passwordAuthentication>;
SSHd 구성에서 PAM을 비활성화하는 방법을 알 수 없습니다[노트 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과 PasswordAuthentication은 두 가지를 참조하므로 실제로 비밀번호 로그인을 방지하려면 ChallengeResponseAuthentication 행이 필요합니다.다른"비밀번호" 기반 로그인 모드는 독립적으로 활성화/비활성화됩니다.
노트: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 옵션은 구성 파일에 설정된 후에는 변경할 수 없습니다. 동일한 값의 후속 정의는 무시됩니다. 따라서 sshd_config 상단에서 "UsePAM"이 이미 "yes"로 설정되어 있으므로 extraConfig에 "UsePAM no"를 입력해도 아무런 효과가 없습니다.
노트 3:NixOS v20.03.1619(마코르), OpenSSH_8.2p1
PAM 또는 sshd 구성이나 NixOS 작동 방식에 대한 더 구체적인 정보가 있는 사람이 있으면 댓글에서 언급해 주시면 답변에 추가하겠습니다.