Unix 允许用户设置SSH隧道,但不允许其他设置

Unix 允许用户设置SSH隧道,但不允许其他设置,unix,ssh,Unix,Ssh,我希望允许用户在特定端口(比如5000)上设置到特定机器的SSH隧道,但我希望尽可能地限制此用户。(将使用公钥/私钥对进行身份验证) 我知道我需要编辑相关的~/.ssh/authorized_keys文件,但我不确定要在其中放入什么内容(公钥除外)。请参阅 您需要记住的两件主要事情是: 确保您chmod 700~/.ssh 将公钥块附加到授权密钥 您将通过用户使用的任何ssh客户端在用户计算机上生成密钥。例如,pUTTY有一个实用程序来完成这项工作。它将生成私钥和公钥 生成的公钥文件的内容将放在

我希望允许用户在特定端口(比如5000)上设置到特定机器的SSH隧道,但我希望尽可能地限制此用户。(将使用公钥/私钥对进行身份验证)

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

请参阅

您需要记住的两件主要事情是:

  • 确保您
    chmod 700~/.ssh
  • 将公钥块附加到授权密钥

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

    生成的公钥文件的内容将放在授权密钥文件中


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

    您可能需要将用户的shell设置为。在用户的~/.bashrc或~/.bash_配置文件中取消设置PATH变量,他们将无法执行任何命令。稍后,如果您决定允许用户执行一组有限的命令,例如
    less
    tail
    ,则可以将允许的命令复制到单独的目录(例如
    /home/restricted commands
    )并更新指向该目录的路径

    我可以使用要记录的公钥设置授权密钥文件 在里面我不确定的是我需要提供的额外信息 限制该帐户允许执行的操作。例如,我知道我可以 放置命令,例如:

    no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding
    
    您希望在授权密钥文件中有一行如下所示

    permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
    ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 
    

    除了像no-X11-forwarding这样的授权密钥选项之外,实际上还有一个是您需要的:permitopen=“host:port”。通过使用此选项,用户只能设置到指定主机和端口的隧道


    有关授权密钥文件格式的详细信息,请参阅mansshd。

    在Ubuntu11.10上,我发现我可以阻止ssh命令(使用和不使用-T发送)和scp复制,同时允许端口转发

    具体地说,我在绑定到localhost:6379的“somehost”上有一个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或其他方式向主机发送命令,则命令=“/bin/echo do not send commands”回显“don not send commands”

    从最近的Ubuntu
    mansshd
    ,授权密钥/命令描述如下:

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

    尝试使用scp安全文件复制也将失败,并返回“请勿发送命令”,我发现sftp也会失败

    我认为,在之前的一些回答中提出的限制性shell建议也是一个好主意。
    此外,我同意,这里详细介绍的所有内容都可以通过阅读“man sshd”并在其中搜索“authorized_key”来确定,如果您想只允许访问特定命令(如svn),还可以在authorized keys文件中指定该命令:

    command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]
    

    中,我的解决方案是为只可能进行隧道挖掘的用户提供,而不提供交互式shell,将/etc/passwd中的shell设置为/usr/bin/tunnel\u 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
    
    只需使用无限循环创建可执行文件/usr/bin/tunnel\u 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
    

    这里详细解释:

    我制作了一个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);
    }
    
    #包括
    #包括
    #包括
    #包括
    无效信号处理器(int signo)
    {
    if(signo==SIGHUP)
    出口(0);
    }
    int main()
    {
    信号(SIGINT和sig_处理器);
    信号(SIGTSTP和sig_处理器);
    printf(“OK\n”);
    而(1)
    睡眠(1);
    出口(0);
    }
    
    我将受限用户的shell设置为此程序


    我认为受限用户不能执行任何操作,即使他们执行了
    ssh server命令
    ,因为这些命令是使用shell执行的,而这个shell不执行任何操作

    这里有一篇我觉得很有用的帖子:

    想法是:(新的受限用户名为“sshtunnel”)

    注意,我们使用rbash(restrictedbash)来限制用户可以做的事情:用户不能更改cd(changeditory),也不能设置任何环境变量

    然后,我们将
    /home/sshtunnel/.profile
    中用户的PATH env变量编辑为nothing-这一技巧将使bash无法找到任何要执行的命令:

    PATH=""
    
    最后,通过设置以下权限,我们不允许用户编辑任何文件:

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

    您还需要指定“无pty”作为选项集的一部分。如果您仅使用“permitopen”,则将隧道限制到给定的主机/端口。。。但是您仍然允许交互式shell。使用permitopen限制端口转发是否也会锁定ssh-w要求的隧道设备转发?@JohnHart:
    no pty
    也不会限制shell访问,您仍然可以访问shell,它只是不会显示y