CentOS 7下限制使用/sbin/nologin shell的用户SSH并发连接数失效的解决方案咨询
CentOS 7下限制使用/sbin/nologin shell的用户SSH并发连接数失效的解决方案咨询
你好,我来帮你梳理这个问题的根源并给出实用的解决办法:
首先得明确为什么/etc/security/limits.conf里的maxlogins对你的/sbin/nologin用户不起作用——这个限制是针对交互式登录shell会话的,而使用/sbin/nologin的用户登录SSH时不会启动真正的交互式shell,负责读取limits.conf的PAM模块不会触发这个规则。另外你修改的MaxSessions是单个SSH连接内的会话数,MaxStartups是未完成认证的连接阈值,这俩确实不直接限制已认证用户的并发连接数。
下面给你两个可行的方案,你可以根据需求选择:
方案一:用SSH的Match指令精准限制(推荐)
SSH的sshd_config支持Match块,可以针对特定用户或组单独配置规则,完美适配你这种端口转发专用用户的场景:
- 先把这些端口转发用户归到一个统一的组里(比如
port-forward-users),方便批量管理:groupadd port-forward-users usermod -aG port-forward-users 你的用户名1 usermod -aG port-forward-users 你的用户名2 - 编辑
/etc/ssh/sshd_config,在文件末尾添加以下配置:
这里的配置不仅限制了该组用户的并发会话数为1,还进一步收紧了权限:只允许端口转发,禁止X11转发、TTY终端,强制使用Match Group port-forward-users MaxSessions 1 AllowTcpForwarding yes X11Forwarding no PermitTTY no ForceCommand /sbin/nologin/sbin/nologin,完全符合你对这类用户的权限限制需求。 - 重启SSH服务使配置生效:
systemctl restart sshd
方案二:用PAM脚本自定义连接数检查
如果需要更灵活的自定义限制逻辑,可以借助PAM的pam_exec模块配合脚本实现:
- 创建一个检查连接数的脚本,比如
/usr/local/bin/check_ssh_connections.sh,内容如下:#!/bin/bash # 获取当前登录的用户 USER=$PAM_USER # 统计该用户的SSH并发连接数 CONNECTIONS=$(who | grep -c "^$USER ") # 设置最大允许连接数 MAX_CONNECTIONS=1 if [ $CONNECTIONS -gt $MAX_CONNECTIONS ]; then echo "错误:用户 $USER 的并发连接数已超过上限" >&2 exit 1 fi exit 0 - 给脚本添加执行权限:
chmod +x /usr/local/bin/check_ssh_connections.sh - 编辑
/etc/pam.d/sshd,在session段添加一行(建议放在开头位置):session required pam_exec.so /usr/local/bin/check_ssh_connections.sh - 同样重启SSH服务生效。
验证方法
用你的端口转发用户尝试发起多个SSH端口转发连接(比如ssh -L 本地端口:目标地址:目标端口 用户名@服务器IP),如果配置正确,第二个连接会被拒绝。
备注:内容来源于stack exchange,提问作者Dr developer
相关产品推荐
相关产品推荐

