Как ввести пароль только однажды в сценарии удара, бывшем нужном sudo

Данные

  • Я хочу, чтобы пользователи оператора на этой машине смонтировали свои собственные доли cifs
  • sudoers файл уже содержит /bin/mount -t cifs //*/* /media/* -o username=* команда для всех операторов
  • Я хочу, чтобы пользователи смонтировали a cifs доля через сценарий, вводящий пароль только однажды, не дважды.
  • sudo пароль и cifs пароль идентичны.

Что я уже имею

Этот сценарий работы:

#!/bin/bash
sudo 'mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... но это требует, чтобы пользователи ввели тот же пароль дважды!

  • Однажды для sudo
  • Однажды для самого монтирования

Это также работало бы:

#!/bin/bash
echo -n Password: 
read -s szPassword
echo $szPassword | sudo -S sh -c 'echo $szPassword | mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER'

... но это потребовало бы, чтобы я позволил всем пользователям оператора мочь к sudo sh (главная проблема безопасности)

Вопрос

Как смонтировать, что cifs совместно использует в ударе ¹ без помещения sh в sudoers файл, ни создание постоянного/временного файла???

Примечание 1: никакой Python, жемчуг, C, Не Идет... пожалуйста?
Примечание 2: Я знаю, что могу просто удалить пароль через sudoers файл, но я пытаюсь сжать безопасность, не ослабить его, не бросая удобство...

21
задан 21 December 2018 в 01:05

4 ответа

Я являюсь немым!

следующий сценарий:

#!/bin/bash
read -p "Password: " -s szPassword
printf "%s\n" "$szPassword" | sudo --stdin mount -t cifs //192.168.1.1/home /media/$USER/home -o username=$USER,password="$szPassword"

просто работы и:

  1. не создает файлов, содержащих пароли
  2. , Позволяет пользователю вводить только один пароль для нескольких долей (включая Windows)
  3. , Не Имеет никакой потребности в дополнительных полномочиях, которые предоставят. :-)
7
ответ дан 23 November 2019 в 01:42

Необходимо вместо этого заставить пользователя сделать вызов использования sudo как sudo script. просто проверьте, запускается ли скрипт как корень, если не просят его

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root, use sudo "$0" instead" 1>&2
   exit 1
fi

Не пытайтесь получить пароль своих пользователей.

24
ответ дан 23 November 2019 в 01:42

Потребуйте нет sudo пароль для выполнения этой команды; подсказка пароля для mount остается.

В sudoers, включайте что-то как

ALL        ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*

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

Примечание: Я принял управление дословно от того, что Вы включали в вопрос; я не проверял, позволят ли его подстановочные знаки, чтобы пользователи сделали что-то противное. Читайте sudoers страница справочника для примеров злобности. В частности, обратите внимание что эта строка в sudoers позволяет пользователю добавлять любое количество -o переключатели или другие аргументы mount. Можно хотеть заново продумать подход, например, путем добавления, что сценарий, такой как @Braiam делает предложение, и позвольте прокручивать это sudo без дополнительной аутентификации. Сценарий затем гарантирует, что пользователи могут только выполнить определенную форму mount то, что Вы хотите, чтобы они работали.

Кроме того, вместо того, чтобы позволить это для всех пользователей, Вы могли также ограничить это членами определенной группы, например, Вы могли создать группу cifsmount и затем имейте

%cifsmount ALL = NOPASSWD: /bin/mount -t cifs //*/* /media/* -o username=*
3
ответ дан 23 November 2019 в 01:42

Общее решение этих проблем состоит в том, чтобы поместить следующую преамбулу наверху Вашего sudo требование сценариев:

#!/bin/bash
case $EUID in
   0) : cool we are already root - fall through ;;
   *) # not root, become root for the rest of this session
      # (and ask for the sudo password only once)
      sudo $0 "$@" ;;
esac
# now the present process is effective-UID  (root)
# so there's no need to put sudo in front of commands

any more commands here will run as superuser ...

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

Так или иначе мысль я совместно использовал бы эту небольшую подсказку. Самая хорошая вещь об этом, то, что, если Вы уже - эффективный-uid корень (например, если Вы уже назвали его под sudo) это корректно делает правильную вещь. Также предоставление ошибки и принуждение Вас перепечатать/повторно выполнить (с sudo) являются менее дружественными.

Можно также хотеть проверить timestamp_timeout переменная в man 5 sudoers который говорит sudo помнить удостоверения пользователя за ограниченное количество минут (и может быть дробным).

1
ответ дан 23 November 2019 в 01:42

Другие вопросы по тегам:

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