Как сценарий может запускать привилегированные команды в удаленной системе без паролей sudo или ssh?

[116034] Вы можете запустить [116387]rpm -q --scripts packagename[116388], чтобы посмотреть, что выполняется при установке или удалении пакета. Если вы смотрите на пакет, который еще не установлен, можно запустить [116389]rpm -q --scripts -p /path/to/package.rpm[116390].[116035].
1
30.10.2015, 04:32
2 ответа

Одна вещь, которую нужно исправить, прежде чем перейти к реальному ответу. Использование «% user1» означает «люди в группе user1»; вы, вероятно, просто хотите, чтобы "user1" означало user1.

Во-вторых, sudo не знает, где вы вошли в систему из - только там, где вы сейчас запускаете sudo.

В-третьих, убедитесь, что вы используете visudo для внесения изменений; он попытается помешать вам сделать синтаксические ошибки.

В-четвертых, добавление строки sudoers только увеличивает ваш текущий доступ; это не помешает вам запускать другие скрипты; если вам нужен sudo для этих скриптов, тогда вам понадобится больше записей sudoers.

3
27.01.2020, 23:20

Вы спросили об ограничении функциональности соединениями с server1. Я бы сделал это с помощью ssh. Код для изменения пользователей предназначен для Debian/Ubuntu. Принципы и большинство другого кода должны быть достаточно универсальными. После выполнения этой конфигурации для выполнения скрипта на server2 с server1, вы выполните следующую команду:

$ ssh -i ~/.ssh/script_identity.pub ruser@server2

Приведенная выше команда подключится к server2 и запустит ваш скрипт, не требуя дальнейшего вмешательства для аутентификации ssh или sudo. Файл открытого ключа ssh является единственным доступом для удаленного запуска сценария на server2, что позволяет вам решать, какие машины и/или учетные записи могут получить доступ к сценарию через ssh.

Код для выполнения этих задач показан ниже в этом описании.

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

Шаги по настройке ssh для ограниченного удаленного доступа

На сервере1

  1. От учетной записи на сервере1, где вы будете выполнять скрипт, создайте новый ssh-ключ, который будет использоваться только для выполнения удаленного скрипта.
  2. Измените новый открытый ключ ssh, чтобы ограничить выполнение только одной команды (см. command= в sshd manpage).
  3. Сделайте тестовый скрипт, который печатает идентификаторы пользователей и дату.

На сервере2 (все будет делаться удаленно с сервера1)

  1. Создайте новую учетную запись на сервере2.
  2. Скопируйте измененный файл публичной идентификации в .ssh/authorized_keys в домашний каталог нового пользователя на сервере2.
  3. Скопируйте тестовый сценарий в домашний каталог нового пользователя на сервере2.
  4. Проверьте все разрешения и права собственности на все файлы в учетной записи нового пользователя.

Код

После сохранения следующего скрипта как ruser.sh на server1, и после того, как вы поймете, что он будет делать, дайте эту команду на выполнение:

$ sh ./ruser.sh ruser server2

Сохраните этот скрипт как ruser. sh в вашей учетной записи пользователя на system1:

#!/bin/sh -e

#
# ruser.sh -- setup user on remote host for secure remote script execution
#
# This is for first time setup!
# Always use a new user on remote host.
#

USAGE="ERROR: Usage: sh $0 remote-username remote-hostname"    
RUSER="${1:?$USAGE}"
RHOST="${2:?$USAGE}"
UNIQUE=$$

# build files that will be transferred to the remote host

# Make the new ssh key, and modify the public key so that
# it can only be used to execute "./rscript.sh"

ssh-keygen -N '' -f ~/.ssh/script_identity
sed -i '1 {
    s,command="./rscript.sh",,
    s,^,command="./rscript.sh" ,
}' ~/.ssh/script_identity.pub

# rscript.sh -- the only script that can be executed
# with the modified public key.

printf '%s' '(id;date) > rscript.out' > /tmp/rscript.sh.$$

# copy the new identity public key and rscript.sh to the remote host

scp ~/.ssh/script_identity.pub "${RHOST}":/tmp/script_identity.pub.${UNIQUE}
scp /tmp/rscript.${UNIQUE} "${RHOST}":/tmp/script_identity.pub.${UNIQUE}

# setup remote user for script execution
# Create new user
# Move identity file and script to new user's home directory.
# Fix ownership and permissions

ssh -t ${RHOST} "sudo /bin/sh -cex '
        adduser --system --shell=/bin/sh ${RUSER};
        mkdir -m0700 ~${RUSER}/.ssh;

        mv /tmp/script_identity.pub.${UNIQUE} ~${RUSER}/.ssh/authorized_keys;
        mv /tmp/rscript.sh.${UNIQUE} ~${RUSER}/rscript.sh

        chmod -R 0600 ~${RUSER}/.ssh/;
        chmod    0700 ~${RUSER}/.ssh/;
        chmod 0700 ~${RUSER}/rscript.sh;
        chown -R ${RUSER}:nogroup ~${RUSER}/;
    '
"

# remove temp files

rm -rf /tmp/rscript.sh.${UNIQUE}

Проверьте вышеуказанную конфигурацию на server1, выполнив:

$ ssh -i ~/.ssh/script_identity.pub ruser@server2

Затем проверьте домашний каталог ruser на server2, чтобы убедиться, что файл rscript.out действительно был создан, что указывает на то, что все настроено правильно.

Если это так, измените ruser@server2:rscript.sh для вызова вашего /path/to/myscript. Перед изменением файла sudoers снова выполните команду ssh для запуска удаленного скрипта, чтобы убедиться, что вывод информации и ошибок работает так, как вы хотите.

Теперь настройте файл sudoers server2, чтобы разрешить этому новому пользователю на server2 выполнять только один скрипт как root без пароля.

ruser ALL = NOPASSWD: /path/to/myscript

Поздравляем, теперь вы можете безопасно запускать привилегированные скрипты удаленно без ssh, sudo или системных паролей.

1
27.01.2020, 23:20

Теги

Похожие вопросы