воскресенье, 8 апреля 2018 г.

Безопасное и удобное использование SSH

На сегодняшний день, системные инженеры, программисты имеют возможность безопасно управлять сервером на Linux удаленно с помощью консоли. Для Windows существуют специальные утилиты для подключения к Linux-серверам по SSH, такие как Putty, для пользователей MacOS и Linux можно использовать встроенный в операционную систему пакет ssh-client. Помимо SSH существуют и другие технологии удаленного доступа к физическим и виртуальным серверам: IPMI, VNC, RDP и прочие.

Изначально вместо SSH использовался протокол telnet, который в отличие от SSH не шифрует трафик от клиента к серверу, поэтому telnet сейчас считается устаревшим и используется в основном в интранете для управления маршрутизаторами и коммутаторами. Также утилита telnet позволяет быстро узнать работает тот или иной сервис на порту, например:
$ telnet 8.8.8.8 53
Trying 8.8.8.8...
Connected to 8.8.8.8.
Escape character is '^]'.
Connection closed by foreign host.

Положительный ответ утилиты telnet свидетельствует о том, что по данному адресу работает сервис, который слушает порт 53.

Вернемся к SSH.
С помощью таких утилит как scp, rsync, sftp мы можем не только управлять сервером, но и обмениваться с ним файлами по шифрованному соединению, вот как можно быстро отправить файл на сервер с помощью scp:
$ scp file user@server:/path

Правильная настройка сервера SSH позволит обезопаситься от взлома сервера, существует несколько правил, которые стоит учитывать при настройке SSH-сервера:

  • доступ на сервер должен быть только у тех, кому это действительно нужно
  • пароли подобрать гораздо легче чем ключи, поэтому желательно отказаться от паролей в пользу последних

Представим что Вы только что приобрели виртуальный сервер и получили доступы к нему от провайдера. Давайте попробуем подключиться к серверу:
$ ssh [email protected]
The authenticity of host '10.0.0.9 (10.0.0.9)' can't be established.
ECDSA key fingerprint is SHA256:4wZrqLapM3+Xb3w0RHgg.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.9' (ECDSA) to the list of known hosts.
[email protected]'s password: reoMeiMeiPh3eeF
[root@vps ~]#

В данном случае адрес сервера 10.0.0.9, пароль пользователя root: reoMeiMeiPh3eeF и мы подключаемся к серверу впервые, поэтому SSH задает вопрос, стоит ли добавлять этот сервер в список доверенных.
Список доверенных хостов находится в файле ~/.ssh/known_hosts
Мы успешно подключились к серверу.

На новом сервере в первую очередь необходимо сменить пароль пользователя root:
# passwd root

Создадим локального пользователя с именем tom и установим для него безопасный пароль:
# useradd tom
# passwd tom

Теперь вернемся к нашей рабочей машине и скопируем публичный ключ на сервер
$ ssh-copy-id [email protected]
/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
[email protected]'s password:
Number of key(s) added: 1

Теперь мы можем подключаться к серверу без ввода пароля, с помощью ключа:
$ ssh [email protected]
[tom@vps ~]$

Сменим пользователя на root и сгенерируем ключи на сервере:
$ su root
# ssh-keygen -A
ssh-keygen: generating new host keys: RSA1 DSA

Настроим безопасный SSH-сервер:
# vim /etc/ssh/sshd_config
Port 22
Protocol 2
AuthorizedKeysFile .ssh/authorized_keys
Banner none
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key

# Отключает логин для root, разрешаем вход по ключу
Disable root login, password login
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no

# Доступ к графической оболочке нам не нужен
X11Forwarding no

# Разрешаем вход только пользователю tom и группе family
AllowUsers tom@*
AllowGroups family@*

# Разрешаем вход пользователю root с некоторых адресов
Match host 192.168.0.10, 10.0.0.20
   PermitRootLogin yes

Для применения изменений перезагрузим сервис:
# systemctl restart sshd

В данной конфигурации мы позволяем работать серверу ssh на стандартном порту 22 и только по протоколу версии 2 (протокол версии 1 считается устаревшим). Также мы запретили вход на сервер для root, вход по паролям, отключили отображение баннера и проброс X11, при этом разрешаем вход на сервер для пользователя tom и группы family.

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

Пример установки fail2ban на CentOS 7.
Установим репозиторий epel и пакет fail2ban:
# yum install epel-release -y && yum install fail2ban -y

Создадим конфигурационный файл:
# vim /etc/fail2ban/jail.local
[ssh-iptables]
enabled = true
filter = sshd

# Блокируем с помощью iptables
action = iptables[name=SSH, port=ssh, protocol=tcp]

# Настройки почты для уведомлений
sendmail-whois[name=SSH, [email protected], [email protected], sendername="Fail2Ban"]

# Максимальное число попыток логина, после которого последует бан
maxretry = 5

# Время бана в секундах (24ч)
bantime = 86400

Запустим сервис и проверим, что создалась цепочка f2b-SSH в iptables:
# systemctl start fail2ban
# iptables -L f2b-SSH
Chain f2b-SSH (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Fail2ban отслеживает подключение к серверу SSH и в случае неправильного ввода пароля или неверного файла ключа 5 раз, блокирует адрес на 24 часа. С помощью fail2ban можно блокировать адреса вручную или убирать из из блока:
# fail2ban-client set JAIL [banip|unbanip] IP

Пример:
# fail2ban-client set ssh-iptables banip 10.0.0.3
# fail2ban-client set ssh-iptables unbanip 10.0.0.3

Помните как мы подключались к серверу изначально? Нам приходилось каждый раз вводить пароль при логине, затем мы пробросили свой публичный ключ на сервер и логиниться на сервер стало проще. Но можно сделать еще проще.
Например того чтобы каждый раз не писать:
$ ssh [email protected]
мы можем логиниться на сервер с помощью команды:
$ ssh vps

Сделать это очень просто, создадим на рабочей машине конфиг для ssh:
$ vim ~/.ssh/config
Host vps
HostName 10.0.0.9
User tom
IdentityFile ~/.ssh/id_rsa
Compression yes

И попробуем подключиться к нашему серверу:
$ ssh vps
[tom@vps ~]$

Не требуется ни ввод пароля, ни помнить адрес пользователя и сервера.

Конечно, существуют и другие виды управления сервером, например VNC. VNC может быть удобен, если на сервере установлена графическая оболочка, однако такое случается редко, да и управлять сервером можно с помощью X11 и SSHD. Панели управления сервером, как правило ограничены в функциональности, а доступ к серверу напрямую через SSH дает полный контроль к серверу.

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