OpenSSH - настройка, полезные приемы, секреты и советы

Ответить
Аватара пользователя
Raven
Бородатый сис
Бородатый сис
Сообщения: 2800
Зарегистрирован: 03 мар 2010, 15:12
ОС: RHEL 8
Откуда: Из серверной

OpenSSH - настройка, полезные приемы, секреты и советы

Сообщение Raven » 02 авг 2010, 18:42

За последние несколько лет OpenSSH из набора программ для защищенной системы регистрации, выполнения команд на удаленном хосте и передачи файлов с одной машины на другую превратился в швейцарский армейский нож, просто потрясающий своими возможностями. Используете ли вы хотя бы половину из них? В этой статье вы найдете множество полезных советов по настройке, использованию, и всевозможные способы применения ssh в повседневной жизни, как например резервное копирование, копирование файлов, создание туннелей, авторизация и ее ограничение, и еще много всяких вещей которые умеет эта замечательная программа.

Отключение прослушивания IPv6 адресов

По умолчанию sshd(8) слушает как на IPv4 так и на IPv6 адресах. Для того что бы отключить возможность работы по IPv6, необходимо изменить параметр AddressFamily:

Код: Выделить всё

AddressFamily inet
Адрес и порт прослушивания

По умолчанию sshd(8) принимает подключения на всех интерфейсах, в чем не всегда есть необходимость. Если не требуется заходить на сервер “из вне”, следует ограничить его работу определенным адресом с помощью параметра

Код: Выделить всё

ListenAddress:
# ListenAddress 0.0.0.0

ListenAddress 192.168.1.2
Дополнительно через двоеточие можно указать и номер порта. В данном примере используется значение порта, заданное глобально параметром Port.

Ограничение доступа суперпользователя

В большинстве дистрибутивов в целях безопасности доступ суперпользователю по SSH закрыт (PermitRootLogin no), и при попытке зарегистрироваться под root получаем сообщение об ошибке. Для выполнения задач, требующих привилегий администратора, приходится заходить под обычным пользователем и использовать su(1) или sudo(8). Красиво выйти из ситуации поможет директива Match. В качестве аргумента ей передается критерий отбора (User, Group, Host, Address), его значение и параметр, который нужно применить. Для примера разрешим подключение под root только с localhost и из доверенной подсети 192.168.5.0/24:

PermitRootLogin no

Match Host 192.168.5.*,127.0.0.1

PermitRootLogin yes


Контроль неудачных подключений

Следующие две директивы позволяют контролировать неудачные подключения к серверу:

Код: Выделить всё

LoginGraceTime 60

MaxStartups 2:50:10
Параметр LoginGraceTime определяет, по истечению какого времени простаивающее подключение будет разорвано (в секундах). Значение по умолчанию 120 явно завышено. Количество параллельных неаутентифицированных подключений к серверу контролируется при помощи MaxStartups. Запись параметра имеет форму “start:rate:full”. В нашем случае она означает отключение с вероятностью 50% при наличии двух неаутентифицированных связей, с линейным ростом вероятности до 100% при достижении 10.

Контроль за подключениями пользователей

Установки в файлах /etc/ssh/sshrc или ~/.ssh/rc позволяют выполнить некоторые действия при регистрации пользователя. Здесь можно использовать любые команды оболочки. Например, отправим администратору на почту уведомление о том, что в систему по SSH зашел пользователь:

Код: Выделить всё

# vi /etc/ssh/sshrc

echo $(date) $SSH_CONNECTION $USER $SSH_TTY | mail -s “ssh login” admin@domain.ru
Пример создания резервных копий

Генерируем пару ключей (секретный и публичный):

Код: Выделить всё

#ssh-keygen -t rsa -C ‘remote backup’

Generating public/private rsa key pair.

Enter file in which to save the key (/home/user/.ssh/id_rsa):

/home/user/.ssh/id_rsa_backup
Добавляем публичный ключ в список авторизованных ключей на удаленной системе:

Код: Выделить всё

$ ssh remotehost “umask 077; cat > .ssh/authorized_keys” < .ssh/id_rsa_backup.pub
Затем редактируем authorized_keys (ключ ‘-t’ следует использовать при запуске программ, требующих для своей работы наличия псевдотерминала):

Код: Выделить всё

$ ssh -t remotehost vi .ssh/authorized_keys

from=”192.168.0.*,212.34.XX.YY”,command=”cd /work; tar cvf - ./* | bzip2 -9″,

no-pty,no-agent-forwarding,no-X11-forwarding,no-port-forwarding ssh-rsa AAAA[…]
И запускаем процедуру резервного копирования:

Код: Выделить всё

$ ssh -i .ssh/id_rsa_backup remotehost > ~/backup/work-`date +%d%m%Y`.tar.bz2 2>/dev/null
Каталог /work, находящийся на сервере remotehost, будет сохранен в архив ~/backup/work-11052008.tar.bz2.

Используем dump в связке с SSH

Используя SSH, можно защитить информацию, передаваемую программами, не имеющими встроенных механизмов шифрования соединения. Например, сделаем бэкап с помощью dump(8) на удаленный сервер:

Код: Выделить всё

$ sudo dump -0au -f - /dev/rwd1a | gzip -9 | ssh remotehost ‘dd of=cvs_backup.dump.gz’
Поскольку в dump(8) встроена возможность передавать данные по сети с использованием RSH, существует возможность использования и SSH, поскольку его функциональность аналогична:

Код: Выделить всё

$ ssh remotehost touch /home/user/cvs.dump

$ env RSH=`which ssh` sudo -E dump 0f remotehost:/home/user/cvs.dump /cvs
Передача файлов и каталогов

Передать файл, используя SSH, можно одним из следующих способов:

Код: Выделить всё

$ cat myfile | ssh remotehost ‘cat > myfile’

$ tar zcf - ~/coding | ssh remotehost ‘cat > coding.tgz’
Чтобы рекурсивно отправить весь каталог, набираем:

Код: Выделить всё

$ scp -r mydir user@host.domain.ru:
Вариант копирования каталога с использованием ssh(1) и tar(1) с локального хоста на удаленный:

Код: Выделить всё

$ tar cf - source | ssh remotehost “(cd /target; tar xpf -)”
и с удаленного хоста на локальный:

Код: Выделить всё

$ ssh remotehost “tar cf - source” | (cd /target; tar xpf -)
Безопасный способ получения почты

Для безопасного получения почты с помощью fetchmail можно использовать SSH. Для этого в конфигурационном файле ~/.fetchmailrc необходимо указать следующее:

Код: Выделить всё

poll localhost with protocol pop3 and port 8110:

        preconnect "ssh -f -q -C user@213.167.XX.YY \

 -L 8110:213.167.XX.YY:110 sleep 10" password noIdea;
Забираем почту:

Код: Выделить всё

$ fetchmail

1 message for user at localhost (8062 octets).

reading message user@localhost.domain.ru:1 of 1 (8062 octets)……. flushed
Почтовый шлюз

Настроим 192.168.1.1 на перенаправление входящей и исходящей почты по шифрованному каналу для клиентов из 192.168.1.0/24 на mail.domain.ru:

Код: Выделить всё

$ vi .ssh/config

Host mail

 Hostname mail.domain.ru

 LocalForward 192.168.1.1:8025 mail.domain.ru:25

 LocalForward 192.168.1.1:8110 mail.domain.ru:110

 LocalForward 192.168.1.1:8143 mail.domain.ru:143

 GatewayPorts yes
Открываем туннель:

Код: Выделить всё

$ ssh mail
Выполнение заданной команды после подключения

Параметр ProxyCommand позволяет выполнить произвольную команду. Для примера подключимся через шлюз к файловому серверу, который находится за NAT:

Код: Выделить всё

$ vi .ssh/config

Host gateway

        HostName ns.domain.ru

Host filesrv

        HostName 192.168.5.201

        ProxyCommand ssh gateway nc -w 180 %h %p
Подключаемся:

Код: Выделить всё

$ ssh filesrv
Мультиплексирование ssh-сессий

Использование параметра ControlMaster позволяет ускорить доступ к удаленному серверу за счет того, что в специальном файле сохраняются все параметры предыдущего сеанса, которые и используются при повторном подключении. Для примера создадим две Host-секции:

Код: Выделить всё

$ vi .ssh/config

Host srv1

 HostName 213.167.XX.YY

 ControlMaster yes

 # Здесь %r - имя, %h - хост и %p - порт

 ControlPath ~/.ssh/ctl-%r-%h-%p

Host srv1fast

 HostName 213.167.XX.YY

 ControlMaster no

 ControlPath ~/.ssh/ctl-%r-%h-%p
Теперь на сервере srv1 выполняем утилиту uptime(1), логинимся на нем (чтобы создать локальный сокет для второго подключения), переходим на другую консоль и снова запрашиваем статистические счетчики:

Код: Выделить всё

ttyp0$ time ssh srv1 uptime

 5:55PM  up 37 days,  9:19, 1 user, load averages: 0.33, 0.32, 0.33

    0m0.77s real     0m0.06s user     0m0.01s systemttyp0$ ssh srv1

ttyp1$ time ssh srv1fast uptime

 5:57PM  up 37 days,  9:20, 2 users, load averages: 0.37, 0.34, 0.33

    0m0.03s real     0m0.00s user     0m0.01s system
Из примера видно, что при использовании мультиплексирования соединений время выполнения команды uptime(1) на удаленном сервере уменьшилось в 25 раз.

Код: Выделить всё

Создание SOCKS-сервера
OpenSSH можно использовать как специальный SOCKS-сервер, который поддерживает более гибкое проксирование, чем простое перенаправление портов. Например, команда:

Код: Выделить всё

$ ssh -D1080 user@domain.ru
Создает локальный SOCKS5-сервер, который ждет подключения на localhost:1080. Альтернативный вариант - прописать директиву DynamicForward в .ssh/config:

Код: Выделить всё

$ vi .ssh/config

Host proxy

        HostName ns.domain.ru

        DynamicForward 1080
Подключаемся, введя

Код: Выделить всё

ssh proxy
. Протестировать работу SOCKS5-сервера можно такой командой:

Код: Выделить всё

$ echo -n “GET / HTTP/1.0\r\n\r\n” | nc -X 5 -x 127.0.0.1:1080 \

 www.domain.ru 80 | head -4

HTTP/1.1 200 OK

Date: Sat, 23 Feb 2008 14:27:43 GMT

Server: Apache

X-Powered-By: PHP/4.4.1
Теперь SOCKS-сервер готов к использованию:

Код: Выделить всё

$ tsocks thunderbird
Сажаем пользователей в песочницу

В OpenSSH 4.9 появилась долгожданная поддержка chroot(2) для sshd(8), контролируемая с помощью опции ChrootDirectory. К примеру, заставим подключающегося по sftp пользователя worker переходить в измененный корневой каталог data:

Код: Выделить всё

# vi /etc/ssh/sshd_config

#Subsystem  sftp   /usr/libexec/sftp-server

Subsystem   sftp   internal-sftpMatch User worker

 X11Forwarding no

 AllowTcpForwarding no

 ForceCommand internal-sftp

 ChrootDirectory /data
Пример для хостинговых клиентов:

Код: Выделить всё

# vi /etc/ssh/sshd_config

#Subsystem  sftp   /usr/libexec/sftp-server

Subsystem sftp internal-sftpMatch Group wwwusers

 X11Forwarding no

 AllowTcpForwarding no

 ForceCommand internal-sftp

 ChrootDirectory /var/www/hosting/%u
Теперь зарегистрированные пользователи будут допущены только к “своему” каталогу, при подключении модификатор %u будет заменен именем пользователя. При необходимости можно использовать %h, который соответствует домашнему каталогу юзера.

Скрываем записи о серверах, к которым мы подключались

Некоторые администраторы, возможно, захотят зашифровать все IP и доменные адреса из файла .ssh/known_hosts. Делается это следующим образом:

Код: Выделить всё

$ echo ‘HashKnownHosts’ >> ~/.ssh/config

$ ssh-keygen -H -f ~/.ssh/known_hosts

$ head -1 ~/.ssh/known_hosts

+|1|TJ2SaXGqO8uHYeiA92KuNRIKR7M=|GpQB8Qz0tQPqA+nF+ghe37mpcHA= ssh-rsa AAAA[…]
Управляющие последовательности SSH

Управляющие последовательности SSH станут доступны, если в SSH-сессии сначала нажать <Enter>, затем управляющий символ сеанса (по умолчанию тильда, задается директивой EscapeChar) и специальную клавишу, которая указывает, какую именно функцию следует выполнить.

Допустим, мы с mail.domain.ru зашли на bastion.domain2.ru и решили, что не плохо было бы открыть обратный шифрованный туннель к почтовому серверу для безопасной загрузки сообщений. С помощью комбинации клавиш “<Enter>~C” можно интерактивно управлять локальным и удаленным форвардингами (ключи ‘-L’ и ‘-R’):
  • bastion$ <Enter>~C

    ssh> -R 8110:mail.domain.ru:110

    Forwarding port.
Проверяем работу созданного почтового туннеля:

Код: Выделить всё

bastion$ telnet localhost 8110

+OK Dovecot ready.
В ответ получен баннер от Dovecot, значит, все в порядке.
Кстати, обратившись к подсказке, получим список всех доступных ключей и дополнительных параметров:

Код: Выделить всё

bastion$ <Enter>~C

ssh> help

Commands:

      -L[bind_address:]port:host:hostport    Request local forward

      -R[bind_address:]port:host:hostport    Request remote forward

      -KR[bind_address:]port                 Cancel remote forward
Если в ~/.ssh/config установить значение директивы PermitLocalCommand в yes, то мы сможем выполнять команды в локальном шелле, т.е. на хосте, с которого зашли:

Код: Выделить всё

ns$ ssh mx

mx$ <Enter>~C

ssh> !uptime # команда выполняется на хосте ns

 7:02PM  up 100 days, 11 mins, 1 user, load averages: 0.13, 0.21, 0.23

<Enter>

mx$ uptime  # команда выполняется на хосте mx

 7:02PM  up 4 days,  7:34, 1 user, load averages: 0.21, 0.23, 0.19
Если на предыдущем узле требуется выполнить сразу несколько команд, то SSH-сессию лучше временно засуспендить (приостановить выполнение программы ssh):

Код: Выделить всё

mx$ <Enter>~<Ctrl-Z>

[1] + Suspended            “ssh” “$@”
Чтобы перевести SSH-сессию из остановленного режима в активный, следует воспользоваться командой fg.
Список текущих SSH-соединений можно просмотреть комбинацией:

Код: Выделить всё

mx$ <Enter>~#

The following connections are open:

  #0 client-session (t4 r0 i0/0 o0/0 fd 5/6 cfd -1)
А для быстрого завершения SSH-сессии ставим точку:

Код: Выделить всё

mx$ <Enter>~.

Connection to 213.167.XX.YY closed.
Сокращенный набор

Чтобы в консоли не вводить полное доменное имя, порт и учетную запись для подключения к удаленной системе, стоит заручиться поддержкой директивы Host:

Код: Выделить всё

$ vi ~/.ssh/config

Host mx

 Hostname mx.domain.ru

 Port 2022

 User admin
Таким образом, достаточно ввести , чтобы соединиться с нужным хостом.

Получение доступа к закрытому сервису

Многие администраторы в целях безопасности скрывают свои сервера в демилитаризованной зоне, либо за NAT’ом, и разрешают входящие соединения только с доверенных IP-адресов и по определенными портам. Поэтому доступ ко многим полезным ресурсам получить напрямую нельзя. Это как раз тот случай, когда использование SSH-форвардинга может исправить ситуацию.

Код: Выделить всё

$ vi ~/.ssh/config

Host gate

        Hostname gate.domain.ru

# Для ускорения соединений включаем мультиплексирование SSH-сессий

        ControlMaster auto

        ControlPath ~/.ssh/ctl-%r-%h-%p

# Перенаправляем локальный порт на файловый сервер (Win2k3 с поднятым VShell)

        LocalForward 8022 192.168.1.101:22# Подключаясь к localhost:8022, мы будем попадать на файловый сервер

Host fileserver

        Hostname localhost

        Port 8022

        ControlMaster auto

        ControlPath ~/.ssh/ctl-%r-%h-%p

        HostKeyAlias fileserver
Соединяемся с узлом gate и проверяем возможность подключения к локальному порту 8022:

Код: Выделить всё

$ ssh -N -f gate

$ telnet localhost 8022

SSH-2.0-VShell_3_0_4_656 VShell
Теперь можно подключиться к файловому серверу, который находится за NAT’ом, в обход правил файерола, установленных на шлюзе:

Код: Выделить всё

$ ssh fileserver

Microsoft Windows [Version 5.2.3790]

C:\Documents and Settings\Username\My Documents>
Ограничение возможностей перебора паролей с помощью Pf (FreeBSD/OpenBSD)

Сервис SSH является любимой мишенью злоумышленников, поэтому следует принять некоторые меры безопасности. Одна из них - ограничение количества подключений, чтобы избежать DoS-атаки и перебора паролей.

Код: Выделить всё

# vi /etc/pf.conf

table <sshbf> persist

block in log quick on $ext_if inet from <sshbf>

pass in log on $ext_if inet proto tcp to $ext_if port ssh keep state \

 (max-src-conn-rate 5/60, overload <sshbf> flush global)
Данный набор правил инструктирует фильтр пакетов не допускать более 5 одновременных соединений к 22 порту за 60 секунд.

Перенаправление X11-подключений

Для перенаправления X11-подключений следует использовать ключ ‘-Y’:

Код: Выделить всё

$ ssh -Y user@domain.com
Причем в конфигурационном файле /etc/ssh/sshd_config параметр X11Forwarding должен быть установлен в “yes”. Если X-сервер запущен на локальной системе, то необходимо включить и X11UseLocalhost.

Источник
Я не злопамятный, я просто часто ковыряю логи
Ответить

Вернуться в «Сетевые технологии»