私は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の2つを参照しているため、実際にパスワードのログインを防ぐには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 の仕組みに関するより具体的な情報を持っている人がいる場合は、コメントでコメントしてください。