Dziennik, który stale rośnie, przestaje rosnąć w chwili, gdy coś go odtwarza, a błąd mówi, że odmówiono uprawnień. Kuszacy wniosek jest taki, że sam plik dziennika potrzebuje więcej uprawnień, tymczasem plik może już być zapisywalny przez to samo konto. Dopisywanie do istniejącej nazwy i tworzenie nowej nazwy to dwie różne kontrole, i tylko druga pyta katalog.

Dopisywanie i tworzenie to różne kontrole

Otwarcie istniejącego pliku do dopisywania wymaga uprawnień zapisu na tym pliku oraz uprawnień wyszukiwania wzdłuż każdego katalogu w jego ścieżce. Utworzenie pliku wymaga zapisu i wyszukiwania w katalogu, który go zawiera, ponieważ operacja dodaje do niego nazwę. Zastąpienie pliku przez zmianę nazwy dotyka też obu katalogów i ich reguł sticky bitu.

OperationWhat must permit itTypical failure message
Append to an existing logFile write access, path traversalPermission denied on the file
Create a missing logDirectory write and search accessPermission denied on the path
Rename a replacement into placeBoth directories, plus sticky restrictionsPermission denied or operation not permitted

Już otwarty deskryptor dodaje czwarty przypadek. Proces może trzymać uchwyt zapisu otwarty przed zrzuceniem uprawnień i mimo to nie zdołać ponownie otworzyć tej samej ścieżki pod swoją późniejszą tożsamością. Udane dopisania i nieudane utworzenie mogą być jednocześnie prawdziwe, w tej samej chwili, dla tego samego procesu.

Domyślne ACL są dziedziczone, nie przyznają

Wpis zaczynający się od prefiksu domyślnego opisuje, co nowe obiekty dziedziczą z katalogu. Nie przyznaje niczego samemu katalogowi i nie naprawia ACL już istniejącego pliku.

namei -l /var/log/openvpn/server.log
getfacl -p /var/log/openvpn
getfacl -p /var/log/openvpn/server.log

Czytaj wpisy dostępu osobno od wpisów domyślnych i czytaj maskę. Wpis nazwany wyliczający pełne prawa nadal może być ograniczony maską, dlatego komentarz efektywny liczy się bardziej niż litery w pierwszym wierszu.

Używaj ścieżki rozwiązanej, a nie ścieżki z konfiguracji. Dowiązanie symboliczne, punkt montowania lub obrócony katalog mogą umieścić rzeczywisty plik tam, gdzie przyznane uprawnienie nigdy nie dociera. Najpierw przejdź ścieżkę narzędziem nazw, potem porównaj każdy poziom z danym kontem. Zgadywanie katalogu najwyższego poziomu to sposób, w jaki poprawka ląduje o jeden poziom za wysoko.

Ustal, kto pisze w tej chwili

Przed zmianą czegokolwiek sprawdź jednostkę usługi, jej drop-iny i ustawienia konta samego demona. Proces dopisujący i proces odtwarzający mogą się różnić: pomocnik rotacji, pisarz stanu i czytnik sieciowy rzadko dzielą tożsamość.

Test uruchomiony z powłoki root nie odtwarza ograniczonej usługi, i zakończy się sukcesem, podczas gdy usługa nadal zawodzi. Odtwórz nieudaną operację w tej samej jednostce, z tym samym kontem i tymi samymi ustawieniami sandboxa. Jeśli nie możesz, uruchom jednostkę z tymczasową powłoką i sprawdź tożsamość, którą zgłasza. Wszystko inne mierzy twój terminal, a nie usługę.

Jeśli utworzenie jest naprawdę konieczne, daj pisarzowi dostęp do dedykowanego katalogu dziennika, a dostęp do odczytu dla konsumentów trzymaj osobno. Uczynienie wspólnego konta lub całego drzewa aplikacji zapisywalnym, aby zaspokoić jedno wywołanie logowania, zamienia mały problem na duży.

Rotuj bez ponownego wprowadzania problemu

Ten, kto odtwarza plik, decyduje o jego właścicielu i trybie na następny cykl, więc skoordynuj poprawkę z konfiguracją rotacji. Zamiennik utworzony pod innym kontem lub ze świeżym ACL przywraca błąd po udanej korekcie.

Ustaw tryb i grupę przy tworzeniu, nie później, i weryfikuj następną rotację, a nie następne dopisanie. Dopisanie tylko powtarza test, który już przeszedł. Jeśli narzędzie rotacji oferuje ustawienie trybu tworzenia, użyj go zamiast chmod po utworzeniu. Luka między utworzeniem a chmod to dokładnie ten moment, w którym następny zapis może zawieść.

Gdy obcinanie i tak zawodzi, przestań dodawać uprawnienia

Niepowodzenie obcięcia pliku, do którego możesz pisać, nie wynika z uprawnień katalogu, a dodawanie ich nie pomoże. Spójrz zamiast tego na atrybuty i ograniczenie: atrybut tylko-do-dopisywania pozwala pisać wyłącznie w trybie dopisywania, a montowanie tylko do odczytu lub sandbox usługi mogą odmówić operacji, którą ACL dopuszcza.

Sprawdź ograniczenia systemu plików jednostki i opcje montowania ścieżki, a następnie odtwórz dokładnie tę operację, która zawiodła. Rozszerzanie uprawnienia, którego nigdy nie sprawdzono, tylko ukrywa, które ograniczenie było prawdziwe. Usuń jedno ograniczenie naraz w jednorazowej jednostce i przywróć je przed zmianą czegokolwiek trwałego.

Powiązane artykuły