Beiträge Automatischer Sicherheitscheck mit Inspec und Nikto
Post
Cancel

Automatischer Sicherheitscheck mit Inspec und Nikto

Einleitung

Wenn man DevOps im Team befolgt und häufig neue Versionen des eigenen Produkts released, ist es wichtig automatisierte Tests zu haben. Unittests stellen sicher, dass die einzelnen Komponenten wie erwartet arbeiten und decken neben den „Happy Cases“ auch Negativbeispiele ab. Mittels Integrationstests wird das Zusammenspiel des Produkts oder eines Teils des Produkts mit anderen Systemen getestet.

Doch auch Sicherheitstests sollten – so weit es möglich ist – automatisiert werden, um mit dem hohen Tempo mitzuhalten. Dank Inspec kann man die für das Produkt am besten geeignetsten Tools in eine CI-/CD-Pipeline integrieren und automatisch mitlaufen lassen.

Inspec

Inspec ist ein Werkzeug von Chef und ist ein Testframework für Compliance und Security. Mittels Profilen werden Tests zusammengefasst und können wiederverwendet werden. Zum Beispiel muss ich nur einmal ein Profil bauen, das prüft, ob eine Webservice mit allen nötigen Headern und TLS-Verschlüsselung betrieben wird. Über Inputfiles kann ich den zu testenden Service angeben und das Profil so wiederverwenden.

Inspec ist an sich OpenSource allerdings nur der Quellcode. Für das ausführbare Programm muss man eine Lizenz akzeptieren. Wer das nicht machen möchte oder kann, kann die freie Distribution CINC verwenden. CINC steht für CINC is not Chef.

Nikto

Nikto habe ich hier schon einmal vorgestellt. Es handelt sich um einen Securityscanner für Webseiten, der gängige Konfigurationsprobleme und unsichere Serverversionen erkennt.

Inspec Profil für Nikto

Vor zwei Jahren habe ich ein Inspec Profil für Nikto gebaut und auf dem Software Craftsmanship Day in Franken einen Vortrag dazu gehalten. Der Quellcode steht in meinem Repository unter seism0saurus/nikto-inspec als OpenSource bereit.

Um den Test lokal mit Docker ausführen zu können sind zunächst zwei Dinge nötig. Docker und Inspec. Inspec kann man auch als Dockerimage herunterladen, sodass man über diesen Weg nur Docker benötigt. Wie man Inspec installiert ist auf der Homepage von [Chief}(https://docs.chef.io/inspec/install/) zu finden.

Nikto als Dockerimage

Der Test nutzt das Dockerimage von Nikto. Dieses muss selbst gebaut werden. Zum Ausprobieren reicht es das Image lokal zu bauen. Wenn ihr den Test in eine CI-/CD-Pipeline integrieren wollt, solltet ihr es automatisch bauen und in eure private Docker Registry pushen lassen.

1
2
3
git clone https://github.com/sullo/nikto
cd nikto
docker build -t sullo/nikto .

Profil herunterlade

Das Profil könnt ihr aus meinem Repository klonen.

1
2
git clone https://github.com/seism0saurus/nikto-inspec.git
cd nikto-inspec

Inputfile anpassen

Als Nächstes muss das Inputfile angepasst werden. Kopiert hierfür inputs.example.yml nach inputs.yml. Passt dann den Host und die Ports so an, dass darüber euer Service erreicht wird. Wenn ihr das Nikto Dockerimage in eine eigene Registry gespeichert habt, muss auch der Name des Images angepasst werden.

Über die dockerOptions können weitere Parameter an Docker übergeben werden, falls z. B. das Dockernetzwerk geändert werden soll. Mit dem Parameter options können beliebige Parameter an Nikto übergeben werden. Lest euch hierzu die Wiki von Nikto durch.

Test ausführen

Den Test könnt ihr nun innerhalb des Ordners nikto-inspec starten, indem ihr folgenden Befehl ausführt.

1
inspec exec . --input-file inputs.yml

Wenn man mehr Details über den Testablauf lesen möchte, kann man den Test mit einem zusätzlichen JSON Reporter starten.

1
 inspec exec . --input-file inputs.yml --reporter cli json:./output.json

In der Datei ./output.json steht dann nicht nur was der Test ergeben hat, sondern auch mit welchen Inputvariablen er aufgerufen wurde.

Der Test kann je nach Internetverbindung einige Minuten dauern. Wenn alles gut läuft, sind alle Tests abgehakt. Das Ergebnis sieht dann wie folgt aus.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Profile: Inofficial Nikto2 InSpec Profile (nikto-inspec)
Version: 0.2.0
Target:  local://

  ✔  nikto-requirements: nikto-inspec requirements
     ✔  User has access to docker should be true
     ✔  Docker Image sullo/nikto:latest is expected to exist
  ✔  nikto-test: nikto-inspec test
     ✔  nikto scan should not abort
     ✔  nikto scan should find no errors
     ✔  nikto scan should find no issues


Profile Summary: 2 successful controls, 0 control failures, 0 controls skipped
Test Summary: 5 successful, 0 failures, 0 skipped

Falls Nikto abbricht oder Probleme findet werden die Abweichungen gemeldet. In meinem Fall hat er ein paar item(s) gefunden und somit den Test nicht bestanden. Items sind Dinge, die man sich genauer anschauen muss, aber nicht unbedingt gefährlich sein müssen. Allerdings ist /archives die URL für meine Archivseite und die Sitemap.xml liegt da absichtlich. Bei den meisten Tools muss man hinterher die False Positives herausfiltern und sie beim nächsten Lauf ausschließen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Profile: Inofficial Nikto2 InSpec Profile (nikto-inspec)
Version: 0.2.0
Target:  local://

  ✔  nikto-requirements: nikto-inspec requirements
     ✔  User has access to docker should be true
     ✔  Docker Image sullo/nikto:latest is expected to exist
  ×  nikto-test: nikto-inspec test (2 failed)
     ×  nikto scan should not abort

     expected: 0
          got: 1

     (compared using ==)

     ✔  nikto scan should find no errors
     ×  nikto scan should find no issues
     expected "- Nikto v2.1.6\n---------------------------------------------------------------------------\n+ Targe...\n---------------------------------------------------------------------------\n+ 1 host(s) tested\n" to match /\b0 item/
     Diff:
     @@ -1,24 +1,47 @@
     -/\b0 item/
     +- Nikto v2.1.6
     +---------------------------------------------------------------------------
     ++ Target IP:          178.254.20.30
     ++ Target Hostname:    seism0saurus.de
     ++ Target Port:        443
     +---------------------------------------------------------------------------
     ++ SSL Info:        Subject:  /CN=seism0saurus.de
     +                   Altnames: seism0saurus.de
     +                   Ciphers:  TLS_CHACHA20_POLY1305_SHA256
     +                   Issuer:   /C=US/O=Let's Encrypt/CN=R3
     ++ Start Time:         2021-05-13 13:23:04 (GMT0)
     +---------------------------------------------------------------------------
     ++ Server: Apache
     ++ No CGI Directories found (use '-C all' to force check all possible dirs)
     ++ Allowed HTTP Methods: HEAD, GET, POST, OPTIONS
     ++ OSVDB-3092: /sitemap.xml: This gives a nice listing of the site content.
     ++ OSVDB-3092: /archives/: This might be interesting.
     ++ SCAN TERMINATED:  0 error(s) and 3 item(s) reported on remote host
     ++ End Time:           2021-05-13 13:31:11 (GMT0) (487 seconds)
     +---------------------------------------------------------------------------
     ++ 1 host(s) tested



Profile Summary: 1 successful control, 1 control failure, 0 controls skipped
Test Summary: 3 successful, 2 failures, 0 skipped

Abschluss

Das Profil hatte ich als Beispiel gebaut, wie man beliebige Sicherheitstools über Inspec in eine CI-/CD-Pipeline integrieren kann. Dafür führt es Nikto im Docker aus und wertet mittels Regex das Ergebnis aus. Das ist zwar nicht der eleganteste Weg, aber er funktioniert mit jedem Programm, für das es keine eigene Inspec Resourcen gibt.

Ihr könnt es gerne so verwenden oder nutzen, um eigene Profile zu erstellen.

Bis bald,

seism0saurus

Dieser Blogbeitrag wurde vom Autor unter der CC BY 4.0 lizenziert.