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?
quelle
Antworten:
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.
quelle
> 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.
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.
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!)
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.
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.
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.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!
quelle
Antwort 1: die steuermaschine
Mit Ihrem Laptop können Sie über einen Bastion-Host eine Verbindung zu Servern herstellen. so etwas wie:
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:
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
quelle