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

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

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

Ответы [ 10 ]

87 голосов
/ 22 апреля 2012

В 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

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

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

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

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

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

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

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

18 голосов
/ 12 августа 2008

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

17 голосов
/ 17 ноября 2010

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

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

9 голосов
/ 13 апреля 2013

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

3 голосов
/ 13 мая 2015

Вот вам хороший пост, который я нашел полезным: http://www.ab -weblog.com / о / создание-а-ограниченного SSH-пользователь-для-SSH-туннелирование только /

Идея такова: (с новым ограниченным именем пользователя как sshtunnel)

useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel

Обратите внимание, что мы используем rbash (limited-bash), чтобы ограничить действия пользователя: пользователь не может cd (сменить каталог) и не может устанавливать переменные окружения.

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

PATH=""

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

chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile
3 голосов
/ 06 апреля 2013

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

3 голосов
/ 08 октября 2008

Я могу настроить файл author_keys с открытым ключом для входа в. То, что я не уверен, это дополнительная информация, мне нужно ограничить то, что разрешено делать этой учетной записи. Например, я знаю, что могу положить команды, такие как:

no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding

Вы бы хотели, чтобы в вашем файле author_keys была строка, которая выглядит следующим образом.

permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache 
0 голосов
/ 17 ноября 2014

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

0 голосов
/ 11 августа 2008

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

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

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

0 голосов
/ 11 августа 2008

См. этот пост об аутентификации открытых ключей .

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

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