Wsparcie dla wtyczek python w sudo 1.9
Napisał: Patryk Krawaczyński
14/07/2021 w Bezpieczeństwo Brak komentarzy. (artykuł nr 791, ilość słów: 548)
W
szyscy znają sudo, prawda? Polecenie to pozwala administratorowi systemu nadać niektórym użytkownikom możliwość uruchamiania wybranych uprzywilejowanych poleceń, jednocześnie rejestrując ich argumenty i wykonanie. Program ten jest instalowany domyślnie prawie we wszystkich dystrybucjach systemu Linux i jest dostępny dla większości komercyjnych systemów Unix – umożliwiając precyzyjne dostosowywanie polityk dostępu. Mimo to nawet administratorzy systemów często wiedzą, że jest to “prefiks”, którego należy użyć przed uruchomieniem polecenia wymagającego uprawnień root nie zdając sobie sprawy z jego prawdziwych możliwości.
Od wersji 1.8 sudo
zmieniło swoją architekturę opierając swoje działanie na wtyczkach (ang. plugins). Umożliwia to rozszerzenie lub nawet zastąpienie podstawowych funkcjonalności tego narzędzia. Podczas, gdy wtyczki zapewniają bardzo dużą elastyczność (dostępne są zarówno komercyjne, jak i open source) – dostosowanie ich do własnych potrzeb może nie być łatwe i szybkie. Zmiana architektury sudo umożliwiła rozwój wielu dobrze zdefiniowanych interfejsów API dla wtyczek. Od wersji 1.9 wprowadzono możliwość rozszerzania funkcji za pomocą modułów Pythona. Istnieje kilka scenariuszy, w których można użyć języka Python:
- Policy – służy do definiowana polityk dostępu np. czy dany użytkownik jest uprawniony do uruchomienia określonego polecenia,
- Approval – służy do zatwierdzania poleceń, gdy polityka dostępu zakończyła się sukcesem np. umożliwienie uruchamiania poleceń tylko w godzinach pracy,
- Audit – służy do logowania informacji audytowych pod postacią akcji i wydawanych poleceń w ramach sesji sudo,
- I/O – służy do rejestrowania danych wejściowych i wyjściowych w ramach sesji sudo,
- Group provider – służy do potwierdzania, czy dany użytkownik należy do zewnętrznej grupy i tym samym ma możliwość wykonywania akcji sudo przewidzianych dla tej grupy.
Jeśli obsługa Pythona nie jest włączona w posiadanym pakiecie sudo będziemy musieli ponownie go skompilować i spakować używając flagi --enable-python
:
./configure --prefix=/usr --enable-python && make && make install
Gdy nasze sudo jest już gotowe do obsługi Pythona wystarczy w pliku sudo.conf
włączyć odpowiedni interfejs, który chcemy użyć:
Plugin python_io python_plugin.so ModulePath=/etc/sudo/mpasswd.py ClassName=Mpasswd
ModulePath
określa lokalizację skryptu Pythona, który będzie zawierał nasz kod, a ClassName
to klasa, która jest zdefiniowana w samym skrypcie. W poniższym przykładzie możemy zobaczyć użycie wtyczki I/O (/etc/sudo/mpasswd.py):
import sudo VERSION = 1.0 class Mpasswd(sudo.Plugin): def log_ttyout(self, buf: str) -> int: if "root:x:0:" in buf: sudo.log_error("Suspicious activity on passwd file detected!") return sudo.RC.REJECT if "8.8.8.8" in buf: sudo.log_error("Suspicious network activity detected!") return sudo.RC.REJECT
Przykład działania wtyczki:
agresor@darkstar:~$ sudo cat /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin ... Suspicious activity on passwd file detected! agresor@darkstar:~$ sudo host 8.8.8.8 8.8.8.8.in-addr.arpa domain name pointer dns.google. Suspicious network activity detected!
Używanie języka Python do rozszerzenia funkcjonalności sudo nie tylko ułatwia programowanie (nie jest konieczne żadne środowisko programistyczne), ale otwiera wiele nowych możliwości. Na przykład możemy opracować wtyczkę, która analizuje aktywność na ekranie w czasie rzeczywistym i przerywa sesję, jeśli na ekranie pojawi się niestosowne polecenie np. rm -rf /
lub wysyła powiadomienia w przypadku wykrycia podejrzanej aktywności.
Więcej informacji: Python plugins examples, Extending sudo in Python, Sudo Python Plugin API, Using Sudo with Python For More Security Controls