Unix 允许用户设置SSH隧道,但不允许其他设置
我希望允许用户在特定端口(比如5000)上设置到特定机器的SSH隧道,但我希望尽可能地限制此用户。(将使用公钥/私钥对进行身份验证) 我知道我需要编辑相关的~/.ssh/authorized_keys文件,但我不确定要在其中放入什么内容(公钥除外)。请参阅 您需要记住的两件主要事情是:Unix 允许用户设置SSH隧道,但不允许其他设置,unix,ssh,Unix,Ssh,我希望允许用户在特定端口(比如5000)上设置到特定机器的SSH隧道,但我希望尽可能地限制此用户。(将使用公钥/私钥对进行身份验证) 我知道我需要编辑相关的~/.ssh/authorized_keys文件,但我不确定要在其中放入什么内容(公钥除外)。请参阅 您需要记住的两件主要事情是: 确保您chmod 700~/.ssh 将公钥块附加到授权密钥 您将通过用户使用的任何ssh客户端在用户计算机上生成密钥。例如,pUTTY有一个实用程序来完成这项工作。它将生成私钥和公钥 生成的公钥文件的内容将放在
chmod 700~/.ssh
您将通过用户使用的任何ssh客户端在用户计算机上生成密钥。例如,pUTTY有一个实用程序来完成这项工作。它将生成私钥和公钥 生成的公钥文件的内容将放在授权密钥文件中
接下来,您需要确保ssh客户端配置为使用生成公钥的私钥。这相当简单,但根据所使用的客户端的不同而略有不同。您可能需要将用户的shell设置为。在用户的~/.bashrc或~/.bash_配置文件中取消设置PATH变量,他们将无法执行任何命令。稍后,如果您决定允许用户执行一组有限的命令,例如
less
或tail
,则可以将允许的命令复制到单独的目录(例如/home/restricted commands
)并更新指向该目录的路径
我可以使用要记录的公钥设置授权密钥文件
在里面我不确定的是我需要提供的额外信息
限制该帐户允许执行的操作。例如,我知道我可以
放置命令,例如:
no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding
您希望在授权密钥文件中有一行如下所示
permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache
除了像no-X11-forwarding这样的授权密钥选项之外,实际上还有一个是您需要的:permitopen=“host:port”。通过使用此选项,用户只能设置到指定主机和端口的隧道
有关授权密钥文件格式的详细信息,请参阅mansshd。在Ubuntu11.10上,我发现我可以阻止ssh命令(使用和不使用-T发送)和scp复制,同时允许端口转发 具体地说,我在绑定到localhost:6379的“somehost”上有一个redis服务器,我希望通过ssh隧道将其安全地共享到具有密钥文件的其他主机,并将通过ssh与以下主机共享:
$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost
这将导致redis服务器“somehost”上的“localhost”端口6379在执行ssh命令的主机上本地显示,并重新映射到“localhost”端口16379
在远程“somehost”上,以下是我用于授权密钥的内容:
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服务器端口
如果某人或某物确实设法通过ssh-T或其他方式向主机发送命令,则命令=“/bin/echo do not send commands”回显“don not send commands”
从最近的Ubuntumansshd
,授权密钥/命令描述如下:
command=“command”
指定在使用此键时执行命令
用于身份验证。用户提供的命令(如果有)为
忽略
尝试使用scp安全文件复制也将失败,并返回“请勿发送命令”,我发现sftp也会失败
我认为,在之前的一些回答中提出的限制性shell建议也是一个好主意。
此外,我同意,这里详细介绍的所有内容都可以通过阅读“man sshd”并在其中搜索“authorized_key”来确定,如果您想只允许访问特定命令(如svn),还可以在authorized keys文件中指定该命令:
command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]
从中,我的解决方案是为只可能进行隧道挖掘的用户提供,而不提供交互式shell,将/etc/passwd中的shell设置为/usr/bin/tunnel\u 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
只需使用无限循环创建可执行文件/usr/bin/tunnel\u 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
这里详细解释:我制作了一个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);
}
#包括
#包括
#包括
#包括
无效信号处理器(int signo)
{
if(signo==SIGHUP)
出口(0);
}
int main()
{
信号(SIGINT和sig_处理器);
信号(SIGTSTP和sig_处理器);
printf(“OK\n”);
而(1)
睡眠(1);
出口(0);
}
我将受限用户的shell设置为此程序
我认为受限用户不能执行任何操作,即使他们执行了
ssh server命令
,因为这些命令是使用shell执行的,而这个shell不执行任何操作 这里有一篇我觉得很有用的帖子:
想法是:(新的受限用户名为“sshtunnel”)
注意,我们使用rbash(restrictedbash)来限制用户可以做的事情:用户不能更改cd(changeditory),也不能设置任何环境变量
然后,我们将/home/sshtunnel/.profile
中用户的PATH env变量编辑为nothing-这一技巧将使bash无法找到任何要执行的命令:
PATH=""
最后,通过设置以下权限,我们不允许用户编辑任何文件:
chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile
您还需要指定“无pty”作为选项集的一部分。如果您仅使用“permitopen”,则将隧道限制到给定的主机/端口。。。但是您仍然允许交互式shell。使用permitopen限制端口转发是否也会锁定ssh-w要求的隧道设备转发?@JohnHart:
no pty
也不会限制shell访问,您仍然可以访问shell,它只是不会显示y