SSH:排除 root 用户强制进入 chrooted sftp

SSH:排除 root 用户强制进入 chrooted sftp

有一台运行 sshd 的服务器强制所有连接用户使用 chrooted SFTP。到目前为止一切正常。

我希望用户 root 能够使用公钥身份验证登录,但每当我尝试“排除”用户 root 被强制进入 SFTP 时,其他所有用户也会被排除。

Port 22
Protocol 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key
UsePrivilegeSeparation yes

KeyRegenerationInterval 3600
ServerKeyBits 1024

SyslogFacility AUTH
LogLevel INFO

LoginGraceTime 120
PermitRootLogin without-password
StrictModes yes

RSAAuthentication yes
PubkeyAuthentication yes

IgnoreRhosts yes
RhostsRSAAuthentication no
HostbasedAuthentication no

PermitEmptyPasswords no

ChallengeResponseAuthentication no

X11Forwarding yes
X11DisplayOffset 10
PrintMotd no
PrintLastLog yes
TCPKeepAlive yes

AcceptEnv LANG LC_*

Subsystem sftp internal-sftp

UsePAM yes

#Match User !root
        ChrootDirectory %h
        ForceCommand internal-sftp
        AllowTcpForwarding no

此配置按预期工作,但只要我在文件末尾附近启用 Match-rule,每个人都可以通过 SSH 登录到常规 shell。

...
Match User !root
        ChrootDirectory %h
        ForceCommand internal-sftp
        AllowTcpForwarding no

强制进入 chrooted SFTP 对所有用户都有效,或者对任何人都无效。要么我误解了什么Match是好的 - 并且所有列出的三个规则都是上下文中支持的子集的一部分Match- 要么它只是无法处理否定标准。我甚至尝试root用非 root 用户的名称替换,但无济于事:只要启用规则,其他每个用户都可以登录。它是什么?

值得一提的是,当我以非 root 用户身份登录时,我也观察到了某种“令人困惑”的日志输出:

Nov 12 22:39:06 host sshd[8687]: Accepted password for nonroot from 78.254.70.12 port 54988 ssh2
Nov 12 22:39:06 host sshd[8687]: pam_unix(sshd:session): session opened for user nonroot by (uid=0)

造成这种混淆的原因是使用权限分离,并让 uid=0 为非 root 用户打开会话。但是,我认为这基本上是预期的行为,因为 uid=0 需要代表其他用户创建进程。但这是否会干扰 root 身份测试!?

答案1

好吧,我看了看代码,必须承认,Match它没有按预期工作,但这是可能的。根据代码,一个条件块由Match User

  1. 必须有阳性检测结果才可匹配。(源码)(源码
  2. 可以否定限制一些另外提供的正向测试,仅:

    Match User @a,!b

    会导致组中的任何用户A满足条件,但用户除外b

因此,单靠测试!root是没有帮助的:

  1. 正如预期,root用户的测试失败。
  2. 但由于缺乏任何积极的测试,其他用户的测试结果也同样失败。

为了解决这个问题,否定测试必须与肯定测试相结合,基本上首先匹配任何用户:

Match User *,!root

相关内容