在 中sshd_config
,默认情况下,所有组和用户都允许登录。允许/拒绝指令按以下顺序处理:DenyUsers、AllowUsers、DenyGroups,最后是 AllowGroups。(可在手册页中找到)。
因此,我必须以“黑名单方式”配置服务器(允许所有人,然后我明确定义可以拒绝哪些人访问)。
有没有办法做相反的事情?我想如果用户无法连接到 ssh,则 sftp 连接将被拒绝,除非他符合规则。
我将默认 shell 设置为/bin/false
(因此经典 ssh 连接被禁用)。
锁定用户(usermod -L usersftp1
)显然会阻止用户同时使用 sftp 和 ssh(这对我来说没问题)。
我尝试使用DenyGroups !sftp
指令来禁止除 sftp 之外的其他用户匹配,但 usersftp1(不属于组 sftp(主要组也不是补充组))但没有成功。
我将服务器配置为管理一些 sftp 访问(以 开头Subsystem sftp internal-sftp
)
在 /etc/passwd 中,以下行usersftp1:x:5001:5001::/home/sftp/usersftp1:/bin/false
ssh 连接不起作用(这是我想要的),但我可以通过 sftp 连接(除了我还没有允许该用户之外)。
如果用户有 shell,我希望默认行为是“不允许连接” /bin/false
。
编辑:更多配置详细信息:
file /etc/passwd:
usersftp1:x:50001:5001::/home/sftp/usersftp1:/bin/false
file /etc/group:
usersftp1:x:5001
file /etc/ssh/sshd_config:
…
Subsystem sftp internal-sftp -l INFO
# This is commented, so no rules will be set for user "usersftp1"
# Match user usersftp1
# X11Forwarding no
# ChrootDirectory %h
# AllowTcpForwarding no
# ForceCommand internal-sftp
# This config works as expected
Match user usersftp2
X11Forwarding no
ChrootDirectory %h
AllowTcpForwarding no
ForceCommand internal-sftp
在中auth.log
,我可以看到用户使用 sftp:
Starting session: subsystem 'sftp' for usersftp1 from xxx.xxx.xxx.xxx port 55552
在该配置中,之后service ssh restart
,用户usersftp1
和usersftp2
都可以使用 sftp 连接(除了第一个被注释掉之外)
答案1
我认为 Match User 的工作方式并不像您想象的那样。
匹配
引入条件块。如果 Match 行上的所有条件都得到满足,则后续行上的关键字将覆盖配置文件全局部分中设置的关键字,直到出现另一个 Match 行或文件末尾。如果关键字出现在多个满足条件的 Match 块中,则仅应用该关键字的第一个实例。
因此,在你的具体情况下匹配用户 usersftp2仅适用于并覆盖 usersftp2 的配置。
当您的用户 ftp1 连接时,sshd 会为他们运行 sftp 程序,并且不应用任何用户特定的配置。
如果我正确理解了你的问题,你应该能够和一个团队一起做你想做的事情。
创建一个组,例如 sftpusers(groupadd...),然后将您想要允许的用户添加到其中(usermod -G ...)
然后将 sshd 配置为仅允许该组中的用户使用 sftp
Match Group sftpusers
# Force the connection to use SFTP
ForceCommand internal-sftp
# Disable tunneling, authentication agent, TCP and X11 forwarding.
PermitTunnel no
AllowAgentForwarding no
AllowTcpForwarding no
X11Forwarding no