Wiele sysadminów Linux pracuje jako root

40

W naszym zespole mamy trzech doświadczonych administratorów Linuksa, którzy muszą administrować kilkadziesiąt serwerami Debiana. Wcześniej wszyscy pracowaliśmy jako root przy użyciu uwierzytelniania klucza publicznego SSH. Ale rozmawialiśmy o tym, jaka jest najlepsza praktyka dla tego scenariusza i nie mogliśmy się na nic zgodzić.

Każdy klucz publiczny SSH jest umieszczony w katalogu ~ root / .ssh / Author_keys2

  • Zaleta: łatwy w użyciu, przekazywanie agentów SSH działa łatwo, niewielki narzut
  • Wada: brak kontroli (nigdy nie wiadomo, który „root” dokonał zmiany), wypadki są bardziej prawdopodobne

Korzystanie ze spersonalizowanych kont i sudo

W ten sposób logujemy się za pomocą spersonalizowanych kont przy użyciu kluczy publicznych SSH i używamy sudo do wykonywania pojedynczych zadań z uprawnieniami roota . Ponadto moglibyśmy dać sobie grupę „adm”, która pozwala nam przeglądać pliki dziennika.

  • Zaleta: dobry audyt, sudo zbyt łatwo powstrzymuje nas od robienia idiotycznych rzeczy
  • Wada: przekazywanie agenta SSH psuje się, jest to kłopot, ponieważ prawie nic nie można zrobić jako użytkownik inny niż root

Korzystanie z wielu użytkowników UID 0

Jest to bardzo unikalna propozycja jednego z sysadminów. Sugeruje utworzenie trzech użytkowników w / etc / passwd, mających UID 0, ale inne nazwy logowania. Twierdzi, że tak naprawdę nie jest to zabronione i pozwala wszystkim być UID 0, ale nadal może kontrolować.

  • Zaleta: Przekazywanie agenta SSH działa, kontrola może działać (niesprawdzona), bez problemów sudo
  • Wada: jest dość brudna - nie można jej nigdzie udokumentować jako dozwolonego sposobu

Co byś zasugerował?

Signum
źródło
2
O Twojej wypowiedzi „nie można go nigdzie udokumentować jako dozwolonego sposobu”: spójrz na -oflagę na useraddstronie podręcznika. Ta flaga umożliwia wielu użytkownikom współużytkowanie tego samego identyfikatora użytkownika.
jlliagre
6
Czy możesz wyjaśnić, co rozumiesz przez „przerwy w przekazywaniu agenta SSH” w drugiej opcji? Używamy tego w mojej pracy, a przekazywanie agentów ssh działa dobrze.
Patrick
4
Powinieneś ssh out ze swojego konta innego niż root niż z sudo.
Random832
4
Kolejna konsekwencja metody sudo: nie możesz już SCP / FTP jako root. Wszelkie transfery plików należy najpierw przenieść do katalogu domowego osoby, a następnie skopiować w terminalu. Jest to zaleta i wada zależna od perspektywy.
user606723,
1
Dlaczego nie rozważa się systemów marionetkowych / szefów kuchni / ansible?
Alex Holst

Odpowiedzi:

64

Druga opcja jest najlepsza IMHO. Konta osobiste, dostęp sudo. Całkowicie wyłącz dostęp roota przez SSH. Mamy kilkaset serwerów i pół tuzina administratorów systemu, tak to robimy.

Jak dokładnie działa przekazywanie agentów?

Ponadto, jeśli jest to problem z użyciem sudokażdego zadania, możesz wywołać powłokę sudo za pomocą sudo -slub przełączyć się na powłokę root za pomocąsudo su -

thepearson
źródło
10
Zamiast całkowicie wyłączać dostęp do roota przez SSH, zalecam, aby dostęp do roota przez SSH wymagał kluczy, tworząc jeden klucz z bardzo silną frazą kluczową i trzymając go zablokowany tylko do użytku awaryjnego. Jeśli masz stały dostęp do konsoli, jest to mniej przydatne, ale jeśli go nie masz, może być bardzo przydatne.
EightBitTony
17
Zalecam wyłączenie logowania roota przez SSH ze względów bezpieczeństwa. Jeśli naprawdę musisz być zalogowany jako root, zaloguj się jako użytkownik inny niż root i su.
taz
+1 .. Chciałbym pójść dalej niż powiedzieć: „Druga opcja jest najlepsza”. Byłbym jedyną rozsądną opcją. Opcje pierwsza i trzecia znacznie zmniejszają bezpieczeństwo systemu przed atakami zewnętrznymi i błędami. Poza tym # 2 to sposób, w jaki system został zaprojektowany przede wszystkim do użytku.
Ben Lee
2
Proszę rozwinąć sudo -s. Czy słusznie rozumiem, że sudo -inie ma różnicy w używaniu su -lub zasadniczo logowaniu się jako root oprócz dodatkowego wpisu dziennika w porównaniu do zwykłego logowania root? Jeśli to prawda, w jaki sposób i dlaczego jest to lepsze niż zwykły login root?
PF4Public
9

Jeśli chodzi o trzecią sugerowaną strategię, inną niż useradd -o -u userXXXprzejrzenie opcji zalecanych przez @jlliagre, nie jestem zaznajomiony z obsługą wielu użytkowników jako tego samego identyfikatora użytkownika. (dlatego jeśli to zrobisz, byłbym zainteresowany, gdybyś mógł zaktualizować post o pojawiające się problemy (lub sukcesy) ...)

Wydaje mi się, że moje pierwsze spostrzeżenie dotyczące pierwszej opcji „Klucz publiczny SSH dla każdego jest umieszczony w katalogu ~ root / .ssh / author_keys2”, jest taki, że chyba, że ​​absolutnie nigdy nie będziesz pracować na żadnym innym systemie;

  1. przynajmniej przez jakiś czas będziesz musiał pracować z kontami użytkowników isudo

Drugim spostrzeżeniem byłoby to, że jeśli pracujesz na systemach, które aspirują do HIPAA, zgodności z PCI-DSS lub takich rzeczy jak CAPP i EAL, będziesz musiał obejść problemy sudo, ponieważ;

  1. Jest to standard branżowy zapewniający konta użytkowników innych niż root, które mogą być kontrolowane, wyłączane, wygasają itp., Zwykle przy użyciu scentralizowanej bazy danych użytkowników.

Więc; Korzystanie ze spersonalizowanych kont i sudo

To niefortunne, że jako administrator systemu prawie wszystko, co musisz zrobić na zdalnej maszynie, będzie wymagało pewnych podwyższonych uprawnień, jednak denerwujące jest to, że większość narzędzi i narzędzi opartych na SSH została zablokowana, gdy jesteś w sudo

Dlatego mogę przekazać pewne sztuczki, których używam, aby obejść irytujące sudowspomnienia, o których wspomniałeś. Pierwszy problem polega na tym, że jeśli logowanie użytkownika root jest zablokowane za pomocą PermitRootLogin=nolub nie masz konta root za pomocą klucza ssh, to powoduje, że pliki SCP są czymś w rodzaju PITA.

Problem 1 : Chcesz scpować pliki ze strony zdalnej, ale wymagają one dostępu do konta root, jednak nie możesz zalogować się do zdalnej skrzynki jako root.

Nudne rozwiązanie : skopiuj pliki do katalogu domowego, zmień i scp w dół.

ssh userXXX@remotesystem, sudo su -itp., cp /etc/somefilesdo /home/userXXX/somefiles, chown -R userXXX /home/userXXX/somefilesużyj scp do pobrania plików ze zdalnego.

Rzeczywiście bardzo nudne.

Mniej nudne rozwiązanie : sftp obsługuje -s sftp_serverflagę, dlatego możesz wykonać następujące czynności (jeśli skonfigurowałeś sudo bez hasła /etc/sudoers);

sftp  -s '/usr/bin/sudo /usr/libexec/openssh/sftp-server' \
userXXX@remotehost:/etc/resolv.conf 

(możesz również użyć tego hack-around z sshfs, ale nie jestem pewien, czy jest to zalecane ... ;-)

Jeśli nie masz praw do hasła sudo bez hasła lub z jakiegoś skonfigurowanego powodu powyższa metoda jest zepsuta, mogę zasugerować jeszcze jedną nudną metodę przesyłania plików, aby uzyskać dostęp do zdalnych plików root.

Metoda Port Forward Ninja :

Zaloguj się do zdalnego hosta, ale określ, że zdalny port 3022 (może być dowolny wolny i niezastrzeżony dla administratorów, tj.> 1024) ma być przekierowany z powrotem do portu 22 po stronie lokalnej.

 [localuser@localmachine ~]$ ssh userXXX@remotehost -R 3022:localhost:22
Last login: Mon May 21 05:46:07 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------

Zrootuj się w normalny sposób ...

-bash-3.2$ sudo su -
[root@remotehost ~]# 

Teraz możesz scpować pliki w innym kierunku, unikając nudnego, nudnego kroku tworzenia pośredniej kopii plików;

[root@remotehost ~]#  scp -o NoHostAuthenticationForLocalhost=yes \
 -P3022 /etc/resolv.conf localuser@localhost:~
localuser@localhost's password: 
resolv.conf                                 100%  
[root@remotehost ~]#  

 

 

Problem 2: Przekazywanie agenta SSH : Jeśli załadujesz profil główny, np. Poprzez określenie powłoki logowania, niezbędne zmienne środowiskowe dla przekazywania agenta SSH, takie jak SSH_AUTH_SOCKsą resetowane, dlatego przekazywanie agenta SSH jest „zepsute” sudo su -.

Połowa upieczonej odpowiedzi :

Wszystko, co poprawnie ładuje powłokę roota, słusznie zresetuje środowisko, jednak istnieje pewne obejście, którego możesz użyć, gdy potrzebujesz OBOWIĄZKOWEGO uprawnienia roota I możliwości korzystania z agenta SSH, W TYM SAMYM CZASIE

Osiąga to rodzaj profilu chimery, którego tak naprawdę nie należy używać, ponieważ jest to paskudny hack , ale jest użyteczny, gdy trzeba przesyłać pliki SCP ze zdalnego hosta jako root do innego zdalnego hosta.

W każdym razie możesz włączyć możliwość zachowania przez użytkownika zmiennych ENV, ustawiając następujące opcje w sudoers;

 Defaults:userXXX    !env_reset

pozwala to na tworzenie nieprzyjemnych hybrydowych środowisk logowania;

zaloguj się jak zwykle;

[localuser@localmachine ~]$ ssh userXXX@remotehost 
Last login: Mon May 21 12:33:12 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------
-bash-3.2$ env | grep SSH_AUTH
SSH_AUTH_SOCK=/tmp/ssh-qwO715/agent.1971

utwórz powłokę bash, która działa /root/.profilei /root/.bashrc. ale zachowujeSSH_AUTH_SOCK

-bash-3.2$ sudo -E bash -l

Ta powłoka ma uprawnienia roota i root $PATH(ale zepsuty katalog domowy ...)

bash-3.2# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
bash-3.2# echo $PATH
/usr/kerberos/sbin:/usr/local/sbin:/usr/sbin:/sbin:/home/xtrabm/xtrabackup-manager:/usr/kerberos/bin:/opt/admin/bin:/usr/local/bin:/bin:/usr/bin:/opt/mx/bin

Ale możesz użyć tego wywołania, aby wykonać czynności wymagające zdalnego rootowania sudo, ale także dostępu agenta SSH;

bash-3.2# scp /root/.ssh/authorized_keys ssh-agent-user@some-other-remote-host:~
/root/.ssh/authorized_keys              100%  126     0.1KB/s   00:00    
bash-3.2# 
Tom H.
źródło
1
Lubię hacki.
sjbotha
2

Trzecia opcja wygląda idealnie - ale czy rzeczywiście wypróbowałeś ją, aby zobaczyć, co się dzieje? Podczas może wyświetlić dodatkowe nazwy użytkowników na etapie uwierzytelniania, każdy wstecznego ma zamiar powrócić tą samą wartość.

Zezwolenie na bezpośredni dostęp do roota ssh to zły pomysł, nawet jeśli twoje maszyny nie są podłączone do Internetu / używają silnych haseł.

Zwykle używam „su” zamiast sudo w celu uzyskania dostępu do roota.

symcbean
źródło
4
Dodanie wielu użytkowników z tym samym UID powoduje problemy. Gdy aplikacje szukają nazwy użytkownika dla numeru UID, mogą wyszukiwać niewłaściwą nazwę użytkownika. Aplikacje działające pod rootem mogą myśleć, że działają jako niewłaściwy użytkownik, i zacznie wyskakiwać wiele dziwnych błędów (raz spróbowałem).
Patrick
8
Trzecia opcja to po prostu cholernie zły pomysł . Zasadniczo łamiesz relację 1: 1 między identyfikatorami UID i nazwami użytkowników, i dosłownie wszystko w Uniksie oczekuje, że ta relacja zostanie utrzymana. To, że nie ma wyraźnej zasady, by tego nie robić, nie oznacza, że ​​to dobry pomysł.
Shadur
Przepraszamy, ale trzecia opcja to okropny pomysł. Posiadanie wielu identyfikatorów UID 0 osób po prostu prosi o pomnożenie problemów. Opcja nr 2 jest jedyną rozsądną.
Doug
Trzecia opcja nie zasługuje na tyle głosów negatywnych. W Uniksie nie ma komendy, o której wiem, że ta pomyłka jest myląca, ludzie mogą być, ale komendy nie powinny mnie obchodzić. Jest to po prostu inna nazwa logowania, ale zaraz po zalogowaniu się używane jest pierwsze imię pasujące do identyfikatora użytkownika w bazie danych haseł, więc po prostu upewnij się, że najpierw pojawia się prawdziwa nazwa użytkownika (tutaj root).
jlliagre
@Patrick Czy widziałeś to w praktyce? O ile testowałem, to aplikacje wybierają rootużytkownika, jeśli rootużytkownik jest pierwszy /etc/passwdz UID 0. Zwykle zgadzam się z jlliagre. Jedynym minusem, jaki widzę, jest to, że każdy użytkownik jest rootużytkownikiem, a czasem może być mylące, aby zrozumieć, kto co zrobił.
Martin
2

Używam (1), ale zdarzyło mi się pisać

rm -rf / tmp *

w jeden niefortunny dzień. Mogę być wystarczająco zły, jeśli masz więcej niż garstkę administratorów.

(2) Jest prawdopodobnie bardziej zaawansowany - i możesz stać się pełnoprawnym rootem poprzez sudo su -. Wypadki są jednak nadal możliwe.

(3) Nie dotknąłbym barką. Użyłem go w Suns, aby mieć konto roota bez systemu operacyjnego (jeśli dobrze pamiętam), ale nigdy nie było solidne - i wątpię, czy byłoby to bardzo kontrolowane.

Alien Life Form
źródło
2

Zdecydowanie odpowiedz 2.

  1. Oznacza, że ​​zezwalasz na dostęp SSH jako root. Jeśli ta maszyna jest w jakikolwiek sposób publicznie dostępna, jest to po prostu okropny pomysł; kiedy uruchomiłem SSH na porcie 22, mój VPS co godzinę podejmował wiele prób uwierzytelnienia jako root. Miałem podstawową konfigurację IDS, aby rejestrować i blokować adresy IP, które podejmowały wiele nieudanych prób, ale wciąż przychodziły. Na szczęście wyłączyłem dostęp SSH jako użytkownik root, gdy tylko skonfigurowałem własne konto i sudo. Ponadto nie ma praktycznie żadnej ścieżki audytu.

  2. Zapewnia dostęp do katalogu głównego, gdy jest potrzebny. Tak, ledwo masz jakieś uprawnienia jako zwykły użytkownik, ale jest to dokładnie to, czego chcesz; jeśli konto zostanie przejęte, chcesz, aby jego możliwości były ograniczone. Chcesz, aby każdy dostęp superużytkownika wymagał ponownego wprowadzenia hasła. Dodatkowo, dostęp do sudo może być kontrolowany przez grupy użytkowników i ograniczony do konkretnych poleceń, jeśli chcesz, dając ci większą kontrolę nad tym, kto ma dostęp do czego. Ponadto polecenia są uruchamiane, ponieważ sudo może być rejestrowane, więc zapewnia znacznie lepszą ścieżkę audytu, jeśli coś pójdzie nie tak. Och, i nie uruchamiaj po prostu „sudo su -”, jak tylko się zalogujesz. To okropna, okropna praktyka.

  3. Pomysł twojego administratora jest zły. I powinien się czuć źle. Nie, maszyny * nix prawdopodobnie nie powstrzymają cię przed zrobieniem tego, ale zarówno twój system plików, jak i praktycznie każda aplikacja oczekuje od każdego użytkownika unikalnego identyfikatora UID. Jeśli zaczniesz iść tą drogą, mogę zagwarantować, że napotkasz problemy. Może nie od razu, ale w końcu. Na przykład, pomimo wyświetlania miłych przyjaznych nazw, pliki i katalogi używają numerów UID do oznaczenia swoich właścicieli; jeśli natrafisz na program, który ma problem ze zduplikowanymi identyfikatorami UID, nie możesz później zmienić identyfikatora UID w pliku passwd bez konieczności poważnego ręcznego czyszczenia systemu plików.

sudojest droga naprzód. Może to powodować dodatkowe problemy z uruchamianiem poleceń jako root, ale zapewnia bardziej bezpieczne okno, zarówno pod względem dostępu, jak i inspekcji.

Rohak
źródło
1

Zdecydowanie opcja 2, ale używaj grup, aby dać każdemu użytkownikowi jak najwięcej kontroli, bez konieczności używania sudo. sudo przed każdym poleceniem traci połowę korzyści, ponieważ zawsze znajdujesz się w strefie zagrożenia. Jeśli uczynisz odpowiednie katalogi zapisywalnymi przez sysadmins bez sudo, zwrócisz sudo do wyjątku, który sprawia, że ​​wszyscy czują się bezpieczniej.

juliański
źródło
1

W dawnych czasach sudo nie istniało. W konsekwencji posiadanie wielu użytkowników UID 0 było jedyną dostępną alternatywą. Ale nadal nie jest tak dobrze, zwłaszcza w przypadku logowania na podstawie identyfikatora UID w celu uzyskania nazwy użytkownika.

W dzisiejszych czasach sudo jest jedynym właściwym rozwiązaniem. Zapomnij o czymkolwiek innym.

Plusk
źródło
0

Jest to udokumentowane faktem. Jednorożce z BSD od dawna mają swoje konta na toor, a użytkownicy bashroot są zwykle akceptowaną praktyką w systemach, w których csh jest standardem (akceptowane nadużycia;)

rackandboneman
źródło
0

Być może jestem dziwny, ale metoda (3) właśnie pojawiła się w mojej głowie. Plusy: będziesz mieć nazwę każdego użytkownika w logach i będziesz wiedział, kto zrobił co jako root. Minusy: każdy z nich będzie cały czas rootowany, więc błędy mogą być katastrofalne.

Chciałbym zapytać, dlaczego wszyscy administratorzy mają dostęp do konta root. Wszystkie 3 zaproponowane przez Ciebie metody mają jedną wyraźną wadę: gdy administrator uruchomi taką sudo bash -llub inną funkcję sudo su -, tracisz zdolność do śledzenia, kto co robi, a potem błąd może być katastrofalny. Co więcej, w przypadku możliwego niewłaściwego zachowania może to nawet skończyć się znacznie gorzej.

Zamiast tego możesz rozważyć pójście inną drogą:

  • Utwórz użytkowników admin jako zwykłych użytkowników
  • Zdecyduj, kto musi wykonać jaką pracę (zarządzanie apache / zarządzanie postfiksami itp.)
  • Dodaj użytkowników do powiązanych grup (np. Dodaj „martin” do „postfix” i „mail”, „amavis”, jeśli go używasz itp.)
  • Napraw uprawnienia (chmod -R g + w postfix: postfix / etc / postfix)
  • podaj tylko względne moce sudo: (visudo -> niech martin użyje /etc/init.d/postfix, / usr / bin / postsuper itp.)

W ten sposób martin będzie w stanie bezpiecznie obsłużyć postfiks, aw przypadku pomyłki lub niewłaściwego zachowania utracisz tylko swój system postfiksów, a nie cały serwer.

Tę samą logikę można zastosować do dowolnego innego podsystemu, takiego jak apache, mysql itp.

Oczywiście jest to w tym momencie czysto teoretyczne i może być trudne do skonfigurowania. To wygląda na lepszy sposób. Przynajmniej dla mnie. Jeśli ktoś spróbuje tego, daj mi znać, jak poszło.

Tuncay Göncüoğlu
źródło
Powinienem dodać, że obsługa połączeń SSH jest w tym kontekście dość prosta. Jakąkolwiek metodą użyjesz, nie zezwalaj na logowanie roota przez SSH, pozwól poszczególnym użytkownikom ssh z własnymi poświadczeniami i stamtąd obsługuj sudo / nosudo / etc.
Tuncay Göncüoğlu