вторник, 22 марта 2022 г.

Запрещаем ребутать сервер Linux даже руту

shutdown command

 

Неожиданно несколько раз выстрелила проблема - коллеги или сам можем ребутнуть или выключить продовый сервер. При этом яркое и цветное приветствие не помогает.


Сходу я не нашел красивых готовых решений. Полазил в сторону polkit, но это не совсем то:

Polkit (прежнее название: PolicyKit) — библиотека для UNIX-подобных операционных систем. API библиотеки используется для предоставления непривилегированным процессам возможности выполнения действий, требующих прав администратора. Использование Polkit противопоставляется использованию таких систем, как sudo, но не наделяет процесс пользователя правами администратора, а позволяет точно контролировать, что разрешено, а что запрещено.

 

Пришла такая идея: заменить бинарники poweroff, shutdown, reboot на свои файлы, при этом сохранив возможность запуска нужных команд.

 

Набросал shell-ник:

 #!/bin/bash

echo -e "\033[41m\033[30m ------------------------------------------------------------ \033[0m"
echo -e "\033[41m\033[30m |                                                          | \033[0m"

echo -e "\033[41m\033[30m | !!! YOU CAN TRY REBOOT OR SHUTDOWN PRODUCTUON SERVER !!! | \033[0m"

echo -e "\033[41m\033[30m |                                                          | \033[0m"

echo -e "\033[41m\033[30m ------------------------------------------------------------ \033[0m"


user=$SUDO_USER
hostname=hostname
CHAT_ID="*******************"
action=realpath $0


echo 'Send alarm on flock chat'
MSG_alarm="User <b>${user}</b> try to execute ${action} on server <b>${hostname}</b>!"
MSG_wrong="User <b>${user}</b> can't confirmation execute ${action} on server <b>${hostname}</b>!"
MSG_info="User <b>${user}</b> confirmation execute ${action} on server <b>${hostname}</b>!"


curl "${MSG_alarm}"

echo
echo


read -p 'If you really want to reboot this server, enter his hostname for confirmation: ' confirmation
echo $confirmation


if [ "$confirmation" = "$hostname" ]; then

echo "Hostname are equal. Reboot"
curl {MSG_info}
### reboot
/usr/sbin/prod_reboot
####
    
  else

echo "Hostname are not equal. Server can not be rebooted"
curl {MSG_wrong}

  fi

 


Кладем его в /usr/sbin, родную команду reboot (или poweroff / shutdown) переименуем, например

mv /usr/sbin/reboot /usr/sbin/prod_reboot


Скрипт делаем исполняемым через chmod +x 

Из в меру важного:

1. CHAT_ID - это ID для отстрела в чатик информации. Не знаю какой у вас чат и как это реализовано, поэтому убрал все лишнее.


Логика работы такая - при запуске команды reboot, запустится скрипт, напишет кислотными цветами в консоль о попытке ребутнуть сервер, отошлет в чатик алярм и попросит ввести хостнейм сервеера, чтобы точно ребутнуть. Если хостнэйм не совпадет - ребута не будет. Об обоих действиях в чатик придет уведомление. 



Комментариев нет:

Отправить комментарий