Z pamiętnika z życia programisty FLOSS: Bezpieczna konfiguracja

Jakiś czas temu byłem zafascynowany projektem etckeeper. Prawdopodobnie przeczytałem o nim w Linux Magazine. Projekt robi w pewnym sensie to samo, co snapper, a mianowicie pozwala na przywracanie i zapisywanie konfiguracji systemu (choć snapper ma większy zakres działań).

Parę dni temu rozpocząłem projekt, który podchodzi do tego od innej strony. Również pozwala wyświetlić administratorowi listę dokonanych zmian, ale zamiast pozwalać na dokonanie zmian w systemie przed możliwością ich podejrzenia, izoluje zmiany i wyświetla je administratorowi z pytaniem czy je potwierdza.

Projekt jest przeznaczony raczej dla bardziej obeznanych z administrowaniem systemami ludzi. Normalna osoba pewnie nie zrozumie, co wynik polecenia diff (pokazywany w okienku) zawiera. Myślę jednak, że będzie pomocny, bo uwalnia adminów od ciężkiej, mozolnej pracy. Pozwala także na uruchamianie graficznego narzędzia we własnym środowisku. I chociaż wiem, że X-y podobno bezpieczeństwem nie grzeszą (część rzeczy, jak możliwość wywłaszczenia klawiatury i przechwytywania jej komunikatów wydaje się być dla mnie oczywista, lecz X-y podobno mają też inne niedociągnięcia), to uruchomiony program poprzez moje narzędzie, nie powinien móc nadpisywać plików systemowych. Inna sprawa jest z Waylandem.

Narzędzie to prosty skrypt bash-a. Korzysta z tar, flatpak, diff i find. Dodatkowo komunikuje się za pomocą dialog, kdialog lub zenity. Zenity jest obsługiwane jedynie częściowo, gdyż sposób jego użycia zawiera błędy. Obecnie udostępniłem pierwszą wersję narzędzia + prostą łatkę, dodającą obsługę zenity i dialog, a także poprawiającą małe błędy.

Programy wywoływane przez moje narzędzie są zależne od dystrybucji, bo:

  1. Jeden plik w archiwum tar z programem, zawiera listę paczek. Tutaj korzystamy z narzędzia RPM, by odnaleźć pliki należące do tej paczki. Jest więc zależne od dystrybucji RPM-owych, a dodatkowo od konkretnej dystrybucji, gdyż nazwy paczek mogą się różnić w poszczególnych dystrybucjach.
  2. Układ plików w systemie plików, a także wewnętrzny układ danych w pliku, mogą się różnić w poszczególnych dystrybucjach

Postanowiłem jednak ułatwić przenoszenie konfigóratorów na inne dystrybucje, więc skorzystałem z flatpaka. Może w przyszłości podejmę kroki, by ukryć różnice między dystrybucjami. Zastanawiałem się nad własnym systemem konfiguracji, z którego/na który dystrybucje mogłyby tłumaczyć swoje pliki ale to pieśń przyszłości.

Sposób działania jest następujący:

  1. Znalezienie właściwego odpowiednika dialog
  2. Jeśli odpowiedni program nie został znaleziony lub nie może pracować (np. jako dialog skrypt postanowił użyć konsolowego programu dialog, ale domyślne wejście nie jest terminalem), to używamy wall do powiadomienia o problemie i kończymy działanie
  3. Sprawdzamy czy program jest uruchomiony, jako root. Jeśli tak, to przechodzimy do punktu 6
  4. Informujemy użytkownika o tym, że może konieczne być ponowne uruchomienie programu jako root
  5. Jeżeli użytkownik zdecyduje się na uruchomienie jako root, to uruchamiamy program jako root (można to rozumieć, jako skok do punktu 1.).
  6. Rozpakowujemy archiwum tar z listą pakietów, właściwym programem i danymi dla flatpaka (nazwa środowiska wykonawczego i jego gałąź)
  7. Tworzymy odpowiednie katalogi tymczasowe. Od tego momentu, w razie przerwania pracy, katalogi tymczasowe zostaną usunięte
  8. Odczytujemy listę pakietów, zainstalowane wraz z nimi pliki i kopiujemy te pliki do katalogów tymczasowych
  9. Wyświetlamy użytkownikowi listę skopiowanych plików i pytamy o zgodę na kontynuację. Jeżeli użytkownik nie wyraził zgody na kontynuację, kończymy działania
  10. Wyświetlamy nazwę środowiska wykonawczego i jego pnia. Pytamy również o kontynuację, kończąc wykonanie w razie jej braku.
  11. Uruchamiamy skrypt basha w odpowiednim środowisku wykonawczym, udostępniając mu katalogi tymczasowe.
  12. Skrypt ten tworzy odpowiednie katalogi i dowiązania symboliczne do katalogów tymczasowych (utworzonych poprzednio), by właściwy program miał je w stałej lokalizacji.
  13. Skrypt ten uruchamia następnie właściwy program.
  14. Po zakończeniu właściwego programu i wyjściu z flatpaka, główny skrypt porównuje każdy plik z katalogu tymczasowego ze skopiowaną konfiguracją, z katalogiem root systemu.
  15. Główny skrypt wyświetla dane zgromadzone przez program diff i pyta czy nadpisać konfigurację systemu. Jeżeli użytkownik się nie zgodził, to kończymy działanie.
  16. Nadpisujemy konfigurację systemu.

Repo jest tutaj.