允许用户build立一个SSH隧道,但没有别的

我想允许用户build立到特定端口(例如5000)的特定机器的SSH隧道,但是我想尽可能地限制这个用户。 (身份validation将使用公钥/私钥对)。

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

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

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

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

这将导致“somehost”上的redis-server,“localhost”端口6379出现在执行ssh命令的主机本地,重映射到“localhost”端口16379。

在远程“一些主机”这是我用于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访问了大多数想要打开terminal的ssh尝试。

permitopen解释了哪些端口可以被转发,在这种情况下,端口6379是我想要转发的redis-server端口。

如果有人或某事通过ssh -T或其他方式发送命令给主机,则命令=“/ bin / echo do-not-send-commands”回显“不发送命令”。

从最近的Ubuntu man sshd ,authorized_keys / command的描述如下:

command =“command”指定只要使用此密钥进行身份validation就执行该命令。 用户提供的命令(如果有的话)被忽略。

尝试使用scp安全文件复制也会失败,并显示“do-not-send-commands”的回声。我发现sftp也会因此configuration失败。

我认为在之前的一些答案中提出的限制shellbuild议也是一个好主意。 另外,我同意在这里详述的一切可以通过阅读“man sshd”并在其中search“authorized_keys”

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

除了像no-X11-forwarding这样的authorized_keys选项,实际上还有一个你正在请求的:permitopen =“host:port”。 通过使用该选项,用户只能build立到指定主机和端口的隧道。

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

我的解决scheme是向没有交互式shell的用户提供只能通过隧道操作的用户将/ etc / passwd中的shell设置为/ usr / bin / tunnel_shell

只需用无限循环创build可执行文件/ 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/

我可以使用公钥设置authorized_keys文件来login。我不确定的是额外的信息,我需要限制什么帐户是允许做的。 例如,我知道我可以把命令,如:

 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

在这里,你有一个不错的职位,我觉得有用: 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(更改目录),也不能设置任何环境variables。

然后,我们将/home/sshtunnel/.profile的用户PATH envvariables编辑为/home/sshtunnel/.profile – 这个技巧会使bash找不到任何要执行的命令:

 PATH="" 

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

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

在validation公钥上看到这篇文章 。

你需要记住的两件事情是:

  1. 确保你chmod 700 ~/.ssh
  2. 将公钥块添加到授权密钥中

我做了一个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不执行任何操作。

你将通过他们正在使用的任何ssh客户端在用户机器上生成一个密钥。 例如pUTTY有一个实用工具来做这个确切的事情。 它将生成一个私人和公共密钥。

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

接下来,您需要确保ssh客户端被configuration为使用生成公钥的私钥。 这是相当直接的,但略有不同,取决于使用的客户端。