Docker - Continuous Build Security Assessment mit Anchore

Docker

Continuous Build Security Assessment mit Anchore

Rocco Gagliardi
von Rocco Gagliardi
am 19. Oktober 2017
Lesezeit: 15 Minuten

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

Was ist 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.

Was kann man mit Anchore machen

Anchore kann genutzt werden, um interaktiv eine Analyse von Containern voranzutreiben. Wir werden besprochen, wie Anchore wie folgt eingesetzt werden kann:

Auslesen von Informationen

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.

Vulnerability Scanner

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.

Anchore Policies

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.

Gates and Triggers

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.

Anchore Jenkins Plugin

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:

  1. Ein Jenkins-Job wird ein Container Image erstellen
  2. Der Anchore Build Step wird die Anchore Engine einbinden, um einen Policy-Check des Images durchzuführen. Der Build Step kann optional so konfiguriert werden, dass ein Fehler im Policy-Check zu einem STOP führt.
  3. Das Plugin wird die Resultate der Policy-Analyse des Jobs speichern, wodurch eine nachträgliche Untersuchung möglich wird

Fazit

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.

Über den Autor

Rocco Gagliardi

Rocco Gagliardi ist seit den 1980er Jahren im Bereich der Informationstechnologie tätig. In den 1990er Jahren hat er sich ganz der Informationssicherheit verschrieben. Die Schwerpunkte seiner Arbeit liegen im Bereich Routing, Firewalling und Log Management.

Links

Sie wollen mehr als einen simplen Security Test mit Nessus und Nmap?

Unsere Spezialisten kontaktieren Sie gern!

×
Schutz vor Phishing

Schutz vor Phishing

Rocco Gagliardi

Logging

Logging

Rocco Gagliardi

IT Security Policies

IT Security Policies

Rocco Gagliardi

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv