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 ?

Martin Vegter
źródło
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
GnP
źródło
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
@GnP Proszę o pomoc na askubuntu.com/questions/821793/…
Nullpointer,
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:~$ 
chaos
źródło
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

Patrick
źródło
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 ...

Frank Nocke
źródło
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