允许用户设置SSH隧道,但没有别的

时间:2008-08-11 17:59:02

标签: unix ssh

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

我知道我需要编辑相关的〜/ .ssh / authorized_keys文件,但我不确定要放入哪些内容(公钥除外)。

10 个答案:

答案 0 :(得分:87)

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

具体来说,我将“somehost”上的redis-server绑定到localhost:6379,我希望通过ssh隧道安全地共享到具有密钥文件的其他主机,并将与ssh一起使用:

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

这将导致“somehost”上的redis-server“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 /命令描述如下:

  

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

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

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

答案 1 :(得分:18)

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

答案 2 :(得分:17)

除了像no-X11-forwarding这样的authorized_keys选项之外,实际上只有你要求的一个:permitopen =" host:port"。通过使用此选项,用户只能设置到指定主机和端口的隧道。

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

答案 3 :(得分: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/

答案 4 :(得分:3)

  

我可以使用公钥设置authorized_keys文件进行记录   in。我不确定的是我需要的其他信息   限制允许该帐户执行的操作。例如,我知道我可以   把命令如:

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 

答案 5 :(得分:3)

如果您只想对特定命令(例如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

答案 6 :(得分: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(restricted-bash)来限制用户可以执行的操作:用户无法cd(更改目录)并且无法设置任何环境变量。

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

PATH=""

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

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

答案 7 :(得分: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不执行任何操作。

答案 8 :(得分:-1)

请参阅this post on authenticating public keys

您需要记住的两件主要事情是:

  1. 确保chmod 700 ~/.ssh
  2. 将公钥块附加到authorized-keys

答案 9 :(得分:-3)

您将通过他们使用的任何ssh客户端在用户计算机上生成密钥。例如pUTTY有一个实用程序可以做到这一点。它将生成私钥和公钥。

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

接下来,您需要确保将ssh客户端配置为使用生成公钥的私钥。它非常直接,但根据使用的客户端略有不同。