6 янв. 2012 г.

Руководство по SSH (HOWTO)

 


SSH (secure shell — безопасная оболочка) — сетевой протокол, который обеспечивает безопасный удаленный вход в систему (в т.ч. удаленное выполнение команд), копирование файлов, перенаправление протокола X (X Window System), а также туннелирование TCP-соединений. Протокол работает в рамках модели клиент-сервер. 


 Протокол SSH.
Краткое практическое руководство.
HOWTO.




Оглавление

1.Обзор
2.Установка и запуск
3.Подключение
4.Способы аутентификации
5.Конфигурационные файлы
6. Беспарольный вход с кодовой фразой
7.Генерация ключей сервера
8.Вход в систему: сообщение дня
9.Перенаправление «иксов»
10.Перенаправление TCP-портов
11.Монтирование с помощью sshfs
12.mc: shell соединение
13.Защита SSH
14.Интересные возможности



  1. Обзор



SSH (secure shell — безопасная оболочка) — сетевой протокол, который обеспечивает безопасный удаленный вход в систему (в т.ч. удаленное выполнение команд), копирование файлов, перенаправление протокола X (X Window System), а также туннелирование TCP-соединений. Протокол работает в рамках модели клиент-сервер. На данный момент существует две версии протокола SSH — SSH-1 и SSH-2. Наилучшую безопасность обеспечивает протокол SSH-2. Особенностями протокола являются: взаимная аутентификация клиента и сервера, шифровка соединения, сжатие передаваемых данных. По умолчанию SSH-сервер прослушивает 22-й порт.


  1. Установка и запуск


Наиболее популярной реализацией 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


  1. Подключение

$ ssh user@hostname -p port

user - имя пользователя
hostname - DNS-имя хоста или IP-адрес
port - номер порта (если отличается от стандартного - 22).
  1. Способы аутентификации


При подключении к серверу клиент сверяет публичный ключ сервера с сохраненными ключами из ~/.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-2 вместе данными передаются контрольные суммы, то есть контролируется целостность данных.

  1. Конфигурационные файлы

Основные конфигурационные файлы содержатся в /etc/ssh. Конфигурационный файл клиента - ssh_config, сервера - sshd_config. Пример конфигурации сервера в Ubuntu:
Port 22 
# номер порта, на котором работает ssh-сервер
ListenAddress :: 

# адрес интерфейса, на котором висит ssh-сервер (опционально)
Protocol

# версия используемого протокола. Рекомендуется использовать только значение 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



  1. Беспарольный вход с кодовой фразой


Генерируем 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

С помощью утилиты 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

  1. Генерация ключей сервера


Для того, чтобы заново сгенерировать ключи сервера необходимо выполнить следующие команды:

# ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key
# ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key

При этом у закрытых ключей будут права доступа 600, у публичных - 644.


  1. Вход в систему: сообщение дня


Сообщение дня - это содержимое файла /etc/motd либо /var/run/motd. В Ubuntu сообщение дня формируется с помощью утилиты run-parts, которая поочередно выполняет скрипты из /etc/update-motd.d. Таким образом, сообщение дня можно изменять с помощью редактирования скриптов в /etc/update-motd.d. Для просмотра сообщения дня необходимо выполнить:

# run-parts /etc/update-motd.d/

Автоматическое создание сообщения дня происходит в /etc/init/mounted-varrun.conf строчкой:

[ -d "/etc/update-motd.d" ] && run-parts --lsbsysinit /etc/update-motd.d > /var/run/motd &
  1. Перенаправление «иксов»

Для отображения графических приложений удаленной машины используется перенаправление протокола X11(«иксов»).

Самый простой способ (запуск xclock):

$ ssh -X user@remotehost 'xclock'

Для перенаправления «иксов»:

1) на клиентской стороне настраиваем возможность приёма X11, для этого в конфигурационном файле ssh_config нужно раскомментировать строчку:

# ForwardX11 yes
  1. на серверной стороне в конфигурационном файле sshd_config должны быть следующие строчки:
    X11Forwarding yes
    X11DisplayOffset 10

  1. Перенаправление 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

Если данного файла нет, можете его создать:



$ touch ~/.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
  1. Монтирование с помощью 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

  1. mc: shell соединение

В Midnight commander с помощью файловой системы FISH (File transfer over Shell) можно подключаться к файловой системе удаленной машины:

Панель -> Shell-соединение -> Имя сервера (логин@ip-сервера:порт)


  1. Защита SSH


! Раздел не закончен
  1. Использование нестандартного порта.
  2. Аутентификация по RSA-ключу.
  3. Настройка 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


Простейший 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

для того чтобы открыть 22 порт достаточно и необходимо:

$ ping -s 125 -c 1 адрес
$ ping -s 126 -c 1 адрес
$ ping -s 127 -c 1 адрес

Количество пакетов регулируется через --hitcount сами числа передаются через длину icmp-echo.
Утилита fail2ban предназначена для сканирования логов с последующей раздачи банов IP-адресам, с которых пытаются несанкционированно подключиться на сервер. Раздача банов осуществляется посредством обновления правил фаервола /etc/hosts.deny куда добавляется забаненный IP-адрес.

  1. Интересные возможности


! Раздел не закончен

Трансляция речи с локального микрофона на удаленный динамик:

$ arecord -f dat | ssh -C user@remotehost aplay -f dat



автор: Рамиль Гаимов gaimovrf@gmail.com

 Источники:
RFC 4253 The Secure Shell (SSH) Transport Layer Protocol http://tools.ietf.org/html/rfc4253
http://www.snailbook.com/faq/ssh-1-vs-2.auto.html
http://tools.ietf.org/html/rfc4253#section-4.1
http://openssh.org/portable.html
http://habrahabr.kz/blog/819.html
http://www.linuxcenter.ru/lib/articles/soft/ssh.phtml
http://www.nixp.ru/articles/Настройка-сервера-SSH-(теория-и-практика).html
http://linux-doc.ru/ssh/config/moduli.php
http://man.he.net/man5/moduli
http://help.ubuntu.ru/wiki/ssh
http://www.bog.pp.ru/work/ssh.html
http://fixunix.com/ssh/73410-how-does-challengeresponseauthentication-actually-works.html
http://guruadmin.ru/page/menyaem-soobshhenie-privetstviya-ssh-v-ubuntu
http://otvety.google.ru/otvety/fhistory?fid=566e48b4f423becb00049483040aadcd
http://www.freebsd.org/doc/ru/books/handbook/openssh.html
http://souptonuts.sourceforge.net/sshtips.htm
http://ru.wikibooks.org/wiki/SSH_туннелирование
http://www.debianadmin.com/autossh-automatically-restart-ssh-sessions-and-tunnels.html
http://www.nestor.minsk.by/sr/2007/11/sr71104.html
http://ru.gentoo-wiki.com/wiki/Fail2ban
http://mylinuxblog.ru/fail2ban-ssh-and-other-services-bruteforce-protection/
http://usefree.com.ua/poleznye-programmy-2/using-ssh-ubuntu.html

Комментариев нет:

Отправить комментарий