Назад | Перейти на главную страницу

Противоположность su: запустить команду без привилегий root

Я пишу сценарий оболочки, в котором для большинства команд не требуются привилегии root. Скрипт должен запускаться администратором. Но я хотел бы иметь возможность «su» для обычной учетной записи пользователя для тех частей скриптов, которые не требуют привилегий root. Это минимизирует количество операций, выполняемых с привилегиями root, и повысит безопасность.

Есть ли для этого команда linux?

Я знаю, что можно использовать su для любой учетной записи пользователя, но я не хочу полагаться на гипотезу о том, что на машине существует конкретное имя пользователя.

Я подумал о создании временной учетной записи на время сценария и удалении ее в конце сценария. Но если я не установлю пароль для этой учетной записи, не сможет ли злоумышленник использовать его в течение короткого времени существования учетной записи? Я не могу настроить пользовательскую оболочку на / sbin / nologin, потому что, по-видимому, это предотвращает выполнение команд в сценарии оболочки "подавать в суд" на счет.

Спасибо за вашу помощь.

Я бы лично изменил вашу стратегию и запустил скрипт от имени непривилегированного пользователя с sudo, используемым для запуска команд, требующих привилегий root. Есть ли какая-то конкретная причина, по которой вам нужно запускать скрипт от имени пользователя root?

Однако, чтобы ответить на ваш вопрос, вы можете использовать флаг -c для запуска определенной команды от имени пользователя:

su someuser -c "touch /tmp/file"

Ссылка: http://linux.die.net/man/1/su

Я не хочу полагаться на гипотезу о том, что на машине существует определенное имя пользователя.

У суперпользователя есть свои преимущества ... :-)

scriptuser_created=no
scriptuser=myuser
if ! id "$scriptuser" &>/dev/null
  adduser --system "$scriptuser"
  scriptuser_created=yes
fi
sudo -u "$scriptuser" command1
sudo -u "$scriptuser" command2
sudo -u "$scriptuser" command3
if [ yes = "$scriptuser_created" ]; then
  userdel "$scriptuser"
fi
#! /bin/bash
#  (GPL3+) Alberto Salvia Novella (es20490446e)


execute () {
    function="${1}"
    command="${2}"
    error=$(eval "${command}" 2>&1 >"/dev/null")

    if [ ${?} -ne 0 ]; then
        echo "${function}: $error"
        exit 1
    fi
}


executeAsNonAdmin () {
    function="${1}"
    command="${2}"

    eval setPasswordAsker="SUDO_ASKPASS=/usr/libexec/openssh/ssh-askpass"
    run="runuser ${SUDO_USER} --session-command=\"${setPasswordAsker}\" --command=\"${command}\""
    execute "${function}" "${run}"
}


executeAsNonAdmin "" "${@}"

Su обозначает замещающего пользователя. Вы можете использовать su для перехода к другому пользователю. Итак, если вы суперпользователь и хотите запустить что-то от имени другого пользователя, просто введите имя пользователя и выполните команду.

Традиционное решение такой проблемы заключается в существовании постоянной учетной записи пользователя с точно такими же уровнями доступа и разрешениями, которые требуются данной программе. Сетевые службы (например, apache) часто запускаются как собственный пользователь, с привилегиями, отличными от привилегий обычного интерактивного пользователя, и значительно меньшими, чем у root.

Если root запускает сценарий в первую очередь, им не нужно будет предоставлять пароль для su другому пользователю, даже если у этого пользователя есть пароль.

Вставьте это в начало вашего сценария оболочки.

# please run as foo user
if [[ $EUID -ne 1234 ]]; then
        echo "This script must be run as foo"
        exit 1
fi

Вы жестяная банка установите оболочку на nologin.

Добавьте привилегии sudo для пользователя foo, чтобы он мог выполнять оставшиеся операции, требуемые root, только с помощью тщательно продуманной конфигурации sudoer.