Добавить README.md

This commit is contained in:
2025-12-04 17:41:24 +03:00
commit 061acfb328

363
README.md Normal file
View File

@@ -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
Домашние задание выполнено!