Безопасность

Пентест, защита серверов, шифрование.

  • «Как защитить SSH от брутфорса»

  • «Основы SELinux: что это и как не сломать систему»

Основы безопасности Linux: от простого к сложному

- Опубликовано в Безопасность

Приветствуем, друзья-администраторы и любознательные пользователи! Если вы работаете со средой Linux – будь то сервер, рабочая станция или виртуальная машина – вопрос безопасности становится крайне важным. Хорошая новость: безопасность Linux построена на понятных принципах и может быть эффективно усвоена "от простого к сложному".

Эта статья – ваш путеводитель, как закрепить первый рубеж защиты для ваших систем.

1. Базовый уровень: Фундаментальные правила

Многие проблемы возникают из-за нарушения базовых принципов. Держимся этих пяти пунктов:

  • Слабые пароли – прямой вход врагу: Это самое частое слабое звено! Избегайте простых паролей (петербург, 123456, ваша собака Бобик наоборот). Используйте длинные комбинации из латинских и кириллических букв, цифр и специальных символов. Попробуйте утилиты типа pwgen или соответствующий плагин в менеджере паролей для генерации надежных вариантов.

    • Практика: Команда passwd <имя_пользователя> позволяет сменить пароль. Убедитесь, что все пользователи, особенно обычные и сервисные аккаунты (например, mysql, httpd), имеют прочный пароль.
  • Управление правами доступа: Linux – многопользовательская система. Контролируйте, кто есть кто на вашем компьютере.

    • Практика: Команда sudo -l покажет, какие команды может выполнять пользователь (или группа) с правами root. Используйте usermod для добавления пользователя в группу sudoers и adduser <имя_пользователя> для создания новых аккаунтов.
    • Практика: Всегда используйте команду su - username (или соответствующее GUI) вместо простого sudo, если нужно работать в оболочке другого пользователя. Это уменьшает накопление кеша паролей.
  • Отключение Root-доступа по SSH без sudo: Давайте будем честны – root – это опасный аккаунт. Вместо прямого входа с root'ом, настройте систему так, чтобы можно было подключаться только через обычного пользователя, который имеет право выполнять команды sudo.

    • Практика: Отредактируйте файл /etc/ssh/sshd_config (обязательно сделайте резервную копию!), найдите строку PermitRootLogin yes и измените на PermitRootLogin without-password ИЛИ лучше – PermitRootLogin prohibit-password. Второй вариант предпочтительнее, так как полностью запрещает прямой root-доступ по паролю. Затем убедитесь, что пользователь с правами sudo может выполнять нужные команды через sudo.
  • Обязательное использование ключей (SSH): Ключи SSH – это идеальная замена паролям для безопасного удаленного доступа.

    • Практика: Создайте пару ключей на своей машине (ssh-keygen) и скопируйте публичный ключ (id_rsa.pub, или используйте ssh-copy-id) на целевую Linux-машину в файл /root/.ssh/authorized_keys (для root) или соответствующий каталог пользователя. Или используйте сертификаты (X.509), которые более безопасны для больших систем.
  • Сильные файловые системы: Не ходите по чужим сюжетам!

    • Практика: При монтировании USB-накопителей, сетевых дисков или даже некоторых локальных директорий используйте флаги nofollow, nosuid, nodev, ro.
    # Пример для временного устройства /dev/sdb1
    mount -o ro,nofollow,noexec,nosuid /dev/sdb1 /mnt/readonly
    
    • Пояснение: ro – только для чтения, nofollow запрещает проследование символьных ссылок (защита от ".."), noexec запрещает выполнение файлов на диске, nosuid отключает исполняемые биты в заголовке файла. Эти флаги сильно ограничивают использование "посторонних" файловых систем.

2. Работа с пользователями и группами

Контроль доступа начинается с управления учетными записями:

  • Удаление ненужных пользователей: Не нужны root-доступ, но не выполняют важные задачи? Их лучше удалить.

    • Практика: Команда userdel -r username удаляет пользователя и его домашнюю директорию.
  • Строгий контроль домашних директорий: Обеспечьте, чтобы только владелец мог читать/изменять содержимое своих папок.

    • Практика:
    # Установить права на домашнюю директорию пользователя
    chmod 700 /home/username
    
    Или для безопасности сразу после создания:
    ```
    # Создать пользователя и автоматически убрать права записи для других
    adduser username --disabled-password --gecos "" && \
    echo "username:password" | chpasswd -e && \
    mkdir /home/username && chmod 700 /home/username && chown username:username /home/username
    ```
    
  • Обязательный шифрование домашних директорий (для root и важных пользователей):

    • Практика: Используйте ecryptfs или LUKS для шифрования домашней папки пользователя. Особенно это критично для root.
  • Имена пользователей – скрывайте детали: Избегайте имен вроде "admin", "root" (если прямой доступ отключен), "testuser". Используйте неочевидные или описательные, но не связанные с правами.

    • Практика:
    # Создать пользователя с нелогичным именем для важного сервиса
    useradd -s /bin/false -d /opt/myapp/data -m -N my_weird_service_user
    

3. Входящие соединения и сетевая безопасность

Что заходит на вашу машину – это важно:

  • Не открытые порты: Не оставляйте порты открытыми, если явно не нужно.

    • Практика:
      1. Проверьте, какие сервисы запущены и слушают сетевые соединения с помощью netstat -tulnp или ss -tulnp.
      2. Если сервис по умолчанию прослушивает публичный интерфейс (например, SSH на eth0), то либо измените его конфигурацию, чтобы он слушал только локальный (lo) интерфейс или специально отведенный для этого интерфейс (eth1).
      3. Используйте systemctl stop <service> и systemctl disable <service> для приложений по умолчанию не запускаемых на сервере.
  • Имя хоста: Установите уникальное имя хоста (hostnamectl set-hostname new.name), чтобы системы могли узнавать вас правильно, а вы – себя.

  • Базовая фаерволльская политика (iptables/nftables): Откажитесь от всех подключения и разрешайте строго необходимые.

    • Практика:

      # Блокировать все входящие соединения по умолчанию, разрешить ответы на исходящие
      iptables -P INPUT DROP
      iptables -P OUTPUT ACCEPT
      
      # Разрешить доступ к своим сервисам (SSH на порт 22)
      iptables -A INPUT -p tcp --dport 22 -j ACCEPT
      
      # Разрешить выход в Интернет (если это сервер, возможно потребуется и обратно)
      iptables -A OUTPUT -j ACCEPT
      
      # Сохранить правила
      service iptables save   # или команду для nftables
      
  • Разграничение сети: Если есть возможность (на уровне провайдера VPS/облака), используйте разные интерфейсы. Отдайте для внешних подключений один, а другой – "внутренний" и скрывайте его от широкой общественности.

4. Доверенные пути (PATH):

Злоумник может замаскировать опасный файл в директории, которую вы добавляете в свой $PATH. * Практика: 1. Всегда проверяйте команды с помощью полного пути (/bin/ls вместо ls) – это надежнее. 2. Не добавляйте неизвестные директории в $PATH. Убедитесь, что $PATH содержит только доверенные места, особенно для root и системных администраторов.

5. Отладка ядра (Kdump):

Диагностика проблем – дело важное, но это создает файл сжатого дампа памяти (vmcore) при сбое ядра. Этот файл может содержать очень много информации о системе и безопасности его доступа критически важна. * Практика: Настройте Kdump только для доверенных пользователей или отключите запись дампа в читаемую системой папку по умолчанию. Сместите права на /var/crash. Или используйте crash с правами root, но это уже продвинутый уровень.

6. Продвинутый: SELinux / AppArmor

Теперь самое интересное – трансляционную уровню (или Mandatory Access Control - MAC)!

  • Принцип "меньше привилегий": Представьте, что даже при запуске как root программа может делать только строго определенные действия. Это повышает безопасность.
  • Практика: SELinux (расширенный механизм в Linux) или AppArmor (более простой для начинающих, особенно в Canonical/Ubuntu).

    • Включите и настройте политику минимальных привилегий.

      # Проверить статус SELinux
      sestatus
      
      # Настроить режим enforcing (требовать строгих правил) или permissive (записывать нарушения без блокировки)
      setenforce 0   # Переместить в режим пермиссивного контроля (для тестирования!)
      setenforce 1   # Включить строгий контроль
      
      # Проверить политику для конкретной программы или сервиса
      seinfo permissive -s /path/to/file-or-service-name
      
    • Поиск уязвимостей: если программа не может выполнить свою работу (например, запущенный скрипт), значит, либо настроена неправильно, либо есть недостаток в политике. Это повод для анализа и возможного смягчения политики.

7. Дополнительные меры

  • Шифрование дисков (LUKS): Даже если кто-то получит доступ к физическому носителю, данные будут защищены.
  • Обновления безопасности: Самое важное! Всегда проверяйте наличие обновлений (yum check-update, apt-get update && apt-get upgrade) и ставьте их вовремя.
  • Аудит безопасности (auditd): Используйте утилиту auditd для записи событий, связанных с безопасностью – изменения правил sudoers, доступ к файлам конфигурации и т.д.

Вывод

Безопасность Linux – это путь постоянного обучения и внимательного настройки. Начните с базовых паролей и прав пользователя, затем настройте сети и доверенные пути, включите аудит событий и изучите принцип "меньше привилегий". По мере опыта переходите к использованию ключевых механизмов контроля доступа (SELinux/AppArmor) и тщательному монтированию файловых систем.

Следование этим основам – первый шаг к тому, чтобы ваш Linux-сервер или рабочая станция стали устойчивыми к большинству типичных атак. Начните внедрять эти практики сегодня!


Ваши дальнейшие действия:

  • Установите надежные пароли для всех пользователей.
  • Отключите прямой root-доступ по SSH (если он еще есть).
  • Проверьте порты на сервере и отключите ненужные.
  • Изучите базовую синтаксис iptables или nftables для своих нужд.

Успехов в управлении безопасностью ваших Linux-систем!