commit 061acfb3283959627b0a108b451aebfc5dda06d7 Author: alex Date: Thu Dec 4 17:41:24 2025 +0300 Добавить README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..3200b66 --- /dev/null +++ b/README.md @@ -0,0 +1,363 @@ +# Домашнее задание 9 + +## Systemd - создание unit-файла + +Для выполнение задания используется Ubuntu Server 24.04 + + +Я немного отошел от домашнего задания, и решил создать свой скрипт. + +Работа собственного скрипта будет заключаться в следующем: + +1. Скрипт мониторит новые записи в журнале **/var/log/auth.log** +2. Ищет строку с текстом **"Accepted password for"** +3. Если нашел строку, то берет из нее ip адрес по регулярному выражению +4. Сравниваем ip из полученный строки с доверенным ip из конфига **/etc/default/paranoia-shutdown.conf** +5. Если ip не совпадаю, записываем сообщение в лог и **ВЫКЛЮЧАЕМ** сервер! + + +### Создание bash скрипта + +С помощью vi, создаем скрипт в каталоге /opt + +```bash +nimda@ubuntu-1:~$ sudo vi /opt/paranoia-shutdown.sh +``` + +Вставляем туда следующие + +```bash +#!/bin/bash + +allowIp=$2 +pidFile="/var/run/paranoia-shutdown.pid" + +start(){ + + echo $$ > "$pidFile" + + tail -f -n0 /var/log/auth.log | while read string + do + if echo "$string" | grep "Accepted password for" + then + ip=$(echo "$string" | grep -o -E '([0-9]{1,3}[\.]){3}[0-9]{1,3}') + + if [ "$ip" != "$allowIp" ] + then + logger "Alert!!! Alert!!! Alert!!! Login from not confirmed ip $ip. Faster shutdown!" + systemctl poweroff + fi + fi + done +} + +stop(){ + kill $(cat "$pidFile") +} + +case "$1" in + start) + start;; + + stop) + stop;; + + restart) + stop + sleep 3 + start + ;; + *) + + echo $"Usage: $0 {start|stop|restart}" + exit 3 +esac + + + + +``` + + + +Сохраняем скрипт, и даем права на запуск + +```bash +nimda@ubuntu-1:~$ sudo chmod +x /opt/paranoia-shutdown.sh + +``` + + +Создадим конфиг в каталоге /etc/default + +```bash +nimda@ubuntu-1:~$ sudo vi /etc/default/paranoia-shutdown.conf + +``` + +Вставим туда одну переменную с ip который будет доверенным. + +```bash +allowIp=192.168.50.16 + +``` + + +### Создание unit + +В systemctl создаем новый unit командой +```bash +nimda@ubuntu-1:~$ sudo systemctl edit --force --full paranoia-shutdown +``` + +Откроется текстовый редактор, туда вставляем следующие +```bash +[Unit] +Description=Paranoia service shutdown. Shuts down the computer if connected from an untrusted IP address. + +[Service] +Type=simple +EnvironmentFile=/etc/default/paranoia-shutdown.conf +ExecStart=/opt/paranoia-shutdown.sh start $allowIp +ExecStop=/opt/paranoia-shutdown.sh stop +Restart=on-failure + +[Install] +WantedBy=multi-user.target +``` + + +Включаем автозапуск + +```bash +nimda@ubuntu-1:~$ sudo systemctl enable paranoia-shutdown +Created symlink /etc/systemd/system/multi-user.target.wants/paranoia-shutdown.service → /etc/systemd/system/paranoia-shutdown.service. + +``` + + +Стартуем наш сервис, и смотрим его статус + +```bash +nimda@ubuntu-1:~$ sudo systemctl start paranoia-shutdown +nimda@ubuntu-1:~$ sudo systemctl status paranoia-shutdown +● paranoia-shutdown.service - Paranoia service shutdown. Shuts down the computer if connected from an untrusted IP address. + Loaded: loaded (/etc/systemd/system/paranoia-shutdown.service; enabled; preset: enabled) + Active: active (running) since Thu 2025-12-04 10:07:24 UTC; 1s ago + Main PID: 2321 (paranoia-shutdo) + Tasks: 3 (limit: 2202) + Memory: 1008.0K (peak: 1.6M) + CPU: 8ms + CGroup: /system.slice/paranoia-shutdown.service + ├─2321 /bin/bash /opt/paranoia-shutdown.sh start 192.168.50.16 + ├─2324 tail -f -n0 /var/log/auth.log + └─2325 /bin/bash /opt/paranoia-shutdown.sh start 192.168.50.16 + +Dec 04 10:07:24 ubuntu-1 systemd[1]: Started paranoia-shutdown.service - Paranoia service shutdown. Shuts down the computer if connected from an untrusted IP address.. + +``` + + +Наш сервис запущен, теперь если подключиться по ssh с любого ip кроме 192.168.50.16 (мой ПК), то сервер выключится. + +## Проверка + +Сменим IP на ПК и попробуем подключиться. + +На сриншоте видно, что при авторизации сервер выполнил команду shutdown! + +![9_1](images/9_1.png) + +После включения, посмотрим что там в логах, я подключался с ip 192.168.50.66 + +```bash +nimda@ubuntu-1:~$ cat /var/log/syslog | grep 192.168.50.66 | tail -1 +2025-12-04T10:19:30.049414+00:00 ubuntu-1 root: Alert!!! Alert!!! Alert!!! Login from not confirmed ip 192.168.50.66. Faster shutdown! + +``` + + + +Готово, наш сервис успешно выполняет свой функции! + + + + + +### Запуск нескольких экземпляров Nginx + + +Устанавливаем nginx + +```bash +nimda@ubuntu-1:~$ sudo apt install nginx -y +[sudo] password for nimda: +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +The following additional packages will be installed: + nginx-common +Suggested packages: + fcgiwrap nginx-doc ssl-cert +The following NEW packages will be installed: + nginx nginx-common +... + +... + +No containers need to be restarted. + +No user sessions are running outdated binaries. + +No VM guests are running outdated hypervisor (qemu) binaries on this host. +nimda@ubuntu-1:~$ + +``` + + + +Слздаем новый unit **nginx@.service** + +```bash +nimda@ubuntu-1:~$ sudo vi /etc/systemd/system/nginx@.service +``` + +Вставляем туда следующие + +```bash +# Stop dance for nginx +# ======================= +# +# ExecStop sends SIGSTOP (graceful stop) to the nginx process. +# If, after 5s (--retry QUIT/5) nginx is still running, systemd takes control +# and sends SIGTERM (fast shutdown) to the main process. +# After another 5s (TimeoutStopSec=5), and if nginx is alive, systemd sends +# SIGKILL to all the remaining processes in the process group (KillMode=mixed). +# +# nginx signals reference doc: +# http://nginx.org/en/docs/control.html +# +[Unit] +Description=A high performance web server and a reverse proxy server +Documentation=man:nginx(8) +After=network.target nss-lookup.target + +[Service] +Type=forking +PIDFile=/run/nginx-%I.pid +ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx-%I.conf -q -g 'daemon on; master_process on;' +ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx-%I.conf -g 'daemon on; master_process on;' +ExecReload=/usr/sbin/nginx -c /etc/nginx/nginx-%I.conf -g 'daemon on; master_process on;' -s reload +ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx-%I.pid +TimeoutStopSec=5 +KillMode=mixed + +[Install] +WantedBy=multi-user.target + +``` + + +Перечитываем сервисы +```bash +nimda@ubuntu-1:~$ sudo systemctl daemon-reload + +``` + + +Теперь создадим еще 2 файла конфигурации, для отдельный демонов nginx. + +Скопируем текущий конфиг nginx + + +```bash +nimda@ubuntu-1:~$ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx-one.conf +nimda@ubuntu-1:~$ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx-two.conf +``` + + + +С помощь vi отредактируем скопированные файлы. + + + +В файлах nginx-one.conf и nginx-two.conf требуетсянам требует изменить путь до pid файла, чтобы у каждого был свой + + + +```bash +### для nginx-one.conf + +#pid /run/nginx.pid; +pid /run/nginx-one.pid; + + +### для nginx-two.conf +#pid /run/nginx.pid; +pid /run/nginx-two.pid; + +``` + + + +В обоих файлах закоментируем строку **include /etc/nginx/sites-enabled/*;** + +Так же добавим внутрь секции http{} еще одну секцию server{}, и там пропишем разные порты для nginx-one и nginx-two + + + +```bash +### для nginx-one.conf + +http { + server { + listen 9001; + } +} + + + +### для nginx-two.conf +http { + server { + listen 9002; + } +} +``` + + + +Все сохраняем и запускаем все наши службы nginx + + +```bash +nimda@ubuntu-1:~$ sudo systemctl start nginx +nimda@ubuntu-1:~$ sudo systemctl start nginx@one +nimda@ubuntu-1:~$ sudo systemctl start nginx@two + +``` + + +Проверим статусы служб + +```bash +nimda@ubuntu-1:~$ sudo systemctl status nginx nginx@one nginx@two | grep Active + Active: active (running) since Thu 2025-12-04 14:37:25 UTC; 1min 9s ago + Active: active (running) since Thu 2025-12-04 14:37:33 UTC; 1min 1s ago + Active: active (running) since Thu 2025-12-04 14:37:36 UTC; 57s ago + +``` + + +```bash +nimda@ubuntu-1:~$ sudo ss -tnulp | grep nginx +tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=3571,fd=5),("nginx",pid=3570,fd=5),("nginx",pid=3569,fd=5)) +tcp LISTEN 0 511 0.0.0.0:9002 0.0.0.0:* users:(("nginx",pid=3606,fd=5),("nginx",pid=3605,fd=5),("nginx",pid=3603,fd=5)) +tcp LISTEN 0 511 0.0.0.0:9001 0.0.0.0:* users:(("nginx",pid=3589,fd=5),("nginx",pid=3587,fd=5),("nginx",pid=3586,fd=5)) +tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=3571,fd=6),("nginx",pid=3570,fd=6),("nginx",pid=3569,fd=6)) + +``` + +Теперь в системе существую 3 сервиса Nginx + +Домашние задание выполнено! \ No newline at end of file