2008-08-11 18 views
88

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

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

ответ

82

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

В частности у меня есть Redis-сервер на «somehost», связанного с локального хоста: 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/описывается следующим образом:

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

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

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

0

См. this post on authenticating public keys.

два основных вещей, которые вы должны помнить, является:

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

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

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

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

18

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

+0

Но это не мешает пользователю указать другую команду в командной строке SSH, как `SSH использовать @ хост«/ bin/Баш»`, не так ли? – Fritz 2015-08-31 10:31:01

+0

Да, это так, если предположить, что `user @ host` имеет rbash как оболочку. См. [Ограниченная оболочка] (http://www.gnu.org/software/bash/manual/html_node/The-Restricted-Shell.html) – 2015-08-31 13:23:10

+0

Хорошо, я попробовал, и вы правы. Поскольку указанная команда выполняется оболочкой входа, выполнение `/ bin/bash` завершается с ошибкой, поскольку в ней содержатся слэши. – Fritz 2015-09-01 17:29:10

3

Я могу создать файл 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 
17

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

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

3

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

8

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

Просто создайте исполняемый файл /USR/бен/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/

-1

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

3

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

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

PATH="" 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^