Der Autor hat dieFree and Open Source Fundausgewählt, um eine Spende im Rahmen desWrite for DOnations-Programms zu erhalten.
Einführung
InSpec ist ein Open-Source-Framework für automatisierte Tests zum Testen und Prüfen Ihres Systems, um die Einhaltung von Integrations-, Sicherheits- und anderen Richtlinienanforderungen sicherzustellen. Entwickler können den aktuellen Status ihrer Infrastruktur und Anwendungen anhand eines Zielstatus mit InSpec-Code testen.
InSpec enthältaudit controls, um die Richtlinienanforderungen anzugeben, auf die Sie testen. Üblicherweise erzwingen Entwickler Richtlinienanforderungen manuell und tun dies häufig direkt vor der Bereitstellung von Änderungen in der Produktion. Mit InSpec können Entwickler jedoch die Konformität in jeder Phase der Produktentwicklung kontinuierlich bewerten. Dies hilft bei der Lösung von Problemen zu einem früheren Zeitpunkt im Entwicklungsprozess. DieInSpec DSL (Domain Specific Language), die aufRSpec basieren, einem in Ruby geschriebenen DSL-Testtool, geben die Syntax an, die zum Schreiben der Überwachungssteuerelemente verwendet wird.
InSpec enthält auch eine Sammlung vonresources, um die Konfiguration bestimmter Teile Ihres Systems zu unterstützen und die Durchführung von Überwachungskontrollen zu vereinfachen. Es gibt eine Funktion, mit der Sie Ihre eigenen benutzerdefinierten Ressourcen schreiben können, wenn Sie eine bestimmte Lösung definieren müssen, die nicht verfügbar ist. MitUniversal matchers können Sie Ressourcenwerte mit den Erwartungen aller InSpec-Tests vergleichen.
In diesem Tutorial installieren Sie InSpec auf einem Server mit Ubuntu 18.04. Sie schreiben zunächst einen Test, der die Betriebssystemfamilie des Servers überprüft, und erstellen dann ein PostgreSQL-Überwachungsprofil von Grund auf. In diesem Überwachungsprofil wird zunächst überprüft, ob PostgreSQL auf dem Server installiert ist und ob die zugehörigen Dienste ausgeführt werden. Anschließend fügen Sie Tests hinzu, um zu überprüfen, ob der PostgreSQL-Dienst mit dem richtigen Port, der richtigen Adresse, dem richtigen Protokoll und dem richtigen Benutzer ausgeführt wird. Als Nächstes testen Sie bestimmte PostgreSQL-Konfigurationsparameter und schließlich überprüfen Sie die Clientauthentifizierungskonfiguration.
Voraussetzungen
Bevor Sie diesem Tutorial folgen, benötigen Sie Folgendes:
-
Ein Ubuntu 18.04-Server, der mithilfe vonInitial Server Setup with Ubuntu 18.04 eingerichtet wurde, einschließlich eines Sudo-Nicht-Root-Benutzers und einer Firewall.
-
Eine funktionierende PostgreSQL 10-Installation, die dieseninstallation guide folgt.
[[Schritt-1 - Vorbereitung der Umgebung]] == Schritt 1 - Vorbereitung der Umgebung
In diesem Schritt laden Sie die neueste stabile Version von InSpec herunter und entpacken sie in Ihr Home-Verzeichnis. InSpec bietet installierbare Binärdateien auf der Seitedownloads.
Navigieren Sie zu Ihrem Home-Verzeichnis:
cd ~
Laden Sie nun die Binärdatei mitcurl
herunter:
curl -LO https://packages.chef.io/files/stable/inspec/3.7.11/ubuntu/18.04/inspec_3.7.11-1<^>_amd64.deb
Verwenden Sie als Nächstes den Befehlsha256sum
, um eine Prüfsumme der heruntergeladenen Datei zu generieren. Dies dient zur Überprüfung der Integrität und Authentizität der heruntergeladenen Datei.
sha256sum inspec_3.7.11-1_amd64.deb
Die Prüfsummen für jede Binärdatei sind inInSpec downloads pageangegeben. Besuchen Sie daher die Downloadseite, um sie mit Ihrer Ausgabe dieses Befehls zu vergleichen.
Outpute665948f9c0441e8648b08f8d3c8d34a86f9e994609877a7e4853c012dbc7523 inspec_3.7.11-1_amd64.deb
Wenn die Prüfsummen unterschiedlich sind, löschen Sie die heruntergeladene Datei und wiederholen Sie den Download-Vorgang.
Als Nächstes installieren Sie die heruntergeladene Binärdatei. Dazu verwenden Sie den Befehldpkg
, den Sie für die Paketverwaltung verwenden können und der standardmäßig mit allen Debian-basierten Systemen wie Ubuntu geliefert wird. Das Flag-i
fordert den Befehl dpkg auf, die Paketdateien zu installieren.
sudo dpkg -i inspec_3.7.11-1_amd64.deb
Wenn keine Fehler vorliegen, wurde InSpec erfolgreich installiert. Geben Sie den folgenden Befehl ein, um die Installation zu überprüfen:
inspec version
Sie erhalten eine Ausgabe mit der gerade installierten Version von InSpec:
Output3.7.11
Wenn keine Versionsnummer angezeigt wird, führen Sie Schritt 1 erneut aus.
Danach können Sieinspec_3.7.11-1_amd64.deb
löschen, da Sie es bei der Installation des Pakets nicht mehr benötigen:
rm inspec_3.7.11-1_amd64.deb
Sie haben InSpec erfolgreich auf Ihrem Server installiert. Im nächsten Schritt schreiben Sie einen Test, um die Betriebssystemfamilie Ihres Servers zu überprüfen.
[[Schritt-2 -—- Abschluss Ihres ersten Inspektionstests]] == Schritt 2 - Abschluss Ihres ersten InSpec-Tests
In diesem Schritt führen Sie Ihren ersten InSpec-Test durch, bei dem getestet wird, ob Ihre Betriebssystemfamiliedebian
beträgt.
Sie verwenden die Ressourceos
, eine integrierte InSpec-Überwachungsressource, um die Plattform zu testen, auf der das System ausgeführt wird. Sie verwenden auch den Matchereq
. Dereq
-Matcher ist ein universeller Matcher, der die exakte Gleichheit zweier Werte prüft.
Ein InSpec-Test besteht aus einemdescribe
-Block, der eine oder mehrereit
- undits
-Anweisungen enthält, von denen jede eine der Funktionen der Ressource validiert. Jede Aussage beschreibt eine Erwartung eines bestimmten Zustands des Systems alsassertions. Zwei Schlüsselwörter, die Sie einschließen können, um eine Aussage zu treffen, sindshould
undshould_not
, die behaupten, dass die Bedingung wahr bzw. falsch sein sollte.
Erstellen Sie eine Datei mit dem Namenos_family.rb
, um Ihren Test zu speichern, und öffnen Sie sie mit Ihrem Texteditor:
nano os_family.rb
Fügen Sie Ihrer Datei Folgendes hinzu:
os_family.rb
describe os.family do
it {should eq 'debian'}
end
Dieser Test stellt sicher, dass die Betriebssystemfamilie des Zielsystemsdebian
beträgt. Andere mögliche Werte sindwindows
,unix
,bsd
usw. Eine vollständige Liste finden Sie inos
resource documentation. Speichern und schließen Sie die Datei.
Führen Sie als Nächstes Ihren Test mit dem folgenden Befehl aus:
inspec exec os_family.rb
Der Test wird bestanden und Sie erhalten eine Ausgabe wie die folgende:
OutputProfile: tests from os_family.rb (tests from os_family.rb)
Version: (not specified)
Target: local://
debian
✔ should eq "debian"
Test Summary: 1 successful, 0 failures, 0 skipped
In Ihrer Ausgabe enthältProfile
den Namen des Profils, das gerade ausgeführt wurde. Da dieser Test nicht in einem Profil enthalten ist, generiert InSpec einen Standardprofilnamen aus dem Dateinamentests from os_family.rb
des Tests. (Sie werden im nächsten Abschnitt mit InSpecprofiles arbeiten, wo Sie mit dem Erstellen Ihres PostgreSQL InSpec-Profils beginnen.) Hier zeigt InSpec dieVersion
alsnot specified
an, da Sie nur Versionen in angeben können Profile.
Das FeldTarget
gibt das Zielsystem an, auf dem der Test ausgeführt wird. Dies kann überssh
ein lokales oder ein entferntes System sein. In diesem Fall haben Sie Ihren Test auf dem lokalen System ausgeführt, sodass das Ziellocal://
anzeigt.
In der Ausgabe wird auch der ausgeführte Test mit einem Häkchen (✔) links angezeigt, das auf einen erfolgreichen Test hinweist. Die Ausgabe zeigt ein Kreuzsymbol (✘), wenn der Test fehlschlägt.
Schließlich enthält die Testzusammenfassung allgemeine Informationen darüber, wie viele Tests erfolgreich waren, fehlgeschlagen sind und übersprungen wurden. In diesem Fall hatten Sie einen einzelnen erfolgreichen Test.
Jetzt sehen Sie, wie die Ausgabe für einen fehlgeschlagenen Test aussieht. Öffnen Sieos_family.rb
:
nano os_family.rb
In dem Test, den Sie zuvor in diesem Schritt erstellt haben, ändern Sie jetzt den erwarteten Wert der Betriebssystemfamilie vondebian
inwindows
. Ihr Dateiinhalt danach wird der folgende sein:
os_family.rb
describe os.family do
it {should eq 'windows'}
end
Speichern und schließen Sie die Datei.
Führen Sie als Nächstes den aktualisierten Test mit dem folgenden Befehl aus:
inspec exec os_family.rb
Sie erhalten eine Ausgabe ähnlich der folgenden:
OutputProfile: tests from os_family.fail.rb (tests from os_family.fail.rb)
Version: (not specified)
Target: local://
debian
(✘) should eq "windows"
expected: "windows"
got: "debian"
(compared using ==)
Test Summary: 0 successful, 1 failure, 0 skipped
Wie erwartet ist der Test fehlgeschlagen. Die Ausgabe zeigt an, dass Ihre erwarteten (windows
) und tatsächlichen (debian
) Werte nicht mit der Eigenschaftos.family
übereinstimmen. Die Ausgabe von(compared using ==)
zeigt an, dass der Matcher voneq
einen Zeichenfolgenvergleich zwischen den beiden Werten durchgeführt hat, um dieses Ergebnis zu erhalten.
In diesem Schritt haben Sie einen erfolgreichen Test geschrieben, der die Betriebssystemfamilie des Servers überprüft. Sie haben auch einen fehlgeschlagenen Test erstellt, um zu sehen, wie die InSpec-Ausgabe für einen fehlgeschlagenen Test aussieht. Im nächsten Schritt erstellen Sie das Audit-Profil, um Ihre PostgreSQL-Installation zu testen.
[[Schritt 3 - Prüfung Ihrer Postgresql-Installation]] == Schritt 3 - Überprüfung Ihrer PostgreSQL-Installation
Nun überprüfen Sie Ihre PostgreSQL-Installation. Zunächst überprüfen Sie, ob PostgreSQL installiert ist und der Dienst ordnungsgemäß ausgeführt wird. Zuletzt prüfen Sie den Port und den Prozess des PostgreSQL-Systems. Für Ihr PostgreSQL-Audit erstellen Sie verschiedene InSpec-Steuerelemente, alle innerhalb eines InSpecprofile
mit dem NamenPostgreSQL
.
Ein InSpeccontrol ist eine allgemeine Gruppierung verwandter Tests. Innerhalb eines Steuerelements können Sie mehreredescribe
-Blöcke sowie Metadaten zur Beschreibung Ihrer Tests wie Auswirkungsstufe, Titel, Beschreibung und Tags verwenden. InSpec-Profile organisieren Steuerelemente zur Unterstützung des Abhängigkeitsmanagements und der Wiederverwendung von Code, die beide zur Verwaltung der Testkomplexität beitragen. Sie sind auch nützlich, um Tests überChef Supermarketzu verpacken und mit der Öffentlichkeit zu teilen. Sie können Profile verwenden, um benutzerdefinierte Ressourcen zu definieren, die Sie als reguläre Ruby-Klassen implementieren würden.
Um ein InSpec-Profil zu erstellen, verwenden Sie den Befehlinit
. Geben Sie diesen Befehl ein, um das Profil vonPostgreSQL
zu erstellen:
inspec init profile PostgreSQL
Dadurch wird das Profil in einem neuen Verzeichnis mit demselben Namen wie Ihr Profil erstellt, in diesem FallPostgreSQL
. Wechseln Sie nun in das neue Verzeichnis:
cd PostgreSQL/
Die Verzeichnisstruktur sieht folgendermaßen aus:
PostgreSQL/
├── controls
│ └── example.rb
├── inspec.yml
├── libraries
└── README.md
Die Dateicontrols/example.rb
enthält ein Beispielsteuerelement, das prüft, ob der Ordner/tmp
auf dem Zielsystem vorhanden ist. Dies ist nur als Beispiel vorhanden und Sie werden es durch Ihren eigenen Test ersetzen.
Ihr erster Test besteht darin, sicherzustellen, dass das Paketpostgresql-10
auf Ihrem System installiert ist und dass der Dienstpostgresql
installiert, aktiviert und ausgeführt wird.
Benennen Sie die Dateicontrols/example.rb
incontrols/postgresql.rb
um:
mv controls/example.rb controls/postgresql.rb
Öffnen Sie anschließend die Datei mit Ihrem Texteditor:
nano controls/postgresql.rb
Ersetzen Sie den Inhalt der Datei durch Folgendes:
controls/postgresql.rb
control '1-audit_installation' do
impact 1.0
title 'Audit PostgreSQL Installation'
desc 'Postgres should be installed and running'
describe package('postgresql-10') do
it {should be_installed}
its('version') {should cmp >= '10'}
end
describe service('postgresql@10-main') do
it {should be_enabled}
it {should be_installed}
it {should be_running}
end
end
Im vorhergehenden Codeblock definieren Sie zunächst das Steuerelement mit seinem Namen und seinen Metadaten.
Im erstendescribe
-Block verwenden Sie die Ressourcepackage
und übergeben den PostgreSQL-Paketnamenpostgresql-10
als Ressourcenargument. Die Ressourcepackage
stellt den Matcherbe_installed
bereit, um zu testen, ob das genannte Paket auf dem System installiert ist. Es gibttrue zurück, wenn Sie das Paket installiert haben, undfalse andernfalls. Als Nächstes haben Sie die Anweisungits
verwendet, um zu überprüfen, ob die Version des installierten PostgreSQL-Pakets mindestens 10 ist. Sie verwendencmp
anstelle voneq
, da Paketversionszeichenfolgen normalerweise andere Attribute als die numerische Version enthalten. eq
gibttrue nur zurück, wenn eine genaue Übereinstimmung vorliegt, währendcmp
weniger restriktiv ist.
Im zweitendescribe
-Block verwenden Sie die Ressourceservice
und übergeben den PostgreSQL 10-Dienstnamenpostgresql@10-main
als Ressourcenargument. Die Ressourceservice
stellt die Matcherbe_enabled
,be_installed
undbe_running
bereit und sie gebentrue zurück, wenn Sie den genannten Dienst installiert, aktiviert und auf dem ausgeführt haben Zielsystem jeweils.
Speichern und schließen Sie Ihre Datei.
Als Nächstes führen Sie Ihr Profil aus. Stellen Sie sicher, dass Sie sich im Verzeichnis~/PostgreSQL
befinden, bevor Sie den folgenden Befehl ausführen:
inspec exec .
Nachdem Sie das Lernprogramm für die PostgreSQL-Voraussetzungen abgeschlossen haben, besteht Ihr Test. Ihre Ausgabe sieht ungefähr so aus:
OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target: local://
✔ 1-audit_installation: Audit PostgreSQL Installation
✔ System Package postgresql-10 should be installed
✔ System Package postgresql-10 version should cmp >= "10"
✔ Service postgresql@10-main should be enabled
✔ Service postgresql@10-main should be installed
✔ Service postgresql@10-main should be running
Profile Summary: 1 successful control, 0 control failures, 0 controls skipped
Test Summary: 5 successful, 0 failures, 0 skipped
Die Ausgabe zeigt an, dass Ihre Steuerung erfolgreich war. Eine Kontrolle ist nur dann erfolgreich, wenn alle darin enthaltenen Tests erfolgreich sind. Die Ausgabe bestätigt auch, dass alle Ihre Tests erfolgreich waren.
Nachdem Sie überprüft haben, ob die richtige Version von PostgreSQL installiert ist und der Dienst ordnungsgemäß funktioniert, erstellen Sie ein neues Steuerelement, mit dem sichergestellt wird, dass PostgreSQL den richtigen Port, die richtige Adresse und das richtige Protokoll überwacht.
Für diesen Test verwenden Sie auchattributes. Ein InSpec-Attribut wird zum Parametrisieren eines Profils verwendet, um eine einfache Wiederverwendung in verschiedenen Umgebungen oder Zielsystemen zu ermöglichen. Sie definieren das AttributPORT
.
Öffnen Sie die Dateiinspec.yml
in Ihrem Texteditor:
nano inspec.yml
Sie hängen das Attributport
an das Ende der Datei an. Fügen Sie am Ende Ihrer Datei Folgendes hinzu:
inspec.yml
...
attributes:
- name: port
type: string
default: '5432'
Im vorhergehenden Codeblock haben Sie das Attributport
hinzugefügt und auf den Standardwert5432
gesetzt, da dies der Port ist, den PostgreSQL standardmäßig überwacht.
Speichern und schließen Sie die Datei. Führen Sie danninspec check
aus, um zu überprüfen, ob das Profil noch gültig ist, da Sie geradeinspec.yml
bearbeitet haben:
inspec check .
Wenn keine Fehler vorliegen, können Sie fortfahren. Öffnen Sie andernfalls die Dateiinspec.yml
und stellen Sie sicher, dass das Attribut am Ende der Datei vorhanden ist.
Jetzt erstellen Sie das Steuerelement, mit dem überprüft wird, ob der PostgreSQL-Prozess ausgeführt und mit dem richtigen Benutzer konfiguriert wird. Öffnen Siecontrols/postgresql.rb
in Ihrem Texteditor:
nano controls/postgresql.rb
Fügen Sie das folgende Steuerelement an das Ende Ihrer aktuellen Testdateicontrols/postgresql.rb
an:
controls/postgresql.rb
...
PORT = attribute('port')
control '2-audit_address_port' do
impact 1.0
title 'Audit Process and Port'
desc 'Postgres port should be listening and the process should be running'
describe port(PORT) do
it {should be_listening}
its('addresses') {should include '127.0.0.1'}
its('protocols') {should cmp 'tcp'}
end
describe processes('postgres') do
it {should exist}
its('users') {should include 'postgres'}
end
describe user('postgres') do
it {should exist}
end
end
Hier deklarieren Sie zunächst die VariablePORT
, die den Wert des Profilattributsport
enthält. Dann deklarieren Sie das Steuerelement und seine Metadaten.
Im erstendescribe
-Block enthalten Sie dieport
-Ressource, um grundlegende Porteigenschaften zu testen. Die Ressourceport
liefert die Matcherbe_listening
,addresses
undprotocols
. Sie verwenden den Matcherbe_listening
, um zu testen, ob der genannte Port das Zielsystem überwacht. Es gibttrue zurück, wenn der Port5432
empfangsbereit ist, andernfallsfalse. Deraddresses
-Matcher testet, ob die angegebene Adresse dem Port zugeordnet ist. In diesem Fall überwacht PostgreSQL die lokale Adresse127.0.0.1
.
Der Matcherprotocols
testet das Internetprotokoll, auf das der Port wartet. Dies kannicmp
sein. tcp
/tcp6
oderudp
/udp6
. PostgreSQL wartet auftcp
Verbindungen.
Im zweiten Blockdescribe
enthalten Sie die Ressourceprocesses
. Sie verwenden die Ressourceprocesses
, um Eigenschaften für Programme zu testen, die auf dem System ausgeführt werden. Zuerst überprüfen Sie, ob der Prozesspostgres
auf dem System vorhanden ist, und verwenden dann den Matcherusers
, um zu testen, ob der Benutzerpostgres
den Prozesspostgres
besitzt.
Im drittendescribe
-Block haben Sie dieuser
-Ressource. Sie geben die Ressourceuser
an, um Benutzereigenschaften für einen Benutzer zu testen, z. B. ob der Benutzer vorhanden ist oder nicht, zu welcher Gruppe der Benutzer gehört usw. Mit dieser Ressource testen Sie, ob der Benutzer vonpostgres
auf dem System vorhanden ist. Speichern und beenden Siecontrols/postgresql.rb
.
Führen Sie als Nächstes Ihr Profil mit dem folgenden Befehl aus:
inspec exec .
Die Tests bestehen und Ihre Ausgabe sieht folgendermaßen aus:
OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target: local://
✔ 1-audit_installation: Audit PostgreSQL Installation
✔ System Package postgresql-10 should be installed
✔ System Package postgresql-10 version should cmp >= "10"
✔ Service postgresql@10-main should be enabled
✔ Service postgresql@10-main should be installed
✔ Service postgresql@10-main should be running
✔ 2-audit_address_port: Audit Process and Port
✔ Port 5432 should be listening
✔ Port 5432 addresses should include "127.0.0.1"
✔ Port 5432 protocols should cmp == "tcp"
✔ Processes postgres should exist
✔ Processes postgres users should include "postgres"
✔ User postgres should exist
Profile Summary: 2 successful controls, 0 control failures, 0 controls skipped
Test Summary: 11 successful, 0 failures, 0 skipped
Die Ausgabe zeigt an, dass sowohl Ihre Kontrollen als auch alle Ihre Tests erfolgreich waren.
In diesem Abschnitt haben Sie Ihr erstes InSpec-Profil und -Steuerelement erstellt und zum Organisieren Ihrer Tests verwendet. Sie haben mehrere InSpec-Ressourcen verwendet, um sicherzustellen, dass die richtige Version von PostgreSQL installiert ist, der PostgreSQL-Dienst aktiviert ist und ordnungsgemäß ausgeführt wird und der PostgreSQL-Benutzer auf dem System vorhanden ist. Mit dieser Einstellung können Sie Ihre Konfiguration überprüfen.
[[Schritt 4 - Prüfung Ihrer Postgresql-Konfiguration]] == Schritt 4 - Prüfung Ihrer PostgreSQL-Konfiguration
In diesem Schritt prüfen Sie einige PostgreSQL-Konfigurationswerte, die Ihnen eine Grundlage für die Arbeit mit diesen Konfigurationsdateien bieten. Auf diese Weise können Sie alle PostgreSQL-Konfigurationsparameter wie gewünscht prüfen.
Nachdem Sie die PostgreSQL-Installation getestet haben, prüfen Sie Ihre PostgreSQL-Konfiguration selbst. PostgreSQL verfügt über mehrere Konfigurationsparameter, mit denen Sie die gewünschten Einstellungen vornehmen können. Diese werden in der Konfigurationsdatei gespeichert, die sich standardmäßig unter/etc/postgresql/10/main/postgresql.conf
befindet. In Bezug auf die PostgreSQL-Konfiguration können für Ihre verschiedenen Bereitstellungen unterschiedliche Anforderungen gelten, z. B. Protokollierung, Kennwortverschlüsselung, SSL und Replikationsstrategien. Diese Anforderungen werden in der Konfigurationsdatei angegeben.
Sie verwenden die Ressourcepostgres_conf
, die bestimmte, benannte Konfigurationsoptionen anhand der erwarteten Werte im Inhalt der PostgreSQL-Konfigurationsdatei testet.
Bei diesem Test werden einige nicht standardmäßige PostgreSQL-Konfigurationswerte vorausgesetzt, die Sie manuell festlegen.
Öffnen Sie die PostgreSQL-Konfigurationsdatei in Ihrem bevorzugten Texteditor:
sudo nano /etc/postgresql/10/main/postgresql.conf
Stellen Sie die folgenden Konfigurationswerte ein. Wenn die Option bereits in der Datei vorhanden ist, aber auskommentiert ist, kommentieren Sie sie aus, indem Sie#
entfernen, und legen Sie den angegebenen Wert fest:
/etc/postgresql/10/main/postgresql.conf
password_encryption = scram-sha-256
logging_collector = on
log_connections = on
log_disconnections = on
log_duration = on
Die von Ihnen eingestellten Konfigurationswerte:
-
Stellen Sie sicher, dass gespeicherte Kennwörter immer mit dem scram-sha-256-Algorithmus verschlüsselt werden.
-
Aktivieren Sie
logging collector
, einen Hintergrundprozess, der Protokollnachrichten aus dem Standardfehler (stderr
) erfasst und in eine Protokolldatei umleitet. -
Aktivieren Sie die Protokollierung von Verbindungsversuchen zum PostgreSQL-Server sowie von erfolgreichen Verbindungen.
-
Aktivieren Sie die Protokollierung von Sitzungsabbrüchen.
-
Aktivieren Sie die Protokollierung der Dauer jeder abgeschlossenen Anweisung.
Speichern und beenden Sie die Konfigurationsdatei. Starten Sie dann den PostgreSQL-Dienst neu:
sudo service postgresql@10-main restart
Sie testen nur einige Konfigurationsoptionen, können jedoch jede PostgreSQL-Konfigurationsoption mit der Ressourcepostgres_conf
testen.
Sie übergeben Ihr PostgreSQL-Konfigurationsverzeichnis mit/etc/postgresql/10/main
unter Verwendung des neuen Profilattributspostgres_conf_dir
. Dieses Konfigurationsverzeichnis ist nicht für alle Betriebssysteme und Plattformen gleich. Wenn Sie es also als Profilattribut übergeben, können Sie dieses Profil in verschiedenen Umgebungen einfacher wiederverwenden.
Öffnen Sie die Dateiinspec.yml
:
nano inspec.yml
Fügen Sie dieses neue Attribut dem Abschnittattributes
voninspec.yml
hinzu:
inspec.yml
...
- name: postgres_conf_dir
type: string
default: '/etc/postgresql/10/main'
Speichern und schließen Sie Ihre Datei. Führen Sie dann den folgenden Befehl aus, um zu überprüfen, ob das InSpec-Profil noch gültig ist, da Sie gerade dieinspec.yml
bearbeitet haben:
inspec check .
Wenn keine Fehler vorliegen, können Sie fortfahren. Öffnen Sie andernfalls die Dateiinspec.yml
und stellen Sie sicher, dass die obigen Zeilen am Ende der Datei vorhanden sind.
Jetzt erstellen Sie das Steuerelement, das die von Ihnen erzwungenen Konfigurationswerte überprüft. Fügen Sie das folgende Steuerelement an das Ende der Testdateicontrols/postgresql.rb
an:
controls/postgresql.rb
...
POSTGRES_CONF_DIR = attribute('postgres_conf_dir')
POSTGRES_CONF_PATH = File.join(POSTGRES_CONF_DIR, 'postgresql.conf')
control '3-postgresql' do
impact 1.0
title 'Audit PostgreSQL Configuration'
desc 'Audits specific configuration options'
describe postgres_conf(POSTGRES_CONF_PATH) do
its('port') {should eq PORT}
its('password_encryption') {should eq 'scram-sha-256'}
its('ssl') {should eq 'on'}
its('logging_collector') {should eq 'on'}
its('log_connections') {should eq 'on'}
its('log_disconnections') {should eq 'on'}
its('log_duration') {should eq 'on'}
end
end
Hier definieren Sie zwei Variablen:
-
POSTGRES_CONF_DIR
enthält das Attributpostgres_conf_dir
, wie in der Profilkonfiguration definiert. -
POSTGRES_CONF_PATH
enthält den absoluten Pfad der Konfigurationsdatei, indem der Name der Konfigurationsdatei mitFile.join
mit dem Konfigurationsverzeichnis verknüpft wird.
Als Nächstes definieren Sie das Steuerelement mit seinem Namen und seinen Metadaten. Anschließend verwenden Sie die Ressourcepostgres_conf
zusammen mit dem Matchereq
, um sicherzustellen, dass Ihre erforderlichen Werte für die Konfigurationsoptionen korrekt sind. Speichern und beenden Siecontrols/postgresql.rb
.
Als Nächstes führen Sie den Test mit dem folgenden Befehl aus:
inspec exec .
Die Tests werden bestanden und Ihre Ausgaben werden wie folgt aussehen:
OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target: local://
✔ 1-audit_installation: Audit PostgreSQL Installation
✔ System Package postgresql-10 should be installed
✔ System Package postgresql-10 version should cmp >= "10"
✔ Service postgresql@10-main should be enabled
✔ Service postgresql@10-main should be installed
✔ Service postgresql@10-main should be running
✔ 2-audit_address_port: Audit Process and Port
✔ Port 5432 should be listening
✔ Port 5432 addresses should include "127.0.0.1"
✔ Port 5432 protocols should cmp == "tcp"
✔ Processes postgres should exist
✔ Processes postgres users should include "postgres"
✔ User postgres should exist
✔ 3-postgresql: Audit PostgreSQL Configuration
✔ PostgreSQL Configuration port should eq "5432"
✔ PostgreSQL Configuration password_encryption should eq "scram-sha-256"
✔ PostgreSQL Configuration ssl should eq "on"
✔ PostgreSQL Configuration logging_collector should eq "on"
✔ PostgreSQL Configuration log_connections should eq "on"
✔ PostgreSQL Configuration log_disconnections should eq "on"
✔ PostgreSQL Configuration log_duration should eq "on"
Profile Summary: 3 successful controls, 0 control failures, 0 controls skipped
Test Summary: 18 successful, 0 failures, 0 skipped
Die Ausgabe zeigt an, dass Ihre drei Kontrollen und alle Ihre Tests ohne ausgelassene Tests oder Kontrollen erfolgreich waren.
In diesem Schritt haben Sie ein neues InSpec-Steuerelement hinzugefügt, mit dem bestimmte PostgreSQL-Konfigurationswerte aus der Konfigurationsdatei mithilfe der Ressourcepostgres_conf
getestet werden. Sie haben in diesem Abschnitt einige Werte überprüft, können sie jedoch zum Testen beliebiger Konfigurationsoptionen aus der Konfigurationsdatei verwenden.
[[Schritt-5 -—- Auditing-Postgresql-Client-Authentifizierung]] == Schritt 5 - Auditing der PostgreSQL-Client-Authentifizierung
Nachdem Sie einige Tests für Ihre PostgreSQL-Konfiguration geschrieben haben, werden Sie einige Tests für die Clientauthentifizierung schreiben. Dies ist wichtig für Installationen, die bestimmte Authentifizierungsmethoden für verschiedene Benutzertypen sicherstellen müssen. Um beispielsweise sicherzustellen, dass Clients, die sich lokal mit PostgreSQL verbinden, immer mit einem Kennwort authentifiziert werden müssen, oder um Verbindungen von einer bestimmten IP-Adresse oder einem bestimmten IP-Adressbereich usw. abzulehnen.
Eine wichtige Konfiguration für PostgreSQL-Installationen, bei denen es um die Sicherheit geht, besteht darin, nur verschlüsselte Kennwortauthentifizierungen zuzulassen. PostgreSQL 10supports two password encryption methods für die Clientauthentifizierung:md5
undscram-sha-256
. Dieser Test erfordert eine Kennwortverschlüsselung für alle Clients. Dies bedeutet, dass das FeldMETHOD
für alle Clients in der Clientkonfigurationsdatei entweder aufmd5
oderscram-sha-256
festgelegt werden muss. Für diese Tests verwenden Siescram-sha-256
, da es sicherer alsmd5
ist.
Standardmäßig haben die Clients vonlocal
ihre Authentifizierungsmethodepeer
in der Dateipg_hba.conf
. Für den Test müssen Sie diese inscram-sha-256
ändern. Öffnen Sie die Datei/etc/postgresql/10/main/pg_hba.conf
:
sudo nano /etc/postgresql/10/main/pg_hba.conf
Der Anfang der Datei enthält Kommentare. Scrollen Sie nach unten und suchen Sie nach nicht kommentierten Zeilen mit dem Authentifizierungstyplocal
. Ändern Sie die Authentifizierungsmethode vonpeer
inscram-sha-256
. Ändern Sie zum Beispiel:
/etc/postgresql/10/main/pg_hba.conf
...
local all postgres peer
...
to:
/etc/postgresql/10/main/pg_hba.conf
...
local all postgres scram-sha-256
...
Am Ende ähnelt die Konfiguration vonpg_hba.conf
der folgenden:
/etc/postgresql/10/main/pg_hba.conf
...
local all postgres scram-sha-256
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all scram-sha-256
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all scram-sha-256
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
...
Speichern und beenden Sie die Konfigurationsdatei. Starten Sie dann den PostgreSQL-Dienst neu:
sudo service postgresql@10-main restart
Für diesen Test verwenden Sie die Ressourcepostgres_hba_conf
. Diese Ressource wird zum Testen der in der Dateipg_hba.conf
definierten Clientauthentifizierungsdaten verwendet. Sie übergeben den Pfad Ihrerpg_hba.conf
-Datei als Parameter an diese Ressource.
Ihre Steuerung besteht aus zweidescribe
-Blöcken, die dieauth_method
-Felder sowohl fürlocal
- als auch fürhost
-Clients überprüfen, um sicherzustellen, dass beide gleichscram-sha-256
sind. Öffnen Siecontrols/postgresql.rb
in Ihrem Texteditor:
nano controls/postgresql.rb
Fügen Sie das folgende Steuerelement an das Ende der Testdateicontrols/postgresql.rb
an:
controls/postgresql.rb
POSTGRES_HBA_CONF_FILE = File.join(POSTGRES_CONF_DIR, 'pg_hba.conf')
control '4-postgres_hba' do
impact 1.0
title 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf'
desc 'Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf. Do not allow untrusted authentication methods.'
describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'local' } do
its('auth_method') { should all eq 'scram-sha-256' }
end
describe postgres_hba_conf(POSTGRES_HBA_CONF_FILE).where { type == 'host' } do
its('auth_method') { should all eq 'scram-sha-256' }
end
end
In diesem Codeblock definieren Sie eine neue VariablePOSTGRES_HBA_CONF_FILE
, um den absoluten Speicherort Ihrerpg_hba.conf
-Datei zu speichern. File.join
ist eine Ruby-Methode zum Verketten von zwei Dateipfadsegmenten mit/
. Sie verwenden es hier, um die im vorherigen Abschnitt deklarierte VariablePOSTGRES_CONF_DIR
mit der PostgreSQL-Konfigurationsdateipg_hba.conf
zu verknüpfen. Dadurch wird ein absoluter Dateipfad der Dateipg_hba.conf
erstellt und in der VariablenPOSTGRES_HBA_CONF_FILE
gespeichert.
Danach deklarieren und konfigurieren Sie das Steuerelement und seine Metadaten. Der erstedescribe
-Block überprüft, ob alle Konfigurationseinträge mit dem Client-Typlocal
auchscram-sha-256
als Authentifizierungsmethoden haben. Der zweitedescribe
-Block macht dasselbe für Fälle, in denen der Client-Typhost
ist. Speichern und beenden Siecontrols/postgresql.rb
.
Sie führen dieses Steuerelement als Benutzer vonpostgres
aus, da der Zugriff vonRead
auf die PostgreSQL-HBA-Konfiguration nur dem Eigentümer und der Gruppe gewährt wird, die der Benutzer vonpostgres
ind. Führen Sie das Profil aus, indem Sie Folgendes ausführen:
sudo -u postgres inspec exec .
Ihre Ausgabe sieht folgendermaßen aus:
OutputProfile: InSpec Profile (PostgreSQL)
Version: 0.1.0
Target: local://
✔ 1-audit_installation: Audit PostgreSQL Installation
✔ System Package postgresql-10 should be installed
✔ System Package postgresql-10 version should cmp >= "10"
✔ Service postgresql@10-main should be enabled
✔ Service postgresql@10-main should be installed
✔ Service postgresql@10-main should be running
✔ 2-audit_address_port: Audit Process and Port
✔ Port 5432 should be listening
✔ Port 5432 addresses should include "127.0.0.1"
✔ Port 5432 protocols should cmp == "tcp"
✔ Processes postgres should exist
✔ Processes postgres users should include "postgres"
✔ User postgres should exist
✔ 3-postgresql: Audit PostgreSQL Configuration
✔ PostgreSQL Configuration port should eq "5432"
✔ PostgreSQL Configuration password_encryption should eq "scram-sha-256"
✔ PostgreSQL Configuration ssl should eq "on"
✔ PostgreSQL Configuration logging_collector should eq "on"
✔ PostgreSQL Configuration log_connections should eq "on"
✔ PostgreSQL Configuration log_disconnections should eq "on"
✔ PostgreSQL Configuration log_duration should eq "on"
✔ 4-postgres_hba: Require SCRAM-SHA-256 for ALL users, peers in pg_hba.conf
✔ Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "local" auth_method should all eq "scram-sha-256"
✔ Postgres Hba Config /etc/postgresql/10/main/pg_hba.conf with type == "host" auth_method should all eq "scram-sha-256"
Profile Summary: 4 successful controls, 0 control failures, 0 controls skipped
Test Summary: 20 successful, 0 failures, 0 skipped
Diese Ausgabe zeigt an, dass das neue Steuerelement, das Sie zusammen mit allen vorherigen Steuerelementen hinzugefügt haben, erfolgreich ist. Es zeigt auch an, dass alle Tests in Ihrem Profil erfolgreich sind.
In diesem Schritt haben Sie Ihrem Profil ein Steuerelement hinzugefügt, das Ihre PostgreSQL-Clientauthentifizierungskonfiguration erfolgreich überprüft hat, um sicherzustellen, dass alle Clients überscram-sha-256
unter Verwendung derpostgres_hba_conf
-Ressource authentifiziert werden.
Fazit
Sie haben InSpec eingerichtet und eine PostgreSQL 10-Installation erfolgreich überprüft. Dabei haben Sie eine Auswahl von InSpec-Tools verwendet, z. B. InSpec DSL, Matcher, Ressourcen, Profile, Attribute und die CLI. Von hier aus können Sie andere Ressourcen, die InSpec bereitstellt, inResources section ihrer Dokumentation integrieren. InSpec bietet auch einen Mechanismus zum Definieren voncustom resources für Ihre spezifischen Anforderungen. Diese benutzerdefinierten Ressourcen werden als reguläre Ruby-Klasse geschrieben.
Sie können auch den AbschnittCompliance Profiles
vonChef supermarket durchsuchen, der öffentlich freigegebene InSpec-Profile enthält, die Sie direkt ausführen oder in Ihren eigenen Profilen erweitern können. Sie können auch Ihre eigenen Profile mit der Öffentlichkeit im Chef-Supermarkt teilen.
Sie können noch weiter gehen, indem Sie andere Tools im Chef-Universum erkunden, z. B.Chef
undHabitat
. InSpec is integrated with Habitat und dies bietet die Möglichkeit, Ihre Compliance-Kontrollen zusammen mit Ihren Habitat-Anwendungen zu versenden und kontinuierlich auszuführen. Sie können offizielle und Community-InSpec-Tutorials auf der Seitetutorialsdurchsuchen. Weitere erweiterte InSpec-Referenzen finden Sie in den offiziellenInSpec documentation.