我们有一个使用 SSH 连接到服务器的应用程序:应用程序的网络流量(数据库、一些自定义 TCP 协议等)通过 SSH 连接进行隧道传输。
我们在服务器上使用密钥对和非特权帐户,但用户仍然可以使用他们的密钥登录服务器,或者执行他们想要的任何端口重定向。
有没有办法配置 SSH 服务器以仅允许一些隧道(限制隧道的终止地址和端口),并禁用 shell 访问?(我们使用 OpenSSH)
[编辑]
我碰到本文,看来删除 shell 访问权限还不够。相应地更改了标题和描述。
答案1
在您的 authorized_keys 文件中,您可以指定登录时将运行哪个命令。您可以简单地将该命令设置为运行一些将等待很长时间的命令。sshd man页作为您可以在 authorized_keys 文件中使用的所有选项的列表。
permitopen="tsserver.example.org:3389",no-pty,no-agent-forwarding,no-X11-forwarding,command="/usr/local/stm_shell.sh" ssh-rsa AAAAB3....
我的 stm_shell.sh 是这样的(它还强制执行 12 小时超时)。我不能 100% 确定这是否完全安全。
#!/bin/bash
# send a hang-up after this process exits
shopt -s huponexit
# maximum session length in hours
CONNECT_TIME=12
sleep $[CONNECT_TIME*60]
kill $PPID
答案2
将用户的 shell 设置为 /bin/false 可能会实现您想要的效果。
答案3
也许 sshd_config(man sshd_config)中的“ChrootDirectory”关键字可能会提供更多的额外安全性。
答案4
我相信您可以设置ForceCommand
指令来/bin/false
阻止 shell 访问。