允许用户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,他们将不能执行任何命令。 稍后,如果您决定要允许用户执行一组有限的命令(例如less
或tail
,则可以将允许的命令复制到单独的目录(例如/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公钥上看到这篇文章 。
你需要记住的两件事情是:
- 确保你
chmod 700 ~/.ssh
- 将公钥块添加到授权密钥中
我做了一个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为使用生成公钥的私钥。 这是相当直接的,但略有不同,取决于使用的客户端。