Container Security Best Practices | Enjyn Gruppe
Hallo Welt
Hallo Welt
Original Lingva Deutsch
Übersetzung wird vorbereitet...
Dieser Vorgang kann bis zu 60 Sekunden dauern.
Diese Seite wird erstmalig übersetzt und dann für alle Besucher gespeichert.
0%
DE Zurück zu Deutsch
Übersetzung durch Lingva Translate

235 Dokumentationen verfügbar

Wissensdatenbank

Container Security Best Practices

Zuletzt aktualisiert: 20.01.2026 um 11:24 Uhr

Container Security Best Practices

Container-Sicherheit erfordert Maßnahmen auf mehreren Ebenen. Lernen Sie Best Practices für sichere Images, Kubernetes-Konfiguration und Runtime-Schutz.

Security Layers

┌─────────────────────────────────────────────────────────────┐
│                  CONTAINER SECURITY LAYERS                  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   1. IMAGE SECURITY                                         │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • Minimale Base Images                               │  │
│   │ • Keine Secrets in Images                            │  │
│   │ • Vulnerability Scanning                             │  │
│   │ • Signierte Images                                   │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   2. REGISTRY SECURITY                                      │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • Private Registry                                   │  │
│   │ • Access Control                                     │  │
│   │ • Image Scanning bei Push                            │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   3. ORCHESTRATION SECURITY (Kubernetes)                   │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • RBAC                                               │  │
│   │ • Network Policies                                   │  │
│   │ • Pod Security Standards                             │  │
│   │ • Secrets Management                                 │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
│   4. RUNTIME SECURITY                                       │
│   ┌─────────────────────────────────────────────────────┐  │
│   │ • Seccomp/AppArmor                                   │  │
│   │ • Read-only Filesystem                               │  │
│   │ • Resource Limits                                    │  │
│   │ • Runtime Monitoring                                 │  │
│   └─────────────────────────────────────────────────────┘  │
│                                                             │
└─────────────────────────────────────────────────────────────┘

Sichere Dockerfiles

# ❌ UNSICHER
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nodejs npm
COPY . /app
RUN npm install
USER root
CMD ["node", "server.js"]

# ✅ SICHER
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM gcr.io/distroless/nodejs20-debian12
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY --chown=nonroot:nonroot . .
USER nonroot
EXPOSE 3000
CMD ["server.js"]
# Best Practices für Dockerfiles

# 1. Spezifische Tags statt :latest
FROM node:20.10.0-alpine3.19

# 2. Multi-Stage Builds
FROM node:20-alpine AS builder
# Build-Tools hier
RUN npm ci && npm run build

FROM node:20-alpine AS production
# Nur Production-Artefakte
COPY --from=builder /app/dist ./dist

# 3. Minimale Base Images
# Alpine, Distroless, oder Scratch

# 4. Keine Secrets im Image
# ❌ COPY .env /app/.env
# ✅ Secrets via Environment oder Mounted Volumes

# 5. .dockerignore nutzen
# .git, node_modules, .env, *.log

# 6. Non-root User
RUN addgroup -g 1001 appgroup && \
    adduser -u 1001 -G appgroup -D appuser
USER appuser

# 7. HEALTHCHECK
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -q --spider http://localhost:3000/health || exit 1

Image Scanning

# Trivy (Open Source Scanner)
trivy image myapp:latest

# Scan im CI/CD
trivy image --exit-code 1 --severity HIGH,CRITICAL myapp:latest

# Als GitHub Action
- name: Trivy Scan
  uses: aquasecurity/trivy-action@master
  with:
    image-ref: 'myapp:${{ github.sha }}'
    format: 'sarif'
    exit-code: '1'
    severity: 'CRITICAL,HIGH'

# Docker Scout
docker scout cves myapp:latest
docker scout recommendations myapp:latest

# Grype (Anchore)
grype myapp:latest

Kubernetes Pod Security

# Sichere Pod-Konfiguration
apiVersion: v1
kind: Pod
metadata:
  name: secure-pod
spec:
  # Service Account mit minimalen Rechten
  serviceAccountName: myapp-sa
  automountServiceAccountToken: false

  securityContext:
    runAsNonRoot: true
    runAsUser: 1000
    runAsGroup: 1000
    fsGroup: 1000
    seccompProfile:
      type: RuntimeDefault

  containers:
  - name: app
    image: myapp:v1.0.0
    imagePullPolicy: Always

    securityContext:
      allowPrivilegeEscalation: false
      readOnlyRootFilesystem: true
      capabilities:
        drop:
          - ALL
      privileged: false

    resources:
      limits:
        cpu: "500m"
        memory: "256Mi"
      requests:
        cpu: "100m"
        memory: "128Mi"

    volumeMounts:
    - name: tmp
      mountPath: /tmp
    - name: cache
      mountPath: /app/cache

  volumes:
  - name: tmp
    emptyDir: {}
  - name: cache
    emptyDir: {}

Pod Security Standards

# Namespace mit Pod Security Standard labeln
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/enforce-version: latest
    pod-security.kubernetes.io/warn: restricted
    pod-security.kubernetes.io/audit: restricted

# Levels:
# - privileged: Keine Einschränkungen
# - baseline: Verhindert bekannte Privilege Escalations
# - restricted: Streng, beste Security

# Was "restricted" verhindert:
# ✗ Privileged containers
# ✗ Host namespaces (network, PID, IPC)
# ✗ Host ports
# ✗ Running as root
# ✗ Privilege escalation
# ✗ Non-default capabilities

Network Policies

# Default: Deny All Ingress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny-ingress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
    - Ingress

---
# Erlaubt nur Traffic von Frontend zu Backend
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-allow-frontend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 8080

---
# Egress: Nur DNS und interne Services
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: restrict-egress
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Egress
  egress:
    # DNS erlauben
    - to:
        - namespaceSelector: {}
          podSelector:
            matchLabels:
              k8s-app: kube-dns
      ports:
        - protocol: UDP
          port: 53
    # Nur zu Database
    - to:
        - podSelector:
            matchLabels:
              app: database
      ports:
        - protocol: TCP
          port: 5432

Secrets Management

# ❌ UNSICHER: Secrets als Plain Text
apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
data:
  password: cGFzc3dvcmQxMjM=  # Base64 ist KEINE Verschlüsselung!

# ✅ BESSER: External Secrets Operator
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: db-credentials
spec:
  refreshInterval: 1h
  secretStoreRef:
    kind: ClusterSecretStore
    name: vault
  target:
    name: db-credentials
  data:
    - secretKey: password
      remoteRef:
        key: secret/data/production/database
        property: password

# ✅ BESSER: Sealed Secrets
# Verschlüsselt mit Cluster-Key, sicher für Git
kubeseal --format yaml < secret.yaml > sealed-secret.yaml
# Secrets als Files, nicht Env Vars (sicherer)
spec:
  containers:
  - name: app
    volumeMounts:
    - name: secrets
      mountPath: /etc/secrets
      readOnly: true
  volumes:
  - name: secrets
    secret:
      secretName: app-secrets
      defaultMode: 0400  # Nur lesbar für Owner

# Im Code:
const dbPassword = fs.readFileSync('/etc/secrets/db-password', 'utf8').trim();

RBAC

# Service Account mit minimalen Rechten
apiVersion: v1
kind: ServiceAccount
metadata:
  name: myapp-sa
  namespace: production

---
# Role mit minimalen Permissions
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: myapp-role
  namespace: production
rules:
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "list"]
    resourceNames: ["myapp-config"]  # Nur spezifische Resources

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: myapp-rolebinding
  namespace: production
subjects:
  - kind: ServiceAccount
    name: myapp-sa
    namespace: production
roleRef:
  kind: Role
  name: myapp-role
  apiGroup: rbac.authorization.k8s.io

Runtime Security

# Seccomp Profile (System Call Filter)
spec:
  securityContext:
    seccompProfile:
      type: RuntimeDefault  # Kubernetes Default Profile
      # type: Localhost
      # localhostProfile: profiles/custom.json

# AppArmor (Linux Security Module)
metadata:
  annotations:
    container.apparmor.security.beta.kubernetes.io/myapp: runtime/default

# Read-only Root Filesystem
securityContext:
  readOnlyRootFilesystem: true

# Dann tmpfs für schreibbare Verzeichnisse:
volumeMounts:
- name: tmp
  mountPath: /tmp
volumes:
- name: tmp
  emptyDir:
    medium: Memory
    sizeLimit: 64Mi

Vulnerability Checklist

IMAGE SECURITY
[ ] Minimales Base Image (Alpine, Distroless)
[ ] Spezifische Image Tags, nicht :latest
[ ] Multi-Stage Builds
[ ] Keine Secrets im Image
[ ] Image Scanning in CI/CD
[ ] Image Signing (Cosign, Notary)

POD SECURITY
[ ] runAsNonRoot: true
[ ] readOnlyRootFilesystem: true
[ ] allowPrivilegeEscalation: false
[ ] Drop ALL capabilities
[ ] Resource Limits gesetzt
[ ] Seccomp Profile aktiviert

KUBERNETES SECURITY
[ ] RBAC mit Least Privilege
[ ] Network Policies (Default Deny)
[ ] Pod Security Standards enforced
[ ] Secrets verschlüsselt (External Secrets)
[ ] Service Account Token nicht auto-mounted

RUNTIME
[ ] Logging und Monitoring
[ ] Anomalie-Detection
[ ] Regelmäßige Security Audits
[ ] Incident Response Plan
💡 Best Practices: 1. Defense in Depth - mehrere Security-Layer
2. Least Privilege überall anwenden
3. Regelmäßig Images auf Vulnerabilities scannen
4. Immutable Infrastructure - keine SSH in Container
5. Security als Teil der CI/CD Pipeline

Weitere Informationen

Enjix Beta

Enjyn AI Agent

Hallo 👋 Ich bin Enjix — wie kann ich dir helfen?
120