Разрешить user1 «su - user2» без пароля

51

Мне нужно разрешить пользователю martinпереключаться на пользователя martin-testбез пароля

su - martin-test

Я думаю, что это можно настроить в /etc/pam.d/su. В этом файле уже есть строки, которые можно раскомментировать. Однако мне не нравится идея добавления пользователя martinв группу wheel. Я не хочу давать martinбольше привилегий, чем возможность переключиться на martin-test. Я тоже не хочу использовать sudo.

Как лучше всего это сделать, сохранив при этом martinминимальные привилегии пользователя ?

Мартин Вегтер
источник
2
Это проще сделать, sudoнапример sudo -u martin-test -i. Есть ли причина, о которой вы спрашиваете конкретно su?
Иордания
Я не хочу устанавливать sudoтолько из-за этого (я обычно не использую sudoи мне это не особо нравится). И я думаю, использование pamболее чистого и прозрачного способа сделать это.
Мартин Вегтер
3
@MartinVegter Как вы можете видеть из ответа сценария, делать это через какой-то механизм pam очень уродливо. На самом деле это именно то, sudoдля чего предназначалось. Каковы же возражения, помимо того, что они обычно не используются?
Патрик
1
Если можно получить чистое решение pam, я бы предпочел это sudo. Если sudoэто единственная возможность, то это тоже хорошо. Мои возражения в sudoосновном идеологические: мне не нравится идея, когда пользователь выполняет администрирование sudo foo. Когда мне нужно сделать администрирование, я захожу как root. В противном случае я войду в систему как пользователь, эти две разные роли не должны смешиваться. Также у меня уже установлена pamинфраструктура. Я не хочу устанавливать другую setuidпрограмму, которая может содержать ошибки безопасности.
Мартин Вегтер
5
@MartinVegter Вам не нужно делать sudo fooдля конкретных команд. Судо имеет, sudo -sкоторый запустит оболочку. sudo - очень распространенная утилита, означающая, что ее безопасность была тщательно проверена, гораздо больше, чем какая-либо хитрость с использованием pam. Я также утверждаю, что получение корневой оболочки для задач гораздо более небезопасно, чем запуск определенных команд. Когда вы запускаете оболочку, вы запускаете все как root. Если какая-либо из этих вещей (например, простая ls) имеет уязвимость безопасности, то вы только что открыли дыру в безопасности.
Патрик

Ответы:

61

Добавьте следующие строки прямо под pam_rootok.soстрокой в ​​вашем /etc/pam.d/su:

auth  [success=ignore default=1] pam_succeed_if.so user = martin-test
auth  sufficient                 pam_succeed_if.so use_uid user = martin

Эти строки выполняют проверки с использованием pam_succeed_if.soмодуля. Смотрите также синтаксис файла конфигурации Linux-PAM, чтобы узнать больше о authстроках.

  • Первые проверки линии ли целевой пользователь является martin-test. Если это так, ничего не происходит ( success=ignore), и мы продолжаем на следующей строке, чтобы проверить текущего пользователя . Если это не так, следующая строка будет пропущена ( default=1), и мы продолжим на последующих строках с обычными шагами аутентификации.
  • Вторая строка проверяет, является ли текущий пользователь martin. Если это так, система считает процесс аутентификации успешным и возвращает ( sufficient). Если это не так, ничего не происходит, и мы продолжаем в последующих строках с обычными шагами аутентификации.

Вы также можете ограничиться suгруппой, здесь группа allowedpeopleможет suбез пароля:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople
ВНП
источник
1
Если вы хотите авторизоваться, если они входят в определенную группу: достаточно авторизоваться pam_succeed_if.so user ingroup GROUP
shrimpwagon
@gnp Супер, спасибо! Работая на iCinga с nrpe, нужно выполнить какую-то команду от имени другого пользователя !! Помогло много !!!!!! Спасибо!!!!!
Сараванакумар
@GnP Пожалуйста, помогите мне на askubuntu.com/questions/821793/…
Nullpointer
Было бы неплохо добавить информацию о том, как применить изменения.
Kyslik
@ Кислик, что ты имеешь в виду? Инструкция о том, как отредактировать нужные файлы, есть в ответе ...
GnP
12

Если вы не хотите менять или использовать группы sudo, используйте модуль pam, вызываемый pam_execдля выполнения внешних сценариев на этапе pam.

Добавьте строку в вашу /etc/pam.d/suпосле pam_rootok.soстроки:

auth       sufficient pam_exec.so quiet /path/to/script

/path/to/script имеет разрешения 755 (rwxr-xr-x) и следующий контент:

#!/bin/bash
if [ "$PAM_TYPE" == "auth" ] && \
[ "$PAM_USER" == "martin-test" ] && \
[ "$PAM_RUSER" == "martin" ]; then
  exit 0
else
  exit 1
fi

Таким образом, этот сценарий существует с успехом, если su:

  • вызывается в контексте аутентификации,
  • вызывающий пользователь martinи
  • пользователь для аутентификации есть martin-test.

Видеть:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 
хаос
источник
1
pam_access может использоваться для обеспечения аналогичной функциональности, не полагаясь на скрипт. (это было сделано для pam_access)
jsbillings
1
@jsbillings Вы бы сделали (с некоторыми подробностями) еще один ответ?
Hauke ​​Laging
1
Как мне нужно изменить мой, /etc/pam.d/suчтобы использовать pam_accessдля моей ситуации?
Мартин Вегтер
3
@jsbillings На самом деле pam_accessне могу этого сделать. Когда suпроходит через стек pam, он делает это как пользователь, на которого вы переходите, а не как пользователь, с которого вы переходите. Поэтому, если вы добавите правило, такое как + : martin : ALL, оно позволит любому перейти на martin . Даже если вы измените martinк martin-test, он все равно будет пусть кто - нибудь это сделать. Вам необходимо проанализировать как пользователя, от которого вы приходите, так и пользователя, на которого вы переходите. В самом деле, это именно то, что sudoдля ...
Патрик
0

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

  • Это спросит у вас пароль toto: su - toto -c whoami
  • Это не будет: ssh toto @ localhost whoami

Просто установите ваш открытый ключ в авторизованных ключах toto

Патрик
источник
Вдумчивый ответ .. Однако команда, которую кто-то хочет попробовать запустить, уже находится на машине. Так что нет смысла ssh'ing на тот же сервер.
Раджа Анбажаган
-1

Мое простое решение:

sudo login -f martin-test

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

  1. принадлежит root и имеет права root (с использованием флага setuid )
  2. исполняемый всеми, также без всякого sudo.

Тем не менее, я не могу выяснить chown rootи chmod +s ToTest.shбиты, чтобы сделать это на самом деле работает:

#!/usr/bin/env bash
echo howdy, I am $(whoami)
sudo login -f martin-test

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

Фрэнк Нок
источник
Флаг setuid для сценария оболочки (или любого другого сценария) не будет работать в Linux и по уважительным причинам. Обратите внимание, что приведенный выше скрипт с рабочим флагом suid сразу же станет ловушкой: он включает bash через «env» (довольно самоубийственно, потому что, если вы предполагаете, что не знаете, где bashнаходится, почему вы предполагаете, что знаете, где envнаходится или существует ли оно вообще?). Но, в конце концов, вы не знаете, что именно bashэто будет. Он может исходить из каталога вызывающего пользователя и был скомпилирован минутой ранее из его исходного кода. Вы видите, куда я иду? Или пользователь может переопределить whoami...
Дэвид Тонхофер
Мой мозг в настоящее время слишком далеко от этих вопросов, чтобы полностью понять, но все же спасибо за подробные объяснения.
Фрэнк Нок