允许用户设置SSH隧道,但无其他设置


97

我想允许用户在特定端口(例如5000)上建立到特定计算机的SSH隧道,但是我想尽可能地限制该用户。(身份验证将使用公共/专用密钥对)。

我知道我需要编辑相关的〜/ .ssh / authorized_keys文件,但是我不确定到底要放什么内容(除了公钥)。

Answers:


91

在Ubuntu 11.10上,我发现我可以阻止ssh命令(使用-T和不使用-T发送),并阻止scp复制,同时允许端口转发通过。

具体来说,我在“ somehost”上有一个绑定到localhost:6379的redis服务器,我希望通过ssh隧道安全地共享到其他具有密钥文件的主机,并将通过ssh输入:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost

这将导致redis服务器“ 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端口。

如果某人或某物确实设法通过ssh -T或其他方式向主机发送命令,则command =“ / bin / echo do-not-send-commands”回显“ do-not-send-commands”。

在最近的Ubuntu中man sshd,authorized_keys /命令的描述如下:

command =“ command”指定在此密钥用于身份验证时执行命令。用户提供的命令(如果有)将被忽略。

尝试使用scp安全文件复制也将失败,并回显“ do-not-send-commands”。我发现sftp在此配置下也失败。

我认为在先前的一些回答中提出的限制性外壳建议也是一个好主意。另外,我同意可以通过阅读“ man sshd”并在其中搜索“ authorized_keys”来确定此处详述的所有内容


1
虽然no-pty不允许打开交互式种子,但它无济于事,无法阻止命令执行,因此,authorized_keys如果用户可以访问,则可以编辑文件,例如ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
突触

4
上面也列出了@synapse command =“ / bin / echo do-not-send-commands”,旨在阻止命令。并提供信息。您是否打算让您的示例破坏上面的所有设置,还是仅对不带任何评论?
保罗

值得一提的是,管理员没有义务授予用户Authorized_keys文件或包含目录的所有权,也不存在于用户的主目录中(假设ssh服务器已针对其位置进行了正确配置)
Daniel Farrell 2014年

?? @DanFarrell .ssh / authorized_keys将由root或wheel拥有,还是由谁拥有?
安德鲁·沃尔夫

@AndrewWolfe通常~user/.ssh/authorized_keys由拥有user,并且user将管理用于访问帐户的授权密钥。SSH对权限挑剔,可能会对~/.ssh/它及其内容强加期望。我做了一个sudo chown root: .ssh/authorized_keys,似乎阻止了我登录,但是从过去的经验中我知道,用户不必拥有该文件- root如果您愿意,可以对其进行管理。
丹尼尔·法瑞尔

18

您可能需要将用户的shell设置为受限shell。在用户的〜/ .bashrc或〜/ .bash_profile中取消设置PATH变量,他们将无法执行任何命令。稍后,如果您决定要允许用户执行一组有限的命令(例如lesstail例如),则可以将允许的命令复制到单独的目录(例如/home/restricted-commands),并更新PATH以指向该目录。


1
但这并不能阻止用户在ssh命令行上指定其他命令,如ssh use@host "/bin/bash"
Fritz

是的,假设user@host有rbash作为shell ,它会这样做。参见“受限制的贝壳
杰森日”,

好吧,我尝试过了,您是对的。由于指定的命令由登录外壳程序执行,因此执行/bin/bash失败,因为它包含斜杠。
Fritz

3
尽管应该说允许less可能不是一个好主意,因为从那里您可以使用进入不受限制的shell !/bin/bash。有关其他示例,请参见pen-testing.sans.org/blog/2012/06/06/…。因此,允许(如果有)命令应该非常非常小心地进行。
Fritz

17

除了诸如no-X11-forwarding之类的authorized_keys选项外,实际上您还要求提供一个:allowopen =“ host:port”。通过使用此选项,用户只能设置到指定主机和端口的隧道。

有关AUTHORIZED_KEYS文件格式的详细信息,请参考man sshd。


13
您还需要在选项集中指定“ no-pty”。如果仅使用“ permitopen”,则将隧道限制为给定的主机/端口...,但仍将允许交互式外壳。
约翰·哈特

用allowopen限制端口转发是否还会锁定ssh -w要求的隧道设备转发类型?
flabdablet 2014年

5
@JohnHart:no-pty也不限制外壳程序访问,您仍然可以进入外壳程序,只是不会向您显示提示;您仍然可以发出命令并看到输出结果。command="..."如果要限制来自的外壳程序访问,则需要此选项.ssh/authorized_keys
Aleksi Torhamo 2015年

9

我的解决方案是为没有交互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/


9
CTRL + Z将脱离脚本,使您可以完全访问bash ...尝试在脚本的开头添加“ trap” 20”(不带引号)
Big Papoo

1
感谢您的提示,我添加了一些中断信号的陷阱
Daniel W.

1
我只是使用/ bin / cat作为“ shell”。似乎工作正常。不知道有没有针对cat的攻击,即使您确实找到了一些可以使其崩溃的输入模式,您的ssh会话也将终止。
flabdablet 2014年

4
@BigPapoo:您真的测试过吗?我看不到它会逃到哪里。如果您在外壳程序中并运行tunnel_shell,则shell -> /bin/bash tunnel_shell可以使用它,当然可以转回该外壳程序,但是,如果已将其设置tunnel_shell 用户的外壳程序,则只能/bin/bash tunnel_shell运行,而没有外壳程序可以转义到,据我所知。我对其进行了测试,但无法使用ctrl-z逃脱。如果你做了尝试,并可能逃脱,你可以张贴的设置?同样,如果您知道任何说明其应如此工作的文档,是否可以发布?
Aleksi Torhamo 2015年

3

我可以使用公共密钥来设置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 


3

在这里,您有一篇不错的帖子,我觉得很有用: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(受限bash)来限制用户可以执行的操作:用户不能cd(更改目录)并且不能设置任何环境变量。

然后,我们将用户的PATH env变量编辑为空/home/sshtunnel/.profile-这将使bash找不到要执行的任何命令:

PATH=""

最后,我们通过设置以下权限禁止用户编辑任何文件:

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile

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);
}

我将受限用户的shell设置为此程序。

我认为受限制的用户即使可以执行任何操作也不会执行任何操作ssh server command,因为命令是使用Shell执行的,并且此Shell不会执行任何操作。



-3

您将通过用户使用的任何ssh客户端在用户计算机上生成密钥。例如,pUTTY具有实用程序来执行此操作。它将生成私钥和公钥。

生成的公共密钥文件的内容将放置在authorized_keys文件中。

接下来,您需要确保将ssh客户端配置为使用生成公钥的私钥。这是相当简单的,但是根据所使用的客户端而略有不同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.