Ansible Best Practices für die Sicherheit


37

Ich werde Ansible in mein Rechenzentrum einführen und suche nach bewährten Methoden für die Sicherheit, um herauszufinden, wo sich der Steuerungscomputer befindet und wie die SSH-Schlüssel verwaltet werden.

Frage 1: die steuermaschine

Wir brauchen natürlich eine Kontrollmaschine. Auf der Steuerungsmaschine sind öffentliche SSH-Schlüssel gespeichert. Wenn ein Angreifer Zugriff auf den Steuerungscomputer hat, hat er möglicherweise Zugriff auf das gesamte Rechenzentrum (oder auf die von Ansible verwalteten Server). Ist es also besser, einen dedizierten Steuerungscomputer im Rechenzentrum oder einen Fernsteuerungscomputer (wie z. B. einen Laptop, der remote mit dem Rechenzentrum verbunden ist) zu haben?

Wenn die beste Vorgehensweise darin besteht, meinen Laptop zu verwenden (der natürlich gestohlen werden könnte, aber ich könnte meine öffentlichen Schlüssel sicher online in der Cloud oder offline auf einem tragbaren verschlüsselten Gerät speichern), was ist, wenn ich einige Webschnittstellen verwenden muss Ansible, wie Ansible Tower, Semaphore, Rundeck oder Foreman, die auf einer zentralen Maschine im Rechenzentrum installiert werden müssen? Wie kann man es sichern und vermeiden, dass es zu einem "Single Point of Attack" wird?

Frage 2: die SSH-Schlüssel

Angenommen, ich muss Ansible verwenden, um einige Aufgaben auszuführen, die von root ausgeführt werden müssen (z. B. die Installation von Softwarepaketen oder ähnliches). Ich denke, die beste Vorgehensweise ist, nicht den Root-Benutzer auf kontrollierten Servern zu verwenden, sondern einen normalen Benutzer für Ansible mit Sudo-Berechtigungen hinzuzufügen. Wenn Ansible jedoch fast alle Aufgaben ausführen muss, muss es über sudo auf alle Befehle zugreifen können. Also, was ist die beste Wahl:

  • Lassen Sie Ansible den Root - Benutzer verwenden (mit seinem öffentlichen Schlüssel, der in gespeichert ist) ~/.ssh/authorized_keys
  • Erstellen Sie einen nicht privilegierten Benutzer für Ansible mit sudo-Zugriff
  • Ermöglichen Sie dem Ansible-Benutzer, alle Befehle über sudo auszuführen und ein Kennwort anzugeben (dieses Kennwort muss jedem Systemadministrator bekannt sein, der Ansible zur Steuerung dieser Server verwendet).
  • Lassen Sie den Ansible-Benutzer alle Befehle über sudo ausführen, ohne ein Kennwort anzugeben
  • irgendwelche anderen Hinweise?

Sie möchten ein dediziertes Management-Subnetz (oder VLAN). Ihr ansible Steuercomputer befindet sich in diesem Subnetz. Wenn Sie mit dem Steuerungscomputer kommunizieren müssen, verbinden Sie Ihr VPN mit diesem Subnetz. Lassen Sie sich nicht ansible root sein
Neil McGuigan

1
Der Ansible-Steuerungshost wird sich im internen LAN befinden und von außen nicht zugänglich sein, aber ich denke, das ist nicht genug.
Mat

Antworten:


15

Der Bastion Host (das ansible Kontrollzentrum) gehört zu einem separaten Subnetz. Es sollte nicht direkt von außen zugänglich sein, es sollte nicht direkt von den verwalteten Servern zugänglich sein !

Ihr Laptop ist das am wenigsten sichere Gerät. Eine blöde Mail, eine blöde Flash-Schwachstelle, ein blödes Gast-WLAN und es wird gepwnt.

Erlauben Sie bei Servern keinen Root-Zugriff über ssh. Viele Audits machen sich darüber lustig.

Lassen Sie jeden Administrator sein eigenes persönliches Konto auf jedem Zielserver verwenden und lassen Sie ihn mit Passwörtern sudo. Auf diese Weise wird kein Passwort zwischen zwei Personen geteilt. Sie können auf jedem Server überprüfen, wer was getan hat. Es liegt an Ihnen, ob Sie sich bei Ihren persönlichen Konten mit einem Passwort, einem SSH-Schlüssel oder beidem anmelden können.

Um dies zu verdeutlichen, muss kein einziger Ziel-Anmeldename verwendet werden . Jeder Administrator kann und sollte einen persönlichen Ziel-Anmeldenamen haben.

Eine Randnotiz: Versuchen Sie niemals, ein Konto mit dem Namen "ansible" oder "admin" oder "cluster" oder "management" oder "operator" zu erstellen, wenn es ein Passwort hat. Der einzige gute Name für einen Account, der ein Passwort hat, ist der Name eines Menschen, wie "jkowalski". Nur ein Mensch kann für die über das Konto ausgeführten Aktionen verantwortlich sein und für die unsachgemäße Sicherung seines Passworts verantwortlich sein, was "ansible" nicht kann.


Vielen Dank, Sie haben mich davon überzeugt, einen zentralen Bastion-Host in einem separaten Subnetz im Rechenzentrum zu verwenden. Mir ist auch bewusst, dass es am besten ist, einen persönlichen Benutzer pro Systemadministrator zu verwenden, aber jetzt habe ich eine andere Frage (möglicherweise ist dies bei einer separaten Serverfehlerfrage besser): Wie können Benutzer und SSH-Schlüssel auf Linux-Hosts ohne Verwendung von NIS, NFS zentralisiert werden? Aktien oder so etwas? Bitte beachten Sie, dass ich bereits Active Directory für Windows-Server habe.
Mat

Ok, wenn ich besser über meine Frage nachdenke, habe ich zwei mögliche Antworten: Verwenden Sie den LDAP-Schlüsselspeicher oder Userify (siehe zwei Antworten unten). Aber ... brauche ich das wirklich? Nein, wenn ich meinen eigenen Benutzer verwende, um neue Benutzer und Schlüssel über Ansible selbst bereitzustellen! :-)
Mat

@Mat, stimmte vollkommen zu - wie ich weiter unten sagte, benötigen Sie Userify oder ein ähnliches Tool erst, wenn Ihr Team größer wird. (Es macht es allerdings viel angenehmer.) Die Installation von LDAP ist ein bisschen mühsam (siehe pam_ldap und nss_ldap), aber wir haben Tools eingebaut, die sich in Sekundenschnelle in Ansible, Chef, Puppet usw. integrieren lassen <20 Server.
Jamieson Becker

16

> Frage 1: die Kontrollmaschine

Bei Userify (vollständige Offenlegung: Wir bieten tatsächlich Software zur Verwaltung von SSH-Schlüsseln an) kümmern wir uns ständig darum, da wir auch das größte SSH-Schlüssellager betreiben. Wir empfehlen im Allgemeinen eine lokale Installation, anstatt eine Cloud zu verwenden, da Sie die Kontrolle erhöht und die Oberfläche verkleinert haben. Sie können diese wirklich auf nur bekannte vertrauenswürdige Netzwerke beschränken.

Das Wichtigste ist, dass es in einem richtig aufgebauten System wie diesem wirklich keine wesentlichen Geheimnisse geben sollte, die einem Angreifer durchgesickert werden können . Wenn jemand einen Gabelstapler in Ihr Rechenzentrum fährt und mit Ihrem Server davonläuft, erhält er nicht viel außer einigen stark gehackten Passwörtern, wahrscheinlich einigen stark verschlüsselten Dateien und einigen öffentlichen Schlüsseln ohne die entsprechenden privaten Schlüssel. Mit anderen Worten, nicht so sehr.

Wie Sie bereits erwähnt haben, handelt es sich hierbei um die eigentlichen Bedrohungsvektoren, die auftreten , wenn ein Angreifer die Kontrolle über diesen Computer erlangt und damit seine eigenen Benutzerkonten und (öffentlichen) Schlüssel bereitstellt. Dies ist ein Risiko für praktisch jede Cloud-Plattform (z. B. Linode). Sie sollten sich am stärksten darauf konzentrieren, den Zugriff auf die Steuerungsebene zu verhindern. Dies bedeutet, die Angriffsfläche zu minimieren (nur einige Ports freizulegen und diese Ports so weit wie möglich zu sperren) und vorzugsweise Software zu verwenden, die gegen die Eskalation von Berechtigungen und verschiedene Angriffe geschützt ist ( SQL Injection, XSS, CSRF usw.) Aktivieren Sie den 2FA / MFA-Zugriff auf die Steuerebene und konzentrieren Sie sich darauf, diese Steuerebene so weit wie möglich zu sperren.

Ist es also besser, einen dedizierten Steuerungscomputer im Rechenzentrum oder einen Fernsteuerungscomputer (wie z. B. einen Laptop, der remote mit dem Rechenzentrum verbunden ist) zu haben?

Es ist definitiv besser , eine dedizierte Steuerungsmaschine in einem sicheren Rechenzentrum zu haben, da Sie diese isolieren und sperren können, um Diebstahl- oder unbefugte Zugriffe zu verhindern bzw. zu minimieren.

Wenn die beste Praxis ist meinen Laptop zu benutzen (was gestohlen werden könnte, natürlich, aber ich konnte meine öffentlichen Schlüssel sicher gespeichert online in der Cloud oder offline auf einem tragbares crypted Gerät hat), was , wenn ich brauche ein paar Web - Schnittstellen zu verwenden , mit Ansible, wie Ansible Tower, Semaphore, Rundeck oder Foreman, die auf einer zentralen Maschine im Rechenzentrum installiert werden müssen?

Sie müssen KEINE Webschnittstelle oder sekundäre Steuerungsebene ausführen, um Ihre Schlüssel (auch Userify) zu verwalten, bis Sie aufgrund einer größeren Anzahl von Benutzern und unterschiedlicher Berechtigungsstufen auf den Servern groß genug sind, um Verwaltungsprobleme zu lösen, oder zusätzliche benötigen Hand-Holding für Ihre Benutzer, die möglicherweise nicht über Kenntnisse oder Zugriff auf Ansible verfügen, um Schlüssel zu aktualisieren. Userify war anfangs nicht viel mehr als ein Bündel von Shell-Skripten (heute wären sie wahrscheinlich Ansible!), Und daran ist überhaupt nichts auszusetzen, bis Sie anfangen, zusätzliche Verwaltungskontrolle und einfache Möglichkeiten zum Verwalten / Drehen ihrer Skripten zu benötigen eigene Schlüssel. (Bitte schauen Sie sich Userify an, wenn Sie an diesem Punkt angelangt sind!)

Wie kann man es sichern und vermeiden, dass es zu einem "Single Point of Attack" wird?

Schauen Sie sich natürlich alle Ressourcen im Internet an, um die Dinge zu blockieren, aber am wichtigsten ist, dass Sie mit einer sicheren Grundlage beginnen:

1. Planen Sie Ihre Lösung von Anfang an mit Blick auf die Sicherheit. Wählen Sie Technologien (z. B. Datenbanken oder Sprachen), bei denen traditionell weniger Probleme aufgetreten sind, und programmieren Sie dann sicherheitshalber. Bereinigen Sie alle eingehenden Daten, auch von vertrauenswürdigen Benutzern. Paranoia ist eine Tugend.

2. Irgendwann wird alles kaputt. Minimieren Sie den Schaden, wenn er auftritt: Versuchen Sie, wie Sie bereits betont haben, den Umgang mit geheimem Material zu minimieren.

3. Halte es einfach. Machen Sie nicht die neuesten exotischen Dinge, es sei denn, Sie sind sicher, dass dies messbar und nachweislich Ihre Sicherheit erhöht. Zum Beispiel haben wir X25519 / NaCl (libsodium) anstelle von AES für unsere Verschlüsselungsschicht ausgewählt (wir verschlüsseln alles, in Ruhe und in Bewegung), weil es ursprünglich von einer vertrauenswürdigen Person (DJB et al.) Entwickelt und geschrieben wurde und von world rezensiert wurde renommierte Forscher wie Schneier und Googles Sicherheitsteam. Verwenden Sie Dinge, die zur Einfachheit neigen, wenn sie neuer sind, da es aufgrund der Einfachheit schwieriger ist, tiefe Fehler zu verbergen.

4. Sicherheitsstandards erfüllen. Auch wenn Sie nicht in ein Sicherheitsregime wie PCI oder die HIPAA-Sicherheitsregel fallen, lesen Sie diese Standards durch und finden Sie heraus, wie Sie sie einhalten können, oder zumindest sehr strenge Ausgleichskontrollen. Auf diese Weise stellen Sie sicher, dass Sie wirklich die 'Best Practices' erfüllen.

5. Führen Sie externe / unabhängige Penetrationstests durch und führen Sie Bug Bounties durch , um sicherzustellen, dass Sie diese Best Practices kontinuierlich befolgen . Alles sieht gut aus, bis Sie ein paar kluge und hochmotivierte Leute dazu bringen, darauf einzustoßen. Sobald dies erledigt ist, haben Sie großes Vertrauen in Ihre Lösung.


Frage 2: Die SSH-Schlüssel Was ist die beste Wahl: Lassen Sie Ansible den Root-Benutzer verwenden (mit seinem öffentlichen Schlüssel, der in ~/.ssh/authorized_keys/ gespeichert ist), und lassen Sie den Ansible-Benutzer alle Befehle über sudo ausführen, wobei er ein Kennwort angibt (das jedem Sysadmin eindeutig bekannt sein muss) die Ansible verwendet, um diese Server zu steuern)

Versuchen Sie, die Verwendung von Kennwörtern auf Servern zu vermeiden, auch für sudo. Das hat mit Geheimnissen zu tun und untergräbt letztendlich Ihre Sicherheit (Sie können dieses sudo-Passwort nicht sehr leicht zwischen Maschinen variieren, Sie müssen es irgendwo speichern, das Passwort bedeutet, dass Sie keine Server-zu-Server-Automatisierung durchführen können, was wirklich ist Genau darum geht es. Wenn Sie SSH auf den Standardeinstellungen belassen, können diese Kennwörter brutal erzwungen werden, wodurch die Schlüssel etwas bedeutungslos werden. Vermeiden Sie außerdem die Verwendung des Root-Benutzers für beliebige Zwecke und insbesondere die Remote-Anmeldung.

Erstellen Sie einen nicht privilegierten Benutzer, der für Ansible mit sudo-Zugriff reserviert ist, und lassen Sie den Ansible-Benutzer alle Befehle über sudo ausführen, ohne ein Kennwort anzugeben

Genau. Ein nicht privilegierter Benutzer, den Sie mit sudo-Rollen auf ansible zurückführen können. Erstellen Sie im Idealfall einen Standardbenutzer für die Server-zu-Server- / Ansible-Kommunikation mit sudo-Zugriff (ohne Kennwort).

... NB, wenn Sie Userify verwenden, würde ich vorschlagen, einen Userify-Benutzer für ansible zu erstellen (Sie können dies auch nach Projekt oder Servergruppe aufteilen, wenn Sie mehrere ansible-Steuerungscomputer haben) einen SSH-Schlüssel auf dem Steuerungsserver und geben Sie seinen öffentlichen Schlüssel auf seiner Userify-Profilseite an. (Dieses Textfeld wird im Wesentlichen /home/ansible/.ssh/authorized_keys). Sie sollten das ansible Systemkonto von anderen Server-zu-Server-Systemkonten wie einem Remote-Sicherungskonto, einer geheimen Verwaltung usw. getrennt halten. Laden Sie dann Ihre Mitarbeiter ein, damit diese ihre eigenen Schlüssel erstellen und verwalten können, und alles bleibt getrennt. Versuchen Sie jedoch, genau wie beim Sperren eines Ansible-Steuerungsservers, Ihren Userify-Server (oder die von Ihnen bereitgestellte Lösung) auf dieselbe Weise zu sperren.

irgendwelche anderen Hinweise?

Ich denke, du gehst das definitiv richtig an und stellst die richtigen Fragen. Wenn Sie über solche Dinge diskutieren möchten, senden Sie mir eine E-Mail (Vorname und Nachname bei userify), und ich würde mich über einen Chat freuen, egal in welche Richtung Sie letztendlich gehen. Viel Glück!


5

Antwort 1: die steuermaschine

Mit Ihrem Laptop können Sie über einen Bastion-Host eine Verbindung zu Servern herstellen. so etwas wie:

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

Mehr zu Bastion Hosts

Wo Sie einen Schlüssel für den Bastion-Server und dann einen separaten Schlüssel für den Host dahinter haben. (persönlich würde ich gpg-agent / ssh-agent verwenden)

Antwort 2: Authentifizierung

Ich bin nicht sicher, wie sich "ansible" spezifische Best Practices von anderen Best Practices für ssh-Verbindungen unterscheiden. Aber nein, Sie möchten ansible als Sie selbst ausführen, nicht als Dienstkonto und nicht als Root-Konto.

Eine Kombination der folgenden Authentifizierungen:

Andere Gedanken:

  • Bewahren Sie Geheimnisse / private Informationen immer in einem Tresor auf.
  • Ansible benötigt zum Ausführen nicht SUDO / Root, es sei denn, Sie benötigen sudo / root.
  • Ansible kann Berechtigungen auf viele verschiedene Arten erhöhen

Zuletzt haben Sie nichts über Fenster erwähnt. Ich kann also nur davon ausgehen, dass Sie dies nicht verwenden. In diesem Fall würde ich jedoch die Delegate-Option verwenden, damit Ihr Laptop den Bastion-Host (delegate_to bastion.hostname.fqdn:) und kerberos / winrm https mit Kerberos-Tickets verwendet.

Wenn Sie es verpasst haben, verwenden Sie immer benannte Konten

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.