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
3. Best Practice: Предоставление доступа удаленному сотруднику
Передача приватных ключей по сети запрещена правилами безопасности. Приватный ключ никогда не должен покидать устройство владельца.
Правильный алгоритм выдачи доступа:
-
Сотрудник сам генерирует ключ на своем компьютере и отправляет администратору ТОЛЬКО публичную часть (
.pub):ssh-keygen -t ed25519 -C "employee_name" -
Администратор создает отдельного пользователя на сервере:
sudo adduser developer -
Администратор вносит присланный публичный ключ в профиль нового пользователя:
sudo mkdir -p /home/developer/.ssh sudo nano /home/developer/.ssh/authorized_keys # (вставляется содержимого файла id_ed25519.pub сотрудника) -
Администратор выставляет корректные права и владельца:
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