当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《允许用户设置SSH隧道,但没有别的》经验,为你挑选了4个好方法。

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

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



1> Paul..:

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

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

$ 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 /命令描述如下:

command ="command"指定只要使用此密钥进行身份验证,就会执行该命令.用户提供的命令(如果有)将被忽略.

尝试使用scp安全文件复制也将失败并显示"do-not-send-commands"的回声我发现sftp也因此配置而失败.

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


上面列出的@synapse命令="/ bin/echo do-not-send-commands"用于阻止命令.并提供一条消息.你打算用你的例子来打败上面的所有设置,还是只评论no-pty?

2> Jason Day..:

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


虽然应该说允许"less"可能是一个坏主意,因为从那里你可以通过`!/ bin/bash`逃到一个不受限制的shell.有关其他示例,请参见http://pen-testing.sans.org/blog/2012/06/06/escaping-restricted-linux-shells/comment-page-1/.因此,如果有的话,应该非常小心地完成单个命令.

3> 小智..:

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

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


您还需要指定"no-pty"作为选项集的一部分.如果仅使用"permitopen",那么您将限制隧道到给定的主机/端口......但您仍将允许交互式shell.
@JohnHart:`no-pty`也不限制shell访问,你仍然会进入shell,它只是不会向你显示提示; 你仍然可以给出命令并看到输出就好了.如果要从`.ssh/authorized_keys`限制shell访问,则需要`command ="..."`选项.

4> Daniel W...:

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


CTRL + Z将从脚本中逃脱,让您完全访问bash ...尝试在脚本的最开头添加"trap''20"(不带引号)
@BigPapoo:你真的测试过吗?我看不出它会逃到哪里.如果你在shell中运行`tunnel_shell`,那么你将拥有`shell - >/bin/bash tunnel_shell`,这样你当然可以逃回shell,但如果你设置`tunnel_shell`*为*用户的shell,你只能运行`/ bin/bash tunnel_shell`,没有shell可以逃脱,据我所见.我测试了它,无法用ctrl-z逃脱.如果你*尝试过并且可以逃脱,你可以发布设置吗?同样,如果您知道任何文档说它应该像那样工作,您可以发布吗?
推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有