Checklist

Отслеживать нежелательные изменения файлов

Чтобы понимать, что происходит на сервере и не происходит ли чего нехорошего я рекомендую использовать auditd. Устанавливается из репозитория.

sudo apt-get install auditd

В комплект пакета auditd входит 4 утилиты:

  • auditctl — управления демоном auditd;
  • autrace — аналог strace, позволяет отследить события в процессах;
  • ausearch — поиск событий в журналах;
  • aureport — генератор отчётов.

Правила для аудита задаются в /etc/audit/audit.rules, укажем там несколько основных правил

-w /etc/hosts -p wa -k hosts_file_change
# -w {path} - директория или папка, которую отслеживаем
# -p {permissions} – какой доступ логировать (rwa)
# -k {key} - все логи записанные по этому правилу будут помечены этим ключом

Перезапускаем демона и проверяем конфигурацию

sudo service auditd restart
sudo auditctl -l

Чтобы не углубляться в подробности работы ядра, а просто включить аудит с приемлемыми настройками по умолчанию auditd поставляется с набором готовых конфигураций, соответствующих промышленным стандартам. На мой взгляд, стандарт NISPOM включает в себя оптимальные правила.

cd /usr/share/doc/auditd/examples
sudo gunzip nispom.rules.gz
sudo sh -c 'sudo cat nispom.rules > /etc/audit/audit.rules'

Полезные команды:

sudo ausearch -m USER_LOGIN --success no --start today # Все неудачные плпытки входа
ausearch -m help 2>&1 | awk -v RS=' ' '/^[A-Z]{2}/{ print }' | sort # Список всех типов событий

Утилита aureport без параметров показывает сводный отчет по количеству событий каждого типа, с ключом --help выведет на экран список всех доступных отчетов, которые можно посмотреть и проанализировать по отдельности.

  • AIDE - Advanced Intrusion Detection Environment
  • rkhunter - Rootkit checker (set UPDATE_MIRRORS=1, MIRRORS_MODE=0 and WEB_CMD="")
  • chkrootkit - One more rootkit checker

Контейнеризация приложений

Все меры безопасности, предпринимаемые не имеют смысла, если на нашем сервере нет клиентских приложений. Поскольку эти приложения обрабатывают внешние соединения - это наиболее уязвимая часть сервера. Извне к серверу может обратиться любой злоумышленник, поэтому всё, что находится в открытом доступе, мы изолируем от остальной системы при помощи технологии контейнеризации.

Предположим, что у нас есть бложик на Wordpress. Обернем его в контейнеры, чтобы обезопасить свой сервер.

Ставим свежую версию Docker из внешнего репозитория.

sudo apt-get install apt-transport-https \
 ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64]  \
    https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce docker-compose
sudo usermod -aG docker $USER

Создаем файл docker-compose.yml со следующим содержимым:

version: "3"
services:
    reverse-proxy: # в качестве reverse-proxy используем nginx
        image: nginx:stable-alpine
        ports:
        - "80:80"
        - "443:443"
        volumes:
        # слева - путь к конфигам nginx
        - ./nginx:/etc/nginx/conf.d 
        # логи нам нужны булут для аудита
        - /var/log/nginx:/var/log/nginx 
        # монтируем контент, чтобы nginx отдавал статику напрямую
        - ./petrashov.ru:/var/www/html 
         # и SSL сертификаты тоже нужно не забыть пробросить в контейнер
        - /etc/ssl/:/etc/ssl
    blog:
        image: wordpress:fpm-alpine
        volumes:
        - ./petrashov.ru:/var/www/html
        environment:
        - WORDPRESS_DB_NAME: wordpress
        - WORDPRESS_TABLE_PREFIX: wp_
        - WORDPRESS_DB_HOST: db
        # пароль задаем в переменой окружения
        - WORDPRESS_DB_PASSWORD: ${WP_DB_USER_PASSWORD} 
    db:
        image: mariadb:latest
        volumes:
        - ./petrashov.ru_20180808.sql.gz:/docker-entrypoint-initdb.d/db.sql.gz
        environment:
        - MYSQL_ROOT_PASSWORD: ${WP_DB_USER_PASSWORD}

Содержимое директории /docker-entrypoint-initdb.d/ контейнер при старте исполняет, поэтому туда можно положить дамп базы.

Для конфига nginx нужно помнить, что php-fpm обрабатывающий wordpress доступен по адресу blog:9000

Поднимаем всё это командой docker-compose up -d. Несколько полезных команд.

docker-compose logs # Посмотреть логи. Флаг -f работает так же как в tail.
docker-compose ps # Состояние контейнеров описанных в compose файле
docker-compose stop # {имя контейнера} остановить контейнер

На этом считаю чек-лист оконченным. Описанных мер безопасности должно хватить для обеспечения безопасности небольшого личного сервера. Но не стоить успокаивать на этом свою внутреннюю паранойю. Даже если никто не видит суслика, помните — он есть.