Docs/SysAdmin/Networking/SSH
Материал из Mandriva Russian Community Wiki
Содержание |
Доступ к находящимися за одним 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-сервер.

