2

Я хочу иметь возможность удаленно отключить свой сервер, нажав кнопку на веб-странице. На сервере работает 64-битная Ubuntu 14.04.1 и веб-приложение на python. Я еще не решил что, но это будет либо Apache, либо Gunicorn.

Мне нужно иметь возможность отключить сервер удаленно, поскольку у меня не всегда будет физический доступ к машине. Я бы предпочел не входить в систему через ssh и выполнять для этого команду poweroff, поэтому я хочу, чтобы в браузере была какая-то кнопка для запуска выключения.

Мои идеи что-то вроде

  • создайте программу выключения, сделайте владельца root и установите бит закрепления. Веб-приложение Python может называть это
  • каким-то образом, используя файл sudoers
  • веб-приложение записывает в файл и отслеживает его (inotify) для отправки команды выключения

Каковы лучшие практики или, по крайней мере, самые безопасные способы, которыми я могу это сделать?

Конечно, веб-интерфейс будет защищен, а также будет механизм защиты от случайного нажатия.

1 ответ1

7

Там нет причин писать сценарий для этого, вы можете сделать это через Python. В любом случае вы не можете установить бит SUID для скриптов в Linux.

Самый простой способ - запустить команду shutdown из скрипта Python, а затем дать пользователю веб-сервера право на его запуск.

  1. Предоставьте пользователю, на котором работает ваш веб-сервер, право на shutdown . Запустите visudo и добавьте эту строку в файл:

    www-data ALL=NOPASSWD:/sbin/shutdown
    

    Я предполагаю, что ваш сервер работает как пользовательские www-data , если нет, измените соответствующим образом.

  2. Напишите небольшой скрипт, который запускает команду shutdown и сохраните его в одном из ваших каталогов cgi-bin :

    #!/usr/bin/env python
    import os;
    os.system("sudo shutdown -h now");
    
  3. Сделайте скрипт исполняемым с

    sudo chmod 755 /var/www/yourpage/cgi-bin/shutdown.py
    
  4. Создайте веб-страницу, которая даст вам кнопку для запуска этого скрипта:

    <HTML>
     <BODY>
        <FORM method="post" action="cgi-bin/shutdown.py"> 
            <INPUT TYPE="submit" VALUE="Submit" NAME="Submit"> 
        </FORM>
     </BODY>
    </HTML>
    

Вот и все, теперь у вас есть кнопка, которая отключит ваш сервер.


Записка о безопасности

Я понятия не имею, почему вы хотите настроить веб-интерфейс для этого. Это, очевидно, очень небезопасно. Любой, кто имеет доступ к этой странице, сможет выключить компьютер. Тем не менее, нет никакого способа обойти это, что бы вы ни делали, у вас будет веб-страница, которая может выключить ваш компьютер, а это значит, что любой, кто может видеть страницу, может это сделать. Так что будьте осторожны.

Гораздо лучшая альтернатива - запустить что-то подобное с другой машины:

ssh root@server shutdown -h now

Это одна команда, и, если вы работаете в системе Linux, вы даже можете создать для нее псевдоним из одного слова. Если вы используете bash, просто добавьте эту строку в ваш ~/.bashrc:

alias shtdn='ssh root@server shutdown -h now'

Таким образом, все, что вам нужно сделать, это запустить shtdn и вы сможете безопасно и надежно завершить работу удаленного компьютера.


Если вы действительно настаиваете на возможности сделать это через веб-интерфейс, я предлагаю вам попробовать что-то вроде webmin. Это полнофункциональный веб-сервер для администрирования серверов. Это бесплатный и с открытым исходным кодом, очень прост в установке и предлагает интуитивно понятный графический интерфейс для различных аспектов вашего компьютера. Вы можете использовать его для настройки общих ресурсов SAMBA, веб-серверов, баз данных и т.д. Вы также можете использовать его для выключения вашей системы.

В системах на основе Debian вы можете установить его, просто запустив

sudo apt-get install webmin

После этого перейдите по http://localhost:10000 и войдите в систему как пользователь root. Возможно, вам придется сначала активировать учетную запись root, запустив sudo passwd . Затем перейдите в Система -> Загрузка и завершение работы, прокрутите страницу до конца и нажмите кнопку "Завершение работы":

Это очень легко настроить и, вероятно, будет более безопасным, чем любое специальное решение, которое вы внедряете.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .