Checklist

SSH ключи

Генерируем пару ключей (id_ed25519 - приватный, id_ed25519.pub - публичный). Алгоритм RSA всё еще надежный при использовании длинных ключей, но довольно старый. Лучше использовать современный алгоритм Ed25519 на эллиптических кривых. Можно указать путь к файлу и свой email.

ssh-keygen -o -a 150 -t ed25519 -f ~/.ssh/id_ed25519 -C "s@perashov.ru"

Не забываем ввести passphrase.

Дальше надо свой публичный ключ передать на целевой сервер. Для этого запускаем утилиту ssh-copy-id с нужным именем пользователя и адресом.

ssh-copy-id user@petrashov.ru

Это еще не всё. Чтобы не вводить при каждом подключении passphrase используем ssh-agent. Проверим, запущен ли он:

eval "$(ssh-agent -s)"

Если агент показал pid можем продолжать. Передаем в ssh-add путь к файлу с приватным ключем и passphrase.

ssh-add ~/.ssh/id_ed25519

После этого можно подключится к серверу пройдя аутентификацию по ключу.

ssh user@petrashov.ru

Зачем нужен passphrase?

Аутентификация по ключу без passphrase ничем не отличается от пароля записанного в текстовый файл. Будучи скомпрометированным, этот файл позволяет сразу получить доступ к серверу. Поэтому добавив passphrase к ключу, мы создаем двух-факторную аутентификацию.

Преимущества

  • Не надо запоминать пароли
  • Защита от bruteforce

Смена порта sshd

По умолчанию демон ssh работает на 22-м порту. Об этом знают все, и боты регулярно простукивают 22-й порт, поэтому разумно повесить sshd на другой, непривилегированный порт, чтобы усложнить им задачу. Для этого в файле /etc/ssh/sshd_config находим строчку

Port 22

И меняем на любой другой, который не используется другими сервисами. Чтобы не усложнять себе жизнь, дописывая каждый раз опцию -p при подключении к нестандартному порту по ssh, удобно завести файл ~/.ssh/config где будут храниться хосты и соответствующие им порты для подключения в таком формате:

Host petrashov.ru
Port 2222

Firewall

Для Linux наиболее простыми и распространенными решениями будет UFW и iptables

UFW - это Uncomplicated Firewall. Удобный интерфейс для управления iptables, входит в дистрибутив Ubuntu.

Работает только от имени root. Для начала проверяем статус:

sudo ufw status

Если активен, временно выключаем.

sudo ufw disable

По умолчанию закрываем весь входящий трафик и открываем весь исходящий:

sudo ufw default deny incoming
sudo ufw default allow outgoing

Теперь, разрешаем доступ по ssh

sudo ufw allow ssh

Это эквивалентно команде

sudo ufw allow 22/tcp

В качестве алиасов сервисов UFW использует список из /etc/services. Можно смело ориентироваться на него, или прописывать конкретный порт, если используется нестандартная конфигурация.

Теперь можно включить firewall. При включении он выдаст предупреждение. Если закрыть порт, по которому подключен ssh, то будет неловкая ситуация. Подтверждаем и радуемся.

 sudo ufw enable

Еще несколько полезных команд, которые умеет выполнять UFW

# sh
sudo ufw status verbose # Подробный отчет о состоянии
sudo ufw deny from 185.143.172.234 # Заблокировать опредленный IP
sudo ufw allow 6000:6007/tcp # Открыть диапазон IP адресов
sudo ufw allow from 185.143.172.234 to any port 22 # Разрешить подключение по ssh с определнного IP 
sudo ufw allow in on eth0 to any port 443 # Разрешить подключаться по https к сетевому интерфейсу eth0
sudo ufw reset # Сбросить все настройки

sudo ufw status numbered # Показать список правил из iptables с номерами строк
sudo ufw delete 1 # Удалить правило по номеру строки

VPN

Наладить взаимодействие серверов по VPN задача не тривиальная, поэтому возьмем в помощь демон tinc.

sudo apt-get install tinc

Конфигурация хранится в директории /etc/tinc/netname/, в которой есть SSH ключи и информация о других VPN хостах:

  • tinc.conf
  • tinc-up
  • tinc-down
  • hosts/
    • vpnmaster
    • vpnslave

Нужные файлы и директории создаются одной командой:

sudo tinc -n netname init vpnmaster

Здесь netname - название сети, а vpnmaster - имя хоста. Затем на нашем vpnmaster задаем подсеть

tinc -n tincnet add subnet 192.168.2.0/24

На втором сервере тоже устанавливаем tinc и создаем конфигурацию командой:

sudo tinc -n netname init vpnslave

Чтобы vpnslave нашел vpnmaster достаточно в конфигурации указать ConnectTo

tinc -n tincnet add connectto vpnmaster

Одного имени VPN хоста недостаточно, чтобы демон смог подключиться по сети к другой машине. Вся информация о подключении, включая публичные ключи хранится в файлах директории /etc/tinc/netname/hosts/. Передать информацию о хостах между компьютерами сети мы можем так:

tinc -n netname export \
    | ssh vpn1.petrashov.ru tinc -n netname exchange \
    | tinc -n netname import

В файл tinc-up пишем команду создания сетевого интерфейса для работы VPN

ifconfig $INTERFACE 192.168.0.1 netmask 255.255.255.0

Аналогично для vpnslave с ip 192.168.0.2.

После чего можно запускать демон

tinc -n netname start

Для отладки использовать параметр -d со значением в диапазоне от 0(только критичные ошибки) до 5(весь трафик)

Продолжение


Написано на основе обучающей статьи с Digital Ocean