Pull to refresh

Pdmenu или как не дать новичку ошибиться

Reading time 3 min
Views 1.8K
image

Привет, Хабр!

У многих системных администраторов наверняка бывали случаи, когда доступ к серверу приходилось предоставлять неопытному или непроверенному человеку. Соблюдая меры предосторожности вполне можно оградить себя от проблем, но что делать, если человек вообще не знаком с консолью?

«Категорически отказать!» — скажете вы и будете правы. Но, что делать, если этот человек — ваш босс?

С чего все началось


Доступ к панели управления сайтом компании, на которую я работаю, ограничен не только по паролю, но и по IP. С тех пор, как начальник стал активно путешествовать, потребовалось так же активно обновлять IP-адреса в access-list'е. Настолько активно, что звонки и просьбы на эту тему надоели как ему, так и мне.

Так как человек абсолютно не знаком с unix-системами и консольным управлением, нужно было найти максимально простое и безопасное решение. И оно нашлось: pdmenu!

К делу


Дабы не утомлять читателя спецификой работы конкретно взятой системы, для демонстрации возможностей pdmenu возьмем какую-нибудь более-менее распространенную задачу. Допустим, доступ к FTP серверу «снаружи» закрыт файрволлом для всех, кроме угодных нам IP.

Задача: дать совершенно неопытному человеку возможность открывать FTP доступ для новых адресов.

В нашем случае на сервере установлена CentOS, но и на других unix-системах проблем с pdmenu быть не должно. Поиск и установка занимает считанные минуты, поэтому перейдем сразу к настройке.

Подготовка системы


В операционной системе создаем отдельного пользователя, через sudo разрешаем ему запускать только iptables и в ~/.bash_profile добавляем следующее:

# запишем в лог кто и когда заходил:
ip=`set | /bin/grep SSH_CLIENT | /bin/cut -d\' -f2 | /bin/awk '{print $1}' | /bin/awk '/[0-9]/ {print}'`
date=`/bin/date +'%d.%m.%G %H:%M:%S'`
echo "${date} | ${ip} | ---Logged into the shell menu---" >> /var/log/pdmenu.log
#запускаем pdmenu
/usr/local/pdmenu/bin/pdmenu
exit
#выходим из сервера, если вышли из pdmenu
logout


Таким образом пользователю нужно научиться в putty (или любом другом SSH-клиенте) открывать соединение и вводить пароль. Дальше запускается удобное и понятное меню.

Теперь pdmenu


Вся конфигурация хранится в файле pdmenurc. Он у меня расположился тут: /usr/local/pdmenu/etc/pdmenurc

Создаем главное меню, для этого в pdmenurc запишем следующее:

menu:main:Main menu:
show:--------------------------::
nop
show:System tools::system
nop
show:::
exit:Exit
show:--------------------------::

Получаем:
image

Теперь опишем подменю System tools. Для этого в pdmenurc добавим:

menu:system:System tools
show:-------------------------------::
nop
exec:Open FTP access:pause:ip=`set | /bin/grep SSH_CLIENT | /bin/cut -d\' -f2 | /bin/awk '{print $1}' | /bin/awk '/[0-9]/ {print}'`; date=`/bin/date +'%d.%m.%G %H:%M:%S'`; echo "${date} | ${ip} | Open FTP access" >> /var/log/pdmenu.log && /bin/sh /home/shellmenu/bin/openftp.sh
nop
exit:Main menu
show:-------------------------------::

В четвертой строке все, что начинается с "ip=" вплоть до "&&" — запись в лог. Если запись прошла удачно, то запускается shell-скрипт, который и будет открывать доступ.

Выглядеть это будет так:
image

А вот и сам шелл-скрипт openftp.sh который выполняет всю грязную работу:

#!/bin/sh
printf '\n---------------------\n\033[1;32m Open FTP connection\033[0m\n---------------------\n\n'
printf 'Enter the IP address you wish to provide FTP access: \033[1;32m'
read ip
if [ $ip ]
then
printf '\n\033[0mOk, you are going to allow FTP connections to the following IP: \033[1;31m%s\033[0m' ${ip}
printf '\n\nAre you sure? [y/n] \033[1;32m'
read wish
if [ $wish -a $wish == y ]
then
/usr/bin/sudo /sbin/iptables -I INPUT -s ${ip} -p tcp -m tcp --dport 20 -j ACCEPT
/usr/bin/sudo /sbin/iptables -I INPUT -s ${ip} -p tcp -m tcp --dport 21 -j ACCEPT
/etc/init.d/iptables save
printf '\n\033[0m--------------------------------------------'
printf '\n The FTP access to \033[1;32m'
/bin/echo -n ${ip}
printf '\033[0m has been \033[1;31mgranted\033[0m';
printf '\033[0m\n--------------------------------------------\n\n'
else
printf '\033[0m\nExiting...\n\n'
fi
else
printf '\033[0m\nExiting...\n\n'
fi


Результат


Вот как выглядит то, что мы только что сделали:

image

Таким образом, любой человек, который умеет вводить пароль, пользоваться курсорными клавишами и кнопкой Enter, может вполне безболезненно выполнять некоторые действия на сервере.
Будь то: перезапуск сервисов, запуск скриптов, генерирующих контент, просмотр логов, редактирование файлов и т.д. и т.п.

Главное: не забудьте обезопасить себя логами и необходимыми ограничениями в sudo.

P.S. нюансы настройки sudo, создания пользователей и т.п. не описывал, чтобы не раздувать статью.
Документации и описания на эту тему в интернете достаточно, в отличие от описания Pdmenu.

Upd: как подсказал уважаемый shadowalone, скачать и установить Pdmenu можно тут
Upd2: как подсказал уважаемый lorc, когда пишете shell-скрипты для pdmenu (и не только), обязательно делайте проверку того, что вводит пользователь
Tags:
Hubs:
+68
Comments 33
Comments Comments 33

Articles