SlideShare uma empresa Scribd logo
1 de 56
Baixar para ler offline
Dockerbank 2
Szenarien des Routinebetriebs
Jens Piegsa
Berlin, 07.12.2016
Inhalt
• Docker im Produktiv‐Einsatz
• Antipatterns
• Konfigurationsmanagement
• Docker‐Containern absichern
• kontinuierliche Sicherheitsanalyse
• Secret‐Management
• Datensicherung und
‐wiederherstellung
• Protokollieren,
Überwachen,
Benachrichtigen
• Fazit, weitere Materialien
Dockerbank 2, Jens Piegsa 2
DOCKER IM PRODUKTIV‐EINSATZ
Dockerbank 2, Jens Piegsa 3
Was bedeutet produktiv?
• Betriebsszenarien:
– Docker lokal betreiben
– auf einem Intranet‐Server
– auf einem eigenen Webserver
– auf mehreren eigenen Servern
– auf cloud‐basierter Infrastruktur
• unterscheiden sich in Zielen und
Anforderungen
Dockerbank 2, Jens Piegsa 4
Docker lokal betreiben
• Ziele:
– leichtgewichtige Instanz einer vollständigen
Umgebung zu Testzwecken
– Entwicklung / Debugging von Docker Images
• Maßnahmen:
– Einsatz vertrauenswürdiger Images
(keine Schadcode)
– Verwendung von Volumes
(kein Datenverlust zwischen mehreren Session)
– Durchführung manueller Backups
Dockerbank 2, Jens Piegsa 5
Docker im Intranet betreiben
• Ziele:
– dauerhafte Bereitstellung von Diensten
– Test‐ / Deployment‐Pipelines
• Maßnahmen:
– periodische Backups
– Softwareaktualisierungen
– Einbindung von Storagelösungen
– Ressourcen‐Zuteilung
– Monitoring
Dockerbank 2, Jens Piegsa 6
Docker auf einem Webserver
• Ziele:
– dauerhafter Betrieb
– kurzzeitiger Betrieb zu Test‐, Demonstrationszwecken
• Maßnahmen:
– Serverzertifikate, verschlüsselte Kommunikation
– Monitoring, Logging
– Hardening des Host‐Systems, restriktive Firewall‐
Konfiguration
Dockerbank 2, Jens Piegsa 7
Docker auf mehreren Servern
• Ziele:
– Skalierung, Ausfallsicherheit von Diensten
– mehrere Mandanten
– Sicherheit: Trennung durch Netzwerkzonen, VMs
– Testumgebung
• Maßnahmen:
– Orchestrierung
– Konfigurationsmanagement, Secret Management
– Private Docker Registry
– CI/CD Pipelines
Dockerbank 2, Jens Piegsa 8
Docker produktiv: Antipatterns
ø Datenhaltung im Container
ø Images mit umgebungsspezifischer Konfiguration bzw. sensiblen Daten;
umgebungsspezifische Tags
ø Einsatz nicht reproduzierbarer Images (mittels docker commit
erzeugt oder aus Fremdquellen)
ø Container‐Modifikationen (docker cp, docker exec)
ø langlebige Container
ø Ausführung mehrerer Prozesse innerhalb eines Containers
ø Images mit vielen Schichten
ø implizite oder explizite Ausführung / Abhängigkeit von latest
ø Veröffentlichung aller Ports via docker run -P
ø zeitliche Abhängigkeiten zwischen Containern
Dockerbank 2, Jens Piegsa 9
KONFIGURATIONSMANAGEMENT
Dockerbank 2, Jens Piegsa 10
Konfigurationsmanagement
Docker Container
• Docker Image so entwickeln, dass
– sie unabhängig von der Umgebung (Entwicklung, Test,
QA, Staging, Produktion) bleiben
– initiale Konfigurationen über Umgebungsvariablen
vorgenommen werden können, die ggf. anwendungs‐
abhängig über ein Entrypoint‐Skript angewendet
werden
– veränderliche Konfigurationen aus Dateien,
idealerweise in separaten Verzeichnissen, gelesen
wird, die als (benannte) Volumes gemountet werden
– es keiner nachträglichen Modifikationen des
instanziierten Containers bedarf
Dockerbank 2, Jens Piegsa 11
Konfigurationsmanagement
Hostumgebung
• Einsatz herkömmlicher Konfigurations‐
managementwerkzeuge wie Puppet, Chef und
Ansible möglichst auf ein Minimum reduzieren
– Installation / Update der Hostumgebung
• docker, docker‐compose, Kubernetes‐, Mesos‐Cluster
– Einrichtung hybrider Umgebungen
– Sicherheitsvorkehrungen
Dockerbank 2, Jens Piegsa 12
SICHERHEIT VON DOCKER‐
CONTAINERN
Dockerbank 2, Jens Piegsa 13
Sicherheit: Container vs. VMs
Kriterium Virtuelle Maschinen (VM) Container
Isolation verfügen über eine zusätzliche Hypervisor‐
Schicht
teilen sich einen Kernel
Angriffsfläche enthalten viele Tools, die sich Angreifer
zunutze machen können
minimale Images
Kontrolle Begrenzung des Zugriffs auf Ressourcen Begrenzung des Zugriffs auf Ressourcen;
read‐only Dateisystem; Kernel Capabilities
Auditierung langlebig; divergieren vom Basisimage;
werden mittels Konfigurationsmanagement‐
software gepatcht
kurzlebig; Aktualisierung durch Austausch;
Image‐Anpassungen unter Versions‐
kontrolle; docker diff
Zuverlässigkeit haben sich in der Vergangenheit bewährt weniger Erfahrungswerte; rapide
Entwicklung
Fazit • kombinierter Einsatz von VMs und Containern: VMs zur Separierung von Container‐
Gruppen und Container als zusätzliche Sicherheit und wegen ihrer Features
• aktuell viele Bestrebungen VMs leichtgewichtiger und Container sicherer zu machen
• grundsätzlich: gestaffelte Sicherheitsvorkehrungen, Least‐Privilege‐Prinzip
Dockerbank 2, Jens Piegsa 14
Bedrohungen und Maßnahmen
Kernel‐
Exploits
Denial‐of‐
Service‐
Angriffe
Container‐
Breakouts
Vergiftete
Images
Verratene
Geheimnisse
Images auditieren (Dockerfile, statische Analyse) 
Abgrenzung von Container‐Gruppen durch VMs 
Gesamtes Container‐Dateisystem read‐only setzen    
Sensible Volumes read‐only deklarieren  
Kernel Capabilities einschränken  
CPU‐Ressourcen zuweisen 
Arbeitsspeicher limitieren 
SETUID/SETGID‐Dateizugriffsrechte entfernen  
Kommunikation zwischen Containern einschränken   
Nicht‐Root USER im Dockerfile festlegen   
Geheimnisse nicht in Umgebungsvariablen ablegen 
Container nicht --privileged starten   
Minimale Images ohne unnötige Pakete  
AppArmor, SELinux, Seccomp 
Dockerbank 2, Jens Piegsa 15
Syntax der Übungsbeispiele
Dockerbank 2, Jens Piegsa 16
mkdir ~/foo && 
echo "Beispiel" | 
tee -a ~/foo/bar && 
cat ~/foo/bar
Schreibzugriffe einschränken
• gesamtes Dateisystem auf read‐only setzen:
(kombinierbar mit Schreibrechten für Volumes)
• sensibles Volume read‐only deklarieren:
Dockerbank 2, Jens Piegsa 17
docker run --read-only --rm alpine touch x
docker run -v $(pwd):/secrets:ro --rm 
alpine touch /secrets/x
Kernel Capabilities einschränken
• bestimmte Capabilities deaktivieren:
• sämtliche Capabilities abschalten:
• Whitelist‐ und Blacklist‐Verfahren möglich durch
Kombination mit --cap-add
• siehe Man‐Pages: man capabilities
Dockerbank 2, Jens Piegsa 18
docker run --cap-drop SETGID --cap-drop SETUID 
--rm alpine su -c whoami postgres
docker run --cap-drop ALL --rm alpine 
ping localhost -c1
CPU‐Ressourcen zuweisen
• erfolgt anhand von relativer Wichtungen
• Wichtung beträgt standardmäßig 1024
• Beispiel erzeugt drei Container mit den Last‐
wichtungen 50%, 25% und 25%:
• Container entfernen mit docker rm -f …
Dockerbank 2, Jens Piegsa 19
docker run -d alpine sh -c 'yes>/dev/null' && 
docker run -d -c 512 alpine sh -c 'yes>/dev/null' && 
docker run -d -c 512 alpine sh -c 'yes>/dev/null' && 
top
Arbeitsspeicher limitieren
• einmalig Memory und Swap Limit Capabilities im
Host aktivieren (erfordert Neustart):
• Container auf 42MB Arbeits‐ und 42MB Swap‐
Speicher beschränken:
(Abbruch mittels der Tastenkombination Strg+C)
Dockerbank 2, Jens Piegsa 20
docker run -m 42m -d alpine tail -f /dev/null && 
docker stats
echo 'GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"'| 
sudo tee -a /etc/default/grub && 
sudo update-grub && sudo reboot
Ausführbare Dateien mit setuid‐/setgid‐
Zugriffsrechten entschärfen
1. Alle privilegierten Dateien finden:
2. Neues Dockerfile erstellen, das bei der Image‐Erstellung allen
Dateien die kritischen Zugriffsrechte entzieht:
3. Container auf Basis des neuen Image erstellen und testen:
Dockerbank 2, Jens Piegsa 21
docker run --rm debian find / -type f -perm /6000 
-exec stat -c "%A %a %n" {} ; 2>/dev/null
FROM debian:8.6
RUN find / -type f -perm /6000 -exec chmod a-s {} ; || true
USER daemon
docker build -t mostly-harmless . && 
docker run --rm mostly-harmless find / -type f -perm /6000 
-exec stat -c "%n" {} ; 2>/dev/null | wc -l
Absicherung der Kommunikation zwischen
Containern (I)
• Docker‐Terminologie (expose / publish ports) lässt
vermuten, dass die Kommunikation zwischen
Containern standardmäßig eingeschränkt ist
• Experiment:
Dockerbank 2, Jens Piegsa 22
docker inspect $(docker run -d nginx:alpine)
docker run --rm alpine wget -qO - -T10 -t1 <IPAddress>:80
Absicherung der Kommunikation zwischen
Containern (II)
• generelle Deaktivierung mit Ausnahme bei Container‐Verlinkung:
• unter Debian/Ubuntu zusätzlich notwendige Anpassung mittels
sudoedit /lib/systemd/system/docker.service vornehmen:
• Neustart und Prüfen der Argumente mittels der Prozessliste:
Dockerbank 2, Jens Piegsa 23
echo 'DOCKER_OPTS="--icc=false --iptables"' | 
sudo tee -a /etc/default/docker
...
[Service]
ExecStart=/usr/bin/docker -d -H fd:// $DOCKER_OPTS
EnvironmentFile=/etc/default/docker
...
sudo systemctl daemon-reload && 
sudo systemctl restart docker && 
ps aux | grep dockerd
Absicherung der Kommunikation zwischen
Containern (III)
• Experiment wiederholen:
• stattdessen Port‐Publishing über Host nutzen:
• oder alternativ mittels Container‐Verlinkung:
Dockerbank 2, Jens Piegsa 24
docker inspect $(docker run -d nginx:alpine)
docker run --rm alpine wget -qO - -T10 -t1 <IPAddress>:80
docker run -d -p 10080:80 nginx:alpine && 
docker run --rm alpine wget -qO - -T10 -t1 192.168.56.20:10080
docker run -d --name nginx nginx:alpine && 
docker run --rm --link nginx:web alpine sh -c 
'wget -qO - -T10 -t1 $WEB_PORT_80_TCP_ADDR'
KONTINUIERLICHE SICHERHEITSANALYSE
FÜR CONTAINER IMAGES
Dockerbank 2, Jens Piegsa 25
Sicherheitsanalyse
• automatisierte Analyse von Image‐Inhalten
anhand Liste bekannter Sicherheitslücken und
Schwachstellen (Common Vulnerabilities and
Exposures; CVE)
• unterschiedliche Techniken
– statische vs. dynamische Analyse
• verschiedene Integrationsmöglichkeiten
– manuelle Scans
– Registry‐ und Build‐Pipeline‐Integration
– Echtzeitbenachrichtigung
Dockerbank 2, Jens Piegsa 26
Kriterien zur Evaluierung von container‐
basierten Sicherheitsanalysewerkzeugen
• Technik
– Wie werden in einem Image enthaltene Softwareversionen detektiert?
(auf Basis des Paketmanagers oder binär)
– Welche Quellen u. Datenbanken bekannter Sicherheitslücken werden genutzt?
– Liegt der Analyseschwerpunkt eher auf anwendungs‐ oder docker‐spezifischen
Schwachstellen?
– Inwiefern werden in Produduktiveinsatz befindliche Images kontinuierlich
gescannt?
– Welche Container‐Technologien werden unterstützt?
• Integrierbarkeit
– Wo ist der Ansatzpunkt des Scanners in der eigenen Pipeline?
– Mit welchen Anwendungen arbeitet der Scanner zusammen (Registries, CI/CD‐
Lösungen, cloud‐basierten / selbstbetriebenen Orchestrierungsplattformen)?
– Wird neben der statischen Image‐Analyse auch Auditing der Host‐Umgebung
unterstützt (Konfiguration, Container)?
– Gibt es eine API für eine individuelle Integration (Erweiterbarkeit,
Benachrichtigungsmechanismen)?
Dockerbank 2, Jens Piegsa 27
Sicherheitsanalysewerkzeuge
Dockerbank 2, Jens Piegsa 28
• Docker Bench for Security (Docker, Apache‐Lizenz)
– prüft Docker‐ und Container‐Konfigurationen auf Einhaltung von "Best Practices" aufgestellt
vom Zentrum für Internet Security (CIS)
• Clair (CoreOS; Apache‐Lizenz)
– detektiert installierte Software über bekannte Paketmanager
– manuell installierte Komponenten bleiben unberücksichtigt
• Docker Security Scanning (Docker Inc.; kommerzielle Lizenz)
– Erkennung wird auf Binär‐Ebene durchgeführt, unabhängig vom Paketmanager
– integriert in Docker Cloud und Docker Datacenter, jedoch nicht unabhängig einsetzbar
• Twistlock Trust (sowohl freie, als auch kommerzielle Lizenz)
– Erkennung auf Binärebene
– berücksichtigt Zero‐Day‐Feeds
• OpenSCAP + Atomic Scan (Red Hat; GPL3‐Lizenz)
– spezialisiert auf Red‐Hat‐Linuxdistributionen
• Bluemix Vulnerability Advisor (IBM; kommerziell)
– integriert in cloud‐basierte Plattform Bluemix
 siehe auch: https://www.alfresco.com/blogs/devops/2015/12/03/docker‐security‐
tools‐audit‐and‐vulnerability‐assessment/
Docker Bench for Security
• Skript, das automatisiert auf Schwachstellen bzw. Einhaltung von
"Best Practices" beim Produktiveinsatz von Docker prüft
• basiert auf dem Docker‐Security‐Benchmark des Center for Internet
Security (CIS): https://benchmarks.cisecurity.org/tools2/docker/
CIS_Docker_1.11.0_Benchmark_v1.0.0.pdf
• generierter Testbericht enthält Verweise auf die Kapitel im
Dokument mit den entsprechenden Handlungsempfehlungen
Dockerbank 2, Jens Piegsa 29
sudo apt-get install auditd
cd ~
git clone https://github.com/docker/docker-bench-security.git
cd ~/docker-bench-security
sudo sh docker-bench-security.sh
Clair lokal aufsetzen
Dockerbank 2, Jens Piegsa 30
mkdir -p ~/clair/clair_config && 
cd ~/clair && 
curl -L https://raw.githubusercontent.com/coreos/clair/v1.2.6/docker-compose.yml -o docker-compose.yml && 
curl -L https://raw.githubusercontent.com/coreos/clair/v1.2.6/config.example.yaml 
-o clair_config/config.yaml && 
sed -i.bak 's* source:* source: postgresql://postgres:password@postgres:5432?sslmode=disable*g' 
clair_config/config.yaml && 
printf 'n' >> docker-compose.yml && 
sed -i.bak -e 's/^$/ restart: unless-stopped/g' docker-compose.yml && 
docker-compose up -d && 
sudo apt-get -y install golang-go && 
printf 'nexport GOPATH=/usr/share/go/nexport PATH=$PATH:/usr/lib/go/binn' | sudo tee -a /etc/profile && 
sudo su -c 'go get -x -v -u github.com/coreos/clair/contrib/analyze-local-images' && 
docker-compose logs -f # wait until the vulerability database is updated
Clair mittels CLI einsetzen
• Workflow:
1. mittels docker pull oder docker build Image
lokal bereitstellen bzw. mittels docker images
auffinden
2. Einsatz: analyze-local-images myimage
3. Recherche anhand des Berichtes durchführen
4. Optionen:
a) keine Korrektur, bei geringfügigem Risiko
b) Image Maintainer um Korrektur bitten
c) Schwachstelle selbst beheben und ggf. dem Maintainer
rückmelden
d) alternatives Image einsetzen
5. Analyse regelmäßig wiederholen
Dockerbank 2, Jens Piegsa 31
Secret‐Management
Wo können Geheimnisse aufbewahrt werden?
Dockerbank 2, Jens Piegsa 32
im Docker Image
in Umgebungsvariablen
in Dateien innerhalb von Volumes
in einem Secret Store
DATENSICHERUNG UND
‐WIEDERHERSTELLUNG
Dockerbank 2, Jens Piegsa 33
Datenpersistenz in Containern
• Volume‐Arten: anonyme, host‐gebundene und benannte Volumes
• wird ein benanntes Volume impliziert bei Container‐Erzeugung
angelegt werden vorhandene Dateien aus dem zugeordneten
Verzeichnis des Image in das Volume kopiert
• wird bei Container‐Erzeugung ein bestehendes Volume gemountet
findet kein initialer Kopiervorgang statt
• mit dem Stopp eines Containers werden keine Inhalte gelöscht
• mit dem Löschen eines Containers gehen alle Inhalte des Container‐
Dateisystems verloren, Volumes bleiben jedoch erhalten
– anonyme Volumes lassen sich anschließend mittels docker volume
ls und docker volume inspect VID wieder auffinden und
nachnutzen
– wird docker rm mit dem Schalter -v ausgeführt, werden alle
anonymen Volumes eines Containers gelöscht, es sei denn, sie sind
mittels --volumes-from an weitere Container gebunden
Dockerbank 2, Jens Piegsa 34
Sicherungsmöglichkeiten
• Sicherung und Wiederherstellung von
– Docker‐Images
– Docker‐Containern
– Dateien / Verzeichnissen in Containern ohne Volume
– Dateien / Verzeichnissen aus anonymen Volumes
– benannten Volumes
– Datenbank‐Dumps
• manueller Backup‐Container
• kurzlebiger Backup‐Container über cronjob auf dem Host
• permanenter Backup‐Container mit cron im Vordergrund
Dockerbank 2, Jens Piegsa 35
Sicherung und Wiederherstellung von
Dateien in Containern ohne Volume
• Sicherungskopie des Ordners /data des Containers SOURCE im
aktuellen Arbeitsverzeichnis des Hostsystems anlegen:
• Kopie des Ordners data im aktuellen Arbeitsverzeichnis des
Hostsystems in das Verzeichniss /data des TARGET‐Containers:
• Nachteil: Applikation und Daten sind eng gekoppelt
• besser: Einsatz von Volumes vereinfacht Aktualisierung von
Containern und schafft Transparenz
Dockerbank 2, Jens Piegsa 36
docker cp SOURCE:/data $(pwd)/data
docker cp $(pwd)/data TARGET:/data
Sicherung und Wiederherstellung einzelner
Verzeichnisse aus anonymen Volumes
• Sicherung des Ordners /data des Containers SOURCE als
Archivdatei in das aktuelle Arbeitsverzeichnis des Hostsystems:
• Wiederherstellung des Ordners /data aus Archivdatei im aktuellen
Arbeitsverzeichnis des Hostsystems in den Containers TARGET:
• Nachteile: anonyme Volumes sind schwer zuzuordnen;
Backup‐Routine hat Zugriff auf alle Volumes
• besser: benannte Volumes
Dockerbank 2, Jens Piegsa 37
docker run --rm --volumes-from SOURCE:ro 
-v $(pwd):/backup alpine 
tar cvzf /backup/backup_$(date +%Y-%m-%d_%H%M).tar.gz /data
docker run --rm --volumes-from TARGET 
-v $(pwd):/backup:ro alpine 
tar xvf /backup/backup_2016-12-07_13-30.tar
Sicherung und Wiederherstellung von
benannten Volumes
• Sicherung aller Dateien des benannten Volumes SOURCE als
Archivdatei in das aktuelle Arbeitsverzeichnis des Hostsystems:
• Wiederherstellung aller Dateien aus Archivdatei im aktuellen
Arbeitsverzeichnis des Hostsystems in das Volume TARGET:
• Nachteile: Volume‐Namensschema bei Skalierung?
Dockerbank 2, Jens Piegsa 38
docker run --rm -v SOURCE:/data:ro 
-v $(pwd):/backup alpine 
tar cvzf /backup/backup_$(date +%Y-%m-%d_%H%M).tar.gz /data
docker run --rm -v TARGET:/data 
-v $(pwd):/backup:ro alpine 
tar xvf /backup/backup_2016-12-07_13-30.tar.gz
Backup‐Beispielcontainer
• tutum/mysql‐backup:
• spoqa/postgresql‐backup
• osixia/openldap‐backup
Dockerbank 2, Jens Piegsa 39
docker run -d 
--env MYSQL_HOST=mysql.host 
--env MYSQL_PORT=27017 
--env MYSQL_USER=admin 
--env MYSQL_PASS=password 
--volume host.folder:/backup
tutum/mysql-backup
PROTOKOLLIERUNG, ÜBERWACHUNG,
BENACHRICHTIGUNG
Dockerbank 2, Jens Piegsa 40
Ziele
• Zuverlässigkeit bereitgestellter Dienste gewährleisten
– Ausfallzeiten reduzieren
– Softwarefehler frühzeitig erkennen
– auf Performance‐Engpässe reagieren
– Dateneingaben auditieren
• Einbruchsschutz
– Schwachstellen identifizieren
– Angriffe frühzeitig erkennen
– Schadensausmaß bestimmen / reduzieren
• Prozessoptimierung
– Anwenderverhalten auswerten
Dockerbank 2, Jens Piegsa 41
Möglichkeiten der Protokollierung
• docker logs ist die einfachste Lösung, hat jedoch für den
Produktiveinsatz einige Nachteile:
– kann nur mit STDOUT‐ und STDERR‐Ausgaben umgehen
– Protokolle gehen mit dem Entfernen eines Containers verloren
– das intern genutzte JSON‐Format ist speicherintensiv, erschwert
einfache Suchen und zerlegt Stacktraces zeilenweise in mehrere
Abschnitte
– unterstützt keine Log‐Rotation
• Log‐Dateien in ein Docker Volume schreiben
• spezialisierte Logging‐Dienste einsetzen
– z.B. syslog‐ng, rsyslog, logstash, logspout, filebeat, fluentd
• Komplettlösungen:
– ELK‐Stack: Elasticsearch, Logstash, Kibana
– Logentries (kommerzielle Lizenz)
Dockerbank 2, Jens Piegsa 42
Welche Protokolle werden
docker‐intern angelegt
• Docker‐Daemon‐Logs
– abhängig von der Linux‐Distribution
– für Debian / Ubuntu aktuell:
• Container‐Logs
– für alle Container anzeigen:
Dockerbank 2, Jens Piegsa 43
journalctl -u docker -n100
sudo su -c 'ls -Ralph /var/lib/docker/containers/*/*.log'
Container‐Protokollierung mittels
logrotate begrenzen
• /etc/logrotate.d/docker anlegen:
• täglicher Cronjob meist bereits vorkonfiguriert
(siehe /etc/cron.daily/logrotate; /etc/crontab)
Dockerbank 2, Jens Piegsa 44
/var/lib/docker/containers/*/*.log {
daily
rotate 5
compress
delaycompress
missingok
copytruncate
}
STDOUT /
STDERR
Der ELK‐Stack
Dockerbank 2, Jens Piegsa 45
logspout
logstash
elasticsearch
app2
Docker
ELK‐Stack
app3
Socket
Logs als JSON
über UDP
HTTP gefilterte, angereicherte Logs
als JSON über HTTP
app1
kibana
cd ~/elk && docker-compose up -d
STDOUT /
STDERR
Der ELK‐Stack
Dockerbank 2, Jens Piegsa 46
logspout
logstash
elasticsearch
app2
Docker
ELK‐Stack
app3
Socket
Logs als JSON
über UDP
HTTP gefilterte, angereicherte Logs
als JSON über HTTP
cd ~/elk && docker-compose up -d
kibana
app1
Welche Metriken überwachen?
• Anwendungsmetriken
– Anmeldeversuche, Nutzersitzungen, Threads, Transaktionen, Entities;
Response Time, Health Check
• Containermetriken
– Container CPU / Limits
– Memory Limits + Allocation Fail Counters
– Disk I/O
– Network I/O + Network Errors
– Events: create, destroy, die, export, kill, pause, restart, start, stop,
unpause, oom
– Logs
• Servermetriken
– CPU
– Speicher
– Festplatte
Dockerbank 2, Jens Piegsa 47
Überwachung von Produktivsystemen
• docker‐spezifische Lösungen:
– docker stats + API, Google cAdvisor, Prometheus
• herkömmliche Überwachungswerkzeuge:
– Nagios, Xymon, PRTG, Zabbix
• kombinierte Lösungen:
– TICK‐Stack: Telegraf, InfluxDB, Chronograf, Kapacitor
• eigene HTTP‐Endpunkte mit weiteren Parametern
– Anmeldeversuche, Nutzersitzungen, Threads,
Transaktionen, Entities; Response Time, Health Check,
…
Dockerbank 2, Jens Piegsa 48
Monitoring mit docker stats
• Echtzeitstatistik auf der Konsole:
Dockerbank 2, Jens Piegsa 49
docker stats $(docker ps -a --format={{.Names}})
Monitoring mit Google cAdvisor
• im Browser:
Dockerbank 2, Jens Piegsa 50
docker run -d --name cadvisor -p 7777:8080 
-v /:/rootfs:ro 
-v /var/run:/var/run:rw 
-v /sys:/sys:ro 
-v /var/lib/docker/:/var/lib/docker:ro 
google/cadvisor
Monitoring mit Prometheus
• Konfigurationsdatei ~/prometheus/conf.yml:
Dockerbank 2, Jens Piegsa 51
global:
scrape_interval: 1m
scrape_timeout: 10s
evaluation_interval: 1m
scrape_configs:
- job_name: prometheus
scheme: http
static_configs:
- targets: ['192.168.56.20:9090']
Monitoring mit Prometheus
• im Browser:
Dockerbank 2, Jens Piegsa 52
docker run -d -p 9090:9090 --name prometheus 
-v $HOME/prometheus:/conf:ro 
-v prom-data:/prometheus 
prom/prometheus 
-config.file=/conf/conf.yml
FAZIT
Dockerbank 2, Jens Piegsa 53
Fazit
• früh starten Sicherheitsaspekt einzubeziehen
• Sicherheitsanalysewerkzeuge einsetzen
• Schritt für Schritt zur eigenen Continuous
Delivery Pipeline
Dockerbank 2, Jens Piegsa 54
Weiterführende Literatur
• Adrian Mouat: Docker – Software entwickeln und deployen mit Containern.
dpunkt.verlag 2016, ISBN 978‐3‐86490‐384‐7
• Adrian Mouat: Docker Security. Using Containers Safely in Production.
Second Release. O’Reilly Media 2016. http://www.oreilly.com/webops‐
perf/free/docker‐security.csp
• Awesome Docker.
https://veggiemonk.github.io/awesome‐docker/
• Docker Cheat Sheet.
http://docker.jens‐piegsa.com
• Docker + AppArmor. https://docs.docker.com/engine/security/apparmor/
• Docker + SELinux.
http://www.projectatomic.io/docs/docker‐and‐selinux/
• Docker + Seccomp.
https://docs.docker.com/engine/security/seccomp/
• Docker‐Illustrationen mit freundlicher Genehmingung von Docker, Inc.
Dockerbank 2, Jens Piegsa 55
Kontakt & Fragen
• per E‐Mail an:
jens.piegsa@uni‐greifswald.de
Dockerbank 2, Jens Piegsa 56

Mais conteúdo relacionado

Semelhante a Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf

Docker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemachtDocker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemachtB1 Systems GmbH
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17remigius-stalder
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayTobias Schneck
 
Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen B1 Systems GmbH
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...inovex GmbH
 
Ausrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerAusrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerB1 Systems GmbH
 
Docker for Windows / Windows Container
Docker for Windows / Windows ContainerDocker for Windows / Windows Container
Docker for Windows / Windows ContainerThomas Wilhelm Wiefel
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungTilo Baller
 
MySQL-Server im Teamwork - Replikation und Cluster
MySQL-Server im Teamwork - Replikation und ClusterMySQL-Server im Teamwork - Replikation und Cluster
MySQL-Server im Teamwork - Replikation und ClusterFromDual GmbH
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenOPITZ CONSULTING Deutschland
 
Grundlagen postgresql
Grundlagen postgresqlGrundlagen postgresql
Grundlagen postgresqlinovex GmbH
 
Docker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugDocker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugAlexander Bohndorf
 
Compact, Compress, De-DUplicate
Compact, Compress, De-DUplicateCompact, Compress, De-DUplicate
Compact, Compress, De-DUplicateUlrich Krause
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...NETWAYS
 
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...NETWAYS
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerSteven Grzbielok
 

Semelhante a Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf (20)

Docker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemachtDocker - Containervirtualisierung leichtgemacht
Docker - Containervirtualisierung leichtgemacht
 
Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17Infrastructure as Code - BaselOne 17
Infrastructure as Code - BaselOne 17
 
Containerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony DayContainerized End-2-End Testing - JUG Saxony Day
Containerized End-2-End Testing - JUG Saxony Day
 
Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen Docker - Automatisches Deployment für Linux-Instanzen
Docker - Automatisches Deployment für Linux-Instanzen
 
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
Docker Security - Architektur und Sicherheitsfunktionen von Containervirtuali...
 
Ausrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit DockerAusrollen von Multi-Tier-Applikationen mit Docker
Ausrollen von Multi-Tier-Applikationen mit Docker
 
Docker for Windows / Windows Container
Docker for Windows / Windows ContainerDocker for Windows / Windows Container
Docker for Windows / Windows Container
 
FLOW3-Workshop F3X12
FLOW3-Workshop F3X12FLOW3-Workshop F3X12
FLOW3-Workshop F3X12
 
Docker Workbench
Docker WorkbenchDocker Workbench
Docker Workbench
 
Oracle und Docker
Oracle und DockerOracle und Docker
Oracle und Docker
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
Vagrant - Einführung & Verwendung
Vagrant - Einführung & VerwendungVagrant - Einführung & Verwendung
Vagrant - Einführung & Verwendung
 
MySQL-Server im Teamwork - Replikation und Cluster
MySQL-Server im Teamwork - Replikation und ClusterMySQL-Server im Teamwork - Replikation und Cluster
MySQL-Server im Teamwork - Replikation und Cluster
 
Vagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und ArchitektenVagrant, Puppet, Docker für Entwickler und Architekten
Vagrant, Puppet, Docker für Entwickler und Architekten
 
Grundlagen postgresql
Grundlagen postgresqlGrundlagen postgresql
Grundlagen postgresql
 
Docker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebugDocker Entwicklungsumgebung für TYPO3 mit xdebug
Docker Entwicklungsumgebung für TYPO3 mit xdebug
 
Compact, Compress, De-DUplicate
Compact, Compress, De-DUplicateCompact, Compress, De-DUplicate
Compact, Compress, De-DUplicate
 
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
OSMC 2008 | Programmierung von Nagios-Plugins für NetApp Speichergeräte by In...
 
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
OSMC 2011 | Collectd in der großen weiten Welt - Anbindung des Datensammlers ...
 
Boost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with DockerBoost your APEX Deployment and Provisioning with Docker
Boost your APEX Deployment and Provisioning with Docker
 

Dockerbank II - 03 - Szenarien des Routinebetriebs (aktualisiert).pdf

  • 1. Dockerbank 2 Szenarien des Routinebetriebs Jens Piegsa Berlin, 07.12.2016
  • 2. Inhalt • Docker im Produktiv‐Einsatz • Antipatterns • Konfigurationsmanagement • Docker‐Containern absichern • kontinuierliche Sicherheitsanalyse • Secret‐Management • Datensicherung und ‐wiederherstellung • Protokollieren, Überwachen, Benachrichtigen • Fazit, weitere Materialien Dockerbank 2, Jens Piegsa 2
  • 4. Was bedeutet produktiv? • Betriebsszenarien: – Docker lokal betreiben – auf einem Intranet‐Server – auf einem eigenen Webserver – auf mehreren eigenen Servern – auf cloud‐basierter Infrastruktur • unterscheiden sich in Zielen und Anforderungen Dockerbank 2, Jens Piegsa 4
  • 5. Docker lokal betreiben • Ziele: – leichtgewichtige Instanz einer vollständigen Umgebung zu Testzwecken – Entwicklung / Debugging von Docker Images • Maßnahmen: – Einsatz vertrauenswürdiger Images (keine Schadcode) – Verwendung von Volumes (kein Datenverlust zwischen mehreren Session) – Durchführung manueller Backups Dockerbank 2, Jens Piegsa 5
  • 6. Docker im Intranet betreiben • Ziele: – dauerhafte Bereitstellung von Diensten – Test‐ / Deployment‐Pipelines • Maßnahmen: – periodische Backups – Softwareaktualisierungen – Einbindung von Storagelösungen – Ressourcen‐Zuteilung – Monitoring Dockerbank 2, Jens Piegsa 6
  • 7. Docker auf einem Webserver • Ziele: – dauerhafter Betrieb – kurzzeitiger Betrieb zu Test‐, Demonstrationszwecken • Maßnahmen: – Serverzertifikate, verschlüsselte Kommunikation – Monitoring, Logging – Hardening des Host‐Systems, restriktive Firewall‐ Konfiguration Dockerbank 2, Jens Piegsa 7
  • 8. Docker auf mehreren Servern • Ziele: – Skalierung, Ausfallsicherheit von Diensten – mehrere Mandanten – Sicherheit: Trennung durch Netzwerkzonen, VMs – Testumgebung • Maßnahmen: – Orchestrierung – Konfigurationsmanagement, Secret Management – Private Docker Registry – CI/CD Pipelines Dockerbank 2, Jens Piegsa 8
  • 9. Docker produktiv: Antipatterns ø Datenhaltung im Container ø Images mit umgebungsspezifischer Konfiguration bzw. sensiblen Daten; umgebungsspezifische Tags ø Einsatz nicht reproduzierbarer Images (mittels docker commit erzeugt oder aus Fremdquellen) ø Container‐Modifikationen (docker cp, docker exec) ø langlebige Container ø Ausführung mehrerer Prozesse innerhalb eines Containers ø Images mit vielen Schichten ø implizite oder explizite Ausführung / Abhängigkeit von latest ø Veröffentlichung aller Ports via docker run -P ø zeitliche Abhängigkeiten zwischen Containern Dockerbank 2, Jens Piegsa 9
  • 11. Konfigurationsmanagement Docker Container • Docker Image so entwickeln, dass – sie unabhängig von der Umgebung (Entwicklung, Test, QA, Staging, Produktion) bleiben – initiale Konfigurationen über Umgebungsvariablen vorgenommen werden können, die ggf. anwendungs‐ abhängig über ein Entrypoint‐Skript angewendet werden – veränderliche Konfigurationen aus Dateien, idealerweise in separaten Verzeichnissen, gelesen wird, die als (benannte) Volumes gemountet werden – es keiner nachträglichen Modifikationen des instanziierten Containers bedarf Dockerbank 2, Jens Piegsa 11
  • 12. Konfigurationsmanagement Hostumgebung • Einsatz herkömmlicher Konfigurations‐ managementwerkzeuge wie Puppet, Chef und Ansible möglichst auf ein Minimum reduzieren – Installation / Update der Hostumgebung • docker, docker‐compose, Kubernetes‐, Mesos‐Cluster – Einrichtung hybrider Umgebungen – Sicherheitsvorkehrungen Dockerbank 2, Jens Piegsa 12
  • 14. Sicherheit: Container vs. VMs Kriterium Virtuelle Maschinen (VM) Container Isolation verfügen über eine zusätzliche Hypervisor‐ Schicht teilen sich einen Kernel Angriffsfläche enthalten viele Tools, die sich Angreifer zunutze machen können minimale Images Kontrolle Begrenzung des Zugriffs auf Ressourcen Begrenzung des Zugriffs auf Ressourcen; read‐only Dateisystem; Kernel Capabilities Auditierung langlebig; divergieren vom Basisimage; werden mittels Konfigurationsmanagement‐ software gepatcht kurzlebig; Aktualisierung durch Austausch; Image‐Anpassungen unter Versions‐ kontrolle; docker diff Zuverlässigkeit haben sich in der Vergangenheit bewährt weniger Erfahrungswerte; rapide Entwicklung Fazit • kombinierter Einsatz von VMs und Containern: VMs zur Separierung von Container‐ Gruppen und Container als zusätzliche Sicherheit und wegen ihrer Features • aktuell viele Bestrebungen VMs leichtgewichtiger und Container sicherer zu machen • grundsätzlich: gestaffelte Sicherheitsvorkehrungen, Least‐Privilege‐Prinzip Dockerbank 2, Jens Piegsa 14
  • 15. Bedrohungen und Maßnahmen Kernel‐ Exploits Denial‐of‐ Service‐ Angriffe Container‐ Breakouts Vergiftete Images Verratene Geheimnisse Images auditieren (Dockerfile, statische Analyse)  Abgrenzung von Container‐Gruppen durch VMs  Gesamtes Container‐Dateisystem read‐only setzen     Sensible Volumes read‐only deklarieren   Kernel Capabilities einschränken   CPU‐Ressourcen zuweisen  Arbeitsspeicher limitieren  SETUID/SETGID‐Dateizugriffsrechte entfernen   Kommunikation zwischen Containern einschränken    Nicht‐Root USER im Dockerfile festlegen    Geheimnisse nicht in Umgebungsvariablen ablegen  Container nicht --privileged starten    Minimale Images ohne unnötige Pakete   AppArmor, SELinux, Seccomp  Dockerbank 2, Jens Piegsa 15
  • 16. Syntax der Übungsbeispiele Dockerbank 2, Jens Piegsa 16 mkdir ~/foo && echo "Beispiel" | tee -a ~/foo/bar && cat ~/foo/bar
  • 17. Schreibzugriffe einschränken • gesamtes Dateisystem auf read‐only setzen: (kombinierbar mit Schreibrechten für Volumes) • sensibles Volume read‐only deklarieren: Dockerbank 2, Jens Piegsa 17 docker run --read-only --rm alpine touch x docker run -v $(pwd):/secrets:ro --rm alpine touch /secrets/x
  • 18. Kernel Capabilities einschränken • bestimmte Capabilities deaktivieren: • sämtliche Capabilities abschalten: • Whitelist‐ und Blacklist‐Verfahren möglich durch Kombination mit --cap-add • siehe Man‐Pages: man capabilities Dockerbank 2, Jens Piegsa 18 docker run --cap-drop SETGID --cap-drop SETUID --rm alpine su -c whoami postgres docker run --cap-drop ALL --rm alpine ping localhost -c1
  • 19. CPU‐Ressourcen zuweisen • erfolgt anhand von relativer Wichtungen • Wichtung beträgt standardmäßig 1024 • Beispiel erzeugt drei Container mit den Last‐ wichtungen 50%, 25% und 25%: • Container entfernen mit docker rm -f … Dockerbank 2, Jens Piegsa 19 docker run -d alpine sh -c 'yes>/dev/null' && docker run -d -c 512 alpine sh -c 'yes>/dev/null' && docker run -d -c 512 alpine sh -c 'yes>/dev/null' && top
  • 20. Arbeitsspeicher limitieren • einmalig Memory und Swap Limit Capabilities im Host aktivieren (erfordert Neustart): • Container auf 42MB Arbeits‐ und 42MB Swap‐ Speicher beschränken: (Abbruch mittels der Tastenkombination Strg+C) Dockerbank 2, Jens Piegsa 20 docker run -m 42m -d alpine tail -f /dev/null && docker stats echo 'GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"'| sudo tee -a /etc/default/grub && sudo update-grub && sudo reboot
  • 21. Ausführbare Dateien mit setuid‐/setgid‐ Zugriffsrechten entschärfen 1. Alle privilegierten Dateien finden: 2. Neues Dockerfile erstellen, das bei der Image‐Erstellung allen Dateien die kritischen Zugriffsrechte entzieht: 3. Container auf Basis des neuen Image erstellen und testen: Dockerbank 2, Jens Piegsa 21 docker run --rm debian find / -type f -perm /6000 -exec stat -c "%A %a %n" {} ; 2>/dev/null FROM debian:8.6 RUN find / -type f -perm /6000 -exec chmod a-s {} ; || true USER daemon docker build -t mostly-harmless . && docker run --rm mostly-harmless find / -type f -perm /6000 -exec stat -c "%n" {} ; 2>/dev/null | wc -l
  • 22. Absicherung der Kommunikation zwischen Containern (I) • Docker‐Terminologie (expose / publish ports) lässt vermuten, dass die Kommunikation zwischen Containern standardmäßig eingeschränkt ist • Experiment: Dockerbank 2, Jens Piegsa 22 docker inspect $(docker run -d nginx:alpine) docker run --rm alpine wget -qO - -T10 -t1 <IPAddress>:80
  • 23. Absicherung der Kommunikation zwischen Containern (II) • generelle Deaktivierung mit Ausnahme bei Container‐Verlinkung: • unter Debian/Ubuntu zusätzlich notwendige Anpassung mittels sudoedit /lib/systemd/system/docker.service vornehmen: • Neustart und Prüfen der Argumente mittels der Prozessliste: Dockerbank 2, Jens Piegsa 23 echo 'DOCKER_OPTS="--icc=false --iptables"' | sudo tee -a /etc/default/docker ... [Service] ExecStart=/usr/bin/docker -d -H fd:// $DOCKER_OPTS EnvironmentFile=/etc/default/docker ... sudo systemctl daemon-reload && sudo systemctl restart docker && ps aux | grep dockerd
  • 24. Absicherung der Kommunikation zwischen Containern (III) • Experiment wiederholen: • stattdessen Port‐Publishing über Host nutzen: • oder alternativ mittels Container‐Verlinkung: Dockerbank 2, Jens Piegsa 24 docker inspect $(docker run -d nginx:alpine) docker run --rm alpine wget -qO - -T10 -t1 <IPAddress>:80 docker run -d -p 10080:80 nginx:alpine && docker run --rm alpine wget -qO - -T10 -t1 192.168.56.20:10080 docker run -d --name nginx nginx:alpine && docker run --rm --link nginx:web alpine sh -c 'wget -qO - -T10 -t1 $WEB_PORT_80_TCP_ADDR'
  • 25. KONTINUIERLICHE SICHERHEITSANALYSE FÜR CONTAINER IMAGES Dockerbank 2, Jens Piegsa 25
  • 26. Sicherheitsanalyse • automatisierte Analyse von Image‐Inhalten anhand Liste bekannter Sicherheitslücken und Schwachstellen (Common Vulnerabilities and Exposures; CVE) • unterschiedliche Techniken – statische vs. dynamische Analyse • verschiedene Integrationsmöglichkeiten – manuelle Scans – Registry‐ und Build‐Pipeline‐Integration – Echtzeitbenachrichtigung Dockerbank 2, Jens Piegsa 26
  • 27. Kriterien zur Evaluierung von container‐ basierten Sicherheitsanalysewerkzeugen • Technik – Wie werden in einem Image enthaltene Softwareversionen detektiert? (auf Basis des Paketmanagers oder binär) – Welche Quellen u. Datenbanken bekannter Sicherheitslücken werden genutzt? – Liegt der Analyseschwerpunkt eher auf anwendungs‐ oder docker‐spezifischen Schwachstellen? – Inwiefern werden in Produduktiveinsatz befindliche Images kontinuierlich gescannt? – Welche Container‐Technologien werden unterstützt? • Integrierbarkeit – Wo ist der Ansatzpunkt des Scanners in der eigenen Pipeline? – Mit welchen Anwendungen arbeitet der Scanner zusammen (Registries, CI/CD‐ Lösungen, cloud‐basierten / selbstbetriebenen Orchestrierungsplattformen)? – Wird neben der statischen Image‐Analyse auch Auditing der Host‐Umgebung unterstützt (Konfiguration, Container)? – Gibt es eine API für eine individuelle Integration (Erweiterbarkeit, Benachrichtigungsmechanismen)? Dockerbank 2, Jens Piegsa 27
  • 28. Sicherheitsanalysewerkzeuge Dockerbank 2, Jens Piegsa 28 • Docker Bench for Security (Docker, Apache‐Lizenz) – prüft Docker‐ und Container‐Konfigurationen auf Einhaltung von "Best Practices" aufgestellt vom Zentrum für Internet Security (CIS) • Clair (CoreOS; Apache‐Lizenz) – detektiert installierte Software über bekannte Paketmanager – manuell installierte Komponenten bleiben unberücksichtigt • Docker Security Scanning (Docker Inc.; kommerzielle Lizenz) – Erkennung wird auf Binär‐Ebene durchgeführt, unabhängig vom Paketmanager – integriert in Docker Cloud und Docker Datacenter, jedoch nicht unabhängig einsetzbar • Twistlock Trust (sowohl freie, als auch kommerzielle Lizenz) – Erkennung auf Binärebene – berücksichtigt Zero‐Day‐Feeds • OpenSCAP + Atomic Scan (Red Hat; GPL3‐Lizenz) – spezialisiert auf Red‐Hat‐Linuxdistributionen • Bluemix Vulnerability Advisor (IBM; kommerziell) – integriert in cloud‐basierte Plattform Bluemix  siehe auch: https://www.alfresco.com/blogs/devops/2015/12/03/docker‐security‐ tools‐audit‐and‐vulnerability‐assessment/
  • 29. Docker Bench for Security • Skript, das automatisiert auf Schwachstellen bzw. Einhaltung von "Best Practices" beim Produktiveinsatz von Docker prüft • basiert auf dem Docker‐Security‐Benchmark des Center for Internet Security (CIS): https://benchmarks.cisecurity.org/tools2/docker/ CIS_Docker_1.11.0_Benchmark_v1.0.0.pdf • generierter Testbericht enthält Verweise auf die Kapitel im Dokument mit den entsprechenden Handlungsempfehlungen Dockerbank 2, Jens Piegsa 29 sudo apt-get install auditd cd ~ git clone https://github.com/docker/docker-bench-security.git cd ~/docker-bench-security sudo sh docker-bench-security.sh
  • 30. Clair lokal aufsetzen Dockerbank 2, Jens Piegsa 30 mkdir -p ~/clair/clair_config && cd ~/clair && curl -L https://raw.githubusercontent.com/coreos/clair/v1.2.6/docker-compose.yml -o docker-compose.yml && curl -L https://raw.githubusercontent.com/coreos/clair/v1.2.6/config.example.yaml -o clair_config/config.yaml && sed -i.bak 's* source:* source: postgresql://postgres:password@postgres:5432?sslmode=disable*g' clair_config/config.yaml && printf 'n' >> docker-compose.yml && sed -i.bak -e 's/^$/ restart: unless-stopped/g' docker-compose.yml && docker-compose up -d && sudo apt-get -y install golang-go && printf 'nexport GOPATH=/usr/share/go/nexport PATH=$PATH:/usr/lib/go/binn' | sudo tee -a /etc/profile && sudo su -c 'go get -x -v -u github.com/coreos/clair/contrib/analyze-local-images' && docker-compose logs -f # wait until the vulerability database is updated
  • 31. Clair mittels CLI einsetzen • Workflow: 1. mittels docker pull oder docker build Image lokal bereitstellen bzw. mittels docker images auffinden 2. Einsatz: analyze-local-images myimage 3. Recherche anhand des Berichtes durchführen 4. Optionen: a) keine Korrektur, bei geringfügigem Risiko b) Image Maintainer um Korrektur bitten c) Schwachstelle selbst beheben und ggf. dem Maintainer rückmelden d) alternatives Image einsetzen 5. Analyse regelmäßig wiederholen Dockerbank 2, Jens Piegsa 31
  • 32. Secret‐Management Wo können Geheimnisse aufbewahrt werden? Dockerbank 2, Jens Piegsa 32 im Docker Image in Umgebungsvariablen in Dateien innerhalb von Volumes in einem Secret Store
  • 34. Datenpersistenz in Containern • Volume‐Arten: anonyme, host‐gebundene und benannte Volumes • wird ein benanntes Volume impliziert bei Container‐Erzeugung angelegt werden vorhandene Dateien aus dem zugeordneten Verzeichnis des Image in das Volume kopiert • wird bei Container‐Erzeugung ein bestehendes Volume gemountet findet kein initialer Kopiervorgang statt • mit dem Stopp eines Containers werden keine Inhalte gelöscht • mit dem Löschen eines Containers gehen alle Inhalte des Container‐ Dateisystems verloren, Volumes bleiben jedoch erhalten – anonyme Volumes lassen sich anschließend mittels docker volume ls und docker volume inspect VID wieder auffinden und nachnutzen – wird docker rm mit dem Schalter -v ausgeführt, werden alle anonymen Volumes eines Containers gelöscht, es sei denn, sie sind mittels --volumes-from an weitere Container gebunden Dockerbank 2, Jens Piegsa 34
  • 35. Sicherungsmöglichkeiten • Sicherung und Wiederherstellung von – Docker‐Images – Docker‐Containern – Dateien / Verzeichnissen in Containern ohne Volume – Dateien / Verzeichnissen aus anonymen Volumes – benannten Volumes – Datenbank‐Dumps • manueller Backup‐Container • kurzlebiger Backup‐Container über cronjob auf dem Host • permanenter Backup‐Container mit cron im Vordergrund Dockerbank 2, Jens Piegsa 35
  • 36. Sicherung und Wiederherstellung von Dateien in Containern ohne Volume • Sicherungskopie des Ordners /data des Containers SOURCE im aktuellen Arbeitsverzeichnis des Hostsystems anlegen: • Kopie des Ordners data im aktuellen Arbeitsverzeichnis des Hostsystems in das Verzeichniss /data des TARGET‐Containers: • Nachteil: Applikation und Daten sind eng gekoppelt • besser: Einsatz von Volumes vereinfacht Aktualisierung von Containern und schafft Transparenz Dockerbank 2, Jens Piegsa 36 docker cp SOURCE:/data $(pwd)/data docker cp $(pwd)/data TARGET:/data
  • 37. Sicherung und Wiederherstellung einzelner Verzeichnisse aus anonymen Volumes • Sicherung des Ordners /data des Containers SOURCE als Archivdatei in das aktuelle Arbeitsverzeichnis des Hostsystems: • Wiederherstellung des Ordners /data aus Archivdatei im aktuellen Arbeitsverzeichnis des Hostsystems in den Containers TARGET: • Nachteile: anonyme Volumes sind schwer zuzuordnen; Backup‐Routine hat Zugriff auf alle Volumes • besser: benannte Volumes Dockerbank 2, Jens Piegsa 37 docker run --rm --volumes-from SOURCE:ro -v $(pwd):/backup alpine tar cvzf /backup/backup_$(date +%Y-%m-%d_%H%M).tar.gz /data docker run --rm --volumes-from TARGET -v $(pwd):/backup:ro alpine tar xvf /backup/backup_2016-12-07_13-30.tar
  • 38. Sicherung und Wiederherstellung von benannten Volumes • Sicherung aller Dateien des benannten Volumes SOURCE als Archivdatei in das aktuelle Arbeitsverzeichnis des Hostsystems: • Wiederherstellung aller Dateien aus Archivdatei im aktuellen Arbeitsverzeichnis des Hostsystems in das Volume TARGET: • Nachteile: Volume‐Namensschema bei Skalierung? Dockerbank 2, Jens Piegsa 38 docker run --rm -v SOURCE:/data:ro -v $(pwd):/backup alpine tar cvzf /backup/backup_$(date +%Y-%m-%d_%H%M).tar.gz /data docker run --rm -v TARGET:/data -v $(pwd):/backup:ro alpine tar xvf /backup/backup_2016-12-07_13-30.tar.gz
  • 39. Backup‐Beispielcontainer • tutum/mysql‐backup: • spoqa/postgresql‐backup • osixia/openldap‐backup Dockerbank 2, Jens Piegsa 39 docker run -d --env MYSQL_HOST=mysql.host --env MYSQL_PORT=27017 --env MYSQL_USER=admin --env MYSQL_PASS=password --volume host.folder:/backup tutum/mysql-backup
  • 41. Ziele • Zuverlässigkeit bereitgestellter Dienste gewährleisten – Ausfallzeiten reduzieren – Softwarefehler frühzeitig erkennen – auf Performance‐Engpässe reagieren – Dateneingaben auditieren • Einbruchsschutz – Schwachstellen identifizieren – Angriffe frühzeitig erkennen – Schadensausmaß bestimmen / reduzieren • Prozessoptimierung – Anwenderverhalten auswerten Dockerbank 2, Jens Piegsa 41
  • 42. Möglichkeiten der Protokollierung • docker logs ist die einfachste Lösung, hat jedoch für den Produktiveinsatz einige Nachteile: – kann nur mit STDOUT‐ und STDERR‐Ausgaben umgehen – Protokolle gehen mit dem Entfernen eines Containers verloren – das intern genutzte JSON‐Format ist speicherintensiv, erschwert einfache Suchen und zerlegt Stacktraces zeilenweise in mehrere Abschnitte – unterstützt keine Log‐Rotation • Log‐Dateien in ein Docker Volume schreiben • spezialisierte Logging‐Dienste einsetzen – z.B. syslog‐ng, rsyslog, logstash, logspout, filebeat, fluentd • Komplettlösungen: – ELK‐Stack: Elasticsearch, Logstash, Kibana – Logentries (kommerzielle Lizenz) Dockerbank 2, Jens Piegsa 42
  • 43. Welche Protokolle werden docker‐intern angelegt • Docker‐Daemon‐Logs – abhängig von der Linux‐Distribution – für Debian / Ubuntu aktuell: • Container‐Logs – für alle Container anzeigen: Dockerbank 2, Jens Piegsa 43 journalctl -u docker -n100 sudo su -c 'ls -Ralph /var/lib/docker/containers/*/*.log'
  • 44. Container‐Protokollierung mittels logrotate begrenzen • /etc/logrotate.d/docker anlegen: • täglicher Cronjob meist bereits vorkonfiguriert (siehe /etc/cron.daily/logrotate; /etc/crontab) Dockerbank 2, Jens Piegsa 44 /var/lib/docker/containers/*/*.log { daily rotate 5 compress delaycompress missingok copytruncate }
  • 45. STDOUT / STDERR Der ELK‐Stack Dockerbank 2, Jens Piegsa 45 logspout logstash elasticsearch app2 Docker ELK‐Stack app3 Socket Logs als JSON über UDP HTTP gefilterte, angereicherte Logs als JSON über HTTP app1 kibana cd ~/elk && docker-compose up -d
  • 46. STDOUT / STDERR Der ELK‐Stack Dockerbank 2, Jens Piegsa 46 logspout logstash elasticsearch app2 Docker ELK‐Stack app3 Socket Logs als JSON über UDP HTTP gefilterte, angereicherte Logs als JSON über HTTP cd ~/elk && docker-compose up -d kibana app1
  • 47. Welche Metriken überwachen? • Anwendungsmetriken – Anmeldeversuche, Nutzersitzungen, Threads, Transaktionen, Entities; Response Time, Health Check • Containermetriken – Container CPU / Limits – Memory Limits + Allocation Fail Counters – Disk I/O – Network I/O + Network Errors – Events: create, destroy, die, export, kill, pause, restart, start, stop, unpause, oom – Logs • Servermetriken – CPU – Speicher – Festplatte Dockerbank 2, Jens Piegsa 47
  • 48. Überwachung von Produktivsystemen • docker‐spezifische Lösungen: – docker stats + API, Google cAdvisor, Prometheus • herkömmliche Überwachungswerkzeuge: – Nagios, Xymon, PRTG, Zabbix • kombinierte Lösungen: – TICK‐Stack: Telegraf, InfluxDB, Chronograf, Kapacitor • eigene HTTP‐Endpunkte mit weiteren Parametern – Anmeldeversuche, Nutzersitzungen, Threads, Transaktionen, Entities; Response Time, Health Check, … Dockerbank 2, Jens Piegsa 48
  • 49. Monitoring mit docker stats • Echtzeitstatistik auf der Konsole: Dockerbank 2, Jens Piegsa 49 docker stats $(docker ps -a --format={{.Names}})
  • 50. Monitoring mit Google cAdvisor • im Browser: Dockerbank 2, Jens Piegsa 50 docker run -d --name cadvisor -p 7777:8080 -v /:/rootfs:ro -v /var/run:/var/run:rw -v /sys:/sys:ro -v /var/lib/docker/:/var/lib/docker:ro google/cadvisor
  • 51. Monitoring mit Prometheus • Konfigurationsdatei ~/prometheus/conf.yml: Dockerbank 2, Jens Piegsa 51 global: scrape_interval: 1m scrape_timeout: 10s evaluation_interval: 1m scrape_configs: - job_name: prometheus scheme: http static_configs: - targets: ['192.168.56.20:9090']
  • 52. Monitoring mit Prometheus • im Browser: Dockerbank 2, Jens Piegsa 52 docker run -d -p 9090:9090 --name prometheus -v $HOME/prometheus:/conf:ro -v prom-data:/prometheus prom/prometheus -config.file=/conf/conf.yml
  • 54. Fazit • früh starten Sicherheitsaspekt einzubeziehen • Sicherheitsanalysewerkzeuge einsetzen • Schritt für Schritt zur eigenen Continuous Delivery Pipeline Dockerbank 2, Jens Piegsa 54
  • 55. Weiterführende Literatur • Adrian Mouat: Docker – Software entwickeln und deployen mit Containern. dpunkt.verlag 2016, ISBN 978‐3‐86490‐384‐7 • Adrian Mouat: Docker Security. Using Containers Safely in Production. Second Release. O’Reilly Media 2016. http://www.oreilly.com/webops‐ perf/free/docker‐security.csp • Awesome Docker. https://veggiemonk.github.io/awesome‐docker/ • Docker Cheat Sheet. http://docker.jens‐piegsa.com • Docker + AppArmor. https://docs.docker.com/engine/security/apparmor/ • Docker + SELinux. http://www.projectatomic.io/docs/docker‐and‐selinux/ • Docker + Seccomp. https://docs.docker.com/engine/security/seccomp/ • Docker‐Illustrationen mit freundlicher Genehmingung von Docker, Inc. Dockerbank 2, Jens Piegsa 55
  • 56. Kontakt & Fragen • per E‐Mail an: jens.piegsa@uni‐greifswald.de Dockerbank 2, Jens Piegsa 56