Протокол Secure Shell (SSH) был разработан для максимальной защиты сетевых взаимодействий с удаленными узлами сети. Этот протокол шифрует сетевой трафик при помощи улучшенных возможностей аутентификации, а также функций, направленной на защиту других незащищенных протоколов – таких как защищенное копирование (Secure Copy, SCP), защищенный протокол передачи файлов (Secure File Transfer Protocol, SFTP), перенаправление X-сеансов и перенаправление портов. Поддерживается несколько типов шифрования (начиная от 512-битного и заканчивая 32768-битным) с использованием различных криптографических алгоритмов – Blowfish, Triple DES, CAST-128, Advanced Encryption Scheme (AES) и ARCFOUR. Чем выше разрядность шифрования, тем больший объем трафика генерируется в сети. Из рисунка 1 видно, как любой пользователь сети может с легкостью просмотреть трафик telnet-подключения с помощью анализатора сетевых пакетов (например, Wireshark).
Оглавление
Архитектура SSH
В документах IETF RFC 4251-4256 дается следующее определение: “Протокол SSH используется для организации безопасного входа в удаленную систему и организации иных безопасных служб через сети, не обеспечивающие безопасности”. Протокол включает три основных компонента (рисунок 3):
- Протокол транспортного уровня: обеспечивает аутентификацию серверов, конфиденциальность и целостность. Этот протокол может также обеспечивать сжатие информации и работает в основном с использованием соединений TCP/IP, но может быть реализован и на базе иных потоков данных с гарантированной доставкой.
- Протокол аутентификации пользователей: используется на серверах для проверки подлинности клиентов и работает на основе протокола транспортного уровня.
- Протокол соединений: обеспечивает мультиплексирование шифрованного туннеля в несколько логических каналов и работает поверх протокола аутентификации пользователей.
Синтаксис
Рассмотрим синтаксис команды.
ssh [опция] [пользователь]@[название хоста] [команда]
Стоит отметить, что утилита способна работать с помощью двух версий протокола, они так и называются протокол 1 и протокол 2. Второй вариант является наилучшим, так как поддерживает значительно больше способов шифрования, а также аутентификаций. Именно поэтому протокол 2 применяется пользователями чаще всего.
Основные опции:
- «g» – для разрешения удаленной машине пользоваться определенным локальным портом.
- «l» – для изменения/введения имя пользователя в определенной системе.
- «f» – аргумент переводит режим работы в фоновый.
- «n» – для перенаправления классического вывода.
- «p» – для изменения/введения данных о локальном порту SSH, используемом на удаленной машине.
- «q» – для исключения вероятности показа сообщений о возникающих ошибках.
- «v» – для включения специального режима отладки.
- «x» – для отключения перенаправления X11.
- «X» – для включения перенаправления Х11.
- «C» – для включения сжатия.
Представленный выше список является неполным. На самом деле команда поддерживает в разы больше опций, а описанные варианты используются чаще всего. Стоит заметить, что большинство настроек можно водить с использованием файла «ssh/config». Читайте так же: “SSH — настройка доступа к серверу”
Примеры типового использования SSH в операционных системах UNIX и Linux
Как правило, SSH используется для того, чтобы пользователи могли подключаться к удаленным компьютерам и выполнять на них различные команды. Однако SSH также поддерживает туннелирование и X11-соединения и даже позволяет передавать файлы с помощью SFTP и SCP. Можно использовать во множестве приложений для различных платформ, включая Linux, UNIX, Windows и Apple® OS X (для запуска некоторых приложений могут потребоваться дополнительные возможности, доступные либо совместимые только с определенными SSH-клиентами или SSH-серверами).
Рассмотрим несколько общих примеров синтаксиса SSH:
- Доступ к командной оболочке удаленного компьютера (вместо использования незащищенных протоколов telnet и rlogin): # ssh fsmythe@example.com [fsmythe@example.com] ~
- Выполнение отдельной команды на удаленном компьютере (вместо использования rsh) # ssh root@example.com reboot root@example.com’s password: ******
- Копирование файлов с локального сервера на удаленный компьютер посредством команды SCP: root@edb-01.example.com’s password: ****** file1.txt 100% 0 0.0KB/s 00:00 file2.txt 100% 0 0.0KB/s 00:00
- Защищенная передача файлов посредством SFTP (вместо использования FTP): sftp fsmythe@example.com Connecting to example.com… fsmythe@example.com’s password: ******* sftp>
- Эффективные и безопасные процедуры резервного копирования, синхронизации и зеркалирования файлов на локальный или удаленный компьютер при помощи rsync: # rsync -avul –rsh=ssh /opt/edbdata/ root@example.com:/root/backup/ root@example.com’s password: ****** building file list … done ./ file1.txt file2.txt file3.txt file4.txt dir1/file5.txt dir2/file6.txt sent 982813 bytes received 2116 bytes 1374860.38 bytes/sec total size is 982138 speedup is 1.00
- Перенаправление или туннелирование порта (не путайте с VPN): ssh -L 8000:mailserver:110 example.com fsmythe@example.com’s password: ********
- Перенаправление X-сеансов с удаленного компьютера (может осуществляться через несколько промежуточных узлов): Edit /etc/ssh/sshd_config and change 2 keywords : AllowTcpForwarding yes X11Forwarding yes # service sshd restart $ export DISPLAY $ ssh -X fsmythe@example.com
- Конфигурация с перенаправлением X11, используемая совместно с клиентом X Windows, в котором настроено SSH-туннелирование X11. Это позволяет использовать графическую подсистему UNIX или Linux через защищенное SSH-соединение на локальном компьютере с Windows, подключенном через SSH к удаленному узлу Linux или UNIX: ssh -ND 8000 fsmythe@example.com Browser Settings, goto ‘Manual Proxy Configuration’ set “SOCKS Host” to example.com, the ‘Port to 8000’ , Enable SOCKS v5, and lastly set ‘No Proxy for’ field to ‘localhost, 127.0.0.1’
- Безопасное монтирование директории удаленного сервера в качестве файловой системы локального компьютера с помощью sshfs: # yum install sshfs fuse-utils (Install sshfs and fuse-utils) $sshfs example.com:/remote_dir /mnt/local_dir
- Автоматизированное наблюдение и управление удаленными серверами при помощи различных средств: (Report number of apache processes running on the remote server example.com): $ ssh example.com ps -ef | grep httpd | wc -l root@example.com’s password: *****
Полезные советы по настройке и использованию SSH
В некоторых случаях, которые были рассмотрены выше, у многих опытных системных администраторов возникает беспокойство относительно безопасной реализации ряда функций и методов использования SSH. Несмотря на большое количество материалов и статей, посвященных различным подходам к безопасности SSH и защите удаленных компьютеров в целом, мы приведем здесь несколько команд и конфигураций, которые можно использовать для усиления защиты удаленного доступа при помощи SSH:
- Запретите удаленные подключения пользователям с привилегиями root: # vi /etc/ssh/sshd_config PermitRootLogin no
- Создавайте пары ключей (открытый/закрытый) с использованием стойких идентификационных фраз и защищайте закрытый ключ паролем (никогда не генерируйте пары ключей или идентификационные фразы без использования паролей): (Use a higher bit rate for the encryption for more security) ssh-keygen -t rsa -b 4096
- Настраивайте обработчики TCP (TCP wrappers) таким образом, чтобы разрешать подключаться только определенным удаленным компьютерам, а всем остальным – запрещать: # vi /etc/hosts.deny ALL: 192.168.200.09 # IP Address of badguy
- Отключайте функциональность SSH-сервера на рабочих станциях и ноутбуках – для этого отключите службу SSH, а затем удалите пакет SSH-сервера: # chkconfig sshd off # yum erase openssh-server
- Управляйте разрешениями на SSH-подключение с помощью учетных записей: # vi /etc/ssh/sshd_config AllowUsers fsmythe bnice swilson DenyUsers jhacker joebadguy jripper
- Используйте только протокол SSH версии 2: # vi /etc/ssh/sshd_config Protocol 2
- Закрывайте неактивные подключения, указав время простоя: # vi /etc/ssh/sshd_config ClientAliveInterval 600 # (Set to 600 seconds = 10 minutes) ClientAliveCountMax 0
- Запрещайте аутентификацию на основе хоста: # vi /etc/ssh/sshd_config HostbasedAuthentication no
- Отключайте пользовательские файлы .rhosts: # vi /etc/ssh/sshd_config IgnoreRhosts yes
- Настраивайте брандмауэр таким образом, чтобы разрешать входящие SSH-подключения только из доверенных сетей: Update /etc/sysconfig/iptables (Redhat specific file) to accept connection only from 192.168.100.0/24 and 209.64.100.5/27, enter: -A RH-FW-1-INPUT -s 192.168.100.0/24 -m state –state NEW -p tcp –dport 22 -j ACCEPT -A RH-FW-1-INPUT -s 209.64.100.5/27 -m state –state NEW -p tcp –dport 22 -j ACCEPT
- Явно указывайте сетевые интерфейсы, которые должны принимать входящие SSH-подключения: # vi /etc/ssh/sshd_config ListenAddress 192.168.100.17 ListenAddress 209.64.100.15
- Настраивайте политики пользователей на использование стойких паролей, обеспечивающих защиту от атак с помощью полного перебора, социальной инженерии и подбора по словарям: # < /dev/urandom tr -dc A-Za-z0-9_ | head -c8 oP0FNAUt[
- Ограничивайте доступ SFTP-пользователей их домашними директориями с помощью параметра Chroot SSHD: # vi /etc/ssh/sshd_config ChrootDirectory /data01/home/%u X11Forwarding no AllowTcpForwarding no
- Запрещайте использование пустых паролей: # vi /etc/ssh/sshd_config PermitEmptyPasswords no
- Ограничивайте количество входящих соединений на порт 2022 в определенный интервал времени: Redhat iptables example (Update /etc/sysconfig/iptables): -A INPUT -i eth0 -p tcp –dport 2022 -m state –state NEW -m limit –limit 3/min –limit-burst 3 -j ACCEPT -A INPUT -i eth0 -p tcp –dport 2022 -m state –state ESTABLISHED -j ACCEPT -A OUTPUT -o eth0 -p tcp –sport 2022 -m state –state ESTABLISHED -j ACCEPT
- Настраивайте iptables таким образом, чтобы в течение 30 секунд разрешать не более трех попыток подключения к порту 2022: Redhat iptables example (Update /etc/sysconfig/iptables): -I INPUT -p tcp –dport 2022 -i eth0 -m state –state NEW -m recent –set -I INPUT -p tcp –dport 2022 -i eth0 -m state –state NEW -m recent –update –seconds 30 –hitcount 3 -j DR
- Используйте анализатор log-файлов (например, logcheck, loggrep, splunk или logwatch) для более тщательного анализа и создания отчетов. Настройте также само SSH-приложение на более подробное журналирование событий: Installation of the logwatch package on Redhat Linux # yum install logwatch
- Устанавливайте наиболее подробный уровень журналирования SSH: # vi /etc/ssh/sshd_config LogLevel DEBUG
- Всегда обновляйте пакеты SSH и необходимые библиотеки до последних версий: # yum update openssh-server openssh openssh-clients -y
- Скрывайте версию OpenSSH в исходном коде, после чего компилируйте приложение заново. После этого вносите следующие изменения: # vi /etc/ssh/sshd_config VerifyReverseMapping yes # Turn on reverse name checking UsePrivilegeSeparation yes # Turn on privilege separation StrictModes yes # Prevent the use of insecure home directory # and key file permissions AllowTcpForwarding no # Turn off , if at all possible X11Forwarding no # Turn off , if at all possible PasswordAuthentication no # Specifies whether password authentication is # allowed. The default is yes. Users must have # another authentication method available .
- Удаляйте исполняемые файлы rlogin и rsh из системы и замещайте их symlink -ссылками на SSH: # find /usr -name rsh /usr/bin/rsh # rm -f /usr/bin/rsh # ln -s /usr/bin/ssh /usr/bin/rsh
SSH поддерживает множество разнообразных методов и способов аутентификации, которые можно включать и отключать. Этим можно управлять в конфигурационном файле /etc/ssh/sshd_config, указывая ключевое слово, относящееся к тому или иному методу аутентификации, с последующим указанием параметра yes или no. В следующем примере показаны наиболее распространенные параметры:
# RSAAuthentication yes # PubkeyAuthentication yes # RhostsRSAAuthentication no # HostbasedAuthentication no # RhostsRSAAuthentication and HostbasedAuthentication PasswordAuthentication yes ChallengeResponseAuthentication no # KerberosAuthentication no GSSAPIAuthentication yes
Ключевые слова AllowedAuthentications и RequiredAuthentications в файле sshd_config определяют, какие конфигурации и методы аутентификации используются только с протоколом SSH версии 2. Синтаксис, разрешающий аутентификацию с помощью паролей и открытых ключей, выглядит следующим образом:
# vi /etc/ssh/sshd_config AllowedAuthentications publickey, password RequiredAuthentications publickey, password
Установка пакетов SSH
Как уже говорилось система ssh в Linux-системах распространяется в виде составного метапакета, поэтому для установки всех требуемых утилит ssh нужно выполнить всего одну команду:
В Ubuntu
$ sudo apt-get install ssh
В CentOS
$ yum -y install openssh-server openssh-clients
После чего начнется процесс установки
Как видно, менеджер пакетов сам распознает все зависимые и связанные пакеты и установит их. Также, по завершению установки, автоматически будет запущен SSH-сервер в режиме демона. Это можно проверить командой:
$ systemctl status sshd
или:
$ service sshd status даст тот же вывод. Теперь сервер работает с базовыми настройками по-умолчанию.
Настройка SSH сервера
Настройки sshd находятся в файле /etc/ssh/sshd_config. Открываем этот файл для редактирования и изменяем его содержимое для наших нужд, не забывая при этом о безопасности.
Первый параметр – Port. По умолчанию используется 22 порт. Изменим его на нестандартный порт 2203 – это избавит наш сервер от сетевых роботов, которые автоматически сканируют интернет в поиске открытых портов и пытаются через них подключиться. Это не избавит от сканирования человеком, но для защиты от человека существует фаервол, хитрые способы открытия порта, «горшочки с мёдом» и т. д.
Port 2203
Теперь, чтобы подключиться к серверу нужно будет явно указать порт. Например, так:
$ ssh –l andrey –p 2203 192.168.123.254
или так
$ ssh andrey@sunup.aitishnik.local –p 2203
Следующие две закомментированные строки оставляем без изменения.
#ListenAddress ::
#ListenAddress 0.0.0.0
Эти строки отвечают за настройку разграничений по сетевым интерфейсам, сетевому адресу или имени компьютера. По умолчанию сервер «слушает» (принимает подключения) на всех сетевых интерфейсах. Нас это устраивает, поэтому мы оставляем значение по умолчанию. Если бы нам нужно было оставить подключение только через внешний интерфейс, то раскомментировав строку мы бы написали:
ListenAddress 192.168.123.0
В этой же строке можно явно указать порт, предварительно закомментировав (поставив символ # в начале строки) первую строку – Port 2203:
ListenAddress 192.168.123.0:2203
Следующий параметр отвечает за версию протокола SSH. Значение по умолчанию 2. Его и оставляем. Не добавляем единичку ни при каких обстоятельствах. Первая версия протокола SSH не безопасна!
Protocol 2
Строки HostKey необходимы для второй версии протокола SSH и отвечают за названия файлов ключей и их расположение. Первая строка отвечает за пару ключей RSA, вторая соответственно за пару ключей DSA. К названиям открытых (публичных) ключей добавляется .pub. Эти ключи используются при аутентификации с ключом хоста. Можно поменять слово host в названии ключей на имя нашего сервера, но мы сделаем это в части, посвященной генерации ключей. Сейчас же отключим ключи DSA, так как будем пользоваться только RSA:
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_sunup_dsa_key
Строка Privilege Separation указывает, должен ли демон ssh (sshd) разделять привилегии. Если да – то сначала будет создан непривилегированный дочерний процесс для входящего сетевого трафика. После успешной авторизации будет создан другой процесс с привилегиями вошедшего пользователя. Основная цель разделения привилегий – предотвращение превышения прав доступа. Оставляем yes.
UsePrivilegeSeparation yes
Следующие строки отвечают за временный ключ и его длину при работе с первой версией протокола SSH. Мы не используем SSH-1, поэтому пока закомментируем эти строки.
# KeyRegenerationInterval 3600
# ServerKeyBits 768
Далее следует группа параметров, отвечающая за журналирование. События, связанные с доступом по SSH записываются в журнал /var/log/auth
Первый параметр определяет, список каких событий администратор хочет видеть в журнале. Доступны следующие значения: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. Нас интересует авторизация, поэтому оставляем AUTH.
SyslogFacility AUTH
Второй параметр определяет уровень детализации событий. Доступны следующие события: SILENT , QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3. Оставляем уровень детализации по умолчанию, если возникнут ошибки, то всегда можно увеличить детализацию журнала.
LogLevel INFO
Следующая группа параметров относится к аутентификации. Первый параметр означает, что соединение будет разорвано через указанное количество секунд, если пользователь не войдёт в систему. Уменьшим это время в два раза.
LoginGraceTime 60
Второй параметр разрешает или запрещает вход по SSH под суперпользователем. Запрещаем вход суперпользователю.
PermitRootLogin no
Третий параметр включает проверку демоном ssh прав и владение домашним каталогом пользователя, который пытается получить удалённый доступ к компьютеру. Оставляем yes.
StrictModes yes
Добавляем параметр AllowUsers, которого нет в конфигурационном файле по умолчанию. Этот параметр разрешает доступ к серверу по протоколу SSH только для перечисленных пользователей.
AllowUsers andrey
В нашем примере разрешение есть только у пользователя andrey. Значениями этого параметра могут выступать имена пользователей, отделённые друг от друга пробелами. Нельзя использовать в качестве значений UID (User ID). Можно использовать запись пользователя в виде user@host, например andrey@echidna. Это означает, что доступ разрешён пользователю andrey с компьютера echidna. Причём пользователь и компьютер проверяются отдельно, это позволяет разграничить доступ определенных пользователей с определенных компьютеров. Существует обратный параметр – DenyUsers, который запрещает доступ пользователям, перечисленным в значении этого параметра. Кроме параметров связанных с доступом отдельных пользователей существуют соответствующие параметры для групп: AllowGroups и DenyGroups.
Оставляем включенной аутентификацию RSA, в параметре RSAAuthentication:
RSAAuthentication yes
Оставляем включенной аутентификацию по открытому ключу, в дальнейшем мы настроим аутентификацию таким способом.
PubkeyAuthentication yes
Параметр AuthorizedKeysFile определяет файл, в котором содержатся публичные ключи, используемые для аутентификации пользователей по открытому ключу. В записи могут присутствовать переменные, например %h означает домашний каталог пользователя, а %u – имя пользователя. В дальнейшем мы планируем использование аутентификации по открытому ключу – раскомментируем эту строку.
AuthorizedKeysFile .ssh/authorized_keys
Следующие два параметра отвечают за включение совместимости с программой rhosts. Нам такая совместимость только повредит, поэтому оставляем значения по умолчанию.
IgnoreRhosts yes
RhostsRSAAuthentication no
Аутентификация hostbased нам тоже не нужна и она уже отключена, поэтому оставляем существующее значение
HostbasedAuthentication no
Следующая строка нужна для совместимости с rhost – оставляем закомментированной.
#IgnoreUserKnownHosts yes
Параметр PermitEmptyPasswords разрешает или запрещает вход с пустым паролем. Естественно, запрещаем вход с пустым паролем – оставляем no.
PermitEmptyPasswords no
Параметр ChallengeResponseAuthentication включает PAM интерфейс. Если задано значение yes, то для всех типов аутентификации помимо обработки модуля сессии и аккаунта PAM, будет использоваться аутентификация на основе запроса-ответа (ChallengeResponseAuthentication и PasswordAuthentication) Т.к. аутентификация запросов-ответов в PAM обычно выполняет ту же роль, что и парольная аутентификация, следует отключить, либо PasswordAuthentication, либо ChallengeResponseAuthentication.
ChallengeResponseAuthentication no
Следующий параметр отвечает за аутентификацию по паролю. Сейчас используется аутентификация по ключу хоста – просто раскомментируем строку.
PasswordAuthentication yes
Группу из четырёх параметров, отвечающих за аутентификацию Kerberos, оставляем без изменений – не раскомментированными.
#KerberosAuthentication no
#KerberosGetAFSToken no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
Следующие два закомментированных параметра отвечают за то, разрешена ли аутентификация пользователя на основе GSSAPI или нет. Для наших целей аутентификация GSSAPI не нужна – оставляем без изменений.
#GSSAPIAuthentication no
#GSSAPICleanupCredentials yes
Параметры, начинающиеся с X11, отвечают за проброс иксов через ssh туннель. Ниш сервер не имеет иксов, поэтому закомментируем эти опции
# X11Forwarding yes
# X11DisplayOffset 10
Опция PrintMotd выводит при подключении к sshd так называемое сообщение дня, что на самом деле является содержимым файла /etc/motd. Опция PrintLastLog очень полезна, так как она включает отображение информации о том, когда вы последний раз и с какого компьютера заходили на сервер.
PrintMotd no
PrintLastLog yes
Установим параметру TCPKeepAlive значение no. Этот параметр важен для поддержания соединения со стороны сервера, но мы реализуем те же функции, но более безопасней.
TCPKeepAlive no
Для этого добавим два следующих параметра:
ClientAliveCountMax 3
ClientAliveInterval 20
Первый из этих параметров определяет количество запросов, которое ssh-сервер отправляет ssh-клиентам через определённые промежутки времени. Как только установленное значение запросов достигнуто, а клиент так и не ответил, соединение будет разорвано. Если не посылать такие запросы, то сессии на сервере придётся закрывать вручную, так как они будут длиться бесконечно, отбирая часть ресурсов. Второй параметр определяет интервал отправки запросов в секундах. В нашем примере, соединение будет разорвано, если между клиентом и сервером не будет связи в течение одной минуты.
Параметр UseLogin оставляем закомментированным. Его значение по умолчанию и так no.
#UseLogin no
Раскомментируем параметр MaxStartups и выставим ему следующее значение:
MaxStartups 3:30:9
По умолчанию значение данного параметра 10. Это количество неавторизованных подключений к серверу ssh. Длительность такого подключения определяется параметром LoginGraceTime, описанным выше. Перенесём параметр MaxStartups под LoginGraceTime и запишем в виде start:rate:full, где start – это уже имеющееся количество неавторизованных подключений, rate – процент вероятности отклонения попытки подключения, full – максимальное количество неавторизованных соединений. В нашем примере, если уже имеется 3 неавторизованных подключения, то следующее подключение будет отклонено с вероятностью 30%, а если количество неавторизованных подключений достигнет 9, то все последующие попытки подключения будут отвергнуты.
Опция Banner определяет место положения файла-баннера, который будет выведен на экран, при попытке подключиться к серверу sshd. Предлагается файл /etc/issue.net, но можно использовать свой баннер, поместив его, например в /etc/ssh. В Debian по умолчанию выводится содержимое файла /etc/motd.tail. Оставляем как есть.
#Banner /etc/issue.net
Лучше добавим ещё один полезный параметр, который отсутствует в файле sshd_config – DebianBanner. Этот параметр добавляет в строку ответа sshd информацию об операционной системе, при обращению к серверу по протоколу TELNET или при сканировании nmap. Эта строка может выглядеть так: SSH-2.0-OpenSSH_5.5p1 Debian-6+squeeze1. Скроем информацию о нашей операционной системе.
DebianBanner no
Теперь строка ответа будет выглядеть так: SSH-2.0-OpenSSH_5.5p1
Параметр AcceptEnv указывает, какие переменные окружения, переданные клиентом, будут приняты.
AcceptEnv LANG LC_*
Следующий параметр включает внешнюю подсистему (например, FTP). В качестве параметров понимает, имя подсистемы и команду, которая будет выполнена при запросе подсистемы. Команда sftp-server, реализует протокол передачи файлов через SSH – SFTP.
Subsystem sftp /usr/lib/openssh/sftp-server
Параметр UsePAM оставляем без изменений. Если директива UsePAM включена, то запустить sshd можно будет только от имени root.
UsePAM yes
Сохраняем изменения и перезапускаем sshd. Подключаемся, проверяем, если всё в порядке, то настройка сервера ssh с аутентификацией оп ключу хоста закончена. Для разрешения проблем и вывода отладочной информации можно подключаться с ключами: -v, -vv, -vvv.
Настройка ssh клиента
В Debian настройки клиентской части ssh делятся на глобальные и пользовательские. Глобальные клиентские настройки находятся в файле /etc/ssh/ssh_config и применяются ко всем пользователям. Пользовательские настройки могут находиться в домашнем каталоге пользователя, в ~/.ssh/config и применяются к одному пользователю. Файл пользовательских настроек не создаётся автоматически в отличие от файла глобальных настроек клиентской части ssh. Для большинства выполняемых задач подойдут настройки по умолчанию, но для удобства использования, так сказать для тюнинга или для выполнения нестандартных задач клиентские настройки изменяются. Рассмотрим вкратце некоторые из этих настроек. Полезно помнить о приоритетах настроек: высший приоритет имеют ключи командной строки, затем следуют настройки пользователя, а после них используются глобальные настройки клиентской части.
Параметр Host. Ограничивает множество хостов, к которым применяются последующие (до ближайшей новой директивы Host) директивы, по указанным шаблонам (хост должен соответствовать хотя бы одному шаблону). Шаблон, состоящий из одного символа *, соответствует любому хосту. Под хостом в данном контексте понимается аргумент имя_хоста передаваемый в командной строке (т.е. никаких преобразований перед сравнением не выполняется).
Параметр HostName. Устанавливает соответствие между псевдонимами, сокращениями и настоящими именами хостов. По умолчанию используется имя, передаваемое в командной строке. Допустимо непосредственное указание IP-адресов.
Параметр Port. Порт на удалённой машине, к которому следует подключаться. Значение по умолчанию – 22
Параметр User. Имя пользователя, которое следует использовать при регистрации в удалённой системе. Полезно, когда на разных серверах используются разные имена, т.к. избавляет от надобности вспоминать каждый раз нужное имя.
В качестве примера я создам файл пользовательских настроек /home/selifan/.ssh/config следующего содержания:
Host sunup
HostName sunup.aitishnik.local
Port 2203
User andrey
Host windbag
HostName windbag.nnov.ru
Port 2280
User joker
Host 212.177.65.1
HostName 212.177.65.1
Port 2222
User forester
Теперь при подключении к компьютерам sunup.aitishnik.local, windbag или по ip адресу 212.177.65.1 мне не нужно вспоминать, ни имя пользователя, ни ssh порт подключения, достаточно после ssh набрать имя сервера. Просто и удобно! Описания всех параметров, значений и некоторых примеров находятся в man ssh_config. Продолжаем настраивать SSH и читаем “Генерация ключей SSH”.
Помните, что у нас вы можете не только купить готовый сайт или заказать его разработку, но и подобрать подходящий тариф поддержки сайта, заказать продвижение сайта в поисковых системах, а так же зарегистрировать домен в одной из двухсот доменных зон и выбрать недорогой тариф хостинга! Айтишник РУ
Необходимые компоненты
Мы предполагаем, что Вы используете систему Linux или macOS с установленным клиентом OpenSSH.
Расположение файла конфигурации SSH
OpenSSH в клиентский файл конфигурации имеет имя config и хранится в каталоге .ssh в разделе Домашний каталог пользователя. Этот каталог ~/.ssh создается автоматически, когда пользователь запускает SSH команду впервые.
Если вы никогда не использовали ssh команду, то сначала нужно создать каталог, используя:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
По умолчанию конфигурационный файл ssh может не существовать, поэтому вам может понадобиться, чтобы создать его с помощью команды Touch:
touch ~/.ssh/config && chmod 600 ~/.ssh/config
Этот файл должен быть доступен для чтения и записи только пользователю, а не другим пользователям:
chmod 700 ~/.ssh/config
Структура и шаблоны файлов конфигурации SSH
Конфигурационный файл SSH имеет следующую структуру:
Host hostname1 SSH_OPTION value SSH_OPTION value Host hostname2 SSH_OPTION value Host * SSH_OPTION value
Содержимое файла конфигурации клиента SSH организовано в строфы (разделы). Каждая строфа начинается с директивы Host и содержать конкретные параметры SSH, которые используются при установлении соединения с удаленным сервером SSH.
Отступ не требуется, но рекомендуется, так как это сделает файл легче читать.
Эти директивы Host могут содержать один рисунок или разделенный пробелами список моделей. Каждый шаблон может содержать ноль или более символов без пробелов или один из следующих описателей шаблона:
- *– соответствует нулю или более символов. Например, Host * будет соответствовать всем хостам, а 192.168.0.* будет соответствовать всем хостам в подсети 192.168.0.0/24.
- ?– соответствует ровно одному символу. Шаблон, Host 10.10.0.? будет соответствовать всем хостам в диапазоне 10.10.0.[0-9].
- !– в начале шаблона будет отменено его соответствие. Например, Host 10.10.0.* !10.10.0.5 будет соответствовать любой хост в подсети 10.10.0.0/24, кроме 10.10.0.5.
SSH-клиент считывает файл конфигурации по строфам, и если несколько шаблонов совпадают, параметры из первой соответствующей строфы имеют приоритет. Таким образом, в начале файла должны быть заданы дополнительные объявления, а в конце файла – более общие переопределения.
Вы можете найти полный список доступных SSH параметров, введите man ssh_config в терминале или посетив ssh_config man page.
Файл конфигурации SSH также читается другими программами, такими как scp, sftp и rsync.
Пример базового файла конфигурации SSH
Теперь, когда мы рассмотрели основы файла конфигурации SSH, давайте рассмотрим следующий пример.
Обычно, когда вы подключаетесь к удаленному серверу через SSH, вы указываете имя удаленного пользователя, имя хоста и сообщение. Например, чтобы подключиться от имени пользователя andreyex к хосту, вызываемому через dev.example.com порт 2322 из командной строки, введите:
ssh andreyex@dev.example.com -p 2322
Если вы хотите подключиться к серверу, используя те же параметры, что и в приведенной выше команде, просто набрав named, ssh dev вам нужно добавить в файл “~/.ssh/config следующие строки:
~ / .ssh / конфигурацииHost dev HostName dev.example.com User andreyex Port 2322
Теперь, если вы введете:
ssh dev
Клиент ssh прочитает файл конфигурации и будет использовать сведения о соединении, указанные для хоста dev.
Пример общего файла конфигурации SSH
Этот пример дает более подробную информацию о шаблонах хостов и приоритетах опций.
Давайте возьмем следующий пример файла:
Host alex HostName 192.168.1.10 User andreyex Port 7654 IdentityFile ~/.ssh/alex.key Host maxim HostName 192.168.10.20 Host denis HostName 192.168.10.50 Host *im user destroyer Host * !denis LogLevel INFO Host * User root Compression yes
- Если вы введете ssh alex в ssh, клиент прочтет файл и применит параметры первого совпадения Host alex. Затем он проверит следующие строфы один за другим на соответствие шаблону. Следующий совпадающий Host * !denis означает, что все хосты, кроме, denis он будет применять параметр подключения из этого раздела. Наконец, последнее определение Host * также соответствует, но клиент ssh выберет только опцию Compression, потому что эта опция User уже определена в разделе Host alex. Полный список параметров, используемых в этом случае, выглядит следующим образом:HostName 192.168.1.10 User andreyex Port 7654 IdentityFile ~/.ssh/alex.key LogLevel INFO Compression yes
- При работе ssh alex шаблоны соответствия хоста являются: Host maxim, Host * !denis и Host *. Варианты, используемые в этом случае:HostName 192.168.10.20 LogLevel INFO Compression yes
- Если вы запускаете ssh denis соответствующий узел моделей являются: Host denis и Host *. В этом случае используются следующие параметры:HostName 192.168.10.50 Compression yes
- Для всех других вариантов соединений, указанных в секциях Host * !denis и Host * будут использоваться.
Переопределить опцию файла конфигурации SSH
Клиент ssh получает свою конфигурацию в следующем порядке приоритета:
- Параметры, указанные в командной строке
- Параметры, определенные в ~/.ssh/config
- Параметры, определенные в /etc/ssh/ssh_config
Если вы хотите переопределить один параметр, вы можете указать его в командной строке. Например, если у вас есть следующее определение:
Host dev HostName dev.example.com User andreyex Port 2322
и вы хотите использовать все остальные параметры, кроме как для подключения в качестве пользователя, root а не andreyex просто указать пользователя в командной строке:
ssh -o “User=root” dev
Переключатель -F( configfile) позволяет указать альтернативный файл конфигурации для каждого пользователя.
Если вы хотите, чтобы ваш ssh-клиент игнорировал все параметры, указанные в вашем конфигурационном файле ssh, вы можете использовать:
ssh -F /dev/null user@example.com
Как ограничить доступ по SSH
Все изменения вносятся в /etc/ssh/sshd_config
Чтобы изменения вступили в силу, необходимо перезагрузить SSH
Сменить порт
Port 9724
Теперь при авторизации вам нужно вместо стандартного 22 порта указывать 9724.
Способ очень простой и действенный против большинства простых ботов хакеров, которые стучатся в стандартные порты. Тут главное не создать конфликт с другими службами и подобрать заведомо неиспользуемое число.
Запретить связь по старому протоколу
Здесь мы определяем, что связь возможна только по протоколу v2
Protocol 2
Запретить авторизацию под root
PermitRootLogin no
По умолчанию no. Если yes, можно авторизовываться под рутом. Под root работать небезопасно, лучше создать своего пользователя и работать под ним.
Если вы авторизованы не под root, перед всеми консольными командами нужно добавлять sudo — расшифровывается как Substitute User and DO — подмени юзера и делай (под ним). Например, позволяет исполнять команды от имени суперпользователя root.
Уменьшить число попыток авторизации
MaxAuthTries 2
Количество попыток ввода пароля. По умолчанию 6. При неудачном переборе сеанс связи обрывается.
Уменьшить время ожидания авторизации
LoginGraceTime 30s
По умолчанию, 120 секунд может длиться сеанс авторизации. По истечению этого времени он обрывается. 2 минуты на авторизацию — это перебор, всё это время сервер держит связь открытой, что очень нерационально. Полминуты за глаза хватит.
Закрыть доступ по IP
Прежде чем настраивать ограничения по IP, убедитесь, что в случае ошибки в настройке и последующего бана собственного IP у вас останется альтернативный способ вернуть доступ к серверу
Если доступ нужен только вам, самым простым и надёжным будет закрыть доступ отовсюду, кроме вашего IP или, если он динамический, то диапазона IP.
- Открываем /etc/hosts.allow и добавляем туда SSHD: 192.168.1.1где 192.168.1.1 — ваш IP. Если у вас динамический IP, определите IP с маской подсети и запишите Вашу подсеть вместо IP, например:SSHD: 192.168.0.0/16
- Открываем /etc/hosts.deny и добавляем туда: SSHD: ALL
Теперь никто, кроме вас, не сможет авторизоваться на сервере по SSH.
Ещё один способ ограничения доступа по IP
Можно воспользоваться следующей директивой:
AllowUsers = *@1.2.3.4
Здесь мы разрешаем доступ только для IP 1.2.3.4
Настраиваем SSH в Ubuntu
Если вы еще не выполнили инсталляцию на серверный и клиентский ПК, следует это сделать первоначально, благо осуществляется вся процедура достаточно просто и не займет много времени. С детальным руководством по этой теме знакомьтесь в другой нашей статье по следующей ссылке. В ней также показана процедура редактирования файла конфигурации и тестирование работы SSH, поэтому сегодня мы остановимся немного на других задачах.
Создание пары ключей RSA
В только что установленном SSH еще нет заданных ключей для осуществления подключения от сервера к клиенту и наоборот. Все эти параметры необходимо задать вручную сразу же после добавления всех компонентов протокола. Пара ключей работает с помощью алгоритма RSA (сокращение от фамилий разработчиков Rivest, Shamir и Adleman). Благодаря этой криптосистеме через специальные алгоритмы производится шифрование ключей. Для создания пары открытых ключей вам нужно лишь ввести соответствующие команды в консоль и следовать появившимся инструкциям.
-
- Перейдите к работе с «Терминалом» любым удобным методом, например, открыв его через меню или комбинацию клавиш Ctrl + Alt + T.
-
- Введите команду ssh-keygen, а затем нажмите на клавишу Enter.
-
- Будет предложено создать файл, куда сохранятся ключи. Если желаете оставить их в расположении, выбранном по умолчанию, просто нажмите на Enter.
-
- Открытый ключ может быть защищен кодовой фразой. Если хотите использовать эту опцию, в появившейся строке напишите пароль. Вводимые символы при этом отображаться не будут. В новой строке потребуется его повторить.
-
- Далее вы увидите уведомление о том, что ключ был сохранен, а также сможете ознакомиться с его случайным графическим изображением.
Теперь имеется созданная пара ключей — секретный и открытый, которые будут использоваться для дальнейшего подключения между компьютерами. Нужно лишь поместить ключ на сервер, чтобы аутентификация SSH проходила успешно.
Копирование открытого ключа на сервер
Существует три метода копирования ключей. Каждый из них будет наиболее оптимален в различных ситуациях, когда, например, один из способов не работает или не подходит для определенного пользователя. Мы предлагаем рассмотреть все три варианта, начав с самого простого и действенного.
Вариант 1: Команда ssh-copy-id
Команда ssh-copy-id встроена в операционную систему, поэтому для ее выполнения не нужно устанавливать никаких дополнительных компонентов. Соблюдайте простой синтаксис, чтобы скопировать ключ. В «Терминале» необходимо ввести ssh-copy-id username@remote_host, где username@remote_host — имя удаленного компьютера.
При первом подключении вы получите уведомление текстом:
The authenticity of host ‘203.0.113.1 (203.0.113.1)’ can’t be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
Надо указать вариант yes для продолжения соединения. После этого утилита самостоятельно займется поиском ключа в виде файла id_rsa.pub, который был создан ранее. При успешном обнаружении отобразится такой результат:
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed — if you are prompted now it is to install the new keys
username@203.0.113.1’s password:
Укажите пароль от удаленного хоста, чтобы утилита смогла войти в него. Инструмент будет копировать данные из файла публичного ключа ~/.ssh/id_rsa.pub, а после этого на экране появится сообщение:
Number of key(s) added: 1
Now try logging into the machine, with: “ssh ‘username@203.0.113.1′”
and check to make sure that only the key(s) you wanted were added.
Появление такого текста означает, что ключ был успешно загружен на удаленный компьютер, и теперь не возникнет никаких проблем с соединением.
Вариант 2: Копирование открытого ключа через SSH
Если у вас не получается воспользоваться упомянутой выше утилитой, но имеется пароль для входа на удаленный сервер SSH, можете загрузить свой пользовательский ключ вручную, тем самым обеспечив дальнейшую стабильную аутентификацию при соединении. Используется для этого команда cat, которая прочитает данные из файла, а потом они будут отправлены на сервер. В консоли потребуется ввести строку
cat ~/.ssh/id_rsa.pub | ssh username@remote_host “mkdir -p ~/.ssh && touch ~/.ssh/authorized_keys && chmod -R go= ~/.ssh && cat >> ~/.ssh/authorized_keys”.
При появлении сообщения
The authenticity of host ‘203.0.113.1 (203.0.113.1)’ can’t be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
продолжите подключение и введите пароль для входа на сервер. После этого открытый ключ будет автоматически скопирован в конец файла конфигурации authorized_keys.
Вариант 3: Ручное копирование открытого ключа
В случае отсутствия доступа к удаленному компьютеру через SSH-сервер, все описанные выше действия выполняются вручную. Для этого сначала узнается информация о ключе на серверном ПК через команду cat ~/.ssh/id_rsa.pub.
На экране будет отображена примерно такая строка: ssh-rsa + ключ в виде набора символов== demo@test. После этого перейдите к работе на удаленное устройство, где создайте новую директорию через mkdir -p ~/.ssh. В ней дополнительно создается файл authorized_keys. Далее вставьте туда ключ, который вы узнали ранее через echo + строка публичного ключа >> ~/.ssh/authorized_keys. После этого можно пробовать проводить аутентификацию с сервером без использования паролей.
Аутентификация на сервере через созданный ключ
В предыдущем разделе вы узнали о трех методах копирования ключа удаленного компьютера на сервер. Такие действия позволят подключиться без использования пароля. Выполняется эта процедура через командную строку путем ввода shh ssh username@remote_host, где username@remote_host — имя пользователя и хост нужного компьютера. При первом подключении вы будете уведомлены о незнакомом соединении и можете продолжить, выбрав вариант yes.
Подключение произойдет автоматически, если во время создания пары ключей не была задана ключевая фраза (passphrase). В противном случае сначала придется ввести ее, чтобы продолжить работу с SSH.
Отключение аутентификации по паролю
Успешной настройка копирования ключей считается в той ситуации, когда удается войти на сервер без использования пароля. Однако возможность аутентификации таким образом позволяет злоумышленникам использовать инструменты для подбора пароля и взламывать защищенное соединение. Обезопасить себя от таких случаев позволит полноценное отключение входа по паролю в конфигурационном файле SSH. Для этого потребуется:
-
- В «Терминале» откройте конфигурационный файл через редактор с помощью команды sudo gedit /etc/ssh/sshd_config.
-
- Найдите строку «PasswordAuthentication» и уберите знак # в начале, чтобы раскомментировать параметр.
-
- Измените значение на no и сохраните текущую конфигурацию.
-
- Закройте редактор и перезапустите сервер sudo systemctl restart ssh.
Аутентификация по паролю отключится, и войти на сервер можно будет только с использованием специально созданных для этого ключей с алгоритмом RSA.
Настройка стандартного firewall
В Убунту сетевой защитой по умолчанию выступает фаервол Uncomplicated Firewall (UFW). Он позволяет разрешать соединения для избранных сервисов. Каждое приложение создает свой профиль в этом инструменте, а UFW управляет ими, разрешая или запрещая подключения. Настройка профиля SSH путем добавления его в список осуществляется так:
-
- Откройте список профилей firewall через команду sudo ufw app list.
-
- Введите пароль от учетной записи для отображения информации.
-
- Вы увидите лист доступных приложений, среди них должен находиться и OpenSSH.
-
- Теперь следует разрешить соединения через SSH. Для этого добавим его в список разрешенных профилей с помощью sudo ufw allow OpenSSH.
-
- Включите firewall, обновив правила, sudo ufw enable.
-
- Для убеждения в том, что соединения разрешены, следует прописать sudo ufw status, после чего вы увидите состояние сети.
На этом наши инструкции по конфигурации SSH в Ubuntu завершены. Дальнейшие настройки конфигурационного файла и других параметров осуществляются лично каждым пользователем под его запросы. Ознакомиться с действием всех составляющих SSH вы можете в официальной документации протокола.
Включение SSH в Ubuntu
По умолчанию при первой установке Ubuntu удаленный доступ через SSH запрещен. Включение SSH в Ubuntu довольно просто.
Выполните следующие действия как пользователь root или пользователь с привилегиями sudo, чтобы установить и включить SSH в вашей системе Ubuntu:
- Откройте терминал с помощью Ctrl+Alt+T и установите пакет openssh-server:sudo apt update sudo apt install openssh-serverПри появлении запроса введите пароль и нажмите Enter, чтобы продолжить установку.
- После завершения установки служба SSH запустится автоматически. Вы можете проверить, работает ли SSH, набрав:sudo systemctl status sshВ выводе должно быть указано, что служба запущена и включена при загрузке системы:● ssh.service – OpenBSD Secure Shell server Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2020-06-01 12:34:00 CEST; 9h ago …
Нажмите q, чтобы вернуться к приглашению командной строки.
- Ubuntu поставляется с утилитой настройки брандмауэра под названием UFW. Если в вашей системе включен брандмауэр , обязательно откройте порт SSH:sudo ufw allow ssh
Все! Теперь вы можете подключиться к вашей системе Ubuntu через SSH с любого удаленного компьютера. В системах Linux и macOS клиенты SSH установлены по умолчанию. Чтобы подключиться с компьютера под управлением Windows, используйте SSH-клиент, например PuTTY.
Подключение к SSH-серверу
Чтобы подключиться к вашей машине с Ubuntu через локальную сеть, вызовите команду ssh, а затем имя пользователя и IP-адрес в следующем формате:
ssh username@ip_addressУбедитесь, что вы поменяли имя пользователя username и IP-адрес ip_address компьютера с Ubuntu, на котором вы установили SSH.
Если вы не знаете свой IP-адрес, вы можете легко найти его с помощью команды ip:
ip a
Найдя IP-адрес, войдите на удаленный компьютер, выполнив следующую команду ssh:
ssh andreyex@10.0.2.15
Когда вы подключаетесь в первый раз, вы увидите следующее сообщение:
The authenticity of host ‘10.0.2.15 (10.0.2.15)’ can’t be established. ECDSA key fingerprint is SHA256:Vybt22mVXuNuB5unE++yowF7lgA/9/2bLSiO3qmYWBY. Are you sure you want to continue connecting (yes/no)?
Введите yes и вам будет предложено ввести пароль.
Warning: Permanently added ‘10.0.2.15’ (ECDSA) to the list of known hosts. andreyex@10.0.2.15’s password:
После того, как вы введете пароль, вас встретит сообщение по умолчанию Ubuntu:
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-26-generic x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage …
Вы вошли в систему на своей машине с Ubuntu.
Подключение к SSH после NAT
Чтобы подключиться к домашней машине Ubuntu через Интернет, вам необходимо знать ваш публичный IP-адрес и настроить маршрутизатор на прием данных через порт 22 и отправку их в систему Ubuntu, где работает SSH.
Для того, чтобы определить публичный IP – адрес компьютера , который вы пытаетесь SSH к, просто перейдите по следующей ссылке: https://api.ipify.org.
Когда дело доходит до настройки переадресации портов , у каждого маршрутизатора есть свой способ настройки переадресации портов. Вы должны проконсультироваться со своей документацией маршрутизатора о том, как настроить переадресацию портов. Короче говоря, вам нужно ввести номер порта, куда будут поступать запросы (по умолчанию SSH-порт – 22) и частный IP-адрес, который вы нашли ранее (с помощью ip aкоманды) компьютера, на котором работает SSH.
Найдя IP-адрес и настроив маршрутизатор, вы можете войти в систему, набрав:
ssh username@public_ip_address
Если вы подключаете свою машину к Интернету, рекомендуется предпринять некоторые меры безопасности. Наиболее простой способ – настроить маршрутизатор на прием трафика SSH через нестандартный порт и перенаправить его на порт 22 на компьютере, на котором работает служба SSH.
Вы также можете настроить аутентификацию на основе ключей SSH и подключиться к вашему компьютеру с Ubuntu без ввода пароля.
Отключение SSH в Ubuntu
Чтобы отключить сервер SSH в вашей системе Ubuntu, просто остановите службу SSH, выполнив:
sudo systemctl disable –now ssh
Позже, чтобы включить его, введите:
sudo systemctl enable –now ssh
[spoiler title=”Источники”]
- https://www.ibm.com/developerworks/ru/library/au-sshsecurity/
- https://www.vseprolinux.ru/ssh-linux
- https://ITProffi.ru/ustanovka-i-nastrojka-servera-ssh-v-linux/
- https://www.Aitishnik.ru/linux/ssh-debian/nastroyka-openssh.html
- https://andreyex.ru/operacionnaya-sistema-linux/ispolzovanie-fajla-konfiguratsii-ssh/
- https://sheensay.ru/ssh
- https://lumpics.ru/configuration-ssh-in-ubuntu/
- https://andreyex.ru/ubuntu/kak-vklyuchit-ssh-v-ubuntu-20-04/