Привет 👋 ,
Я вернулся, и в этой новой статье мы увидим, как настроить простой, но полезный скрипт, который следит за (виртуальным частным) сервером, уведомляя вас (по электронной почте) о том, какие пакеты безопасности доступны для установки.
Также, в качестве бонуса, скрипт будет включать в себя функцию отслеживания скорости использования диска и необходимости перезагрузки сервера после любого обновления ядра. 🙌 Это очень полезный способ автоматизации мониторинга сервера, который работает как шарм (по крайней мере, для меня))!
Все приведенные здесь примеры кода будут написаны на 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”