Рубрики
Uncategorized

Автоматизированный наблюдатель за пакетами безопасности сервера на PHP

Привет 👋 , Я вернулся, и в этой новой статье мы увидим, как настроить простой, но полезный скрипт для просмотра… Помечен как vps, php, devops, администратор.

Привет 👋 ,

Я вернулся, и в этой новой статье мы увидим, как настроить простой, но полезный скрипт, который следит за (виртуальным частным) сервером, уведомляя вас (по электронной почте) о том, какие пакеты безопасности доступны для установки.

Также, в качестве бонуса, скрипт будет включать в себя функцию отслеживания скорости использования диска и необходимости перезагрузки сервера после любого обновления ядра. 🙌 Это очень полезный способ автоматизации мониторинга сервера, который работает как шарм (по крайней мере, для меня))!

Все приведенные здесь примеры кода будут написаны на PHP , однако вы должны иметь возможность реализовать его с помощью любого другого серверного языка по вашему выбору. Так что не стесняйтесь использовать любой другой язык, на котором вам будет удобнее. Если вы решите использовать другой, дайте мне знать и я буду более чем счастлив также поделиться этим здесь. 🚀

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

. . .

Ух ты, рад видеть, что ты предпочитаешь продолжать это читать! 😇

Отлично! Итак, давайте перейдем к самой смешной части… код! 😉

Весь скрипт будет написан в одном файле, давайте создадим PHP-файл (я называю его Весь скрипт будет написан в одном файле, давайте создадим PHP-файл (я называю его , но вы называете это так, как хотите) и добавляете наши первые строки:

Возможно, мы захотим повторно использовать этот файл на нескольких серверах, поэтому давайте добавим некоторые переменные для хранения настроек, которые можно легко изменить (или автоматически заменить в рабочем процессе CI/CD) при развертывании этого на наших серверах.

# Who is sending the notification
$sender = 'admin@domain.tld';

# To who the notification will be sent.
# Wanna notify more people? Simply put multiple addresses
# separated by commas (,).
$notify = 'you@domain.tld';

# Give a name to identify your server. Usually the hostname.
$server = 'myserver.com'; 

# What mounted disk should be checked.
# Use '/dev/disk1s1' when on macOS.
$mountedDisk = '/dev/sda'; 

# What's the maximum usage before sending a notification
# for disk over-usage (don't go too low or too high here).
$diskUsageBoundary = 80; # %

Не забудьте заменить содержимое этих переменных (например, admin@domain.tld , you@domain.tld , и myserver.com ) с ценностями, которые имеют смысл для вас, верно? 😉

Далее давайте проверим, нуждается ли наш сервер в перезагрузке. Дистрибутивы Linux создают файл, указывающий, когда системе требуется перезагрузка. Мы можем проверить наличие этого файла, чтобы определить, нужен ли он вашей машине.

// If this file exist, a reboot is required
$reboot = file_exists('/var/run/reboot-required');

Теперь давайте дважды проверим, не заканчивается ли на вашем сервере место на диске. Для этого нам нужно будет выполнить команду df и обработайте его возврат.

Мы будем искать конкретный шаблон в результатах, который будет содержать показатель использования диска, и он будет отправлен вам по электронной почте всегда, когда значение выходит за пределы определенной вами границы.

// Gather info about disk usage
$res = exec("df -h | grep {$mountedDisk}");
$res = preg_replace('/\s{2,}/', ' ', $res);

$intUsedRate = 0;
$usedRate    = null;

if (!empty($res) && $res) {
    list($mountPoint, $totalSize, $usedSpace, $freeSpace, $usedRate) = explode(' ', $res);
    $intUsedRate = (int) preg_replace('/[^0-9]/i', '', $usedRate);
}

// Clear used rate when not passed the boundary
if ($diskUsageBoundary > $intUsedRate) {
    $usedRate = null;
}

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

Аналогично тому, что происходит, когда требуется перезагрузка, дистрибутивы Linux имеют специальный файл в системе, который обновляется с краткой информацией о том, какие пакеты необходимо установить в системе, включая пакеты безопасности.

Подход здесь будет заключаться в том, чтобы следить за этим файлом, чтобы выяснить, что мы хотим знать.

// Gather info about available updates
$matches = [];
$note    = @file_get_contents('/var/lib/update-notifier/updates-available');
$note    = preg_replace("/\n/", " ", $note);

Отлично! Имея всю необходимую нам информацию на месте, давайте убедимся, что нашему сценарию действительно нужно отправить нам электронное письмо…

// Set a flag to control whether to send or not send a notification
$shouldNotify = (bool) (preg_match("/\d+\supdates?/i", $note, $matches) || !empty($usedRate) || $reboot);

Классно! Наш сценарий почти готов.

Все, что нам нужно сделать сейчас, это проверить, следует ли отправлять уведомление или нет, и выполнить его для завершения. Вот, держи…

// Notify when needed
if ($shouldNotify) {
    $headers = "From: {$sender} \n";

    $body = [
        "This is an automated message. \n",
    ];

    $count = (int) preg_replace("/[^0-9]/i", '', $matches[0]);

    if ($count) {
        $body[] = "{$count} pending security updates has been found.";
    }

    if (!empty($usedRate)) {
        $body[] = "{$mountedDisk} is {$usedRate} used. Needs an urgent review.";
        $body[] = "As general it is like: ";

        exec("df -h", $out);
        $body[] = "\t" . implode("\n\t", $out);
    }

    if ($reboot) {
        $body[] = "** A reboot is required. **";
    }

    $body[] = "Please review the '{$server}' server ASAP.";

    // echo implode("\n", $body) . "\n";
    mail($notify, "Server '{$server}' Pending Review", implode("\n", $body) . "\n", $headers, "-f {$sender}");
}

И еще одна строчка для связи, которую мы сделали: 😅

echo "Daily updates review complete. \n";

Если вы предпочитаете, вы можете получить файл здесь 👈

Бууууут, держись. Работа еще не закончена!

. . .

Нам нужно будет правильно определить права доступа к файлам и запланировать CRON для регулярного запуска этого файла (скажем, один раз в день?)…

Загрузите файл в каталог по вашему выбору на вашем сервере (помните, что он не обязательно должен быть доступен из Интернета, верно?).

Как только вы его загрузите, нам нужно будет передать его в собственность пользователю root , а также сообщить системе, что наш текущий (непривилегированный пользователь) может его запустить.

Итак, из окна терминала (подключенного к вашему серверу через SSH) выполните следующие команды:

# This will change the ownership
$ sudo chown root:root /path/to/file/sec-watcher.php

Затем откройте конфигурационный файл sudo (с помощью visudo , пожалуйста) и добавьте инструкцию, позволяющую нашему пользователю вызывать наш файл без необходимости ввода пароля…

$ sudo visudo

Когда файл visudo открыт, добавьте эту строку:

YOUR-USER-HERE   ALL=(ALL) NOPASSWD: /home/YOUR-USER-HERE/path/to/file/sec-watcher.php

Не забудьте заменить ВАШ-ПОЛЬЗОВАТЕЛЬ-ЗДЕСЬ и /путь/к/файлу/ с пользователем, к которому вы привыкли подключаться к вашему серверу, и фактическим путем к выбранному вами каталогу.

Окончательно… да, действительно 😅 давайте закончим, запланировав задание CRON, которое будет регулярно вызывать наш файл. Выполните следующую команду в окне вашего терминала (который подключен к вашему серверу через SSH):

$ crontab -e

И добавьте следующую строку …

30 6 * * *  PHP -q /home/YOUR-USER-HERE/path/to/file/sec-watcher.php >/dev/null 2>&1

Сохраните файл с помощью CTRL + X и введите Y .

Не забудьте заменить ВАШ-ПОЛЬЗОВАТЕЛЬ-ЗДЕСЬ и /путь/к/файлу/ с пользователем, к которому вы привыкли подключаться к вашему серверу, и фактическим путем к выбранному вами каталогу.

Вот и все! 😎 Теперь вам просто нужно приветствовать уведомления по электронной почте, приходящие на ваш почтовый ящик, всегда, когда на вашем сервере есть пакет, ожидающий обновления, или когда его диск приближается к заполнению!

Я надеюсь, что это может вам помочь!

Счастливого кодирования. Рок-ракета

Оригинал: “https://dev.to/rogeriotaques/automated-server-security-package-watcher-in-php-5dm6”