Перейти к содержанию

Доступ и защита сервера

Кто и как заходит на сервер, как отбиваться от перебора паролей и что пользователь видит при входе.


SSH-ключи

См. SSH.

Ключ под конкретный сервер удобно делать отдельным файлом с комментарием:

ssh-keygen -t ed25519 -a 64 -f ~/.ssh/id_ed25519_harbor -C "ramil@harbor"
ssh-copy-id -i ~/.ssh/id_ed25519_harbor.pub ramil@harbor   # допишет ключ в ~/.ssh/authorized_keys на сервере
  • -a 64 - число раундов KDF, которым шифруется приватный ключ под passphrase. Больше раундов - дольше перебор
  • -C - комментарий в конце публичного ключа, по нему видно, чей это ключ, в authorized_keys
  • ~/.ssh/id_ed25519_harbor - приватный ключ, никому не показывать. .pub - публичный, его копируют на сервер
# ~/.ssh/config на локальной машине
Host harbor
  HostName harbor
  User ramil
  IdentityFile ~/.ssh/id_ed25519_harbor
  IdentitiesOnly yes     # предлагать серверу только этот ключ, а не все из агента

Fail2ban

Fail2ban - Это служба, которая читает логи (например, неудачные входы по SSH) и банит IP, с которых идёт перебор. Набор правил для одного сервиса называется jail.

sudo fail2ban-client status                        # какие jail'ы активны
sudo fail2ban-client status sshd                   # статус jail sshd: сколько попыток, кто забанен
sudo fail2ban-client set sshd unbanip 101.91.192.9 # снять бан с IP

sudo tail -n 200 /var/log/fail2ban.log             # логи
sudo journalctl -u fail2ban -n 200 --no-pager

sudo nft list set inet f2b-table addr-set-sshd     # какие IP реально забанены в nftables
sudo fail2ban-client status sshd | sed -n '/Banned IP list/p'   # только строка со списком забаненных IP

sed -n '/Banned IP list/p' - -n выключает печать всех строк, /.../p печатает только строку, где встретился шаблон. Из длинного статуса остаётся одна строка со списком IP.


Аудит входов

Кто сейчас в системе:

who        # кто залогинен
w          # то же подробнее: IP, idle, что запущено
users      # просто список логинов

История входов:

last -a                                   # успешные входы и перезагрузки, IP в последней колонке
last -a | grep -E "sshd|pts/"             # только SSH-сессии
last | grep -v "still logged in\|crash"   # только завершённые сессии
lastlog                                   # когда каждый пользователь входил последний раз
lastlog -u ramil                          # по одному пользователю

Неудачные попытки и SSH-сессии из логов:

sudo grep -i "failed password" /var/log/auth.log | tail -n 50
sudo grep -i "invalid user" /var/log/auth.log | tail -n 50
sudo journalctl -u ssh -S today | grep -E "Accepted|session opened|session closed" | tail -n 200

/var/log/auth.log есть в Debian и Ubuntu. В Fedora и RHEL те же события - в /var/log/secure и в journalctl, а сервис называется sshd, а не ssh.

Процессы пользователя:

ps -u ramil -o pid,tty,stat,lstart,etime,cmd --sort=-lstart | head -n 30

motd

motd (message of the day) - Это текст, который пользователь видит после входа по SSH.

  • /etc/motd - статический текст
  • /etc/update-motd.d/ - скрипты, которые выполняются по порядку имён и собирают динамический motd (Debian, Ubuntu)
cat /etc/motd                                  # статический motd
ls -l /etc/update-motd.d/                      # скрипты динамического motd
run-parts /etc/update-motd.d/                  # прогнать все скрипты и посмотреть результат
bash /etc/update-motd.d/99-harbor              # проверить один скрипт

sudo chmod -x /etc/update-motd.d/*             # выключить все скрипты
sudo chmod +x /etc/update-motd.d/99-justheader-harbor   # включить только свой

Выполняются только скрипты с правом x, поэтому chmod -x - способ выключить лишние без удаления.