Разрешить пользователю настраивать туннель SSH, но ничего больше

Я хотел бы разрешить пользователю настраивать туннель SSH на определенную машину на определенном порту (скажем, 5000), но я хочу как можно больше ограничить этого пользователя. (Аутентификация будет с открытой/закрытой ключевой парой).

Я знаю, что мне нужно отредактировать соответствующий файл ~/.ssh/authorized_keys, но я точно не знаю, какой контент его разместить (кроме открытого ключа).

Ответ 1

В Ubuntu 11.10 я обнаружил, что могу блокировать команды ssh, отправленные с использованием и без -T, и блокировать копирование scp, а также пропускать пересылку портов.

В частности, у меня есть redis-сервер на "somehost" , привязанный к localhost: 6379, который я хочу безопасно делиться через туннели ssh с другими хостами, которые имеют ключевой файл и будет с ssh:

$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 [email protected]

Это приведет к тому, что redis-server, "localhost" port 6379 на "somehost" появится локально на хосте, выполняющем команду 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 [email protected]

Не-pty отключает большинство попыток ssh, которые хотят открыть терминал.

В разрешении объясняется, какие порты разрешены для пересылки, в этом случае порт 6379 - порт redis-сервера, который я хотел переслать.

Команда = "/bin/echo do-not-send-commands" отсылает обратно команды do-not-send-commands, если кому-то или чему-то удается отправлять команды хосту через ssh-T или иначе.

Из недавнего Ubuntu man sshd, authorized_keys/команда описывается следующим образом:

Команда = "команда"              Указывает, что команда выполняется всякий раз, когда используется этот ключ              для аутентификации. Команда, предоставленная пользователем (если есть),              игнорируются.

Попытки использовать скопированное защищенное копирование файлов также потерпят неудачу с эхом "do-not-send-commands". Я обнаружил, что sftp также не работает с этой конфигурацией.

Я думаю, что предложение ограниченных оболочек, сделанное в некоторых предыдущих ответах, также является хорошей идеей. Кроме того, я бы согласился с тем, что все подробное описание здесь можно определить из чтения "man sshd" и поиска в нем для "authorized_keys"

Ответ 2

Вероятно, вы захотите установить оболочку пользователя ограниченную оболочку. Отмените переменную PATH в файле ~/.bashrc или ~/.bash_profile пользователя, и они не смогут выполнять какие-либо команды. Позже, если вы решите, что хотите разрешить пользователям (пользователям) выполнять ограниченный набор команд, например, less или tail, то вы можете скопировать разрешенные команды в отдельный каталог (например, /home/restricted-commands) и обновите PATH, чтобы указать на этот каталог.

Ответ 3

Помимо опции authorized_keys, например no-X11-forwarding, на самом деле есть именно тот, который вы запрашиваете: allowopen = "host: port". Используя этот параметр, пользователь может настроить туннель только на указанный хост и порт.

Подробнее о файле формата AUTHORIZED_KEYS см. man sshd.

Ответ 4

Мое решение - предоставить пользователю, который может быть туннелирован, без интерактивной оболочки, чтобы установить эту оболочку в /etc/passwd на /usr/бен/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/

Ответ 5

Я могу настроить файл authorized_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 

Ответ 6

Если вы хотите разрешить доступ только для определенной команды - например, 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

Ответ 7

Здесь у вас хорошая запись, которую я нашел полезной: 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 (limited- bash), чтобы ограничить то, что пользователь может сделать: пользователь не может cd (изменить каталог) и не может устанавливать какие-либо переменные среды.

Затем мы редактируем переменную env пользователя PATH в /home/sshtunnel/.profile ни к чему - трюк, который сделает bash не найти каких-либо команд для выполнения:

PATH=""

Наконец, мы запрещаем пользователю редактировать любые файлы, установив следующие разрешения:

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

Ответ 9

Я сделал программу на 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);
}

Я установил ограниченную оболочку пользователя для этой программы.

Я не думаю, что ограниченный пользователь может выполнить что угодно, даже если они делают ssh server command, потому что команды выполняются с использованием оболочки, и эта оболочка ничего не выполняет.

Ответ 10

Вы создадите ключ на компьютере пользователя через любой клиент ssh, который они используют. Например, у pUTTY есть утилита для выполнения этой конкретной задачи. Он будет генерировать как закрытый, так и открытый ключ.

Содержимое сгенерированного открытого файла ключа будет помещено в файл authorized_keys.

Далее вам нужно убедиться, что клиент ssh настроен на использование закрытого ключа, сгенерировавшего открытый ключ. Это довольно прямолинейно, но немного отличается в зависимости от используемого клиента.