ユーザー固有のSSHパスワード認証で奇妙な動作が発生する

ユーザー固有の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ログインは許可されていませんが、例外的にユーザーログインを許可しています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 の仕組みに関するより具体的な情報を持っている人がいる場合は、コメントでコメントしてください。

関連情報