У меня есть программа, которая должна запускаться от имени пользователя root и должна запускаться внешним процессом для запуска (запускается при завершении процесса сборки). Это не по расписанию, поэтому cron не подходит. Изначально у нас был прямой ssh, но теперь его нужно отключить, так что это не вариант. Есть ли способ удаленно уведомить root о запуске определенной программы на этом компьютере? Не любую программу, а конкретную авторизованную программу?
Я могу войти в систему, использовать sudo в качестве root и запустить его вручную без проблем. Мы пытаемся автоматизировать часть процесса установки после сборки. Это под Redhat 6.4.
Когда вы сделаете это SSH, сделайте его SSH как другого пользователя с ключом и разрешите этому пользователю автоматизации выполнять эту очень конкретную команду от имени root с помощью sudo. Таким образом, вы должны выполнить команду с сервера сборки примерно так: ssh sudo /scripts/myscript
.
Напишите сценарий, который отслеживает именованный канал (или веб-страницу, или сетевой сокет) и выполняет ваш код в ответ.
Вы можете использовать что-то вроде func для удаленного выполнения, но вы также можете использовать систему очередей, такую как бобовый стебель или функциональность PubSub в Redis и локальный демон на стороне назначения, который опрашивает очередь и выполняет команды на ее основе.
Вы спрашиваете способ выполнить задачу, для которой ssh в большей или меньшей степени является инструментом, который использовали бы все, а затем говорите, что это не должно выполняться с использованием ssh. Это означает, что вы, вероятно, получите худшее решение.
Если у вас есть доступ к ssh, но вы просто не можете запустить корневую оболочку через ssh, это все равно можно сделать. Фактически, правильным решением может быть отсутствие доступа к корневой оболочке.
Доступ к ssh может быть как root, но не с использованием пароля, а только с помощью ключа в ~root/.ssh/authorized_keys
. Такой ключ может быть ограничен запуском только определенной команды, например, у вас может быть такая строка:
command="ls /tmp",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa ...
Если это тоже неприемлемо, вы можете войти по ssh как другой пользователь и запустить исполняемый файл suid root. Однако написание исполняемого файла suid требует большой осторожности, поэтому я бы не рекомендовал его. Он может быть расположен в каталоге, доступном только определенной группе, чтобы ограничить круг лиц, которые могут его запускать.
Вы также можете создать список демонов для порта, а затем запустить команду после доступа к этому порту. Это потенциально открывает возможности для многих видов атак. Самый безопасный демон - это тот, который никогда ничего не читает из сетевого сокета и в некоторых случаях может быть подходящим. Но это также затрудняет любую аутентификацию.
В итоге, вам, вероятно, лучше использовать стандартные инструменты, а ssh может быть просто стандартным инструментом, который вам нужен.
Я работал над чем-то очень похожим, но немного более отточенным, в результате чего доступ предоставляется через Samba, и я уведомляю, используется для запуска выполнения.
Я документирую это в своем блоге