So prüfen Sie eine PostgreSQL-Datenbank mit InSpec unter Ubuntu 18.04

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:

[[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 voneqeinen 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 InSpecprofilemit 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 vonPostgreSQLzu 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-10auf Ihrem System installiert ist und dass der Dienstpostgresqlinstalliert, 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 Anweisungitsverwendet, 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~/PostgreSQLbefinden, 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.ymlin Ihrem Texteditor:

nano inspec.yml

Sie hängen das Attributportan 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 Profilattributsportenthä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 Matcherprotocolstestet das Internetprotokoll, auf das der Port wartet. Dies kannicmp sein. tcp /tcp6 oderudp /udp6. PostgreSQL wartet auftcp Verbindungen.

Im zweiten Blockdescribeenthalten 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 Prozesspostgresauf dem System vorhanden ist, und verwenden dann den Matcherusers, um zu testen, ob der Benutzerpostgresden Prozesspostgresbesitzt.

Im drittendescribe-Block haben Sie dieuser-Ressource. Sie geben die Ressourceuseran, 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 vonpostgresauf 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 Sielogging 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_conftesten.

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_confzusammen 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_confgetestet 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 vonlocalihre Authentifizierungsmethodepeerin 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.confder 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.confdefinierten 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.conferstellt und in der VariablenPOSTGRES_HBA_CONF_FILEgespeichert.

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 vonpostgresaus, da der Zugriff vonReadauf die PostgreSQL-HBA-Konfiguration nur dem Eigentümer und der Gruppe gewährt wird, die der Benutzer vonpostgresind. 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.