Привет, Хабр!
У многих системных администраторов наверняка бывали случаи, когда доступ к серверу приходилось предоставлять неопытному или непроверенному человеку. Соблюдая меры предосторожности вполне можно оградить себя от проблем, но что делать, если человек вообще не знаком с консолью?
«Категорически отказать!» — скажете вы и будете правы. Но, что делать, если этот человек — ваш босс?
С чего все началось
Доступ к панели управления сайтом компании, на которую я работаю, ограничен не только по паролю, но и по 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:--------------------------::
Получаем:
Теперь опишем подменю 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-скрипт, который и будет открывать доступ.
Выглядеть это будет так:
А вот и сам шелл-скрипт 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
Результат
Вот как выглядит то, что мы только что сделали:
Таким образом, любой человек, который умеет вводить пароль, пользоваться курсорными клавишами и кнопкой Enter, может вполне безболезненно выполнять некоторые действия на сервере.
Будь то: перезапуск сервисов, запуск скриптов, генерирующих контент, просмотр логов, редактирование файлов и т.д. и т.п.
Главное: не забудьте обезопасить себя логами и необходимыми ограничениями в sudo.
P.S. нюансы настройки sudo, создания пользователей и т.п. не описывал, чтобы не раздувать статью.
Документации и описания на эту тему в интернете достаточно, в отличие от описания Pdmenu.
Upd: как подсказал уважаемый shadowalone, скачать и установить Pdmenu можно тут
Upd2: как подсказал уважаемый lorc, когда пишете shell-скрипты для pdmenu (и не только), обязательно делайте проверку того, что вводит пользователь