Как безопасно передавать переменные в сценарии с поддержкой root?

Этот вопрос является полностью общим и не только применимым к моей ситуации, но … У меня есть небольшое приложение busybox, где я хочу, чтобы пользователь, не являющийся пользователем root, мог выполнить конкретный скрипт с помощью root priviliges. Например, что-то вроде этого маленького скрипта для включения DHCP, где единственная переменная ( $1 ) для отправки в cmdline (!!) – это то, что имя хоста для отправки:

 #!/bin/bash udhcpc -b -i eth0 -h $1 

Для запуска udhcpc требуется root-доступ, поэтому для этого я планирую изменить /etc/sudoers чтобы он содержал эту строку:

 joe ALL = NOPASSWD: /path/to/enable_dhcp.sh 

который должен позволить «joe» легко запустить этот скрипт с правами root, просто выполнив:

 sudo /path/to/enable_dhcp.sh 

и не запрашивается пароль (это то, что я хочу, так как я хочу, чтобы joe мог сценарировать это).

Теперь .. Я знаю (или, по крайней мере, думаю, что знаю), что использование $1 в скрипте, который можно легко запускать с привилегиями root, является УЖАСНОЙ идеей, поскольку вы можете вставлять все, что хотите.

Итак … Каков наилучший способ справиться с этим? Как разрешить joe делать то, что я хочу, с привилегиями root, разрешить ему передавать переменную (или эффективно делать это с переменной окружения), не будучи широко открытыми для инъекционных атак?

2 Solutions collect form web for “Как безопасно передавать переменные в сценарии с поддержкой root?”

Запуск сценариев оболочки в sudo безопасен при условии, что sudo настроен на сброс среды . И наоборот, если sudo не перезагружает среду, тогда запуск сценария оболочки небезопасен, даже если ваш скрипт не использует его параметры (см. « Разрешить setuid для сценариев оболочки» ). Убедитесь, что у вас есть значения по Defaults env_reset в /etc/sudoers или этот параметр является стандартным для времени компиляции ( sudo sudo -V | grep env должен включать в себя Reset the environment to a default set of variables ).

Нет особой опасности при использовании параметров скрипта. $1 – это строка, все, что вам нужно, чтобы убедиться, что вы используете ее как строку. (Например, не делайте eval "$1" .) Очевидно, что здесь особенно важно не делать предположений о содержимом переменной и ставить двойные кавычки вокруг всех подстановок переменных (т. Е. Писать "$1" , а не $1 ) , Обратите внимание, что включение двойных кавычек вокруг переменных подстановок не является специфичным для скриптов, работающих с привилегиями, это то, что вы должны делать все время.

Возможно, вам захочется еще раз проверить параметр, в зависимости от того, что udhcpc делает с чем-то, что не похоже на имя хоста. Например, это выполнит первую синтаксическую проверку:

 #!/bin/sh case "$1" in *[!:-.0-9A-Za-z]*|-*) echo 1>&2 "Badly formed host name!"; exit 3;; esac udhcpc -b -i eth0 -h "$1" 

Вы должны сопоставить прошедший ввод с известным хорошим шаблоном.

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

 if [[ "$1" =~ ^[0-9]?[0-9]?[0-9].[0-9]?[0-9]?[0-9].[0-9]?[0-9]?[0-9]$ ]] then udhcpc -b -i eth0 -h "$1" else echo "Don't mess with me pork chop." fi 

Обратите внимание, что regexp не был протестирован, вы несете ответственность за то, чтобы ваше регулярное выражение не позволяло ничего опасного.

  • `root` vs` sudo` от ulimit POV
  • Выполнить скрипт оболочки из php, как пользователь root?
  • Не удается использовать sudo при входе через ssh
  • Как предотвратить использование оболочки звонящего в sudo
  • Замена команды: / dev / stdin: Отказано в разрешении
  • Написать в файл без перенаправления?
  • несоответствия mdadm при программном запуске
  • Разрешить определенным гостям выполнять определенные команды
  • Запустите sudo в качестве другого пользователя без полномочий root и сохраните его в домашнем каталоге этого пользователя
  • Нет драйверов после изменения владельца usr Linux Mint
  • sudo и sssd не работают с группами пользователей
  • rsync как другой пользователь
  • Linux и Unix - лучшая ОС в мире.