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

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

Я создал 2 файла: /root/FileByRoot и /home/admin/FileByAdmin.

$ ll /root/FileByRoot
-rw-r--r-- 1 root root 13 Oct 10 00:43 /root/FileByRoot

$ ll /home/admin/FileByAdmin
-rw-rw-r-- 1 admin admin 19 Oct 10 00:43 /home/admin/FileByAdmin

Вот что я получаю, когда пытаюсь скопировать их с правами администратора на другую машину.

$ scp -P 2220 admin@34.200.101.165:/root/FileByRoot /home/heysus/
admin@34.200.101.165's password:
scp: /root/FileByRoot: Permission denied

$ scp -P 2220 admin@34.200.101.165:/home/admin/FileByAdmin /home/heysus/
admin@34.200.101.165's password:
FileByAdmin                                                                           100%   19     0.5KB/s   00:00

$ ll /home/heysus/FileByAdmin
-rw-rw-r-- 1 heysus heysus 19 Oct 10 00:56 /home/heysus/FileByAdmin

Теперь давайте переместим файл в каталог, где администратор имеет полный доступ.

$ mv FileByRoot /home/admin/FileByRoot

Поскольку у администратора есть права доступа к папке, теперь я могу ее скопировать.

$ scp -P 2220 admin@34.200.101.165:/home/admin/FileByRoot /home/heysus/
admin@34.200.101.165's password:
FileByRoot                                                                            
100%   13     0.3KB/s   00:00

В завершение включите пользователя root в файле конфигурации /etc/ssh/sshd _и скопируйте необходимые файлы через пользователя root. Когда вы закончите, отключите вход root в конфигурации /etc/ssh/sshd _.

4
07.11.2020, 14:46
3 ответа

Низкоуровневый -способ, позволяющий программе всегда работать под определенным UID, — это бит setuid в двоичном файле. Вот как, например. sudoи suполучают права суперпользователя, даже если они обычно запускаются при обычном использовании. Но в целом Unix -подобные системы не поддерживают сценарии setuid , см.:Разрешить setuid для сценариев оболочки

Однако, что вы можете сделать, так это настроить sudoили другой подобный инструмент, чтобы пользователи могли запускать определенные файлы с соответствующими привилегиями. Например, это позволит пользователю с именем viceadminзапустить /usr/local/bin/sudoswaponс любыми аргументами и без аутентификации :

.
viceadmin ALL = NOPASSWD:/usr/local/bin/sudoswapon

Теперь, поскольку sudoимеет дело с изменением привилегий, sudoswaponможет быть сценарием оболочки.

Вы правы, заметив, что сценарий должен быть осторожен с тем, как он работает с аргументами командной строки, и что будут применяться все подводные камни языка оболочки. К счастью, sudoотфильтровывает большинство переменных окружения, по крайней мере, если установлена ​​опция env_reset.

8
18.03.2021, 22:51

Вы не можете создать сценарий bash, который запускает setuid. Однако вы можете использоватьsudo(или подобные программы, такие как calife ), чтобы убедиться, что они запускаются с привилегиями root.

Для этого есть два основных подхода.

Предположим, ваш скрипт называется reset-swapи выполняет:

#!/bin/sh
swapoff /dev/sdb
shred -n0 -z /dev/sdb
mkswap /dev/sdb
swapon /dev/sdb

Вариант A:заключается в том, чтобы позволить любому пользователю выполнять эти отдельные команды и добавлять к ним префикс sudo:

#!/bin/sh
sudo swapoff /dev/sdb
sudo shred -n0 -z /dev/sdb
sudo mkswap /dev/sdb
sudo swapon /dev/sdb

и добавить к /etc/sudoersряд строк, позволяющих сделать это всем:

ALL     ALL = NOPASSWD: /sbin/swapoff /dev/sdb
ALL     ALL = NOPASSWD: shred -n0 -z /dev/sdb
ALL     ALL = NOPASSWD: mkswap /dev/sdb
ALL     ALL = NOPASSWD: swapon /dev/sdb

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

Таким образом, было бы предпочтительнее использовать

Вариант B:позволяет запускать только этот скрипт с помощью sudo.

ALL     ALL = NOPASSWD: /usr/local/bin/reset-swap

Тогда вы бы назвали это как sudo reset-swap, а не reset-swap. Если вы пофантазируете, скрипт мог бы поднять себя, если бы он не был запущен как root,разрешить запуск без указания префикса sudo:

#!/bin/sh
if [ "`id -u`" -ne 0 ]; then
 echo "Switching from `id -un` to root"
 exec sudo "$0"
 exit 99
fi

swapoff /dev/sdb
shred -n0 -z /dev/sdb
mkswap /dev/sdb
swapon /dev/sdb

Наконец, позвольте мне закончить парой пунктов из лекции о sudo :Думайте, прежде чем печатать. С большой силой приходит большая ответственность.

5
18.03.2021, 22:51

Давным-давно стало понятно, что setuid-скрипты создают непреодолимые проблемы с безопасностью, (их легко взломать, обманув IFS), поэтому мы больше этого не делаем. Linux был изменен, чтобы помочь нам избежать сценариев setuid.

Вы можете достичь своих желаний с помощью sudo, используя NOPASSWD. Прочтите man sudoers sudo.

0
09.10.2021, 01:15

Теги

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