Вопрос или проблема
Я читаю, что использование cron для запланированных и повторяющихся задач может представлять собой риск безопасности. Более того, некоторые другие системы отказываются от него…
Теперь в минимизированной серверной версии UBUNTU 24.04.1 LTS он не включен по умолчанию. Я мог бы установить его, проигнорировав предупреждение о безопасности, может быть, но хотел бы узнать, какие есть альтернативы? Допустим, как я могу запустить bash-скрипт в точно заданные часы каждый день?
Вы можете использовать таймеры systemd. Я не знаю много о безопасности серверов, но таймеры systemd решают в основном ту же проблему, что и cron, хотя работают совершенно по-другому.
Смотрите Arch Wiki для получения дополнительной информации.
Также есть несколько реализаций cron, таких как anacron или cronie. Возможно, одна из них более безопасна, чем другая?
Решением будет использование таймеров SystemD и комбинаций сервисов.
Следующее – пример сервиса SystemD и таймера SystemD:
custom-process.timer
(размещен в /etc/systemd/system
):
[Unit]
Description=Таймер моего пользовательского процесса
Requires=custom-process.service
[Timer]
Unit=custom-process.service
OnCalendar=*-*-* 01:00:00
[Install]
WantedBy=timers.target
custom-process.service
(размещен в /etc/systemd/system
):
[Unit]
Description=Мой пользовательский процесс
Wants=custom-process.timer
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 custom-script.py
WorkingDirectory=/home/user/custom_script/
User=user
Group=user
NoNewPrivileges=true
UMask=0177
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Файл определения сервиса пользовательского процесса сообщает SystemD, как запускать скрипт и под каким пользователем с какими привилегиями и в какой рабочей директории выполнять cd
во время выполнения. Определение таймера определяет, на каком календарном времени/основе (как это делает скрипт cron!) выполнять сервис. В приведенном выше примере это выполняет мой пользовательский скрипт один раз в день в 1:00 ночи. Пользовательский процесс – это пользовательский python-скрипт, который находится в /home/user/custom_script
(что является рабочей директории, настроенной для понимания ‘относительного’ пути к custom-script.py, но также для того, чтобы все другие локальные python-файлы, на которые ссылается мой скрипт, работали)
После того как вы определили правильный объект сервиса и таймера, вам нужно перезагрузить определения SystemD с помощью sudo systemctl daemon-reload
.
Чтобы протестировать сервис и убедиться, что определение работает, выполните sudo systemctl start custom-process.service
Чтобы протестировать таймер, используйте sudo systemctl --now enable custom-process.timer
. Это запустит автоматический таймер при загрузке и выполнит таймер в следующее определенное время запуска в соответствии с определением.
Подробности о файле сервиса и его различных параметрах можно найти в документации SystemD на юнитах файлов сервиса.
Подробности о файле таймера и его параметрах можно найти в документации SystemD на юнитах файлов таймера.
Ответ или решение
Альтернативы для Cron: Использование Systemd таймеров на сервере Ubuntu 24.04.1 LTS
Вопрос о безопасности использования Cron для планирования повторяющихся задач обостряется с учетом особенностей современных операционных систем, таких как Ubuntu 24.04.1 LTS. В связи с изменениями в архитектуре систем и требованиями безопасности, многие IT-специалисты ищут более современные решения, которые могут обеспечить аналогичную функциональность, не рискуя безопасностью.
Почему Systemd таймеры?
Systemd – это система инициализации и управления службами, которая в последние годы стала стандартом для большинства дистрибутивов Linux, включая Ubuntu. Таймеры Systemd предлагают несколько преимуществ по сравнению с традиционным Cron:
-
Безопасность: Таймеры могут быть настроены с учетом современных требований безопасности. Вы можете указать пользователя и группу, от имени которых будет выполняться задача, а также задать привилегии, что значительно снижает риски выполнения задач с высокими правами доступа.
-
Гибкость: Systemd позволят создавать более сложные сценарии, такие как зависимость от других служб, обработку событий и настройки запусков, привязанных к состояниям системы.
-
Подробное логирование: Каждое выполнение задачи фиксируется в журнале Systemd, что облегчает отладку и анализ.
Настройка Systemd таймеров
Для настройки задач с использованием Systemd вам необходимо создать два файла: один для службы и один для таймера. Рассмотрим пример, как это можно сделать для запуска bash-скрипта в одно и то же время каждый день.
1. Создание файла службы
Создайте файл службы, например, custom-process.service
, в каталоге /etc/systemd/system/
:
sudo nano /etc/systemd/system/custom-process.service
Вставьте следующий код:
[Unit]
Description=My Custom Process
After=network-online.target
[Service]
Type=oneshot
ExecStart=/bin/bash /путь/к/вашему/script.sh
User=ваш_пользователь
Group=ваша_группа
NoNewPrivileges=true
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
2. Создание файла таймера
Теперь создайте файл таймера custom-process.timer
в том же каталоге:
sudo nano /etc/systemd/system/custom-process.timer
Добавьте следующий контент:
[Unit]
Description=My Custom Process Timer
[Timer]
Unit=custom-process.service
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
В этом примере задача будет запускаться ежедневно. Можно также использовать более сложные задания с помощью форматирования OnCalendar
, чтобы настроить выполнение в конкретное время.
3. Активация таймера
После создания файлов необходимо выполнить несколько команд, чтобы активировать таймер:
sudo systemctl daemon-reload
sudo systemctl start custom-process.service
sudo systemctl enable custom-process.timer
Для проверки статуса таймера можно использовать:
sudo systemctl list-timers
Заключение
Использование Systemd таймеров на сервере Ubuntu 24.04.1 LTS представляет собой современное решение для планирования задач. Это не только повышает безопасность, но и внедряет гибкие возможности управления и учета выполнения задач. При переходе от Cron к Systemd необходимо учитывать такие аспекты, как правильное указание права доступа, логирование и организация зависимостей. Всё это способствует созданию устойчивой и защищённой среды выполнения ресурсов сервера.
Если вас интересует более глубокая информация по настройке таймеров и обслуживанию системных служб, рекомендуем ознакомиться с документацией по Systemd.