Дозволити 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 Як видно з відповіді сценарію, робити це через якийсь механізм пам’яті дуже некрасиво. Дійсно саме це sudoбуло призначено. Крім того, що зазвичай не використовуєте, які заперечення?
Патрік

1
Якщо можливий чистий розчин pam, я вважаю за краще це sudo. Якщо sudoєдина можливість, то це також добре. Мої заперечення sudoздебільшого ідеологічні: мені не подобається ідея користування адміністрацією sudo foo. Коли мені потрібно зайнятися адміністрацією, я входжу як root. Інакше я входжу як користувач, ці дві різні ролі не слід змішувати. Також у мене вже встановлена pamінфраструктура. Я не хочу встановлювати іншу setuidпрограму, яка, можливо, може ввести помилки безпеки.
Мартін Вегтер

5
@MartinVegter Не потрібно робити sudo fooконкретні команди. Судо має sudo -sзапуск снаряда. Судо - це дуже поширена утиліта, що означає, що безпека ретельно перевірена, набагато більше, ніж буде певна хитрість пам’яті. Я також заперечую, що отримання кореневої оболонки для завдань набагато небезпечніше, ніж запуск конкретних команд. Коли ви запускаєте оболонку, ви запускаєте все як 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
Якщо ви хочете авторизуватися, якщо вони є у певній групі: auth достатній pam_succeed_if.so користувач ingroup GROUP
shrimpwagon

@gnp Супер Дякую !! Працюючи над iCinga з nrpe, доведеться виконувати якусь команду як інший користувач !! Допоміг багато !!!!!! Дякую!!!!!
saravanakumar

@GnP Будь ласка, допоможіть мені на askubuntu.com/questions/821793/…
Nullpointer

Було б непогано додати інформацію про те, як застосувати зміни.
Кислик

@Kyslik, що ти маєш на увазі? Інструкції, як редагувати потрібні файли, є у відповіді ...
GnP

12

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

Додайте рядок до рядка /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 можна використовувати для надання аналогічних функцій, не покладаючись на сценарій. (це було зроблено з
пам’яткою доступу

1
@jsbillings Ви зробили б це (з деякими подробицями) ще однією відповіддю?
Hauke ​​Laging

1
як мені потрібно змінити свій, /etc/pam.d/suщоб використовувати pam_accessдля моєї ситуації?
Мартін Вегтер

3
@jsbillings Насправді цього pam_accessне вдається. Коли suвідбувається перегляд стіку пам’яті, це робиться так, як користувач, до якого ви змінюєтесь, а не той користувач, з якого ви змінюєтесь. Так що, якщо ви додати правило , такі як + : martin : ALL, це дозволить будь-якому змінюється на martin . Навіть якщо ви перейдете martinна martin-testце, він все одно дозволить комусь це зробити. Вам потрібно проаналізувати як користувача, з якого ви приїжджаєте, так і користувача, до якого ви переходите. Дійсно, це саме те, що sudoдля ...
Патрік,

0

Якщо у вас немає доступу до кореневого облікового запису, але у вас є пароль користувача, якого ви хочете використовувати для запуску команди, ви можете зробити наступне.

  • Тут буде запропоновано пароль toto: su - toto -c whoami
  • Це не буде: ssh toto @ localhost whoami

Просто встановіть ваш відкритий ключ в санкціоновані_ ключі toto


Продумана відповідь .. Однак команда, яку хтось хоче спробувати запустити, вже є на машині. Таким чином, немає сенсу ssh'ing на одному сервері.
Раджа Анбаджаган

-1

Моє просте рішення:

sudo login -f martin-test

Якщо ви хочете уникнути судо будь-якою ціною, я думаю, це має бути можливо, щоб це було вкладено в сценарій:

  1. належить корені і з привілеями суперкористувача (використовуючи Setuid прапора)
  2. виконується всіма, також без будь-якого судо.

Тим НЕ менше, я не можу з'ясувати chown rootі chmod +s ToTest.shбіти, щоб зробити це на самому справі працює:

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

Я все ще працює як мій звичайний користувач, як підказує ехо. А ще потрібен пароль sudo. Якби він працював як root, можна було б покінчити з sudoостаннім рядком ...


Установлений прапор на сценарії оболонки (або будь-який інший сценарій) не працюватиме в Linux і з поважних причин. Зауважте, що вищезазначений сценарій із прапором робочого Suid одразу стане пасткою: він залучає bash через "env" (досить самозакохано, тому що якщо ви вважаєте, що не знаєте, де bashє, чому ви вважаєте, що знаєте, де envзнаходиться або чи воно взагалі існує?). Зрештою, ви не знаєте, що bashце буде саме. Він може надходити з каталогу користувача, що викликає, і був складений хвилиною раніше з його вихідного коду. Ви бачите, куди я їду? Або користувач міг би перекрити whoami...
Девід Тонхофер

Наразі мій мозок занадто далеко від цих питань, щоб повністю зрозуміти, але все ще дякую за детальні пояснення.
Френк Нокк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.