我想允许用户在特定端口(比如 5000)上设置到特定机器的 SSH 隧道,但我想尽可能地限制这个用户。(身份验证将使用公钥/私钥对)。
我知道我需要编辑相关的 ~/.ssh/authorized_keys 文件,但我不确定要在其中放入什么内容(公钥除外)。
在 Ubuntu 11.10 上,我发现我可以阻止带有和不带有 -T 的 ssh 命令,并阻止 scp 复制,同时允许端口转发通过。
具体来说,我在绑定到 localhost:6379 的“somehost”上有一个 redis 服务器,我希望通过 ssh 隧道安全地共享到具有密钥文件并将 ssh 的其他主机:
$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost
这将导致 redis-server,“somehost”上的“localhost”端口 6379 出现在本地执行 ssh 命令的主机上,重新映射到“localhost”端口 16379。
在远程“somehost”上这是我用于authorized_keys的:
cat .ssh/authorized_keys (portions redacted)
no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost
no-pty 会触发大多数想要打开终端的 ssh 尝试。
permitopen 解释了允许转发哪些端口,在本例中,端口 6379 是我想要转发的 redis-server 端口。
command="/bin/echo do-not-send-commands" 如果某人或某物确实设法通过 ssh -T 或其他方式向主机发送命令,则返回“do-not-send-commands”。
从最近的 Ubuntuman sshd
中,authorized_keys / 命令描述如下:
command="command" 指定在使用此密钥进行身份验证时执行该命令。用户提供的命令(如果有)将被忽略。
尝试使用 scp 安全文件复制也将失败,并回显“do-not-send-commands”我发现 sftp 在此配置下也失败。
我认为在以前的一些答案中提出的受限外壳建议也是一个好主意。另外,我同意这里详述的所有内容都可以通过阅读“man sshd”并在其中搜索“authorized_keys”来确定
您可能希望将用户的 shell 设置为受限制的 shell。在用户的 ~/.bashrc 或 ~/.bash_profile 中取消设置 PATH 变量,他们将无法执行任何命令。稍后,如果您决定要允许用户执行一组有限的命令,例如less
或tail
,那么您可以将允许的命令复制到单独的目录(例如/home/restricted-commands
)并更新 PATH 以指向那个目录。
除了 no-X11-forwarding 之类的 authorized_keys 选项之外,实际上还有一个您需要的选项:permitopen="host:port"。通过使用此选项,用户只能建立到指定主机和端口的隧道。
有关 AUTHORIZED_KEYS 文件格式的详细信息,请参阅 man sshd。
我的解决方案是为仅在没有交互式 shell 的情况下进行隧道传输的用户提供将/etc/passwd中的shell 设置为/usr/bin/tunnel_shell的用户。
只需使用无限循环创建可执行文件/usr/bin/tunnel_shell。
#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0
在这里充分解释:http: //blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
在这里你有一个很好的帖子,我发现它很有用: http ://www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/
这个想法是:(使用新的受限用户名作为“sshtunnel”)
useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel
请注意,我们使用 rbash(restricted-bash)来限制用户可以做什么:用户不能 cd(更改目录)并且不能设置任何环境变量。
然后我们将用户的 PATH 环境变量编辑为空/home/sshtunnel/.profile
——这个技巧将使 bash 找不到任何要执行的命令:
PATH=""
最后,我们通过设置以下权限来禁止用户编辑任何文件:
chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile
我可以使用公钥设置 authorized_keys 文件以登录。我不确定的是我需要的其他信息来限制允许该帐户执行的操作。例如,我知道我可以输入以下命令:
no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding
您可能希望在您的 authorized_keys 文件中出现如下所示的一行。
permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache
如果您只想允许访问特定命令(例如 svn),您还可以在授权密钥文件中指定该命令:
command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]
来自http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricks
我制作了一个 C 程序,如下所示:
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
if (signo == SIGHUP)
exit(0);
}
int main()
{
signal(SIGINT, &sig_handler);
signal(SIGTSTP, &sig_handler);
printf("OK\n");
while(1)
sleep(1);
exit(0);
}
我将受限用户的外壳设置为该程序。
我不认为受限用户可以执行任何操作,即使他们这样做ssh server command
了,因为命令是使用 shell 执行的,而这个 shell 不执行任何操作。
您将通过他们使用的任何 ssh 客户端在用户机器上生成一个密钥。例如,pUTTY 有一个实用程序来做这件事。它将生成私钥和公钥。
生成的公钥文件的内容会放在authorized_keys 文件中。
接下来,您需要确保将 ssh 客户端配置为使用生成公钥的私钥。这相当简单,但根据所使用的客户端略有不同。