我想允许用户在特定端口(例如5000)上建立到特定计算机的SSH隧道,但是我想尽可能地限制该用户。 (身份验证将使用公共/专用密钥对)。
我知道我需要编辑相关的?/ .ssh / authorized_keys文件,但是我不确定到底要放什么内容(除了公钥)。
在Ubuntu 11.10上,我发现我可以阻止ssh命令(使用-T和不使用-T发送),并阻止scp复制,同时允许端口转发通过。
具体来说,我在绑定到localhost:6379的" somehost"上有一个redis服务器,希望通过ssh隧道安全地共享到其他具有密钥文件的主机,并将通过ssh进行共享:
1
| $ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost |
这将导致redis服务器" somehost"上的" localhost"端口6379在执行ssh命令的主机上本地显示,并重新映射到" localhost"端口16379。
在远程" somehost"上,这是我用于authorized_keys的内容:
1 2 3
| 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或其他方式向主机发送命令,则command =" / bin / echo do-not-send-commands"回显" do-not-send-commands"。
在最近的Ubuntu man sshd中,authorized_keys /命令的描述如下:
command="command"
Specifies that the command is executed whenever this key is used
for authentication. The command supplied by the user (if any) is
ignored.
尝试使用scp安全文件复制也将失败,并回显" do-not-send-commands"。我发现sftp在此配置下也失败。
我认为在先前的一些回答中提出的限制性外壳建议也是一个好主意。
另外,我同意可以通过阅读" man sshd"并在其中搜索" authorized_keys"来确定此处详述的所有内容
您可能需要将用户的外壳设置为受限外壳。在用户的?/ .bashrc或?/ .bash_profile中取消设置PATH变量,他们将无法执行任何命令。稍后,如果您决定要允许用户执行一组有限的命令,例如less或tail,则可以将允许的命令复制到单独的目录(例如)并更新PATH以指向该目录。
除了诸如no-X11-forwarding之类的authorized_keys选项外,实际上您还要求提供一个:allowopen =" host:port"。通过使用此选项,用户只能建立到指定主机和端口的隧道。
有关AUTHORIZED_KEYS文件格式的详细信息,请参考man sshd。
我的解决方案是为仅提供隧道服务的用户(而不提供交互式shell)将/ etc / passwd中的该shell设置为/ usr / bin / tunnel_shell。
只需使用无限循环创建可执行文件/ usr / bin / tunnel_shell。
1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/bash
trap '' 2 20 24
clear
echo -e"
\033[32mSSH tunnel started, shell disabled by the system administrator
"
while [ true ] ; do
sleep 1000
done
exit 0 |
此处有完整说明:http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
在这里,我有一篇不错的文章,对我很有帮助:
http://www.ab-weblog.com/zh-CN/creating-a-restricted-ssh-user-for-ssh-tunneling-only/
这个想法是:(使用新的受限用户名为" sshtunnel")
1 2
| useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel |
请注意,我们使用rbash(受限bash)来限制用户可以执行的操作:用户不能cd(更改目录)并且不能设置任何环境变量。
然后,我们将/home/sshtunnel/.profile中用户的PATH env变量编辑为空-这将使bash找不到任何要执行的命令:
最后,我们通过设置以下权限禁止用户编辑任何文件:
1 2 3
| chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile |
如果要只允许访问特定命令(例如svn),则还可以在授权密钥文件中指定该命令:
1
| 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
I'm able to set up the authorized_keys file with the public key to log
in. What I'm not sure about is the additional information I need to
restrict what that account is allowed to do. For example, I know I can
put commands such as:
1
| no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding |
您可能希望您的authorized_keys文件中的一行如下所示。
1 2
| permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache |
我做了一个C程序,看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #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
");
while(1)
sleep(1);
exit(0);
} |
我将受限用户的外壳程序设置为此程序。
我认为受限制的用户即使执行ssh server command也无法执行任何操作,因为命令是使用Shell执行的,并且此Shell不执行任何操作。
请参阅有关验证公钥的文章。
您需要记住的两件事是:
确保您chmod 700 ~/.ssh
将公钥块追加到授权密钥
您将通过用户使用的任何ssh客户端在用户计算机上生成密钥。例如,pUTTY具有实用程序来执行此操作。它将生成私钥和公钥。
生成的公共密钥文件的内容将放置在authorized_keys文件中。
接下来,您需要确保将ssh客户端配置为使用生成公钥的私钥。这是相当简单的,但是根据所使用的客户端而略有不同。