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

StackOverflow https://stackoverflow.com/questions/8021

  •  08-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Это приведет к тому, что redis-сервер, порт "localhost" 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 keyuser@keyhost

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

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

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

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

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

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

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

Другие советы

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

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

Для получения подробной информации о формате файла AUTHORIZED_KEYS обратитесь к man sshd.

Мое решение состоит в том, чтобы предоставить пользователю, который только может выполнять туннелирование, без интерактивной оболочки, чтобы установить эту оболочку в /etc/passwd Для /usr/bin/туннель_shell.

Просто создайте исполняемый файл /usr/bin/туннель_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/

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

Если вы хотите разрешить доступ только для определенной команды - например, 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 env пользователя в /home/sshtunnel/.profile ни к чему - трюк, который заставит bash не находить никаких команд для выполнения:

PATH=""

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

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

Я создал программу на языке Си, которая выглядит примерно так:

#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, потому что команды выполняются с помощью оболочки, а эта оболочка ничего не выполняет.

Видишь этот пост посвящен аутентификации открытых ключей.

Две основные вещи, которые вам нужно запомнить, это:

  1. Убедитесь, что вы chmod 700 ~/.ssh
  2. Добавьте блок открытого ключа к авторизованным ключам

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top