Bezpieczny obraz aplikacji
Ograniczysz zawartość obrazu i uprawnienia procesu, zachowując działający punkt wejścia aplikacji.
1. Krótka teoria
Prosty obraz aplikacji może zawierać kompilatory, cache pakietów i pliki budowy, których nie potrzeba podczas działania. Multi-stage build używa osobnego etapu do przygotowania zależności oraz mniejszego etapu runtime; COPY --from=build przenosi tylko wybrany wynik. W Pythonie można zbudować środowisko wirtualne w etapie build i skopiować je do etapu runtime o zgodnej wersji Pythona i systemu. Obraz slim zmniejsza liczbę zbędnych pakietów, lecz nadal trzeba regularnie aktualizować jego bazę. Instrukcja USER uruchamia aplikację bez uprawnień roota; katalogi potrzebne do zapisu muszą należeć do właściwego użytkownika. Nie ustawiaj USER dopiero w poleceniu uruchomieniowym, jeżeli obraz ma być bezpieczny domyślnie. Dla wydania wybierz kontrolowane wersje pakietów i obrazu bazowego, a przy wymaganej pełnej odtwarzalności użyj digestu. Hasła, tokeny i pliki .env pozostają poza obrazem. Test końcowy musi potwierdzić zarówno działanie endpointu, jak i UID procesu.
2. Przykłady komend
FROM python:3.12-slim AS build
Rozpoczyna etap przygotowania zależności.
FROM python:3.12-slim AS build
WORKDIR /srv/orders-api
RUN python -m venv /opt/venv
RUN /opt/venv/bin/pip install --no-cache-dir -r requirements.txt
Instaluje pakiety do środowiska przenoszonego między etapami.
COPY requirements.txt .
RUN /opt/venv/bin/pip install --no-cache-dir -r requirements.txt
COPY --from=build /opt/venv /opt/venv
Przenosi gotowe zależności do etapu runtime.
FROM python:3.12-slim
COPY --from=build /opt/venv /opt/venv
RUN useradd --system --uid 10001 --no-create-home orders
Tworzy konto o ograniczonych uprawnieniach w obrazie.
RUN useradd --system --uid 10001 --no-create-home orders
USER orders
Ustawia użytkownika domyślnego procesu kontenera.
USER orders
docker run --rm orders-api:secure id
Sprawdza UID uruchomionego procesu.
$ docker run --rm orders-api:secure id
docker image inspect --format '{{.Config.User}}' orders-api:secure
Odczytuje domyślnego użytkownika z metadanych obrazu.
$ docker image inspect --format '{{.Config.User}}' orders-api:secure
3. Zadanie praktyczne
orders-api na dwa etapy: build z instalacją zależności do /opt/venv i runtime z tym samym obrazem bazowym bez narzędzi budowania. Utwórz konto orders, nadaj mu dostęp do plików aplikacji i ustaw USER. Uruchom id w kontenerze oraz żądanie do endpointu; jeśli aplikacja zapisuje pliki, sprawdź uprawnienia wyłącznie potrzebnego katalogu.
4. Typowe błędy
- Kopiowanie całego etapu build do runtime zamiast wybranych artefaktów.
- Ustawianie USER bez dostępu do plików potrzebnych aplikacji.
- Traktowanie slim jako gwarancji braku podatności.
- Przekazywanie tokenów przez ARG, ENV lub COPY do obrazu.
- Łączenie etapów o niezgodnej wersji Pythona lub bibliotek systemowych.
5. Podsumowanie
Oddziel etap build od runtime, przenoś tylko potrzebne pliki i uruchamiaj proces jako użytkownik bez uprawnień roota. Mniejszy obraz i kontrola wersji ograniczają ryzyko, a test UID i endpointu potwierdza działanie po zmianach.