Docs/SysAdmin/Networking/SSH

Материал из Mandriva Russian Community Wiki

Перейти к: навигация, поиск
SSH

Содержание

Доступ к находящимися за одним IP-адресом нескольким компьютерам

Помните, что за портом 22 на NAT маршрутизатора/файрволла может быть только один компьютер. Чтобы обойти это ограничение, каждой машине, доступ к которой требуется через маршрутизатор/файрволл, понадобится свой отдельный порт. Порты SSH нельзя прокидывать (NATить) на другие порты, прокидывать можно только без изменений номера. Например порт 22 ведет на компьютер1(foo):22, а порт 222 ведет на компьютер2(bar):222.

Для каждого сервера необходимо изменить номер порта в конфигурационном файле sshd.

Сервер 1 (foo)

Используется нормальный файл /etc/ssh/sshd_config.

Сервер 2 (bar)

Необходимо назначить другой порт в файле /etc/ssh/sshd.config:

Port 222

На стороне клиента надо настроить ssh для каждого сервера в файле ~/.ssh/config

Host foo
Hostname mydomain.com
Port 22
HostKeyAlias = foo
CheckHostIP = no

Host bar
Hostname mydomain.com
Port = 222
HostKeyAlias = bar
CheckHostIP = no

Для установки соединения, используйте следующие команды:

ssh mydomain.com           # по-умолчанию порт 22
ssh mydomain.com -p 222 

Можно использовать и упрощенные команды:

ssh foo
ssh bar


Защита SSH от атак методом подбора пароля

Ниже приведен скрипт, который ищет в журналах попытки подбора пароля к SSH серверу и добавляет IP-адрес атакующего в черный список. Скрипт может запускаться по расписанию с использованием cron. Заранее внесите в файл hosts.allow диапазоны тех IP-адресов, с которых вы обычно подключаетесь. Это нужно для того, чтобы при случайном неверном пароле ваш собственный адрес не заблокировался.

Создайте скрипт sshd-block в каталоге /usr/local/sbin. Создайте еще один каталог:
mkdir /usr/local/sbin/sshd_block


#!/bin/sh
cd /usr/local/sbin
#удаляем старые временные файлы
rm ./sshd_block/block.txt
rm ./sshd_block/new_block.txt
#Поиск нужных строк в журнале
grep sshd /var/log/messages | grep Failed | grep invalid >> ./sshd_block/block.txt
#Эта строчка удалит из файла все, кроме IP-адресов
cut -d \  -f 13 ./sshd_block/block.txt | uniq >> ./sshd_block/new_block.txt
#Эта строчка добавит новые записи в черный список
target=`cat /usr/local/sbin/sshd_block/new_block.txt`
for i in $target; do
        echo ALL:$i >> /etc/hosts.deny
done
#удаляем одинаковые строчки из черного списка
cat /etc/hosts.deny | sort | uniq > /etc/hosts.deny.new
mv /etc/hosts.deny.new /etc/hosts.deny

Кстати: Кто-то решит, что списки IP-адресов лучше добавить в файл /etc/ssh.block, но у меня это по какой-то причине не сработало, поэтому я решил использовать hosts.deny.

Если по какой-то причине этот скрипт не работает, проверьте вывод команды:

# grep sshd /var/log/messages | grep Failed | grep invalid

Должно быть, например, так:

Dec 22 04:09:33 hostname sshd[13364]: Failed password for invalid user root from 212.78.79.20 port 49858 ssh2

Если посчитать, то IP-адрес находится на 13-ом месте в этой строчке. Если у вас на другом, внесите изменения в параметры команды cut.

Есть другой способ защиты от атаки методом подбора пароля. Это скрипт BFD (Brute Force Detection), находящийся здесь: http://www.rfxnetworks.com/bfd.php .

Пришлось сделать несколько изменений, чтобы подогнать скрипт под Mandriva, т.к. он сделан для Red Hat.

После установки зайдите в каталог rules и измените файл sshd следующим образом:

LP="/var/log/messages"
TLOG_TF="sshd"
TRIG="3"
TMP="/usr/local/bfd/tmp"

## SSH
ARG_VAL1=`$TLOGP $LP $TLOG_TF.1 | grep sshd | grep -iwf $PATTERN_FILE | awk '{print$13":"$10}' > $TMP/.sshd`
ARG_VAL2=`$TLOGP $LP $TLOG_TF.2 | grep sshd | grep -iwf $PATTERN_FILE | grep -w "Failed" | awk '{print$13":"$10}' >> $TMP/.sshd`
ARG_VAL3=`$TLOGP $LP $TLOG_TF.3 | grep sshd | grep -iwf $PATTERN_FILE | grep -w "invalid" | tr '[]=' ' ' | awk '{print$15":"$12}' >> $TMP/.sshd`
ARG_VAL=`cat $TMP/.sshd`

Те, кто используют ipv6 и не хотят его отключать заметят сообщения, о том, что BFD заблокировал ffff. Чтобы не отключать ipv6, необходимо внести следующие изменения:

## SSH
ARG_VAL1=`$TLOGP $LP $TLOG_TF.1 | grep sshd | grep -iwf $PATTERN_FILE | sed s/::ffff:// | awk '{print$13":"$10}' > $TMP/.sshd`
ARG_VAL2=`$TLOGP $LP $TLOG_TF.2 | grep sshd | grep -iwf $PATTERN_FILE | grep -w "Failed" | sed s/::ffff:// | awk '{print$13":"$10}' \
>> $TMP/.sshd`
ARG_VAL3=`$TLOGP $LP $TLOG_TF.3 | grep sshd | grep -iwf $PATTERN_FILE | grep -w "invalid" | tr '[]=' ' ' | sed s/::ffff:// | awk '{print$15":"$12}' \
>> $TMP/.sshd`
ARG_VAL=`cat $TMP/.sshd`

Вывод ошибочных сообщений прекратится.

Возможно вы захотите изменить команду для вашего файрволла. Например, при использовании shorewall нужно изменить команду файрволла (BAN_COMMAND в файле /usr/local/bfd/conf.bfd) на "/sbin/shorewall drop $ATT_HOST" и все будет работать. Если вы не используете shrewall, попробуйте "iptables -A INPUT -s $ATT_HOST -j DROP"...

Установка соединения VNC с компьютером за NAT с помощью туннеля SSH

Установить VNC-соединение с компьютером, находящимся за NAT, к которому имеется доступ по SSH можно следующей командой:

vncviewer -via user@ssh.work.net -compresslevel 7 -quality 4 mysys::5901

ssh.work.net - компьютер, к которому имеется доступ по ssh user - пользователь этой системы mysys - компьютер за NAT, на котором запущен VNC-сервер 5901 - порт, который слушает VNC-сервер.

Можно проделать следующие действия, чтобы упростить себе доступ в дальнейшем.

1) Настройка беспарольного доступа по ssh на ssh.work.net:

ssh-keygen -t rsa

(Ответ на вопрос о кодовой фразе оставьте пустым. Если считаете, что это небезопасно, введите кодовую фразу. Ниже будет указанно, что надо изменить в скрипте, чтобы кодовая фраза запрашивалась при подключении.)

scp ~/.ssh/id_rsa.pub user@ssh.work.net:.ssh/newkey

Теперь зайдите по ssh на ssh.work.net и дайте следующую команду, после чего отключитесь:

cat ~/.ssh/newkey >> ~/.ssh/authorized_keys

Теперь вы сможете подключаться по ssh к ssh.work.net без пароля.

2) В домашнем каталоге создайте файл, содержащий пароль к VNC-серверу, с помощью vncpasswd:

vncpasswd ~/.ssh/workpw

3) Сохраните этот скрипт как ~/vncwork, и сделайте его исполняемым с помощью команды chmod +x ~/vncwork:

#!/bin/sh
#
# vncwork - подключение через туннель SSH

SYSA="user@ssh.work.net"
SYSB="mysys"
VNCPORT="5901"
VNCPW=$HOME"/.ssh/workpw"

# Раскоментируйте следующие строчки, если используется кодовая фраза
# eval $(ssh-agent)
# ssh-add


xinit /usr/X11R6/bin/vncviewer -fullscreen -compresslevel 7 \
   -quality 4 -passwd $VNCPW -via $SYSA $SYSB::$VNCPORT -- :1

# Раскоментируйте следующую строчку, если используется кодовая фраза
# eval $(ssh-agent -k)

# конец

Измените переменные в начале скрипта под ваши нужды.

Теперь можно переключиться в консоль (Ctrl-Alt-[от F1 до F6], войдите под пользователем и запустите ./vncwork для запуска второго экземпляра X-сервера (display :1), где будет только vncviewer в полноэкранном режиме. Для переключения в обычный X-сервер нажмите Ctrl-Atl-F7; для возврата к VNC - Ctrl-Alt-F8.

Чтобы завершить работу с VNC, нажмите Ctrl-Alt-Backspace. Произойдет завершение работы vncviewer и остановка X-сервера. Вы снова окажетесь в консоли. Разлогинтесь и нажмите Ctrl-Alt-F7 для возврата в обычный X-сервер.

Другие ссылки

На других языках
Ad (via La Vignette)
Looking for a job?