--bsd2008 06:52, 4 марта 2009 (UTC)
OpenSSH - замена стандартных уязвимых протоколов, таких как telnet или rsh. OpenSSH использует шифрованный канал для передачи данных. В нем могут быть задействованы алгоритмы аутентификации RSA или DSA. Эти протоколы основаны на базе специально созданной паре ключей, а именно публичном и приватном ключах. Это асимметричные алгоритмы шифрования, то есть мы можем зашифровать информацию одним ключом, а расшифровать другим, в отличие, например от DES, где используется один и тот же ключ для шифрования и расшифровки информации. OpenSSH различается по версиям: 1.x и 2, любые 1.x версии использовать нельзя т.к есть проблемы с безопасностью. OpenSSH также различается по типу аутентификации:
HostBased - аутентификация без пароля между ssh серверами.
Благодаря host-based аутентификации, можно сделать так чтобы пользователи одного хоста заходили на другой хост без пароля, на котором включена данная функция. Такой вид аутентификации может быть полезен в средах с одним доверенным хостом (trusted) и несколькими хостами, к которым осуществляется доступ с него (untrusted). В этом случае на хосты, к которым осуществляется доступ, пароли не передаются. При данном способе аутентификации происходит следующее: каждый клиент и сервер имеют свои пары ключей RSA, которые называются ключи хоста. При этом существует несколько методов проверки адреса клиента. Сервер смотрит файлы $HOME/.rhosts, $HOME/.shosts, /etc/hosts.equiv, /etc/ssh/shosts.equiv, /etc/ssh/ssh_known_hosts и $HOME/.ssh/known_hosts. Функции и структура файлов: $HOME/.rhosts — определяет адрес машины и имя пользователя, с которой данному пользователю открыт доступ (файл расположен в домашнем каталоге пользователя). $HOME/.shosts — аналогичен .rhosts, но предназначен исключительно для ssh, рекомендуется использовать его. Пример $HOME/.shosts:
user1.test.ru user1 userstend.test.ru user1 null.test.ru user1
/etc/hosts.equiv — содержит пары имя машины/имя пользователя, но имеет эффект на всех пользователей. /etc/shosts.equiv — аналог hosts.equiv, но применяется только ssh, рекомендуется использовать его. Пример файла /etc/ssh/shosts.equiv:
+ user1.test.ru user1 - server.test.ru xakep
Знак "+" означает разрешение пользователю работать с сервером с данного адреса, знак "-" запрещает подобное действие. /etc/ssh/ssh_known_hosts и $HOME/.ssh/known_hosts — данные файлы содержат список адресов и соответствующих им публичных ключей.
Основной механизм:
При запросе клиента сервер генерирует рандомную строку и шифрует ее публичным ключом удаленного хоста. Клиент, получив данную строку, расшифровывает ее своим host ключом (который имеется только у него) и зашифровывает полученную строку паблик ключом сервера. Сервер получает зашифрованное сообщение, расшифровывает своим host ключом и сравнивает с исходной. Если строки совпали, то клиент имеет валидный host ключ, что дает ему право захода на данный сервер.
Но для начала клиент должен иметь правильный адрес, которому соответствует публичный ключ на сервере в файле ssh_known_hosts. Файл состоит из 3-х полей: адрес (или адреса, разделенные запятой), публичный ключ для него одной (!) строкой и дополнительное поле комментариев(необязательно). Пример файла known_hosts:
user1.test.ru {SOME_VERY_LONG_PUBLIC_KEY}
Адрес клиента должен быть в полном формате(name.domain), иначе могут быть проблемы. Кроме этого, в адресе можно использовать шаблоны * и ?. Публичные ключи вставляются в данный файл самим администратором из генерированных клиентом ssh(identity.pub) публичных ключей.
При HostBased аутентификации лучше использовать ssh_known_hosts, т.к. этот метод достаточно безопасен, если публичные ключи клиентов были получены из доверенного источника. Другие методы аутентификации не исключают подмену адреса, и потому считаются небезопасными.
Аутентификация пользователя по его публичному ключу.
Основной механизм: Аутентификация удаленного пользователя по ключу идентична проверке HostBased аутентификации за тем исключением, что проверяется не адрес клиентской машины, а ключ клиента и имя пользователя. Данному пользователю на сервере может соответствовать его публичный ключ, тогда клиент, имея секретный ключ сможет заходить на сервер без пароля. После генерации двух ключей : Host (хранятся в $HOME/.ssh/id_rsa и $HOME/.ssh/id_dsa для ключей rsa и dsa соответственно) и паблик (хранятся в $HOME/.ssh/id_rsa.pub и $HOME/.ssh/id_dsa.pub) паблик ключ необходимо скопировать в домашнюю директорию сервера (компьютер на который вы хотите заходить по ssh) под именем authorized_keys в $HOME/.ssh/authorized_keys. После этого сервер будет знать ключ данного пользователя и сможет аутентифицировать вас без пароля. Файл authorized_keys может содержать несколько публичных ключей, допустимых для данного пользователя: просто поместите их в данный файл по порядку. После этих операций вы сможете входить, имея секретный ключ, на сервер, где размещен ваш публичный ключ, причем под тем пользователем, в чьем домашнем каталоге данный ключ находится. Пароля удаленного пользователя не требуется, необходимо только знать пароль расшифровки секретного ключа, если он используется. Использование: Для генерации пары ключей используется программа ssh-keygen. Для указания типа ключа укажите ssh-keygen -t {RSA DSA}, например, ssh-keygen -t rsa создаст пару ключей RSA длиной 1024 бита. Для указания файла, в котором следует сохранить ключи, можно использовать опцию -f (традиционно используются файлы $HOME/.ssh/id_rsa и $HOME/.ssh/id_dsa для ключей rsa и dsa соответственно), для указания длины ключа в битах используйте опцию -b: Пример: ssh-keygen -t rsa -b 2048 -f $HOME/.ssh/id_rsa В результате работы программа запросит ввод пароля для шифрования секретного ключа, чтобы исключить использование его при попадании к посторонним лицам, не знающим пароля (пароль желательно выбирать не короче 10-и символов), его можно неуказывать. После этого вам будет необходимо вводить данный пароль каждый раз при использовании секретного ключа. После работы ssh-keygen создается пара ключей: один Host (зашифрованный введенным паролем), а другой паблик с расширением .pub (id_rsa.pub). Для переноса публичного ключа клиента служит программа ssh-copy-id. Пример: ssh-copy-id -i public_key_file user@machine После соединения с севером machine и передачей имени пользователя user (необходимо указывать, если удаленное имя отличается от локального) происходит парольная аутентификация заданного пользователя(или текущего) на удаленной машине, затем происходит копирование ключа public_key_file (или $HOME/.ssh/identity.pub, если имя файла не указано) на сервер в $HOME/.ssh/authorized_keys. После этого можно входить на сервер, не используя пароль пользователя.
Аутентификация пользователя по паролю.
Суть проста: сначала идет обмен асимметрическими ключами, и хеш пароля передается в зашифрованном виде.
Устанавливаем OpenSSH:
sudo apt-get install ssh
Все настройки хранятся в каталоге /etc/ssh. При установке он автоматически создаст паблик и Host ключи для rsa и dsa в соответствии с конфигом по умолчанию. Паблик ключи имеют расширение .pub - ssh_host_dsa_key.pub, ssh_host_rsa_key.pub Host ключи - ssh_host_dsa_key, ssh_host_rsa_key. Конфигурационный файл ssh клиента ssh_config находятся в $HOME/.ssh/config или /etc/ssh/ssh_config (для всей системы). Конфигурационный файл демона sshd в /etc/ssh/sshd_config.
Рассмотрим конфигурационный файл ssh клиента ssh_config:
# Это системный конфигурационный файл клиента ssh. Смотрите ssh_config(5) для более подробной документации.
# Этот файл обеспечивает умолчания для пользователей, значения могут быть изменены в пользовательском файле конфигурации или в коммандной строке.
# Данные конфигурации анализируется следующим образом:
# 1. параметры командной строки
# 2. пользовательские специфичные файлы
# 3. общесистемный файлы
# Любое конфигурационное значение только измененное является первым установленым.
# Таким образом, конкретные host определения должны быть в начале файла конфигурации, а по умолчанию в конце.
# Общесистемные умолчания для некоторых используемых функций. Для полного списка доступных опций,
# и установленных по умолчанию смотрите ssh_config(5) в ман старницах.
# Определение хоста, в данном случае включает все хосты домена, можно
# использовать одиночный символ * чтобы указать параметры доступа к любому хосту
Host *
#Определяет какой агент установления подлинности соединения должен быть направлен на удаленную машину.
# ForwardAgent no
#Эта опция определяет, будет ли ssh использовать передачу данных от удаленного
#X сервера через свой безопасный канал. Данная возможность позволяет
#защищать по идее небезопасные протоколы (X, pop, smtp, ftp) шифрованием ssh.
# ForwardX11 no
#При значении ``yes удалённые клиенты X11 будут получать полный доступ к исходному дисплею X11.
#При значении ``no удалённые клиенты X11 будут считаться ненадёжными и будут приниматься меры для предотвращения получения или подмены данных
#принадлежащих надёжным клиентам X11. Более того, для маркера xauth(1) используемого для сеанса будет устанавливаться срок действия 20 минут.
#По прошествии этого времени удалённым клиентам будет отказываться в доступе.
Значение по умолчанию - ``no
# ForwardX11Trusted yes
#Пытаться ли выполнять аутентификацию по rhosts Допустимые значения - yes и no. Значение по умолчанию - no.
#Данный параметр относится только к протоколу версии 1 и требует setuid root для ssh
# RhostsRSAAuthentication no
#Пытаться ли выполнять аутентификацию только по ключу RSA. Допустимые значения - yes и no. RSA будет выполняться только если будет найден файл с
#идентификационными данными или при работающем менеджере ключей. Значение по умолчанию - yes. Данный параметр относится только к протоколу версии 1.
# RSAAuthentication yes
#Использовать ли аутентификацию по паролю.
# PasswordAuthentication yes
#Пытаться ли выполнять Hostbased аутентификацию.
# HostbasedAuthentication no
#Допускать аутентификацию по GSSAPI. Значение по умолчанию - no. Данный параметр относится только к протоколу версии 2.
# GSSAPIAuthentication no
#Перенаправлять (делегировать) идентификационные данные серверу. Значение по умолчанию - no. Данный параметр относится только к протоколу версии 2.
# GSSAPIDelegateCredentials no
#
# GSSAPIKeyExchange no
#
# GSSAPITrustDNS no
#При значении yes запрос паролей отключается. Полезно при использовании программы их сценариев, выполняемых без вмешательства человека. Значение по
#умолчанию: no.
# BatchMode no
#При значении yes ssh будет выполнять проверку наличия IP-адресов в файле known_hosts. Это позволяет обнаруживать подмену ключа хоста посредством
#вмешательства в работу с DNS. При значении no проверка не выполняется. Значение по умолчанию: yes.
# CheckHostIP yes
#Семейство адресов которое должен использовать клиент. Допустимые значения: any, inet (только IPv4) и inet6 (только IPv6).
# AddressFamily any
#Время ожидания (в секундах) подключения к серверу SSH (имеет больший приоритет чем системное значение времени ожидания протокола TCP). Это значение
#игнорируется если с сервером не удаётся соединиться потому что он отклоняет запросы на подключение.
# ConnectTimeout 0
#При значении yes ключи хоста не будут автоматически добавляться в ~/.ssh/known_hosts и программа не будет соединяться с хостами ключи которых
#изменились.Это позволяет лучше защититься от "троянских коней", некоторые люди сочтут это раздражающим, особенно если им приходится часто
#подключаться к новым серверам. При значении no новые ключи хостов будут автоматически добавляться в соответствующий файл. При значении ask новые
#ключи хостов будут добавляться #после подтверждения пользователем, к хостам, ключи которых изменились, по-прежнему подключиться будет невозможно.
#Ключи имеющиеся в файле известных хостов #проверяются автоматически в любом случае. Допустимые значения - yes, no и ask. Значение по умолчанию - ask.
# StrictHostKeyChecking ask
#Файлы с идентификационными данными (субъектом) RSA или DSA. Значение по умолчанию - ~/.ssh/identity для протокола версии 1, ~/.ssh/id_rsa и ~/.ssh/
#id_dsa для протокола версии 2. Кроме того для аутентификации будут использоваться данные предоставляемые менеджером ключей.
#В имени файла может присутствовать тильда для указания каталог пользователя, а также следующие последовательности: `%d' (домашний каталог
#локального пользователя). `%u' (имя локального пользователя), `%l' (имя локального хоста), `%h' (имя удалённого хоста), `%r' (имя удалённого
#пользователя).
#Допустимо указание нескольких файлов с идентификационными данными в файлах конфигурации; все они будут пробоваться по очереди.
# IdentityFile ~/.ssh/identity
#
# IdentityFile ~/.ssh/id_rsa
#
# IdentityFile ~/.ssh/id_dsa
#Порт на удалённой машине к которому следует подключаться. Значение по умолчанию - 22.
# Port 22
#Версии протокола которые следует пытаться использовать, в порядке предпочтения. Допустимые значения - 1 и 2 Значение по умолчанию - 2,1. Это
#означает, что ssh сначала пытается подключиться по протоколу 2 и, если он не поддерживается, пробует протокол 1.
# Protocol 2,1
#Шифр для защиты сеансов по протоколу версии 1. Поддерживаются blowfish, 3des и des. Алгоритм des поддерживается в клиенте ssh(1) только для
#совместимости со старыми серверами не поддерживающими 3des. Рекомендуется воздержаться от использования первого из-за его слабой стойкости. Значение
#по умолчанию: 3des.
# Cipher 3des
#Допустимые для протокола версии 2 шифры. Несколько шифров указываются через запятую. Поддерживаются следующие шифры: 3des-cbc, aes128-cbc, aes192-
#cbc, aes256-cbc, aes128-ctr, aes192-ctr, aes256-ctr, arcfour128, arcfour256, arcfour, blowfish-cbc и cast128-cbc.
# Ciphers aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour,aes192-cbc,aes256-cbc
#Порядок предпочтения алгоритмов MAC (Message Authentication Code - код установления подлинности сообщения).
#Они используются в протоколе версии 2 для гарантирования целостности данных. Несколько алгоритмов следует указывать через запятую.
#Значение по умолчанию: hmac-md5, hmac-sha1, hmac-ripemd160, hmac-sha1-96, hmac-md5-96.
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
#Символ отменяющий интерпретирование следующего за ним символа (по умолчанию - ~ ) . Символ можно также задавать через командную строку. В качестве
#аргумента следует указывать последовательность из ^ и символа, либо none для отключения данного механизма (что позволит использовать соединение для
#передачи двоичных данных без искажений).
# EscapeChar ~
#Запрашивать туннелирование (между клиентом и сервером) для устройств tun(4) Допустимые значения - yes, point-to-point (layer 3), ethernet (layer 2),
#и no. При указании yes программа будет запрашивать режим туннелирования по умолчанию, point-to-point. Значение по умолчанию - no.
# Tunnel no
#Устройства tun(4) которые должны открываться на стороне клиента (local_tun ) и сервера (remote_tun ).
# TunnelDevice any:any
#Разрешить выполнение локальной команды указанной в LocalCommand или через управляющую последовательность ! command в ssh(1).
#Допустимые значения - yes и no. Значение по умолчанию - no.
# PermitLocalCommand no
#Переменные локальной среды environ(7) которые следует посылать серверу для копирования. Эта функция доступна только для протокола 2. Сервер также
#должен поддерживать передачу переменных, кроме того, таковая должна быть разрешена. За это отвечает параметр AcceptEnv файла конфигурации сервера
#sshd_config5. Переменные задаются по шаблону имён. Несколько шаблонов разделяются пробелами, либо указываются в нескольких директивах SendEnv По
#умолчанию не передаются никакие переменные.
SendEnv LANG LC_*
#Создавать хэши имён хостов при добавлении их в ~/.ssh/known_hosts Использование хэшей имён хостов вместо самих имён хостов поддерживается и ssh(1)
#и sshd(8), и позволяет предотвратить утечку информации в случае разглашения содержимого файла. Значение по умолчанию - ``no Уже имеющиеся в файле
#имена хостов не будут преобразованы автоматически, это можно сделать вручную с помощью утилиты ssh-keygen1.
HashKnownHosts yes
#Эти два парметра уже рассматривались, здесь идет их переназначение.
GSSAPIAuthentication yes
#
GSSAPIDelegateCredentials no
Рассмотрим основной конфиг файл sshd_config:
#Сгенерированный конфигурационный файл #смотрите man-ы sshd(8) для подробностей # Какие порты, адреса и протоколы, будет слушать Port 22 # Используйте эти опции для ограничения интерфейсов/протоколов с которыми будет работать sshd #ListenAddress :: #ListenAddress 0.0.0.0 Protocol 2 # Приват ключи для протокола версии 2 (где будут сгенерированны и лежать) HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_dsa_key #Разделение привилегий пользователей включается для обеспечения безопасности #Разделение привилегий пользователей работает следующим образом: для каждого соединения создается отдельный серверный процесс, и когда приходит #запрос от клиента, отслеживающий ssh-монитор процесс запускает непривилегированный дочерний процесс, который и будет обрабатывать все запросы от #клиента. Если для обработки запроса клиента требуются привилегии суперпользователя, то этот запрос посылается привилегированному процессу ssh- #монитор. При просмотре запущенных процессов SSH можно также увидеть демона sshd процесса, предназначенного для наблюдения, и непривилегированный #процесс, принадлежащий клиенту. # UsePrivilegeSeparation yes #Данные значения определяют длину ключа сервера и его время жизни для #использования ssh версии 1(данный ключ будет заново генерироваться через #заданное время) KeyRegenerationInterval 3600 ServerKeyBits 768 #Логгирование #Опция SyslogFacility определяет, список каких событий администратор хочет видеть в лог-файле сервера. #Доступны: DAEMON, USER, AUTH, LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7. #Опция LogLevel определяет уровень детализации сообщений. Возможные значения(какие знаю я): AUTH, INFO. SyslogFacility AUTH LogLevel INFO #Авторизация: #LoginGraceTime указывает количество секунд через которое разорвется соединение если пользователь незалогинется. #PermitRootLogin разрешает или запрещает пользователю root получать удаленный доступ по SSH. #StrictModes указывает sshd проверять ли права и владельца домашнего каталога пользователя, который пытается получить удаленный доступ к системе, #перед тем как вызвать login, для использования беспарольной аутентификации надо установить no. #RSAAuthentication указывает аутентификация через RSA (для версии 1). #PubkeyAuthentication указывает аутентификацию пользователя по ключу (для версии 2). #AuthorizedKeysFile определяет публичный ключ пользователя для аутентификации по ключу. Можно применять шаблоны: %u - имя пользователя, %h - домашний #каталог пользователя. LoginGraceTime 120 PermitRootLogin yes StrictModes yes RSAAuthentication yes PubkeyAuthentication yes #AuthorizedKeysFile %h/.ssh/authorized_keys #Игнорируем пользовательские ~/.rhosts и ~/.shosts файлы. Используется при hostbased аутентификации, #используя только known_hosts файл. IgnoreRhosts yes #Для этого режима вам также потребуется приватные ключи в /etc/ssh_known_hosts. #Используем ли аутентификацию через known_hosts совместно с .rhosts или #.shosts. Опция действительна только для протокола версии 1. RhostsRSAAuthentication no #Аналогично для протокола версии 2. #Включает hostbased аутентификацию. HostbasedAuthentication no #Раскомментируйте, если вы не доверяете ~/.ssh/known_hosts при RhostsRSAAuthentication. #Не использовать known_hosts при hostbased аутентификации. #IgnoreUserKnownHosts yes #Для включения пустых паролей, установите yes (НЕ РЕКОМЕНДУЕТСЯ) PermitEmptyPasswords no #Change to yes to enable challenge-response passwords (beware issues with #some PAM modules and threads) ChallengeResponseAuthentication no #Выберите no чтобы запретить посылку хешей паролей через туннель ssh. #PasswordAuthentication yes #Kerberos опции #Данные опции могут понадобиться, если для аутентификации пользователя будет через Kerberos. #KerberosAuthentication no #KerberosGetAFSToken no #KerberosOrLocalPasswd yes #KerberosTicketCleanup yes #GSSAPI опции #Данные опции могут понадобиться, если для аутентификации пользователя будет через GSSAPI. #GSSAPIAuthentication no #GSSAPICleanupCredentials yes #Передача протокола X через туннель ssh. X11Forwarding yes #так и ненашел что это такое(. X11DisplayOffset 10 #При логине пользователя выводим /etc/motd: рекомендуется отмененить в #целях безопасности. PrintMotd no #Сообщаем пользователю время и место последнего логина. PrintLastLog yes #Функция проверки работоспособности состояния клиента, при перехвате пакетов и анализе содержания злоумышленником может приводить к успешной реализации на отказ обслуживания (Denial of Service), поэтому рекомендуется отключать данную опцию. TCPKeepAlive yes #При использовании опции USELOGIN внешняя програма логин используется для авторизации пользователя и установки корректных разрешений. #UseLogin no #MaxStartups контролирует количество параллельных неаутентифицированных подключений к серверу. Запись параметра имеет форму "start:rate:full". В нашем #случае она означает отключение с вероятностью 30% при наличии 10 неаутентифицированных связей, с линейным ростом вероятности до 100% при достижении #60. #MaxStartups 10:30:60 #Опция Banner определяет место положения файла-баннера, который будет выведен на экран, при попытке подключиться к серверу sshd. Обязательно убедитесь #в существовании файла, указанного в качестве параметра опции Banner. #Banner /etc/issue.net #Разрешить клиенту пропустить локальные переменные окружения. AcceptEnv LANG LC_* #Новые системы, работающие через ssh. В данном примере определяется #"безопасный" ftp сервер - sftp, аналогичный доступ пользователя, но с #возможностью передачи файлов(т.е. пользователь получает доступ ко всем своим #файлам и нет возможности настройки разрешений и виртуальных пользователей, #как, например в proftpd). По сути дела подсистемы ssh могут обеспечивать #прохождение других протоколов по сети, но под "крылышком" ssh. Например, для #sftp сервера есть одноименный sftp клиент. Его интерфейс полностью идентичен #оригинальному ftp, но с одним отличием: происходит та же самая аутентификация #пользователя на удаленном сервере(методами ssh), но вместо оболочки с #пользователем взаимодействует подсистема, в данном случае sftp. Subsystem sftp /usr/lib/openssh/sftp-server #Использовать ли для аутентификации пользователя pam-модули. UsePAM yes