Pozwól użytkownikowi 1 na „su - użytkownik2” bez hasła


51

Muszę umożliwić użytkownikowi martinprzejście na użytkownika martin-testbez hasła

su - martin-test

Myślę, że można to skonfigurować /etc/pam.d/su. W tym pliku jest już kilka wierszy, które można odkomentować. Jednak nie podoba mi się pomysł dodania użytkownika martindo grupy wheel. Nie chcę dawać martinwięcej przywilejów niż możliwość zmiany martin-test. Ja też nie chcę używać sudo.

Jaki byłby najlepszy sposób na to, przy jednoczesnym utrzymaniu martinminimalnych uprawnień użytkownika ?


2
Łatwiej to zrobić sudonp sudo -u martin-test -i. Czy jest jakiś powód, dla którego pytasz konkretnie su?
— jordanm

Nie chcę instalować sudotylko z tego powodu (zwykle nie używam sudoi nie lubię tego szczególnie). I myślę, że używanie pamjest czystszym i bardziej przejrzystym sposobem na to.
— Martin Vegter

3
@MartinVegter Jak widać z odpowiedzi skryptu, robienie tego poprzez pewien rodzaj mechanizmu pam jest bardzo brzydkie. Naprawdę to jest dokładnie to, co sudobyło przeznaczone. Jakie są zastrzeżenia oprócz tego, że normalnie go nie używasz?
— Patrick

1
Jeśli możliwe jest zastosowanie czystego rozwiązania pam, wolałbym to sudo. Jeśli sudojest to jedyna możliwość, to też jest w porządku. Moje zastrzeżenia sudosą głównie ideologiczne: nie podoba mi się pomysł użytkownika administrującego sudo foo. Kiedy potrzebuję administracji, loguję się jako root. W przeciwnym razie loguję się jako użytkownik. Te dwie różne role nie powinny być mieszane. Ponadto mam już pamzainstalowaną infrastrukturę. Nie chcę instalować innego setuidprogramu, który może wprowadzić błędy bezpieczeństwa.
— Martin Vegter

5
@MartinVegter Nie musisz wykonywać sudo foookreślonych poleceń. Sudo ma, sudo -sktóry uruchomi powłokę. sudo jest bardzo powszechnym narzędziem, co oznacza, że ​​jego bezpieczeństwo zostało dokładnie sprawdzone, o wiele bardziej niż inne oszustwa. Argumentowałbym również, że uzyskanie powłoki root do zadań jest znacznie bardziej niepewne niż uruchamianie określonych poleceń. Po uruchomieniu powłoki uruchamiasz wszystko jako root. Jeśli którakolwiek z tych rzeczy (np. Prosta ls) ma lukę w zabezpieczeniach, właśnie otworzyłeś lukę w zabezpieczeniach.
— Patrick

Odpowiedzi:


61

Dodaj następujące linie bezpośrednio pod pam_rootok.solinią w swoim /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

Linie te wykonują kontrole za pomocą pam_succeed_if.somodułu. Zobacz także składnię pliku konfiguracyjnego Linux-PAM, aby dowiedzieć się więcej o authliniach.

  • Pierwszy wiersz sprawdza, czy jest to użytkownik docelowymartin-test . Jeśli tak, nic się nie dzieje ( success=ignore) i kontynuujemy w następnym wierszu, aby sprawdzić bieżącego użytkownika . Jeśli tak nie jest, następny wiersz zostanie pominięty ( default=1) i kontynuujemy w kolejnych wierszach ze zwykłymi krokami uwierzytelnienia.
  • Druga linia sprawdza, czy bieżącym użytkownikiem jest martin. Jeśli tak, system uznaje proces uwierzytelnienia za udany i zwraca ( sufficient). Jeśli tak nie jest, nic się nie dzieje i kontynuujemy kolejne linie ze zwykłymi krokami uwierzytelnienia.

Możesz również ograniczyć się sudo grupy, tutaj grupa allowedpeoplemoże subez hasła:

auth sufficient pam_succeed_if.so use_uid user ingroup allowedpeople

1
Jeśli chcesz autoryzować, jeśli należą do określonej grupy: auth wystarczająca pam_succeed_if.so GRUPA grupy użytkowników
— shrimpwagon

@gnp Super Thanks !! Pracując na iCinga z nrpe, musisz wykonać jakieś polecenie jako inny użytkownik !! Pomógł dużo !!!!!! Dzięki!!!!!
— saravanakumar


Przydałoby się również dodać informacje o tym, jak zastosować zmiany.
— Kyslik

@Kyslik, co masz na myśli? Instrukcje dotyczące edycji niezbędnych plików znajdują się w odpowiedzi ...
— GnP

12

Jeśli nie chcesz zmieniać grup ani używać sudo, użyj modułu pam wywoływanego pam_execdo wykonywania zewnętrznych skryptów na etapie pam.

Dodaj wiersz /etc/pam.d/supo swoim pam_rootok.sowierszu:

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

/path/to/script ma uprawnienia 755 (rwxr-xr-x) i następującą treść:

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

Ten skrypt istnieje z powodzeniem, jeśli su:

  • jest wywoływany w kontekście uwierzytelnienia,
  • użytkownik dzwoniący to martini
  • użytkownik do uwierzytelnienia to martin-test.

Widzieć:

martin@host:~$ su - martin-test
martin-test@host:~$ exit
martin@host:~$ su - otheruser
Password: ****
otheruser@host:~$ 

1
pam_access może być użyty do zapewnienia podobnej funkcjonalności, bez polegania na skrypcie. (tak właśnie zrobiono pam_access)
— jsbillings

1
@jsbillings Czy zrobiłbyś (z pewnymi szczegółami) inną odpowiedź?
— Hauke ​​Laging

1
jak musiałbym zmodyfikować mój, /etc/pam.d/suaby wykorzystać w pam_accessmojej sytuacji?
— Martin Vegter

3
@jsbillings Właściwie pam_accessnie mogę tego zrobić. Kiedy suprzechodzi przez stos pam, robi to jako użytkownik, do którego się zmieniasz, a nie użytkownik, z którego się zmieniasz. Więc jeśli dodać regułę, takie jak + : martin : ALL, pozwoli to ktoś zmienia się martin . Nawet jeśli zmienisz martinna martin-test, nadal pozwoli każdemu to zrobić. Musisz przeanalizować zarówno użytkownika, z którego pochodzisz, jak i użytkownika, na który się zmieniasz. Naprawdę, właśnie po to sudojest ...
— Patrick

0

Jeśli nie masz dostępu do konta root, ale masz hasło użytkownika, którego chcesz użyć do uruchomienia polecenia, możesz wykonać następujące czynności.

  • Spowoduje to podanie hasła do toto: su - toto -c whoami
  • To nie będzie: ssh toto @ localhost whoami

Po prostu zainstaluj swój klucz publiczny w uprawnionych kluczach toto


Przemyślana odpowiedź .. Jednak polecenie, które ktoś chce spróbować, jest już na komputerze. Więc nie ma sensu ssh'ing do tego samego serwera.
— Raja Anbazhagan,

-1

Moje proste rozwiązanie to:

sudo login -f martin-test

Jeśli chcesz uniknąć sudo za wszelką cenę, myślę, że powinno być możliwe umieszczenie tego w skrypcie:

  1. należy do roota i ma uprawnienia roota (używając flagi setuid )
  2. wykonywalny przez wszystkich, również bez sudo.

Jednak nie mogę rozgryźć chown rooti chmod +s ToTest.shbitów, aby to faktycznie działało:

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

Nadal działam jako mój normalny użytkownik, jak mówi mi echo. I nadal wymaga hasła sudo. Gdyby działał jako root, można by zerwać z sudoostatnim wierszem ...


Flaga setuid na skrypcie powłoki (lub dowolnego innego skryptu) nie będzie działać w systemie Linux i nie bez powodu. Zauważ, że powyższy skrypt z działającą flagą suid byłby natychmiast pułapką: uruchamia bash za pomocą „env” (całkiem samobójczo, ponieważ jeśli zakładasz, że nie wiesz, gdzie bashjest, dlaczego zakładasz, że wiesz, gdzie envjest lub czy w ogóle istnieje?). Ale ostatecznie nie wiesz, co bashto dokładnie będzie. Może pochodzić z katalogu użytkownika wywołującego i został skompilowany minutę wcześniej z jego kodu źródłowego. Widzisz gdzie idę? Albo użytkownik może zastąpić whoami...
— David Tonhofer

Mój mózg jest obecnie zbyt daleko od tych problemów, aby w pełni zrozumieć, ale nadal dziękuję za szczegółowe wyjaśnienia.
— Frank Nocke
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.