| categories:linux
Меры безопасности для защиты сервера - I
Checklist
- Использовать аутентификацию по ключам
- Настроить
firewall
- Использовать
VPN
- SSL/TLS шифрование
- Регулярный аудит работающих сервисов
- Отслеживать нежелательные изменения файлов
- Контейнеризация приложений
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