DevOps i automatyzacja Średnio zaawansowany 60 min

Bezpieczny obraz aplikacji

Ograniczysz zawartość obrazu i uprawnienia procesu, zachowując działający punkt wejścia aplikacji.

Wróć do listy lekcji

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

Przebuduj Dockerfile 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.

Flow nauki
  1. Teoria
  2. Przykład
  3. Ćwiczenie
  4. Quiz
  5. Praktyka
  6. Podsumowanie