SSH (secure
shell — безопасная оболочка) — сетевой
протокол, который обеспечивает безопасный
удаленный вход в систему (в т.ч. удаленное
выполнение команд), копирование файлов,
перенаправление протокола X (X Window
System), а также туннелирование TCP-соединений.
Протокол работает в рамках модели
клиент-сервер.
Протокол SSH.
Краткое
практическое руководство.
HOWTO.
HOWTO.
Оглавление
1.Обзор
2.Установка и
запуск
3.Подключение
4.Способы
аутентификации
5.Конфигурационные
файлы
6. Беспарольный
вход с кодовой фразой
7.Генерация
ключей сервера
8.Вход в систему:
сообщение дня
9.Перенаправление
«иксов»
10.Перенаправление
TCP-портов
11.Монтирование
с помощью sshfs
12.mc: shell
соединение
13.Защита SSH
14.Интересные
возможности
Обзор
SSH (secure
shell — безопасная оболочка) — сетевой
протокол, который обеспечивает безопасный
удаленный вход в систему (в т.ч. удаленное
выполнение команд), копирование файлов,
перенаправление протокола X (X Window
System), а также туннелирование TCP-соединений.
Протокол работает в рамках модели
клиент-сервер. На данный момент существует
две версии протокола SSH — SSH-1 и SSH-2.
Наилучшую безопасность обеспечивает
протокол SSH-2.
Особенностями протокола являются:
взаимная аутентификация клиента и
сервера, шифровка соединения, сжатие
передаваемых данных. По умолчанию
SSH-сервер прослушивает 22-й порт.
Установка и запуск
Наиболее
популярной реализацией SSH является
набор программ OpenSSH (http://openssh.org),
распространяемый по лицензии BSD. OpenSSH
является разработкой в рамках проекта
OpenBSD, однако, доступен и во многих других
UNIX-подобных ОС — Linux, Solaris, AIX и других, а
также в Mac OS X.
Установить
ssh-сервер в GNU/Linux Ubuntu можно командой:
#
apt-get install openssh-server
или:
#
aptitude install openssh-server
В
Ubuntu можно также установить метапакет
ssh - который включает в себя и ssh-клиент,
и ssh-сервер:
#
aptitude install ssh
При
использовании System V управление
сервером (запуск, остановка) осуществляется
с помощью команды:
#
service ssh stop|start|restart|status
Управление
автозагрузкой осуществляется с помощью
команды update-rc.d. Удаление ssh-сервера
из автозагрузки:
#
update-rc.d -f ssh remove
При
использовании системы загрузки Upstart
автозагрузкой ssh-сервера можно
управлять посредством файла
/etc/init/ssh.conf. Для отключения автозагрузки
ssh-сервера, можно, к примеру, закомментировать
строчку
start
on filesystem
добавив
символ '#' в начало строки.
Управлять
демоном ssh можно с помощью команд
Upstart: start, stop, restart, reload (сигнал SIGHUP),
status. Для этого используется утилита
initctl. Например:
$
initctl start ssh
Подключение
$
ssh user@hostname -p port
user - имя пользователя
hostname - DNS-имя
хоста или IP-адрес
port - номер порта
(если отличается от стандартного - 22).
Способы аутентификации
При
подключении к серверу клиент сверяет
публичный ключ сервера с сохраненными
ключами из ~/.ssh/known_hosts. Если ключа в
файле нет, то осуществляется запрос к
пользователю:
The
authenticity of host 'example.com (192.168.0.1)' can't be
established. RSA key fingerprint is
0e:33:94:9b:83:b1:d8:02:81:42:0f:0e:4c:c2:cd:98. Are you sure you
want to continue connecting (yes/no)?
После подтверждения ключ добавляется в ~/.ssh/known_hosts. По умолчанию клиент в первую очередь пытается аутентифицироваться своим адресом, затем публичным ключом и, если ничего не сработало, передает пароль, введенный с клавиатуры (при этом пароль шифруется асимметричным ключом - RSA или DSA). После прохождения аутентификации генерируется ключ симметричного шифрования. В качестве метода обмена ключами и создания симметричного ключа в SSH-2 используется алгоритм Диффи-Хелмана (Diffie-Hellman). Файл /etc/ssh/moduli содержит простые числа и генераторы которые используются сервером sshd в алгоритме Диффи-Хелмана. Новые модули могут быть созданы при помощи ssh-keygen в 2 этапа. Первый этап - создание простых чисел, второй - тестирование сгенерированных чисел на их пригодность для использования в рассматриваемом алгоритме:
#
ssh-keygen -G /etc/ssh/moduli.candidates -b 2048
# ssh-keygen -T /etc/ssh/moduli -f /etc/ssh/moduli.candidates
# ssh-keygen -T /etc/ssh/moduli -f /etc/ssh/moduli.candidates
Выполнение
данных команд может занять определенное
время.
Кроме
того, в протоколе SSH-2 вместе данными
передаются контрольные суммы, то есть
контролируется целостность данных.
Конфигурационные файлы
Основные
конфигурационные файлы содержатся в
/etc/ssh. Конфигурационный файл клиента
- ssh_config, сервера - sshd_config. Пример
конфигурации сервера в Ubuntu:
Port
22
# номер порта, на котором работает ssh-сервер
ListenAddress ::
# адрес интерфейса, на котором висит ssh-сервер (опционально)
Protocol 2
# версия используемого протокола. Рекомендуется использовать только значение 2.
HostKey /etc/ssh/ssh_host_rsa_key
# RSA закрытый ключ сервера
HostKey /etc/ssh/ssh_host_dsa_key
# DSA закрытый ключ сервера
AllowUsers
# список разрешенных пользователей. Корректная запись нескольких пользователей/групп по очереди, через пробел.
AllowGroups
# список разрешенных групп
Compression delayed
# сжатие отложено до тех пор, пока пользователь успешно не аутентифицируется.
UsePrivilegeSeparation yes
# указывает, должен ли sshd разделять привилегии. Если да - то сначала будет создан непривилегированный дочерний процесс для входящего сетевого трафика. После успешной авторизации будет создан другой процесс с привилегиями вошедшего пользователя.
AllowTcpForwarding yes
ClientAliveInterval 20
GatewayPorts no
TCPKeepAlive yes
# Указывает, нужно системе посылать TCP сообщения клиенту с целью поддержания соединения.
# ClientAliveCountMax
# Задает количество сообщений к клиентам, которые sshd посылает подряд, не получая какого либо ответа от клиента.
SyslogFacility AUTH;
LogLevel INFO
PermitRootLogin forced-commands-only;
# Указывает, возможен ли ssh-вход под суперпользователем (root). forced-commands-only” - суперпользователь сможет зайти, пользуясь аутентификацией на основе публичного ключа и только если передаст необходимую к исполнению команду.
PermitUserEnvironment no;
PrintMotd yes
# Сообщение дня. Отображается после входа.
Banner /etc/issue.net
Текст, отображаемый перед процедурой аутентификации.
IgnoreRhosts yes
IgnoreUserKnownHosts yes
HostbasedAuthentication no
PermitEmptyPasswords no
# запрет использования пустых паролей
PasswordAuthentication no
# рекомендуется отключить
ChallengeResponseAuthentication no
# способ аутентификации с помощью схемы «Запрос-Ответ» и PAM. Рекомендуется отключить.
AuthorizedKeysFile %h/.ssh/authorized_key <
# Указывает файл, в котором содержатся публичные ключи, используемые для аутентификации пользователей. %h — заменяется домашней директорией аутентифицируещегося пользователя.
PubkeyAuthentication yes
# аутентификация с помощью публичного ключа
UseDNS yes
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication no
SkeyAuthentication no
StrictModes yes
# Указывает должен ли sshd проверить режимы доступа и владения пользовательских папок и файлов перед тем, как дать пользователю войти.
Subsystem sftp /usr/libexec/openssh/sftp-server
# Для возможности использования протокола sftp.
UsePAM no
# Включает интерфейс PAM (Pluggable Authentication Module #
# interface).Если задано значение "yes" - для всех типов #
# аутентификации помимо обработки модуля сессии и аккаунта #
# PAM будет использоваться аутентификация на основе #
# запроса-ответа (ChallengeResponseAuthentication и PasswordAuthentication)
X11Forwarding yes
(если на хосте есть X Windows и игнорируем риск перехвата) X11UseLocalhost yes
# номер порта, на котором работает ssh-сервер
ListenAddress ::
# адрес интерфейса, на котором висит ssh-сервер (опционально)
Protocol 2
# версия используемого протокола. Рекомендуется использовать только значение 2.
HostKey /etc/ssh/ssh_host_rsa_key
# RSA закрытый ключ сервера
HostKey /etc/ssh/ssh_host_dsa_key
# DSA закрытый ключ сервера
AllowUsers
# список разрешенных пользователей. Корректная запись нескольких пользователей/групп по очереди, через пробел.
AllowGroups
# список разрешенных групп
Compression delayed
# сжатие отложено до тех пор, пока пользователь успешно не аутентифицируется.
UsePrivilegeSeparation yes
# указывает, должен ли sshd разделять привилегии. Если да - то сначала будет создан непривилегированный дочерний процесс для входящего сетевого трафика. После успешной авторизации будет создан другой процесс с привилегиями вошедшего пользователя.
AllowTcpForwarding yes
ClientAliveInterval 20
GatewayPorts no
TCPKeepAlive yes
# Указывает, нужно системе посылать TCP сообщения клиенту с целью поддержания соединения.
# ClientAliveCountMax
# Задает количество сообщений к клиентам, которые sshd посылает подряд, не получая какого либо ответа от клиента.
SyslogFacility AUTH;
LogLevel INFO
PermitRootLogin forced-commands-only;
# Указывает, возможен ли ssh-вход под суперпользователем (root). forced-commands-only” - суперпользователь сможет зайти, пользуясь аутентификацией на основе публичного ключа и только если передаст необходимую к исполнению команду.
PermitUserEnvironment no;
PrintMotd yes
# Сообщение дня. Отображается после входа.
Banner /etc/issue.net
Текст, отображаемый перед процедурой аутентификации.
IgnoreRhosts yes
IgnoreUserKnownHosts yes
HostbasedAuthentication no
PermitEmptyPasswords no
# запрет использования пустых паролей
PasswordAuthentication no
# рекомендуется отключить
ChallengeResponseAuthentication no
# способ аутентификации с помощью схемы «Запрос-Ответ» и PAM. Рекомендуется отключить.
AuthorizedKeysFile %h/.ssh/authorized_key <
# Указывает файл, в котором содержатся публичные ключи, используемые для аутентификации пользователей. %h — заменяется домашней директорией аутентифицируещегося пользователя.
PubkeyAuthentication yes
# аутентификация с помощью публичного ключа
UseDNS yes
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication no
SkeyAuthentication no
StrictModes yes
# Указывает должен ли sshd проверить режимы доступа и владения пользовательских папок и файлов перед тем, как дать пользователю войти.
Subsystem sftp /usr/libexec/openssh/sftp-server
# Для возможности использования протокола sftp.
UsePAM no
# Включает интерфейс PAM (Pluggable Authentication Module #
# interface).Если задано значение "yes" - для всех типов #
# аутентификации помимо обработки модуля сессии и аккаунта #
# PAM будет использоваться аутентификация на основе #
# запроса-ответа (ChallengeResponseAuthentication и PasswordAuthentication)
X11Forwarding yes
(если на хосте есть X Windows и игнорируем риск перехвата) X11UseLocalhost yes
Беспарольный вход с кодовой фразой
Генерируем
RSA-пару ключей.
$
ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key
(/home/user1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in
/home/user1/.ssh/id_rsa.
Your public key has been saved in
/home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
Generating public/private rsa key pair.
Enter file in which to save the key
(/home/user1/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in
/home/user1/.ssh/id_rsa.
Your public key has been saved in
/home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
С помощью утилиты ssh-copy-id добавляем публичный ключ в файл authorized_keys на удаленной машине:
$ ssh-copy-id
-i ~/.ssh/id_rsa user@remotehost
После этого
можно запретить парольную аутентификацию
полностью.
Для того, чтобы
не вводить в одном сеансе каждый раз
парольную фразу для ключа, существует
утилита ssh-agent. Ssh-agent - это программа
хранящая приватные ключи, используемые
для публичной аутентификации (RSA, DSA).
Утилита ssh-add
- добавляет RSA- или DSA-идентификацию в
аутентификационного агента.
Публичный ключ
можно добавить на удаленную машину и
вручную. С помощью утилиты защищенного
удаленного копирования scp копируем
открытый ключ на сервер:
$
scp [-P port] /home/user1/.ssh/id_rsa.pub user2@remote_server:~/
Подключаемся по ssh к удаленной машине и добавляем публичный ключ в файл authorized_keys.
$
ssh user1@remote_server [-p port]
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
$ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
Генерация ключей сервера
Для того, чтобы
заново сгенерировать ключи сервера
необходимо выполнить следующие команды:
# ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key
# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
При этом у закрытых ключей будут права доступа 600, у публичных - 644.
Вход в систему: сообщение дня
Сообщение дня
- это содержимое файла /etc/motd
либо /var/run/motd. В Ubuntu сообщение дня
формируется с помощью утилиты run-parts,
которая поочередно выполняет скрипты
из /etc/update-motd.d. Таким образом, сообщение
дня можно изменять с помощью редактирования
скриптов в /etc/update-motd.d. Для просмотра
сообщения дня необходимо выполнить:
#
run-parts /etc/update-motd.d/
[
-d "/etc/update-motd.d" ] && run-parts --lsbsysinit
/etc/update-motd.d > /var/run/motd &
Перенаправление «иксов»
Для отображения
графических приложений удаленной машины
используется перенаправление протокола
X11(«иксов»).
Самый простой
способ (запуск xclock):
$
ssh -X user@remotehost 'xclock'
Для перенаправления
«иксов»:
1) на клиентской стороне настраиваем
возможность приёма X11, для этого в
конфигурационном файле ssh_config нужно
раскомментировать строчку:
#
ForwardX11 yes
- на серверной стороне в конфигурационном файле sshd_config должны быть следующие строчки:
X11Forwarding yes
X11DisplayOffset 10
Перенаправление TCP-портов
OpenSSH поддерживает возможность
создания туннеля для пропуска соединения
по другому протоколу через защищенную
сессию (перенаправление портов).
Рассмотрим
первый случай: Необходимо, что при
поключении к localhost:9999 запрос перенаправлялся
на сервер http:80, при этом данные между
localhost и http шифровались. Это можно
осуществить следующей командой:
$
ssh -2 -f -N -L 9999:http:80 user@http -p 1062
где:
http - ip-адрес
WEB-сервера
-2 - используем
протокол версии 2
-f - фоновый режим
-N - не создавать
сессию для выполнения удаленных команд
-L - перенаправляет
указанный локальный порт на удаленный
порт.
--------80--------
------------------| http || | | localhost |
| \====== 22 ======== 9999 |
| sshd | | |
------------------ -------------------
Второй случай:
Необходимо, что при поключении к
localhost:9999 запрос перенаправлялся на
сервер http:80 через шлюз, при этом данные
между localhost и шлюзом шифровались. Это
можно осуществить следующей командой:
$
ssh -f -N -L 9999:httpserver:80 user@шлюз
---------------- --------------------
| http | | шлюз |
| WEB-сервер 80 ==========-\ |
| | | || sshd |
---------------- --------22---------
| |
--------9999---------
| ssh -L |
| localhost |
| |
---------------------
Файл ~/.ssh/config может содержать необходимые настройки подключения к конкретному хосту. Например:
Host
work
HostName 66.35.250.203
User user1
LocalForward 20000 192.168.0.66:80
LocalForward 22000 192.168.0.66:22
LocalForward 22139 192.168.0.8:139
LocalForward 22110 192.168.0.5:110
Host http
HostName localhost
User iknow
Port 22000
HostKeyAlias localhosthttp
HostName 66.35.250.203
User user1
LocalForward 20000 192.168.0.66:80
LocalForward 22000 192.168.0.66:22
LocalForward 22139 192.168.0.8:139
LocalForward 22110 192.168.0.5:110
Host http
HostName localhost
User iknow
Port 22000
HostKeyAlias localhosthttp
Если данного файла нет, можете его создать:
$
touch ~/.ssh/config
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/config
Для переброса удаленного порта на локальную машину нужно выполнить команду с ключем -R:
$
ssh -R
[удаленный_адрес]:удаленный_порт:локальный_адрес:локальный_порт
[пользователь@]сервер
Для того, чтобы
созданные туннели не сбрасывались по
таймауту существует утилита autossh,
которая поддерживает туннели в рабочем
состоянии и, при необходимости,
перезапускает их.
$
autossh [-V] [-M port[:echo_port]] [-f] [SSH_OPTIONS]
Следующая команда перенаправляет удаленный порт 5022 на сервере serv1 на 22-й порт локальной машины. Порты 5122 и 5123 используются для проверки соединения.
$
autossh -M 5122 -N -R 5022:localhost:22 serv1
Монтирование с помощью sshfs
Модуль ядра
Linux Fuse позволяет
непривилегированным пользователям
монтировать различные файловые системы.
Sshfs - это программа, которая позволяет
монтировать удаленные папки или файловые
системы, используя ssh.
После установки программы остается
только добавить пользователя, которому
мы хотим предоставить право на монтирование
файловых систем через ssh, в группу fuse.
#
adduser user1 fuse
Загружаем модуль
fuse:
#
modprobe fuse
При необходимости fuse можно добавить в файл /etc/modules.
Теперь можно
смонтировать удаленную папку:
$
sshfs user1@remote_server:/tmp ~/remote_folder
Указанная выше команда смонтирует папку /tmp, расположенную на удаленном сервере, в папку ~/remote_folder на локальной машине.
Для того, чтобы
отмонтировать папку достаточно набрать:
$
fusermount -u ~/remote_folder
Пример записи
в /etc/fstab для автоматического монтирования
при загрузке системы:
sshfs#user1@remote_server:/tmp
/home/user1/remote_folder/ fuse defaults,auto 0 0
mc: shell соединение
В
Midnight commander с
помощью файловой системы FISH (File transfer
over Shell) можно подключаться к файловой
системе удаленной машины:
Панель
-> Shell-соединение -> Имя сервера
(логин@ip-сервера:порт)
Защита SSH
!
Раздел не закончен
- Использование нестандартного порта.
- Аутентификация по RSA-ключу.
- Настройка netfilter/iptables.
C помощью модуля
recent iptables:
iptables
-A INPUT -p tcp -m state --state NEW --dport 22 -m recent --update
--seconds 20 -j DROP
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -m recent --set -j ACCEPT
Простейший port-knock'ер работающий по ICMP:
iptables
-A INPUT -p icmp --icmp-type 8 -m length --length 153 -m recent
--name pk --rsource --set -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 154 -m recent --name pk --rsource --update --hitcount 1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 155 -m recent --name pk --rsource --update --hitcount 2 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --name pk --rsource --rcheck --hitcount 3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 154 -m recent --name pk --rsource --update --hitcount 1 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 155 -m recent --name pk --rsource --update --hitcount 2 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --name pk --rsource --rcheck --hitcount 3 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
для того чтобы открыть 22 порт достаточно и необходимо:
$
ping -s 125 -c 1 адрес
$ ping -s 126 -c 1 адрес
$ ping -s 127 -c 1 адрес
$ ping -s 126 -c 1 адрес
$ ping -s 127 -c 1 адрес
Количество пакетов регулируется через --hitcount сами числа передаются через длину icmp-echo.
Утилита
fail2ban
предназначена
для сканирования логов с последующей
раздачи банов IP-адресам, с которых
пытаются несанкционированно подключиться
на сервер. Раздача банов осуществляется
посредством обновления правил фаервола
/etc/hosts.deny куда добавляется забаненный
IP-адрес.
Интересные возможности
!
Раздел не закончен
Трансляция речи с локального микрофона на удаленный динамик:
$
arecord -f dat | ssh -C user@remotehost aplay -f dat
Комментариев нет:
Отправить комментарий