requirements.txt: Narzędzie podstawowe czy ukryte zagrożenie?
Każdy projekt Pythona to ma. Ten niewinnie wyglądający requirements.txt plik znajdujący się w katalogu głównym repozytorium pip install requirements.txt consumes to lista zależności, ale jeśli nie będziesz ostrożny, może to być również szeroko otwarte drzwi do niestabilnych kompilacji, podatnych na ataki pakietów i poważnych problemów bezpieczeństwa.
W jego rdzeniu wymagania.txt kontroluje, jakie pakiety firm trzecich Twoja aplikacja pobiera. Po uruchomieniu pip install -r requirements.txtMenedżer pakietów Pythona instaluje wszystkie wymienione zależności. Ale jest pewien haczyk: jeśli nie przypniesz dokładnych wersji, zaufanie PyPI Zawsze dostarczać bezpieczną, kompatybilną i niezmodyfikowaną wersję. Tak nie działa współczesny AppSec.
Bez przypinania kompilacje mogą się nie powieść. Co gorsza, Twoja aplikacja może nieświadomie pobrać złośliwe pakiety. Wersjonowanie otwarte (Kolba >=1.0, na przykład) lub luźne ograniczenia wersji (django~=3.2) są podatnym gruntem do wstrzykiwania niebezpiecznego kodu. Dlatego właściwe zarządzanie wymagania.txt jest podstawowym zadaniem bezpieczeństwa.
Gdzie znajdują się informacje o plikach pip freeze i pip install requirements.txt
zamrożenie pip jest wygodny, ale też niebezpieczny, gdy jest używany bez zrozumienia, co przechwytuje. Programiści często generują wymagania.txt za pomocą wymagania dotyczące zamrożenia pip.txt, oczekując, że zablokuje ich środowisko. Jednak zamrożenie nie weryfikuje bezpieczeństwa ani pochodzenia zależności; po prostu usuwa wszystkie aktualnie zainstalowane pakiety, w tym pakiety przechodnie i potencjalnie nieaktualne.
Wyobraź sobie teraz, że kolega z drużyny lub Twój CI biegnie w ciemno pip install -r requirements.txt. Jeśli plik zawiera przestarzałe, podatne na ataki lub nawet pakiety z błędami typograficznymi, właśnie zautomatyzowałeś incydent bezpieczeństwa.
Szybki przykład:
# Developer's freeze output
pip freeze > requirements.txt
boto3==1.24.20
requests==2.27.1
⚠️ Niebezpieczny przykład, nie używać w środowisku produkcyjnym
Teraz dodaj to do swojego CI pipeline:
- name: Install dependencies
run: pip install -r requirements.txt
Ufasz, że środowisko jest powtarzalne, że nic nie zmieniło się w PyPI i że każda zależność jest nadal bezpieczny. To ogromne założenie, jeśli polegamy na wymagania dotyczące zamrożenia pip.txt przepływy pracy.
Rzeczywiste zagrożenia bezpieczeństwa aplikacji: typosquatting i zamieszanie wokół zależności w pliku requirements.txt
Atakujący uwielbiają ekosystemy open source. Dlaczego? Ponieważ programiści często polegają na domyślnych ustawieniach i dorozumianym zaufaniu. Oto jak atakują, wykorzystując… wymagania.txt:
- Typosquatting:Przesyłanie złośliwego pakietu o nazwie takiej jak prośby zamiast wywołań. Jedna postać i twoja konstrukcja jest twoja.
żądania # ⚠️ Przykład ilustracyjny, nie jest to prawdziwy pakiet do zainstalowania
- Zamieszanie związane z zależnością:Jeśli Twój wewnętrzny pakiet nie jest przypięty ani nie ma prywatnego zakresu, atakujący mogą opublikować złośliwą wersję w PyPI o tej samej nazwie. Jeśli Twój CI nie zweryfikuje źródeł, zainstalujesz jego pakiet zamiast swojego.
Oba ataki wykorzystują brak ścisłego przypinania i kontroli źródła w wymagania.txt. Jeśli twoje po prostu mówi jakaś-wewnętrzna-bibliotekai biegniesz wymagania instalacyjne pip.txt w CI może pobrać niewłaściwy pakiet z niewłaściwego miejsca.
Zabezpieczanie pliku requirements.txt w CI/CD Pipelinez haszami i przypinaniem
Oto jak utwardzić wymagania.txt przed zagrożeniami ze świata rzeczywistego:
- Przypnij dokładne wersje: Zawsze używaj == za każdy pakiet w Twoim wymagania.txt. Żadnych symboli wieloznacznych, żadnych zakresów.
- Zastosowanie –require-hashes:To sprawia, że pip install -r requirements.txt zweryfikuj integralność każdego pobranego pakietu.
Przykład:
flask==2.2.5 \
--hash=sha256:
⚠️ Przykład demonstracyjny, zastąp prawdziwym hashem w rzeczywistych projektach
- Izoluj swoje kompilacje: Zawsze buduj w czystych, minimalistycznych pojemnikach. Nigdy nie ufaj bezkrytycznie obrazowi bazowemu.
- Użyj prywatnego indeksu PyPI: Hostuj własny serwer proxy/pamięć podręczną i przesyłaj tylko zaufane pakiety.
Uruchom skanowanie zależności:Zintegruj narzędzia takie jak audyt pip albo użyj SBOManaliza oparta na Twoim pipelines.
Przykładowy fragment kodu GitHub Actions:
- name: Secure install
run: pip install --require-hashes -r requirements.txt
⚠️ Edukacyjne pipeline na przykład dostosuj się do swojego otoczenia
Ścisłe obchodzenie się z pip install -r requirements.txt in CI/CD jest jednym z najprostszych sposobów na ograniczenie ryzyka związanego z oprogramowaniem typu open source.
Powtarzalne kompilacje: jak zachować ich stabilność w różnych środowiskach
Jeśli Twoja aplikacja działa lokalnie, ale nie działa w środowisku testowym lub produkcyjnym, występują niespójne zależności w wymagania.txt Są typowym podejrzanym. Nawet niewielki dryf powoduje duże problemy.
Zastosuj następujące strategie:
- narzędzia pip: Posługiwać się kompilacja pip generować wymagania.txt z wymagania.wRozwiązuje zależności poprzez odpowiednie przypinanie.
- Znaczniki środowiskowe:W przypadku pakietów specyficznych dla systemu operacyjnego lub zależności specyficznych dla wersji Pythona należy używać znaczników takich jak platforma_systemowa == 'Linux'.
- Buforowanie Dockera:W CI buforuj warstwy Dockera po zainstalowaniu zależności z wymagania.txt aby zmniejszyć zmienność kompilacji.
Przykład z pip-tools:
# requirements.in
flask
# Compile
pip-compile requirements.in
⚠️ Przykład demonstracyjny, rzeczywisty wynik zależy od środowiska
Wyjście jest w pełni przypięte wymagania.txt.
Narzędzia takie jak zamrożenie pip, w połączeniu z pip install -r requirements.txt podczas budowy wymagają dyscypliny i dodatkowych zabezpieczeń.
Wnioski: Pewne określenie wymagań
Niewłaściwe zarządzanie wymagania.txt To nie tylko zła praktyka; to aktywne zagrożenie bezpieczeństwa. Luźne przypinanie, niezweryfikowane instalacje i ślepe zaufanie do otwartych rejestrów to sposoby, w jakie atakujący wykorzystują Twoje CI/CD pipelineTo nie są błędy teoretyczne; są wykorzystywane codziennie.
Przypinanie zależności to coś więcej niż najlepsza praktyka. To pierwsza linia obrony przed atakami na łańcuch dostaw w Pythonie. Połącz to z –require-hashes, izolacja budowli i powtarzalne narzędzia, takie jak narzędzia pip, i otrzymujesz pipeline w tym przypadku trudniej o kompromis.
Czy używasz wymagania instalacyjne pip.txt Lokalnie lub w CI, zawsze weryfikuj i monitoruj to, co jest wprowadzane do Twoich kompilacji. Narzędzia takie jak Xygeni zapewnij widoczność, egzekwowanie zasad i automatyczne kontrole, które zabezpieczą Twój łańcuch dostaw Pythona wymagania dotyczące zamrożenia pip.txt przez cały proces produkcji.







