В 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-server, порт "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 - это порт redis-server, который я хотел перенаправить.
Команда = "/ bin / echo do-not-send-commands" повторяет "do-not-send-commands", если кому-то или чему-то удается отправить команды на хост через ssh -T или иным образом.
Из недавнего Ubuntu man sshd
команда authorized_keys / описывается следующим образом:
command = "command" Указывает, что команда выполняется всякий раз, когда этот ключ используется для аутентификации. Команда, предоставленная пользователем (если есть), игнорируется.
Попытки использовать безопасное копирование файлов scp также будут неудачными с эхом «do-not-send-commands». Я обнаружил, что sftp также терпит неудачу с этой конфигурацией.
Я думаю, что предложение ограниченной оболочки, сделанное в некоторых предыдущих ответах, также является хорошей идеей. Кроме того, я согласен, что все, что здесь подробно описано, можно определить, прочитав "man sshd" и выполнив поиск в нем "authorized_keys"
no-pty
он не позволяет открывать интерактивные окна, он ничего не делает для предотвращения выполнения команд, поэтому пользователь может редактироватьauthorized_keys
файл, если у него есть доступ с чем-то вродеssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
.~user/.ssh/authorized_keys
принадлежитuser
иuser
управляет авторизованными ключами, используемыми для доступа к учетной записи. SSH требователен к разрешениям и может налагать определенные ожидания на~/.ssh/
свое содержимое. Я сделал,sudo chown root: .ssh/authorized_keys
и это, кажется, помешало мне войти в систему, но по прошлому опыту я знаю, что пользователю не обязательно владеть этим файлом - онroot
может управлять им, если хотите.Вы, вероятно, захотите установить оболочку пользователя на ограниченную оболочку . Отключите переменную PATH в ~ / .bashrc или ~ / .bash_profile пользователя, и они не смогут выполнять никакие команды. Позже, если вы решите, что хотите разрешить пользователю (-ам) выполнять ограниченный набор команд, например
less
или,tail
например, вы можете скопировать разрешенные команды в отдельный каталог (например,/home/restricted-commands
) и обновить PATH, чтобы указать на этот каталог.источник
ssh use@host "/bin/bash"
, не так ли?user@host
в качестве оболочки используется rbash. Смотрите The Restricted Shell/bin/bash
завершается неудачно, поскольку она содержит косые черты.less
- это, вероятно, плохая идея, потому что оттуда вы можете уйти в неограниченную оболочку с помощью!/bin/bash
. См. Pen-testing.sans.org/blog/2012/06/06/… для других примеров. Так что разрешение отдельных команд должно выполняться очень и очень осторожно, если вообще.Помимо параметра authorized_keys, такого как no-X11-forwarding, на самом деле есть именно тот, который вы запрашиваете: allowopen = "host: port". Используя эту опцию, пользователь может установить туннель только к указанному хосту и порту.
Подробные сведения о формате файла AUTHORIZED_KEYS см. В man sshd.
источник
no-pty
также не ограничивает доступ к оболочке, вы все равно попадете в оболочку, она просто не покажет вам приглашение; Вы по-прежнему можете отдавать команды и прекрасно видеть результат. Вам понадобитсяcommand="..."
опция, если вы хотите ограничить доступ к оболочке из.ssh/authorized_keys
.Мое решение - предоставить пользователю, который может выполнять только туннелирование, без интерактивной оболочки , установить эту оболочку в / etc / passwd на / usr / bin / tunnel_shell .
Просто создайте исполняемый файл / usr / bin / tunnel_shell с бесконечным циклом .
Полностью объяснено здесь: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
источник
tunnel_shell
, вы будете иметь ,shell -> /bin/bash tunnel_shell
так что вы можете, конечно , бежать обратно к раковине, но если вы установите вtunnel_shell
качестве оболочки пользователя, вы только уже/bin/bash tunnel_shell
работаете, без оболочки , чтобы избежать в , насколько я вижу. Я проверил это и не смог убежать с помощью ctrl-z. Если бы вы все же попробовали и смогли сбежать, не могли бы вы опубликовать настройку? Точно так же, если вы знаете какую-либо документацию, в которой говорится, что это должно работать именно так, не могли бы вы опубликовать это?Вам нужна строка в вашем файле authorized_keys, которая выглядит так.
источник
Если вы хотите разрешить доступ только для определенной команды, например svn, вы также можете указать эту команду в файле авторизованных ключей:
Из 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")
Обратите внимание, что мы используем rbash (limited-bash), чтобы ограничить действия пользователя: пользователь не может cd (сменить каталог) и не может устанавливать какие-либо переменные среды.
Затем мы изменяем пользовательскую переменную окружения PATH
/home/sshtunnel/.profile
до нуля - трюк, который заставит bash не найти никаких команд для выполнения:Наконец, мы запрещаем пользователю редактировать любые файлы, установив следующие разрешения:
источник
Я сделал программу на C, которая выглядит так:
Я установил оболочку ограниченного пользователя для этой программы.
Я не думаю, что ограниченный пользователь может что-либо выполнить, даже если он это сделает
ssh server command
, потому что команды выполняются с использованием оболочки, а эта оболочка ничего не выполняет.источник
См. Этот пост об аутентификации открытых ключей .
Вам нужно помнить о двух основных вещах:
chmod 700 ~/.ssh
источник
Вы сгенерируете ключ на машине пользователя через любой ssh-клиент, который они используют. У pUTTY, например, есть утилита для выполнения именно этого. Он сгенерирует как закрытый, так и открытый ключ.
Содержимое сгенерированного файла открытого ключа будет помещено в файл authorized_keys.
Затем вам нужно убедиться, что клиент ssh настроен на использование закрытого ключа, сгенерировавшего открытый ключ. Это довольно просто, но немного отличается в зависимости от используемого клиента.
источник