Модуль 1: Linux, Автоматизация и Бэкапы

Харденинг Linux: SSH по ключам, sudoers, SELinux и сетевые фаерволы

1. Что такое SSH и для чего он используется

SSH (Secure Shell) — это сетевой протокол прикладного уровня, позволяющий производить безопасное удаленное управление операционной системой и передачу данных через незащищенные сети. Весь трафик шифруется с использованием асимметричных и симметричных алгоритмов.

Основные сценарии использования SSH:

  • Удаленное администрирование: Выполнение команд на сервере через интерактивную консоль.
  • Безопасная передача файлов: Протоколы SFTP и SCP для копирования данных по шифрованному каналу.
  • Проброс портов (SSH Tunneling): Безопасный доступ к приватным службам и базам данных, скрытым за фаерволом.
  • Автоматизация и CI/CD: Удаленный деплой кода и выполнение скриптов без участия человека.

2. Настройка SSH-ключей и Харденинг сервера

Парольная аутентификация уязвима для атак методом перебора (Brute-force). Базовый стандарт безопасности — использование криптографических SSH-ключей и полное отключение входа по паролям.

Шаг 1. Генерация ключей на локальном ПК

Рекомендуется использовать алгоритм ed25519 как наиболее быстрый и криптоустойчивый:

# Генерация пары ключей (в PowerShell или Linux-терминале)
ssh-keygen -t ed25519 -C "Niko@try-my.beer"

Шаг 2. Добавление публичного ключа на сервер

Содержимое публичной части (id_ed25519.pub) заносится в профиль пользователя на сервере:

# Создание директории и установка прав
mkdir -p ~/.ssh
chmod 700 ~/.ssh

# Добавление публичного ключа
nano ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Шаг 3. Харденинг SSH-конфигурации (`/etc/ssh/sshd_config`)

Отредактируйте конфигурационный файл для защиты от Brute-force атак:

# /etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no

Перезапустите службу SSH для применения настроек:

sudo systemctl restart ssh.socket
sudo systemctl restart ssh
Важно: Перед закрытием текущей SSH-сессии откройте новое окно терминала и проверьте вход по ключу, чтобы не заблокировать себе доступ!

3. Best Practice: Предоставление доступа удаленному сотруднику

Передача приватных ключей по сети запрещена правилами безопасности. Приватный ключ никогда не должен покидать устройство владельца.

Правильный алгоритм выдачи доступа:

  1. Сотрудник сам генерирует ключ на своем компьютере и отправляет администратору ТОЛЬКО публичную часть (.pub):
    ssh-keygen -t ed25519 -C "employee_name"
  2. Администратор создает отдельного пользователя на сервере:
    sudo adduser developer
  3. Администратор вносит присланный публичный ключ в профиль нового пользователя:
    sudo mkdir -p /home/developer/.ssh
    sudo nano /home/developer/.ssh/authorized_keys
    # (вставляется содержимого файла id_ed25519.pub сотрудника)
  4. Администратор выставляет корректные права и владельца:
    sudo chmod 700 /home/developer/.ssh
    sudo chmod 600 /home/developer/.ssh/authorized_keys
    sudo chown -R developer:developer /home/developer/.ssh

4. Безопасное управление правами через `/etc/sudoers`

Файл /etc/sudoers регламентирует доступ пользователей к выполнению команд от имени root.

Главное правило: Никогда не редактируйте /etc/sudoers напрямую обычным редактором. Используйте утилиту visudo — она проверяет синтаксис перед сохранением, исключая риск поломки прав sudo.

Выдача точечных привилегий без запроса пароля (для CI/CD):

Безопасный подход — создание отдельных файлов в директории /etc/sudoers.d/:

sudo visudo -f /etc/sudoers.d/nginx-reload

Пример настройки права перезапуска Nginx для пользователя Niko без ввода пароля:

Niko ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx, /usr/bin/systemctl restart nginx

5. SELinux vs Сетевые Фаерволы (UFW / firewalld)

Распространенное заблуждение — путать SELinux с фаерволом. Они работают на абсолютно разных уровнях защиты системы.

Критерий Сетевой фаервол (UFW / firewalld) SELinux (Security-Enhanced Linux)
Сфера защиты Сетевой трафик и порты (L3/L4) Процессы, файлы и системные вызовы
Тип контроля Межсетевой экран MAC (Mandatory Access Control)
Основная задача Блокировать несанкционированные входящие/исходящие соединения. Ограничить ущерб при взломе сервиса (например, не дать Nginx доступ к /etc/shadow).

Управление SELinux (RHEL / AlmaLinux)

# Проверка текущего статуса
sestatus

# Временное переключение в режим отладки (Permissive)
sudo setenforce 0

# Включение режима блокировки (Enforcing)
sudo setenforce 1

Управление UFW (Ubuntu / Debian)

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable