Добавить README.md
This commit is contained in:
363
README.md
Normal file
363
README.md
Normal 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!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
После включения, посмотрим что там в логах, я подключался с 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
|
||||||
|
|
||||||
|
Домашние задание выполнено!
|
||||||
Reference in New Issue
Block a user