如何创建仅限SSH隧道访问且需密码认证的Linux新用户?解决权限拒绝与命令行越权问题
你遇到的这个问题,核心原因是SSH服务默认只允许用户使用/etc/shells文件中列出的合法shell。当你把new_user的shell设为/bin/true时,大多数Linux发行版的/etc/shells里默认不会包含这个路径,所以sshd会判定这是一个未授权的shell,直接拒绝登录请求。而当你创建带家目录的用户时,默认shell是/bin/bash(或其他合法shell),已经在/etc/shells里,所以能正常登录,但也就拥有了命令行访问权限。
下面是具体的修复步骤:
1. 验证并添加/bin/true到合法shell列表
以root身份登录服务器,先检查/bin/true是否在合法shell列表中:
cat /etc/shells
如果输出里没有/bin/true,就把它添加进去:
echo "/bin/true" >> /etc/shells
2. 重新配置用户的shell(如果已经创建用户)
如果之前已经创建了new_user,执行以下命令修改其shell:
usermod -s /bin/true new_user
如果还没创建,直接用以下命令创建(确保shell合法):
useradd new_user -M -s /bin/true passwd new_user
3. 重载SSH服务配置
systemctl reload sshd
4. 测试SSH隧道连接
现在再尝试你的隧道命令(注意要加上-L参数,这是本地端口转发的关键,你之前的命令里漏掉了):
ssh -p 7822 new_user@my_address.com -N -L 5433:localhost:5432
这次应该能成功建立隧道,且new_user无法交互式登录服务器——如果有人尝试用这个账号直接SSH登录,会因为/bin/true执行后立即退出,无法进入命令行。
额外优化:更安全的配置方案
如果你想进一步限制这个用户的权限,可以在/etc/ssh/sshd_config中添加针对new_user的专属规则,确保它只能用于隧道转发,不能做其他操作:
# 在sshd_config末尾添加以下内容 Match User new_user ForceCommand echo "This account is restricted to SSH tunneling only." AllowTcpForwarding yes X11Forwarding no PermitTunnel no PasswordAuthentication yes PermitEmptyPasswords no
添加后重载sshd服务:
systemctl reload sshd
这样就算用户的shell是合法的交互式shell,尝试登录时也会执行ForceCommand并立即退出,彻底杜绝命令行访问,同时保留隧道转发功能。
内容的提问来源于stack exchange,提问作者JoeBe

