Домашнее задание 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

nimda@ubuntu-1:~$ sudo vi /opt/paranoia-shutdown.sh

Вставляем туда следующие

#!/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




Сохраняем скрипт, и даем права на запуск

nimda@ubuntu-1:~$ sudo chmod +x /opt/paranoia-shutdown.sh

Создадим конфиг в каталоге /etc/default

nimda@ubuntu-1:~$ sudo vi /etc/default/paranoia-shutdown.conf

Вставим туда одну переменную с ip который будет доверенным.

allowIp=192.168.50.16

Создание unit

В systemctl создаем новый unit командой

nimda@ubuntu-1:~$ sudo systemctl edit --force --full paranoia-shutdown

Откроется текстовый редактор, туда вставляем следующие

[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

Включаем автозапуск

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.

Стартуем наш сервис, и смотрим его статус

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

После включения, посмотрим что там в логах, я подключался с ip 192.168.50.66

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

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

nimda@ubuntu-1:~$ sudo vi /etc/systemd/system/nginx@.service

Вставляем туда следующие

# 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

Перечитываем сервисы

nimda@ubuntu-1:~$ sudo systemctl daemon-reload

Теперь создадим еще 2 файла конфигурации, для отдельный демонов nginx.

Скопируем текущий конфиг nginx

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 файла, чтобы у каждого был свой

###  для 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

###  для nginx-one.conf

http {
        server {
                listen 9001;
        }
}



###  для nginx-two.conf
http {
        server {
                listen 9002;
        }
}

Все сохраняем и запускаем все наши службы nginx

nimda@ubuntu-1:~$ sudo systemctl start nginx
nimda@ubuntu-1:~$ sudo systemctl start nginx@one
nimda@ubuntu-1:~$ sudo systemctl start nginx@two

Проверим статусы служб

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

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

Домашние задание выполнено!

Description
No description provided
Readme 785 KiB
Languages
Shell 100%