OpenSSH - настройка, полезные приемы, секреты и советы по использованию [2009]
За последние несколько лет OpenSSH из набора программ для защищенной
системы регистрации, выполнения команд на удаленном хосте и передачи
файлов с одной машины на другую превратился в швейцарский армейский
нож, просто потрясающий своими возможностями. Используете ли вы хотя бы
половину из них? В этой статье вы найдете множество полезных советов по
настройке, использованию, и всевозможные способы применения ssh в
повседневной жизни, как например резервное копирование, копирование
файлов, создание туннелей, авторизация и ее ограничение, и еще много
всяких вещей которые умеет эта замечательная программа.
Отключение прослушивания IPv6 адресов
По умолчанию sshd(8) слушает как на IPv4 так и на IPv6 адресах. Для
того что бы отключить возможность работы по IPv6, необходимо изменить
параметр AddressFamily:
AddressFamily inet
Адрес и порт прослушивания
По умолчанию sshd(8) принимает подключения на всех интерфейсах, в
чем не всегда есть необходимость. Если не требуется заходить на сервер
“из вне”, следует ограничить его работу определенным адресом с помощью
параметра ListenAddress:
# ListenAddress 0.0.0.0 ListenAddress 192.168.1.2
Дополнительно через двоеточие можно указать и номер порта. В данном
примере используется значение порта, заданное глобально параметром
Port.
Ограничение доступа суперпользователя
В большинстве дистрибутивов в целях безопасности доступ
суперпользователю по SSH закрыт (PermitRootLogin no), и при попытке
зарегистрироваться под root получаем сообщение об ошибке. Для
выполнения задач, требующих привилегий администратора, приходится
заходить под обычным пользователем и использовать su(1) или sudo(8).
Красиво выйти из ситуации поможет директива Match. В качестве аргумента
ей передается критерий отбора (User, Group, Host, Address), его
значение и параметр, который нужно применить. Для примера разрешим
подключение под root только с localhost и из доверенной подсети
192.168.5.0/24:
PermitRootLogin no Match Host 192.168.5.*,127.0.0.1 PermitRootLogin yes
Контроль неудачных подключений
Следующие две директивы позволяют контролировать неудачные подключения к серверу:
LoginGraceTime 60 MaxStartups 2:50:10
Параметр LoginGraceTime определяет, по истечению какого времени
простаивающее подключение будет разорвано (в секундах). Значение по
умолчанию 120 явно завышено. Количество параллельных
неаутентифицированных подключений к серверу контролируется при помощи
MaxStartups. Запись параметра имеет форму “start:rate:full”. В нашем
случае она означает отключение с вероятностью 50% при наличии двух
неаутентифицированных связей, с линейным ростом вероятности до 100% при
достижении 10.
Контроль за подключениями пользователей
Установки в файлах /etc/ssh/sshrc или ~/.ssh/rc
позволяют выполнить некоторые действия при регистрации пользователя.
Здесь можно использовать любые команды оболочки. Например, отправим
администратору на почту уведомление о том, что в систему по SSH зашел
пользователь:
# vi /etc/ssh/sshrc echo $(date) $SSH_CONNECTION $USER $SSH_TTY | mail -s “ssh login” admin@domain.ru
Пример создания резервных копий
Генерируем пару ключей (секретный и публичный):
$ sudo ssh-keygen -t rsa -C ‘remote backup’
Generating public/private rsa key pair. Enter file in which to save the key (/home/user/.ssh/id_rsa): /home/user/.ssh/id_rsa_backup
Добавляем публичный ключ в список авторизованных ключей на удаленной системе:
Каталог /work, находящийся на сервере remotehost, будет сохранен в архив ~/backup/work-11052008.tar.bz2.
Используем dump в связке с SSH
Используя SSH, можно защитить информацию, передаваемую программами,
не имеющими встроенных механизмов шифрования соединения. Например,
сделаем бэкап с помощью dump(8) на удаленный сервер:
Поскольку в dump(8) встроена возможность передавать данные по сети с
использованием RSH, существует возможность использования и SSH,
поскольку его функциональность аналогична:
Для безопасного получения почты с помощью fetchmail можно использовать SSH. Для этого в конфигурационном файле ~/.fetchmailrc необходимо указать следующее:
poll localhost with protocol pop3 and port 8110: preconnect "ssh -f -q -C user@213.167.XX.YY \ -L 8110:213.167.XX.YY:110 sleep 10" password noIdea;
Забираем почту:
$ fetchmail
1 message for user at localhost (8062 octets). reading message user@localhost.domain.ru:1 of 1 (8062 octets)……. flushed
Почтовый шлюз
Настроим 192.168.1.1 на перенаправление входящей и исходящей почты
по шифрованному каналу для клиентов из 192.168.1.0/24 на mail.domain.ru:
Использование параметра ControlMaster позволяет ускорить доступ к
удаленному серверу за счет того, что в специальном файле сохраняются
все параметры предыдущего сеанса, которые и используются при повторном
подключении. Для примера создадим две Host-секции:
$ vi .ssh/config
Host srv1 HostName 213.167.XX.YY ControlMaster yes # Здесь %r - имя, %h - хост и %p - порт ControlPath ~/.ssh/ctl-%r-%h-%p Host srv1fast HostName 213.167.XX.YY ControlMaster no ControlPath ~/.ssh/ctl-%r-%h-%p
Теперь на сервере srv1 выполняем утилиту uptime(1), логинимся на нем
(чтобы создать локальный сокет для второго подключения), переходим на
другую консоль и снова запрашиваем статистические счетчики:
ttyp0$ time ssh srv1 uptime
5:55PM up 37 days, 9:19, 1 user, load averages: 0.33, 0.32, 0.33 0m0.77s real 0m0.06s user 0m0.01s systemttyp0$ ssh srv1
ttyp1$ time ssh srv1fast uptime
5:57PM up 37 days, 9:20, 2 users, load averages: 0.37, 0.34, 0.33 0m0.03s real 0m0.00s user 0m0.01s system
Из примера видно, что при использовании мультиплексирования
соединений время выполнения команды uptime(1) на удаленном сервере
уменьшилось в 25 раз.
Создание SOCKS-сервера
OpenSSH можно использовать как специальный SOCKS-сервер, который
поддерживает более гибкое проксирование, чем простое перенаправление
портов. Например, команда:
$ ssh -D1080 user@domain.ru
Создает локальный SOCKS5-сервер, который ждет подключения на
localhost:1080. Альтернативный вариант - прописать директиву
DynamicForward в .ssh/config:
HTTP/1.1 200 OK Date: Sat, 23 Feb 2008 14:27:43 GMT Server: Apache X-Powered-By: PHP/4.4.1
Теперь SOCKS-сервер готов к использованию:
$ tsocks thunderbird
Сажаем пользователей в песочницу
В OpenSSH 4.9 появилась долгожданная поддержка chroot(2) для
sshd(8), контролируемая с помощью опции ChrootDirectory. К примеру,
заставим подключающегося по sftp пользователя worker переходить в
измененный корневой каталог data:
# vi /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/sftp-server Subsystem sftp internal-sftpMatch User worker X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ChrootDirectory /data
Пример для хостинговых клиентов:
# vi /etc/ssh/sshd_config
#Subsystem sftp /usr/libexec/sftp-server Subsystem sftp internal-sftpMatch Group wwwusers X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp ChrootDirectory /var/www/hosting/%u
Теперь зарегистрированные пользователи будут допущены только к
“своему” каталогу, при подключении модификатор %u будет заменен именем
пользователя. При необходимости можно использовать %h, который
соответствует домашнему каталогу юзера.
Скрываем записи о серверах, к которым мы подключались
Некоторые администраторы, возможно, захотят зашифровать все IP и доменные адреса из файла .ssh/known_hosts. Делается это следующим образом:
Управляющие последовательности SSH станут доступны, если в
SSH-сессии сначала нажать <Enter>, затем управляющий символ
сеанса (по умолчанию тильда, задается директивой EscapeChar) и
специальную клавишу, которая указывает, какую именно функцию следует
выполнить.
Допустим, мы с mail.domain.ru зашли на bastion.domain2.ru и решили,
что не плохо было бы открыть обратный шифрованный туннель к почтовому
серверу для безопасной загрузки сообщений. С помощью комбинации клавиш
“<Enter>~C” можно интерактивно управлять локальным и удаленным
форвардингами (ключи ‘-L’ и ‘-R’):
В ответ получен баннер от Dovecot, значит, все в порядке.
Кстати, обратившись к подсказке, получим список всех доступных ключей и дополнительных параметров:
Если в ~/.ssh/config установить значение директивы PermitLocalCommand в yes, то мы сможем выполнять команды в локальном шелле, т.е. на хосте, с которого зашли:
ns$ ssh mx mx$ <Enter>~C
ssh> !uptime # команда выполняется на хосте ns 7:02PM up 100 days, 11 mins, 1 user, load averages: 0.13, 0.21, 0.23 <Enter> mx$ uptime # команда выполняется на хосте mx 7:02PM up 4 days, 7:34, 1 user, load averages: 0.21, 0.23, 0.19
Если на предыдущем узле требуется выполнить сразу несколько команд,
то SSH-сессию лучше временно засуспендить (приостановить выполнение
программы ssh):
mx$ <Enter>~<Ctrl-Z>
[1] + Suspended “ssh” “$@”
Чтобы перевести SSH-сессию из остановленного режима в активный, следует воспользоваться командой fg.
Список текущих SSH-соединений можно просмотреть комбинацией:
mx$ <Enter>~#
The following connections are open: #0 client-session (t4 r0 i0/0 o0/0 fd 5/6 cfd -1)
А для быстрого завершения SSH-сессии ставим точку:
mx$ <Enter>~.
Connection to 213.167.XX.YY closed.
Сокращенный набор
Чтобы в консоли не вводить полное доменное имя, порт и учетную
запись для подключения к удаленной системе, стоит заручиться поддержкой
директивы Host:
$ vi ~/.ssh/config
Host mx Hostname mx.domain.ru Port 2022 User admin
Таким образом, достаточно ввести ssh mx, чтобы соединиться с нужным хостом.
Получение доступа к закрытому сервису
Многие администраторы в целях безопасности скрывают свои сервера в
демилитаризованной зоне, либо за NAT’ом, и разрешают входящие
соединения только с доверенных IP-адресов и по определенными портам.
Поэтому доступ ко многим полезным ресурсам получить напрямую нельзя.
Это как раз тот случай, когда использование SSH-форвардинга может
исправить ситуацию.
$ vi ~/.ssh/config
Host gate Hostname gate.domain.ru # Для ускорения соединений включаем мультиплексирование SSH-сессий ControlMaster auto ControlPath ~/.ssh/ctl-%r-%h-%p # Перенаправляем локальный порт на файловый сервер (Win2k3 с поднятым VShell) LocalForward 8022 192.168.1.101:22# Подключаясь к localhost:8022, мы будем попадать на файловый сервер Host fileserver Hostname localhost Port 8022 ControlMaster auto ControlPath ~/.ssh/ctl-%r-%h-%p HostKeyAlias fileserver
Соединяемся с узлом gate и проверяем возможность подключения к локальному порту 8022:
$ ssh -N -f gate $ telnet localhost 8022
SSH-2.0-VShell_3_0_4_656 VShell
Теперь можно подключиться к файловому серверу, который находится за NAT’ом, в обход правил файерола, установленных на шлюзе:
$ ssh fileserver
Microsoft Windows [Version 5.2.3790] C:\Documents and Settings\Username\My Documents>
Ограничение возможностей перебора паролей с помощью Pf
Сервис SSH является любимой мишенью злоумышленников, поэтому следует
принять некоторые меры безопасности. Одна из них - ограничение
количества подключений, чтобы избежать DoS-атаки и перебора паролей.
# vi /etc/pf.conf
table <sshbf> persist block in log quick on $ext_if inet from <sshbf> pass in log on $ext_if inet proto tcp to $ext_if port ssh keep state \ (max-src-conn-rate 5/60, overload <sshbf> flush global)
Данный набор правил инструктирует фильтр пакетов не допускать более 5 одновременных соединений к 22 порту за 60 секунд.
Перенаправление X11-подключений
Для перенаправления X11-подключений следует использовать ключ ‘-Y’:
$ ssh -Y user@domain.com
Причем в конфигурационном файле /etc/ssh/sshd_config
параметр X11Forwarding должен быть установлен в “yes”. Если X-сервер
запущен на локальной системе, то необходимо включить и X11UseLocalhost.