LINUX.ORG.RU

Автоматический ввод пароля sudo из скрипта.

 , ,


0

4

Хочу сделать скрипт для запуска программы от рута, нужно сделать что-то типо:

echo "password" | sudo -S echo -n 2>/dev/random 1>/dev/random

На дебиане в прошлом году это работало, сейчас сижу на арче и как понимаю с последними обновами sudo это просто запретили. Как заставить это работать?

1) sudo читает пароль не из stdin а из контролирующего терминала, для его имитации есть какие-то проги

2) sudo - плохо, избавься от него

3) ты что-то делаешь совсем неправильно, даже если закрыть глаза на п.2, что именно нужно то на самом деле?

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от enot_obrmot

тупым друзьям

Интересный ты друг…

Поэтому мне нужно тупо в скрипте

А почему бы весь скрипт через sudo не запускать?

А как тогда работают эти программы для ввода пароля sudo, по типу gksudo

Почитай у sudo про опцию -A (–askpass).

Tanger ★★★★★
()
Ответ на: комментарий от enot_obrmot

Используют системную библиотеку.

А тут вот поподробней

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

man expect покажет, как им пользоваться.

Но как уже выше говорили - это неправильный подход. Правильно - дать права на команду в sudoerc.

N.B.: Говорят же, что арч даёт глубокое понимание системы...

shell-script ★★★★★
()
Ответ на: комментарий от shell-script
import sh

password = 'password'

with sh.contrib.sudo(password, _with=True):
    print(ls("/root"))

Я такую дичь нашёл, скрипт на пайтоне, буду тестить, смотреть что внутри)

enot_obrmot
() автор топика
Последнее исправление: enot_obrmot (всего исправлений: 1)
Ответ на: комментарий от mexx

Почему?

$ echo 'pa$$w0rd' | sudo -S -p"" cat -
$ echo 'pa$$w0rd' | sudo -S -p"" cat -
pa$$w0rd

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

Хранить пароль открытым текстом в скрипте - идея плохая. (хотя не факт что ТС это делает)

Tanger ★★★★★
()
Ответ на: комментарий от mexx

И в чем прямо вот опасность?

То что пароль может попасть в stdin недостаточно?

типа kdialog –password

Так можно и SUDO_ASKPASS использовать.


Вообще, когда я писал первый комментарий, у меня было ощущение что ТС не осилил отредактировать /etc/sudoers и, вместо того чтобы разрешить без пароля выполнять определенные команды, делает скрипты в которых пишет пароль открытым текстом.

Но я не могу придумать сценарий при котором стоит использовать sudo -S в скрипте.

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

То что пароль может попасть в stdin недостаточно?

Ну вообще … не знаю.
Ну попал, ну скрипт в фоне отработал и всё.

Но я не могу придумать сценарий при котором стоит использовать sudo -S в скрипте.

Вот. Отсюда и мой вопрос выше про нужность ‘-S’

mexx
()
Ответ на: комментарий от Tanger

Есть сценарий, если тебя задолбало вводить пароль, даже короткий. Ну а в целом то я хочу сейчас повторить на пайтоне pkexec. Юзал на дебиане те скрипты, щас просто копался в них и нашёл пару скриптов с этой строкой.

ДОСТАЛИ СО СВОИМ /etc/sudoers, ну давайте покукарекайте, если я юзаю кучу дистров, мне удобней их скопировать и закинуть.

enot_obrmot
() автор топика
Ответ на: комментарий от mexx

Ну попал, ну скрипт в фоне отработал и всё.

Именно! И я не пойму, что опасного запускать vbox и systemctl start vbox-что-то_там от рута. Это мой скрипт же, не какого то плохого человека

enot_obrmot
() автор топика
Последнее исправление: enot_obrmot (всего исправлений: 1)
Ответ на: комментарий от pihter

Оно вносит путаницу в чёткую систему разделения прав между администратором и пользователем и таким образом вредит как безопасности, так и просто чистоте системы. Главным образом - в головах новичков, его использующих. У них создаётся ложное впечатление о неких «повышенных правах» запуска программы (которых не существует), в целом почти полный аналог виндузятского «запустить от админа». Основной сценарий её использования - совершенно идиотское и неприемлемое «у меня что-то программа не работает, кажется прав не хватает, добавлю их» (иногда без «кажется» и без предварительной проверки, но дела это не меняет). Среди её функций есть проверка разрешённых/запрещённых действий, но: 1) она сделана методом текстового анализа команды... 2) обычно оно не настроено, ибо так сделано что настраивать не хочется, и эта тема тому подтверждение.

При правильном же использовании это чисто избыточный дубликат su, но спрашивающий почему-то не тот пароль, который нужно.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от enot_obrmot

Есть сценарий, если тебя задолбало вводить пароль, даже короткий

Так поставь kali linux Впрочем там уже тоже non-root пользователь появился по умолчанию…

ну давайте покукарекайте

echo "%sudo ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/sudo-nopasswd
Tanger ★★★★★
()
Ответ на: комментарий от firkax

идиотское использование инструмента ничего не говорит о самом инструменте :) ножичком так-то можно и человека пырнуть и колбаску порезать.
не натягивайте свое видение на мир.

в «рассовоправильном» su для его использования использующему необходимо знать пароль root :) по мне так самая главная дыра su в случае когда все необходимо допускать непривилегированного пользователя до некоторых привилегированных функций.

в «рассовоневерном» sudo имеется куча разграничивающих средств в sudoers, позволяющих дать возможность пользователю запускать четко ограниченные root-овые функции под четко ограниченным пользователем (ты наверн в мане до такого даж не дочитывал) зная лишь только свой пароль.

как говорится почувствуй разницу.

и да, абсолютно согласен - если ты не умеешь инструмент, ты не сможешь им эффективно воспользоваться и скорей всего отстрелишь себе ногу.
так что абсолютно согласен - не трогай и вообще не вылазий из песочницы %)

pfg ★★★★★
()
Ответ на: комментарий от pfg

Проблема с sudo, мне кажется, в том, что с его помощью слишком легко преодолеть любые ограничения. Если запускаемая через sudo программа имеет возможность писать в файлы, особенно произвольные файлы, или умеет форкать дочерние процессы, то мне кажется, что её будет достаточно несложно использовать, чтобы получить полный доступ к системе.

Теоретически, например. Мы даём пользователю sudo доступ к mount, и пользователь делает bind mount /etc, заменяя /etc/passwd и /etc/shadow на свои.

Да, можно наверное разрешить только mount со строго определенными аргументами, но кто поручится, что в большом sudoers нет каких-либо похожих возможностей?..

emorozov
()
Ответ на: комментарий от emorozov

теоритически совершил глупость ты, а не sudoers :).
не подумавши, дал пользователю неограниченный доступ.
это в принципе и есть стандартная ошибка «запустить от администратора», которую указали чуть выше.

практически надо создать скрипт с четкими параметрами, что куда монтировать, к примеру «mount /dev/sdb2 /тра/ля/ля …»
запретить пользователю его менять и дать доступ на исполнение данного скрипта через sudo.
и профит… пользователь имеет четко ограниченный доступ к привилегированному функционалу.
на ум приходят еще несколько вариантов, чуть более замороченных.

sudoers дает только те возможности, которые прописаны его правилами. коль ты не разбираешься в составлении правил, то ты с большой вероятностью их сделаешь кривыми.
но это проблема не инструмента, и она не решаема ни одним методом кроме четкого понимания как работать данным инструментом.
и эта проблема есть не только в ИТ :) сколь народа молотком по пальцам попадало.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от pfg

Нет, всё не так. sudo как раз заточен на неправильное использование, и практически непригоден для правильного. Его правильное использование, как я уже писал, полностью перекрывается su, и то оно дефективное из-за того что спрашивает не тот пароль.

по мне так самая главная дыра su в случае когда все необходимо допускать непривилегированного пользователя до некоторых привилегированных функций

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

в «рассовоневерном» sudo имеется куча разграничивающих средств в sudoers,

Эти «средства» сделаны ужасно костыльным способом. Нельзя так делать.

ты наверн в мане до такого даж не дочитывал

Ты глупый?

пользователю запускать четко ограниченные root-овые функции

Вот функции и надо ограничивать. sudo это не умеет. Зато, сюрприз, это умеет делать ядро с начала времён с помощью setuid-бита прав на программе, реализующей разрешённую функцию (не идиотский текстовый фильтр на команду! именно программа которая делает то что нужно). Или, для некоторых, чуть более современные capabilities.

firkax ★★★★★
()
Ответ на: комментарий от pfg

практически надо создать скрипт с четкими параметрами, что куда монтировать, к примеру «mount /dev/sdb2 /тра/ля/ля …»
запретить пользователю его менять и дать доступ на исполнение данного скрипта через sudo.

Ну вот, уже лучше. Осталось только заменить скрипт на программу и выкинуть sudo, поставив программе setuid root.

sudoers дает только те возможности, которые прописаны его правилами. коль ты не разбираешься в составлении правил, то ты с большой вероятностью их сделаешь кривыми.

Правила, основанные на строковых операциях, априорно дефективны.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Его правильное использование, как я уже писал, полностью перекрывается su

Ну и как такое через su делать?

zabbix ALL= (ALL) NOPASSWD: /opt/zabbix/zabbix_mdraid.sh

Или предлагаешь suid-обертки делать?

Tanger ★★★★★
()
Ответ на: комментарий от Tanger

Предлагаю. Не обязательно обёртки кстати.

Я так понимаю речь про это: https://github.com/linuxsquad/zabbix_mdraid/blob/master/zabbix_mdraid.sh

Этой портянке однозначно пойдёт на пользу переписывание на нормальный компилируемый язык. Кстати, автор, такой нехороший человек, ещё и #!/bin/bash туда всунул. Однозначно переписать.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Я так понимаю речь про это

Как пример.

Этой портянке однозначно пойдёт на пользу переписывание на нормальный компилируемый язык.

И это утверждение можно экстраполировать на все shell-скрипты? А интерпретируемые языки «ненужны»?

ещё и #!/bin/bash туда всунул

У меня есть только догадки о причинах возмущения:

  • использование bash, вместо sh
  • нелюбовь к shebang
  • страсть к /usr/bin/env
Tanger ★★★★★
()
Ответ на: комментарий от Tanger

И это утверждение можно экстраполировать на все shell-скрипты? А интерпретируемые языки «ненужны»?

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

У меня есть только догадки о причинах возмущения:

1) использование баша 2) и это несмотря на то, что в скрипте кажется башизмов нет 3) расширение всё равно оставим .sh чтоб всех запутать 4) ну и да, без env оно не кроссплатформенно, а ведь можно было просто написать /bin/sh, впрочем даже с env кому-то придётся ставить лишний баш (нет конечно, просто шебанг пропатчат)

firkax ★★★★★
()
Ответ на: комментарий от firkax

Чуваки, ну cкрипт то мне уже нафиг не нужен, но как тогда сделать что-то вроде pkexec на пайтоне?

enot_obrmot
() автор топика
Последнее исправление: enot_obrmot (всего исправлений: 1)
Ответ на: комментарий от firkax

Как быть с группами, пользователями и аргументами?

Группе adm я хочу дать возможность пускать одни программы, группе support - другие. А группе web я хочу дать возможность выполнять часть команд, но от пользователя www-data, а не от рута. А если я хочу дать права на выполнение команды только с определёнными аргументами? И всё это вместе и в перемешку. Setuid тут не справляется.

shell-script ★★★★★
()
Ответ на: комментарий от firkax

Но вобщем-то sudo как раз такой обёрткой и получается

Совершенно верно. Ты предлагаешь написать ещё миллион обёрток под каждый отдельный случай вместо использования универсального sudo.

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Как быть с группами, пользователями и аргументами?

В чём проблема? Ну и повторю: то, как проверяет аргументы sudo (с помощью сравнения строк) - никуда не годится. Проверять надо осмысленные сущности, а не строковое их представление.

Группе adm я хочу дать возможность пускать одни программы, группе support - другие.

Ты не поверишь:

$ ls -al /usr/sbin | grep rws
-rwsr-xr--  1 root dip    408644 янв  7  2021 pppd
это дефолтный дебиан, и угадай что это значит.

А группе web я хочу дать возможность выполнять часть команд, но от пользователя www-data, а не от рута.

Аналогично.

А если я хочу дать права на выполнение команды только с определёнными аргументами?

Аргументы должна проверять алгоритмическая обёртка. И не с помощью сравнения строк или регулярок на командную строку, а с помощью парсинга argv[] аналогично той программе, которую запускаешь и дальнейшего моделирования того, что произойдёт. А ещё она может сама их составить из более простого собственного синтаксиса (ведь если ты хочешь ограниченную функциональность то незачем синтаксис от полной тащить).

Совершенно верно. Ты предлагаешь написать ещё миллион обёрток под каждый отдельный случай вместо использования универсального sudo.

Универсально-костыльного. Такая универсальность не нужна.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)