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

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

有帮助吗?

解决方案

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

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

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

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

在远程“somehost”上,这是我用于授权密钥的内容:

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/命令说明如下:

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

尝试使用 scp 安全文件复制也会失败,并出现“不发送命令”的回显,我发现 sftp 在这种配置下也会失败。

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

其他提示

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

除了像 no-X11-forwarding 这样的authorized_keys选项之外,实际上还有一个你想要的:允许打开=“主机:端口”。通过使用此选项,用户只能建立到指定主机和端口的隧道。

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

我的解决方案是为仅可能进行隧道传输的用户提供, 没有交互式 shell, ,将该 shell 设置为 /etc/密码/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/

我可以使用公共密钥登录的授权_keys文件。我不确定的是我需要限制该帐户的其他信息。例如,我知道我可以放置命令,例如:

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 (更改目录)并且无法设置任何环境变量。

然后我们编辑用户的 PATH 环境变量 /home/sshtunnel/.profile 什么都没有 - 这个技巧会让 bash 找不到任何要执行的命令:

PATH=""

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

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

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

这篇关于验证公钥的文章.

您需要记住的两件事是:

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

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

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

接下来,您需要确保 ssh 客户端配置为使用生成公钥的私钥。它相当简单,但根据所使用的客户端略有不同。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top