ubuntu: pozwól użytkownikowi uruchomić skrypt z uprawnieniami administratora

9

Mam Ubuntu 8.04 i chcę napisać skrypt bash, rootktóry będzie działał tak, jak każdy użytkownik.

Sam mogę zrobić sudo.

Jak mogę to zrobić?

WYJAŚNIENIE : Nie chcę tego robić w sudo, ponieważ wtedy użytkownicy będą musieli wpisać swoje hasło. Chcę tylko, żeby uruchomili skrypt jako root, być może coś w stylu setuida, nie wiem.

Lecieć jak po sznurku
źródło

Odpowiedzi:

23

Gdyby to był normalny plik binarny, możesz ustawić go w trybie setuid, uruchamiając

# chmod u+s /path/to/binary

Niestety skrypty nie mogą być setuid. (Cóż, możesz, ale jest to ignorowane). Powodem tego jest to, że pierwszy wiersz skryptu informuje system operacyjny, pod jakim tłumaczem ma uruchomić skrypt. Na przykład, jeśli masz skrypt z:

#!/bin/bash

Tak naprawdę skończyłbyś biegać

/bin/bash /path/to/script

Oczywiście potrzebujesz tłumacza setuid, co oznaczałoby, że wszystkie skrypty byłyby setuid. To byłoby złe.

Możesz to zrobić za pomocą sudo, umieszczając następujące polecenie w pliku / etc / sudoers, uruchamiając visudo.

ALL ALL=NOPASSWD: /path/to/script

A teraz każdy użytkownik może uruchomić

$ sudo /path/to/script

Pozwala im to uruchomić skrypt bez wpisywania hasła.

Istnieje alternatywa, która nie wymaga sudo w poleceniu, która wymaga utworzenia małego pliku binarnego z ustawionym skryptem, który wykonuje skrypt, ale każdy dodatkowy plik binarny z setuid stanowi kolejny potencjalny problem bezpieczeństwa.

David Pashley
źródło
Myślę, że to była odpowiedź, której szukałem. Czy nie mogę ustawić skryptu bash tylko binarnego? (Oczywiście, podjąłbym środki, aby było to nieedytowalne)
flybywire 18.10.2009
Nie, nie możesz ustawić skryptu jako setuid.
wfaulk
wfaulk: Kiedyś byłeś w stanie, ale najnowsze dystrybucje Linuksa już na to nie pozwalają. Możesz użyć narzędzia takiego jak shc, aby „skompilować” skrypt, a następnie uczynić go setuid.
Kyle Brandt,
wfaulk: Oczywiście, to byłoby na twojej drodze, aby zrobić coś, co jest celowo wyłączone, więc prawdopodobnie jest to zły pomysł :-)
Kyle Brandt
Zastąp ten termin ALLnazwą użytkownika, aby umożliwić uruchamianie tylko jednego sudoera bez wprowadzania hasła.
hdave
3

Musiałem wstawić ten wiersz NA KOŃCU / etc / sudoers: ALL ALL = NOPASSWD: <filename> Najwyraźniej późniejsze %admin ALL=(ALL) ALLzastąpienie wymagało hasła dla administratorów.

Nie ma problemu z bezpieczeństwem, który pozwala na uruchamianie skryptu jako root, o ile skrypt wykonuje dobrze określoną, nieszkodliwą dozwoloną akcję i, jeśli wartości dla jakichkolwiek parametrów nie mogą spowodować, że skrypt źle się zachowuje.

Ale jest gotcha ...

Zawsze używaj pełnych ścieżek w nazwach poleceń i plików. Jeśli napiszesz coś echo Hello world!w stylu myrootscript, ktoś może napisać a ~/bin/echo scripti myrootscriptwykonać jako root cokolwiek w nim jest.

/bin/echo "Hoping this will keep you safe" :-)

André
źródło
jeśli użytkownik inny niż root na maszynie może edytować ten skrypt, możliwe jest, że ten użytkownik przejmie maszynę. Jeśli ten sam użytkownik ma słabe hasło, nic nie stoi na przeszkodzie, aby komputer był całkowicie narażony na szwank.
hdave
2

Domyślnie członkowie wheelgrupy są uprawnieni do sudodowolnego polecenia jako root. Prawdopodobnie tak właśnie używasz sudodo tej pory.

Aby zezwolić innemu użytkownikowi, musisz utworzyć sudoersregułę. Na przykład:

mickey.mouse ALL = (root) NOPASSWD: /usr/local/bin/test.sh

Umożliwi użytkownikowi mickey.mouseuruchomienie polecenia /usr/local/bin/test.shtak, jak rootbez konieczności podawania dodatkowego hasła.

Powinieneś przeczytać ten dokument, aby uzyskać więcej informacji.

Dan Carley
źródło
Debian / Ubuntu używa grupy administracyjnej zamiast koła. To prawdopodobnie nieco dokładniejsza nazwa.
David Pashley,
Nazywaj mnie staroświeckim, ale ...;)
Dan Carley
1
staromodny: P
David Pashley
0

Użyj, chmod +s <filename>aby zobaczyć bit Suid. Oznacza to, że gdy plik jest wykonywany, działa z uprawnieniami właściciela pliku (więc zmień go na root, aby tak działał).

Jednak może to być BARDZO niebezpieczne w przypadku skryptów typu bash, ponieważ użytkownik znajduje sposób, aby to zmienić, może łatwo uzyskać powłokę root. Upewnij się, że nie może być napisany przez nikogo poza rootem.

Linux nie pozwala ci konfigurować skryptów, aby to zrobić, musisz go skompilować jako program. Zamiast tego możesz użyć pliku sudoers (/ etc / sudoers) i dodać taką linię.

<username> ALL = NOPASSWD: /path/to/script

Dentrasi
źródło
0

Inna alternatywa: możesz zrobić małe setuidowe opakowanie C wokół tego skryptu

  • sprawdza wszelkie ograniczenia, które możesz egzekwować (lista użytkowników, czas, obciążenie systemu, ...)
  • wykonywanie dzienników / audytów w razie potrzeby
  • wykonuje skrypt

Coś jak twój własny podzbiór wielu możliwości sudo.

mpez0
źródło