Verbessern des Datenverständnisses
Rocco Gagliardi
Dieser Artikel stellt eine Weiterführung des Beitrags Docker – Continuous Build Security Assessment dar. Zusätzlich zu den dort genannten Tools haben wir uns in den letzten Monaten mit einer weiteren Lösung beschäftigt: Anchore
Anchore ist ein Tool, das Visibilität in die Welt der Docker Container bringt. Es kann Docker Images sowohl manuell als auch automatisiert analysieren, scannen und inspizieren. Damit wird es möglich, das Tool in einer CD/CI Pipeline einzusetzen, Tool-Gates für einzelne Builds zu etablieren und diese automatisch mit Zulassung, Warnung oder Blockierung zu versehen.
Anchore ist als Docker-Image verfügbar. Dieser Guide bespricht, wie die Umgebung dafür vorbereitet werden muss.
Anchore kann genutzt werden, um interaktiv eine Analyse von Containern voranzutreiben. Wir werden besprochen, wie Anchore wie folgt eingesetzt werden kann:
Schauen wir uns die Images auf unserem System etwas genauer an:
[root@tst-jenkins-01 nodejs-jendoc-01]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ... alpine-nikto-01 16251627082017 91e011e8e68d 5 weeks ago 56.1MB nikto latest 91e011e8e68d 5 weeks ago 56.1MB ... anchore/jenkins 1.1.2 37324139ce3e 6 months ago 325MB citizenstig/dvwa latest c8312743bc09 2 years ago 478MB
Wir werden die folgenden Images analysieren:
Beim ersten handelt es sich um ein ad-hoc erstelltes Image, auf dem der Nikto Scanner betrieben wird. Das zweite ist ein Beispielsystem, das eine Vielzahl extern ausnutzbarer Schwachstellen aufweist.
Wir beginnen mit der Analyse von alpine-nikto-01
:
[root@tst-jenkins-01 nodejs-jendoc-01]# anchore analyze --image 91e011e8e68d Analyzing image: 91e011e8e68d 7328f6f8b418: analyzing ... 7328f6f8b418: analyzed. 91e011e8e68d: analyzing ... 91e011e8e68d: analyzed.
Sobald die Analyse durchgeführt wurde, können wir Informationen abfragen und einen Bericht erstellen:
[root@tst-jenkins-01 nodejs-jendoc-01]# anchore audit --image 91e011e8e68d report +--------------+------+----------------------+----------------------+-------------+-------------+--------------------+--------------------+ | Image Id | Type | Current Tags | All Tags | Gate Status | Size(bytes) | Counts | Base Diffs | +--------------+------+----------------------+----------------------+-------------+-------------+--------------------+--------------------+ | 91e011e8e68d | None | alpine-nikto-01:1625 | alpine-nikto-01:1625 | UNKNOWN | 56079797 | PKGS=21 FILES=2720 | PKGS=10 FILES=2247 | | | | 1627082017,nikto:lat | 1627082017,nikto:lat | | | SUIDFILES=0 | SUIDFILES=N/A | | | | est | est | | | | | +--------------+------+----------------------+----------------------+-------------+-------------+--------------------+--------------------+ [root@tst-jenkins-01 nodejs-jendoc-01]# anchore query --image 91e011e8e68d show-distro all +--------------+--------------+--------+---------+ | Image Id | Repo Tag | Distro | Version | +--------------+--------------+--------+---------+ | 91e011e8e68d | nikto:latest | alpine | 3.6.2 | +--------------+--------------+--------+---------+
Wir können nun grundlegende Informationen zum Dockerfile und den installierten Paketen extrahieren:
[root@tst-jenkins-01 nodejs-jendoc-01]# anchore query --image 91e011e8e68d show-dockerfile all +--------------+--------------+---------+-------------------------------------------+ | Image Id | Repo Tags | Mode | Dockerfile Line | +--------------+--------------+---------+-------------------------------------------+ | 91e011e8e68d | nikto:latest | Guessed | FROM scratch | | 91e011e8e68d | nikto:latest | Guessed | ADD file:4583e12bf5caec40b861a3409f2a1624 | | | | | c3f3556cc457edb99c9707f00e779e45 in / | | 91e011e8e68d | nikto:latest | Guessed | CMD ["/bin/sh"] | | 91e011e8e68d | nikto:latest | Guessed | LABEL maintainer=Rocco Gagliardi | | | | | mail=roga@scip.ch web=https://www.scip.ch | | | | | version=20170813 description=Nikto | | | | | scanner based on Alpine 3.6. Supports SSL | | | | | scanning. Runs with unprivileged user | | | | | 'nikto'. | | 91e011e8e68d | nikto:latest | Guessed | RUN /bin/sh -c apk update && apk add | | | | | --no-cache nikto perl perl-net-ssleay ca- | | | | | certificates && rm -f /tmp/* | | | | | /etc/apk/cache/* && mkdir /work && | | | | | adduser -D -s /bin/sh nikto nikto && | | | | | chown -R nikto /work | | 91e011e8e68d | nikto:latest | Guessed | USER [nikto] | | 91e011e8e68d | nikto:latest | Guessed | VOLUME [/work] | | 91e011e8e68d | nikto:latest | Guessed | WORKDIR /opt/nikto | | 91e011e8e68d | nikto:latest | Guessed | ENTRYPOINT ["nikto.pl"] | | 91e011e8e68d | nikto:latest | Guessed | CMD ["-h"] | +--------------+--------------+---------+-------------------------------------------+ [root@tst-jenkins-01 Anchore_policy]# anchore query --image 91e011e8e68d list-packages all +--------------+--------------+-----------------------+-------------+ | Image Id | Repo Tags | Package | Version | +--------------+--------------+-----------------------+-------------+ | 91e011e8e68d | nikto:latest | busybox | 1.26.2-r5 | | 91e011e8e68d | nikto:latest | libressl | 2.5.5-r0 | | 91e011e8e68d | nikto:latest | libpcap | 1.8.1-r0 | | 91e011e8e68d | nikto:latest | libc-utils | 0.7.1-r0 | | 91e011e8e68d | nikto:latest | musl | 1.1.16-r10 | | 91e011e8e68d | nikto:latest | nmap | 7.40-r1 | | 91e011e8e68d | nikto:latest | musl-utils | 1.1.16-r10 | | 91e011e8e68d | nikto:latest | zlib | 1.2.11-r0 | | 91e011e8e68d | nikto:latest | perl-net-ssleay | 1.81-r1 | | 91e011e8e68d | nikto:latest | libressl2.5-libssl | 2.5.4-r0 | | 91e011e8e68d | nikto:latest | perl | 5.24.1-r2 | | 91e011e8e68d | nikto:latest | libstdc++ | 6.3.0-r4 | | 91e011e8e68d | nikto:latest | ca-certificates | 20161130-r2 | | 91e011e8e68d | nikto:latest | alpine-keys | 2.1-r1 | | 91e011e8e68d | nikto:latest | libgcc | 6.3.0-r4 | | 91e011e8e68d | nikto:latest | libressl2.5-libcrypto | 2.5.4-r0 | | 91e011e8e68d | nikto:latest | alpine-baselayout | 3.0.4-r0 | | 91e011e8e68d | nikto:latest | apk-tools | 2.7.2-r0 | | 91e011e8e68d | nikto:latest | scanelf | 1.2.2-r0 | | 91e011e8e68d | nikto:latest | libressl2.5-libtls | 2.5.5-r0 | | 91e011e8e68d | nikto:latest | nikto | 2.1.5-r2 | +--------------+--------------+-----------------------+-------------+
Wir können ebenfalls prüfen, ob ein spezifisches Paket installiert wurde:
[root@tst-jenkins-01 Anchore_policy]# anchore query --image 91e011e8e68d has-package wget +----------+----------+-------------+---------+---------+ | Image Id | Repo Tag | Query Param | Package | Version | +----------+----------+-------------+---------+---------+ +----------+----------+-------------+---------+---------+ [root@tst-jenkins-01 Anchore_policy]# anchore query --image 91e011e8e68d has-package libgcc +--------------+--------------+-------------+---------+----------+ | Image Id | Repo Tag | Query Param | Package | Version | +--------------+--------------+-------------+---------+----------+ | 91e011e8e68d | nikto:latest | libgcc | libgcc | 6.3.0-r4 | +--------------+--------------+-------------+---------+----------+
Damit kann nun eine Liste der möglichen Abfragen oder der spezifischen Tools angezeigt werden, mit denen das Image analysiert werden kann:
[root@tst-jenkins-01 admin]# anchore query [root@tst-jenkins-01 admin]# anchore toolbox
Die interaktive Untersuchung des Images kann im Rahmen von Debugging, forensischen Untersuchungen oder zielgerichteten Analysen von Nutzen sein.
Nun können wir das Image auf bekannte Schwachstellen hin untersuchen. Um Images nach CVE zu untersuchen, muss als erstes der Feed aktualisiert werden:
[admin@tst-jenkins-01 nodejs-jendoc-01]$ anchore feeds sync syncing data for subscribed feed (vulnerabilities) ... syncing group data: debian:unstable: ... syncing group data: ubuntu:16.04: … ...
Nachdem der Feed erfolgreich aktualisiert wurde, kann erneut eine Analyse des Images initiiert werden:
[root@tst-jenkins-01 nodejs-jendoc-01]# anchore analyze --image 91e011e8e68d Analyzing image: 91e011e8e68d 7328f6f8b418: analyzing ... 7328f6f8b418: analyzed. 91e011e8e68d: analyzing ... 91e011e8e68d: analyzed.
Nun können wir die Datenbank von Anchore nach CVE-Schwachstellen abfragen:
[root@tst-jenkins-01 nodejs-jendoc-01]# anchore query --image 91e011e8e68d cve-scan all +--------+----------+-----------------+--------------------+---------------+------------+----------------+-----+ | CVE ID | Severity | *Total Affected | Vulnerable Package | Fix Available | Fix Images | Rebuild Images | URL | +--------+----------+-----------------+--------------------+---------------+------------+----------------+-----+ +--------+----------+-----------------+--------------------+---------------+------------+----------------+-----+
Das Image alpine-nikto-01
sieht soweit gut aus: Keine Schwachstellen gefunden.
Nun betrachten wir jedoch das zweite Image, das mit Schwachstellen daherkommt. Wir starten den Scan, um CVE High Vulnerabilities ausmachen zu können:
[root@tst-jenkins-01 nodejs-jendoc-01]# anchore analyze --image c8312743bc09 ... [root@tst-jenkins-01 ~]# anchore query --image c8312743bc09 cve-scan High +------------------+----------+-----------------+---------------------+--------------------+---------------------+----------------+---------------------+ | CVE ID | Severity | *Total Affected | Vulnerable Package | Fix Available | Fix Images | Rebuild Images | URL | +------------------+----------+-----------------+---------------------+--------------------+---------------------+----------------+---------------------+ | CVE-2017-1000367 | High | 1 | sudo-1.8.9p5-1ubunt | 1.8.9p5-1ubuntu1.4 | c8312743bc09(citize | None | http://people.ubunt | | | | | u1 | | nstig/dvwa:latest) | | u.com/~ubuntu-secur | | | | | | | | | ity/cve/CVE-2017-10 | | | | | | | | | 00367 | | CVE-2016-6313 | High | 1 | libgcrypt11-1.5.3-2 | 1.5.3-2ubuntu4.4 | c8312743bc09(citize | None | http://people.ubunt | | | | | ubuntu4 | | nstig/dvwa:latest) | | u.com/~ubuntu-secur | ...
In diesem Fall findet Anchore gleich mehrere Schwachstellen der Kritikalität HIGH. Wir können separate Scans für MEDIUM und LOW durchführen lassen. Oder alle Schwachstellen durch ALL auflisten lassen.
Neben diesem interaktiven Verhalten kann Anchore auch im Rahmen automatisierter Prozesse eingesetzt werden. Hierzu ist die Übergabe einer spezifischen Policy erforderlich, um anzugeben, welche Prüfungen durchgeführt werden sollen und was im Fall von OK
, WARN
oder STOP
zu passieren hat.
Anchore stellt einen richtlinienbasierten Mechanismus zur Definition von Checks und Actions bereit. Die Policies kommen in folgendem Format daher:
Gate Name : Trigger : Action : Optionale Parameter
Bei Gate
und Triggers
handelt es sich um die Checks, Action ist die Aktion und die Parameter gelten für Gate/Triggers. Um die komplette Liste aller Gates, Triggers und Optionen zu erhalten, kann das folgende Kommando eingegeben werden:
[root@tst-jenkins-01 Anchore_policy]# anchore gate --show-policytemplate [root@tst-jenkins-01 Anchore_policy]# anchore gate --show-gatehelp
Grundsätzlich können die Gates in die folgenden Gruppen unterteilt werden:
Control Bereich | Gates |
---|---|
Vulnerability | ANCHORESEC |
Dockerfile | DOCKERFILECHECK |
Inspection | IMAGECHECK, FILECHECK, FILEPARSE_PASSWD, SUIDDIFF |
Libraries | GEMCHECK, NPMCHECK |
License | LICBLACKLIST |
Packages | PKGBLACKLIST, PKGCHECK, PKGDIFF |
Für jedes Gate stehen verschiedene Trigger zur Verfügung.
Dank all diesen Gates/Triggers wird es möglich, eine sehr granulare Policy zur Untersuchung – und falls erforderlich – Unterbrechung des Deployment-Prozesses zu erstellen.
In einem nächsten Schritt definieren wir nun eine Policy mit den folgenden Eigenschaften:
Der FINAL lautet in diesem Beispiel: STOP
.
[root@tst-jenkins-01 Anchore_policy]# cat policy-nikto-01.pol DOCKERFILECHECK:VOLUMEPRESENT:WARN PKGBLACKLIST:PKGNAMEMATCH:STOP:BLACKLIST_NAMEMATCH=perl-net-ssleay [root@tst-jenkins-01 Anchore_policy]# anchore gate --policy policy-nikto-01.pol --image 91e011e8e68d 91e011e8e68d4d2822d353d3091de98fa3a9048a84337031b11228682ed9a8ab: evaluating policies... 91e011e8e68d4d2822d353d3091de98fa3a9048a84337031b11228682ed9a8ab: evaluated. 91e011e8e68d: evaluated. +--------------+--------------+-----------------+---------------+-------------------------+-------------+ | Image Id | Repo Tag | Gate | Trigger | Check Output | Gate Action | +--------------+--------------+-----------------+---------------+-------------------------+-------------+ | 91e011e8e68d | nikto:latest | DOCKERFILECHECK | VOLUMEPRESENT | Dockerfile contains a | WARN | | | | | | VOLUME line: VOLUME | | | | | | | [/work] | | | 91e011e8e68d | nikto:latest | PKGBLACKLIST | PKGNAMEMATCH | Package is blacklisted: | STOP | | | | | | perl-net-ssleay | | | 91e011e8e68d | nikto:latest | FINAL | FINAL | | STOP | +--------------+--------------+-----------------+---------------+-------------------------+-------------+
Hierbei ist keine Interaktivität erforderlich: Nachdem die Policy definiert wurde, kann das Image untersucht und adäquat auf Situationen reagiert werden.
Für die Integration von CD/CI Pipelines steht durch Anchore ein Jenkins Plugin zur Verfügung.
Das Anchore Jenkins Plugin ermöglicht es, im Rahmen eines Build-Steps die Anchore-Analyse anzugehen, Images auf individuelle Policies zu prüfen und Security Scans durchzuführen.
Die folgenden Schritte werden durchgeführt:
STOP
führt.Anchore ist mein favorisiertes Tool geworden, um Docker Images zu analysieren. Die quelloffene Lösung ist hochgradig individualisierbar und kann für verschiedenste Aufgaben (wieder-)verwendet werden. Dies reicht von CD/CI Control Gates über forensische Untersuchungen bis hin zu Inspektion und Debugging: Es ist ein Muss for alle, die mit Containern umgehen müssen.
Unsere Spezialisten kontaktieren Sie gern!
Rocco Gagliardi
Rocco Gagliardi
Rocco Gagliardi
Rocco Gagliardi
Unsere Spezialisten kontaktieren Sie gern!