Czy mogę sprawić, aby skrypt zawsze był wykonywany jako root?

27

Jak wykonać skrypt jako root, bez względu na to, kto go wykonuje?

Czytałem o setuid, ale nie wiem, jak to zrobić.

Używam Linuksa, Ubuntu 12.04 LTS.

HappyDeveloper
źródło
Na jakiej dystrybucji Linuksa jesteś? Albo nawet Unix?
slhck
@slhck Linux, Ubuntu 12
HappyDeveloper
3
setuid nie działa na skryptach - jest wyłączony ze względów bezpieczeństwa w większości dystrybucji * nix. Możesz to ustawić, ale zostanie zignorowany. Może możesz wyjaśnić więcej o swoim rzeczywistym problemie, abyśmy mogli pomóc Ci rozwiązać ten problem? Co to za skrypt? Dlaczego musisz go wykonać jako root? Jest używane sudo alternatywa?
slhck
Czy próbowałeś sudo -s?
Nam Phung

Odpowiedzi:

29

Bądź naprawdę ostrożny: skrypty połączone z setuid są niebezpieczne!

Najpierw spójrz na to pytanie / odpowiedzi , zwłaszcza na ta odpowiedź i ostrzeżenie dotyczące bezpieczeństwa .

Jeśli nadal chcesz wykonać skrypt za pomocą setuid ustaw, możesz napisać krótki program C jako opakowanie i ustawić setuid bit na skompilowanym pliku binarnym.

Przykład opakowania:

int main(void) {        
    setuid(0);
    clearenv();
    system("/absolute/path/to/your/script.sh");
}

Kolejne rozwiązanie sudo (wzmiankowany tutaj ):

  1. Jako root zapobiegaj zapisywaniu (a może innym) dostępu do skryptu:

    chown root /absolute/path/to/your/script.sh
    chmod 700 /absolute/path/to/your/script.sh
    
  2. Sprawdź, czy nikt oprócz roota nie może zastąpić skryptu , np. modyfikując prawa dostępu do folderu nadrzędnego:

    chown root /absolute/path/to/your/
    chmod 755 /absolute/path/to/your/
    
  3. Zmodyfikuj prawa dostępu sudo w /etc/sudoers z visudo:

    ALL    ALL = (root) NOPASSWD: /absolute/path/to/your/script.sh
    

    Więcej szczegółów na temat ustawień (np. Ograniczenie dostępu do określonych użytkowników lub grup) można znaleźć w podręczniku sudoers.

Następnie wszyscy użytkownicy mogą uruchomić skrypt jako root bez hasła:

sudo /absolute/path/to/your/script.sh

Jest to podobne do korzystania z powyższego rozwiązania opakowania / setuid.

speakr
źródło
3
Specyficzne zagrożenia nie są zbyt oczywiste, ale kręcą się mocno wokół środowiska. W przeciwieństwie do większości programów zachowanie skryptu powłoki może być znacząco zmienione przez dziesiątki zmiennych środowiskowych, na tyle, że bez obszernych zabezpieczeń taki skrypt może być łatwo podstępny do wykonania dowolnego kodu.
Stephanie
1
Powinieneś dodać wywołanie do clearenv () przed wywołaniem systemowym w tym opakowaniu, całkowicie usuwając środowisko, aby nie było żadnych złych ustawień, aby manipulować skryptem. kernel.org/doc/man-pages/online/pages/man3/clearenv.3.html
Stephanie
@Stephanie Dzięki, dodałem to.
speakr
@Stephanie Muszę robić coś złego, ponieważ to wszystko wygląda zbyt szalenie na wspólne zadanie. Właśnie to staram się robić: serverfault.com/questions/401405/…
HappyDeveloper
4
sudo może być użyty do zapewnienia wszystkim użytkownikom dostępu do określonego programu (lub skryptu). W tym sensie działa jak fantazyjne opakowanie setuid. Wydaje się, że zazwyczaj byłby to lepszy wybór niż pisanie własnego opakowania setuid.
jjlin
4

Najłatwiejszym i najbezpieczniejszym sposobem jest użycie bitów SETUID w uprawnieniach do plików. w ten sposób uprawnienia do poleceń zostaną podniesione do uprawnień właściciela pliku.

aby zapobiec skryptowi z edycji nie ustawiaj zapisu dla wszystkich bitów.

Tadas
źródło