Was ist die beste Methode für die Anmeldeinformationen als Benutzerdaten an eine EC2-Instanz AWS vorbei?

StackOverflow https://stackoverflow.com/questions/640838

Frage

Ich habe einen Job Verarbeitungsarchitektur auf AWS basiert, die EC2-Instanzen Abfrage S3 und SQS erfordert. Um Beispiele für die Ausführung von Zugriff auf die API haben, um die Anmeldeinformationen werden als Nutzdaten (-F) in Form eines Base64-kodiert Shell-Skript gesendet. Zum Beispiel:

$ cat ec2.sh
...
export AWS_ACCOUNT_NUMBER='1111-1111-1111'
export AWS_ACCESS_KEY_ID='0x0x0x0x0x0x0x0x0x0'
...
$ zip -P 'secret-password' ec2.sh
$ openssl enc -base64 -in ec2.zip

Viele Instanzen gestartet ...

$ ec2run ami-a83fabc0 -n 20 -f ec2.zip

Jede Instanz decodiert und entschlüsselt ec2.zip mit dem ‚secret-Passwort‘, die in einen Init-Skript hartcodiert ist. Obwohl es funktioniert, habe ich zwei Probleme mit meinem Ansatz.

  1. 'zip -P' ist nicht sehr sicher
  2. Das Passwort ist hartcodiert in der Instanz (es ist immer 'secret-Passwort')

Das Verfahren ist sehr ähnlich die ein hier beschrieben

Gibt es eine elegantere oder akzeptierter Ansatz? Mit gpg den Anmeldeinformationen und zum Speichern des privaten Schlüssels auf der Instanz zu verschlüsseln, um es zu entschlüsseln, ist ein Ansatz, den ich jetzt bedenken, bin aber ich bin keine Kenntnis von Einschränkungen. Kann ich die AWS Keypairs direkt benutzen? Fehle ich einige super offensichtlich Teil der API?

War es hilfreich?

Lösung

Sie die Anmeldeinformationen auf dem Rechner speichern können (oder die Übertragung, Nutzung, dann entfernen Sie diese.)

Sie können die Anmeldeinformationen über einen sicheren Kanal übertragen (zB scp mit nicht-interaktiver Authentifizierung zB Schlüsselpaar verwendet wird), so dass Sie nicht brauchen würden jede individuelle Verschlüsselung durchzuführen (nur sicherstellen, dass Berechtigungen ordnungsgemäß auf dem Schlüssel 0400 gesetzt Datei jederzeit, zum Beispiel setzte die Berechtigungen für die Master-Dateien und verwendet scp -p)

Wenn die oben nicht Ihre Frage nicht beantworten, geben Sie bitte genauere Angaben wieder. was Ihre Einrichtung ist und was Sie versuchen zu erreichen. Sind EC2 Aktionen auf mehreren Knoten von einer zentralen Stelle eingeleitet werden? Ist SSH verfügbar zwischen den mehreren Knoten und der zentralen Lage? Etc.


Bearbeiten

Haben Sie darüber nachgedacht, Parametrier- Ihre AMI , jene erfordern, die instanziiert Ihre AMI, zunächst die Benutzerdaten zu füllen (ec2-run-instances -f user-data-file) mit ihren AWS Schlüssel? Ihr AMI kann dann dynamisch abrufen diese pro Instanz Parameter aus http://169.254.169.254/1.0/user-data.


UPDATE

OK, hier geht ein sicherheitsbewussten Vergleich der bisher diskutierten verschiedene Ansätze:

  1. Sicherheit von Daten, wenn in dem AMI user-data unverschlüsselt gespeichert
    • low
    • Klartextdaten zugänglich ist jeder Benutzer, der auf die AMI anmelden verwaltet und hat Zugriff auf telnet, curl, wget usw. (kann Klartext http://169.254.169.254/1.0/user-data Zugriff)
    • Sie sind anfällig für Angriffe Proxy-Anforderung (z Angreifer den Apache fragt, die auf der AMI ausgeführt werden kann oder nicht bekommen und leitet den Klartext http://169.254.169.254/1.0/user-data)
  2. Sicherheit von Daten, wenn in der AMI user-data gespeichert und verschlüsselt (oder entschlüsselt) mit leicht zugänglichen Schlüssel
    • low
    • leicht erhältlich Schlüssel (Passwort) können gehören:
      • -Taste hartcodiert in einem Skript in einem ABI (wo das ABI kann von einem Angreifer erhalten werden)
      • -Taste hartcodiert in einem Skript auf der AMI selbst, wo das Skript lesbar jeder Benutzer, der auf der AMI
      • loggt verwaltet
      • andere leicht zugängliche Informationen wie Öffentliche Schlüssel, etc.
      • alle privaten Schlüssel (der öffentliche Schlüssel können leicht zugänglich sein)
    • einen leicht erhältlichen Schlüssel gegeben (Passwort), identifizierten die gleichen Probleme in Nummer 1 gelten, und zwar:
      • die entschlüsselten Daten zugänglich zu jeder Benutzer, der auf der AMI und den Zugang zu telnet Anmeldung schafft, curl, wget usw. (kann Klartext http://169.254.169.254/1.0/user-data Zugriff)
      • Sie sind anfällig für Angriffe Proxy-Anforderung (z Angreifer den Apache fragt, die auf der AMI ausgeführt werden kann oder nicht, um die verschlüsselten http://169.254.169.254/1.0/user-data zu erhalten und weiterleiten, ulteriorly mit dem leicht erhältlichen Schlüssel descrypted)
  3. Sicherheit von Daten, wenn in der AMI user-data gespeichert und verschlüsselt mit nicht leicht erhältlich Schlüssel
    • Durchschnitt
    • die verschlüsselten Daten zugänglich ist jeder Benutzer, der auf die AMI anmelden verwaltet und hat Zugriff auf telnet, curl, wget usw. (kann verschlüsselt http://169.254.169.254/1.0/user-data Zugriff)
      • ein Versuch, die verschlüsselten Daten zu entschlüsseln kann dann Brute-Force-Angriffe erfolgen mit
  4. Sicherheit von Daten, wenn auf der AMI gespeichert ist, in einem gesicherten Standort (kein Mehrwert für sie verschlüsselt werden)
    • höher
    • die Daten sind nur für einen Benutzer, der Benutzer, der die Daten benötigt, um zu arbeiten
      • z. Datei im Besitz von Benutzern: Benutzer mit Maske 0600 oder 0400
    • Angreifer in der Lage sein, um den bestimmten Benutzers, um die Identität Zugriff auf die Daten zu erhalten
      • zusätzliche Sicherheitsschichten, wie der Benutzer verweigern direkte Log-on (durch root für interaktive Identitätswechsel passieren zu müssen) verbessert die Sicherheit

So eine Methode, um die AMI user-data Beteiligung ist nicht die sicherste, weil ich Zugang zu jeder Benutzer an der Maschine (schwächste Punkt) kompromittiert die Daten.

Dies könnte gemildert werden, wenn die S3-Anmeldeinformationen nur für einen begrenzten Zeitraum erforderlich waren (dh während des Bereitstellungsprozesses nur) , wenn AWS erlaubt Ihnen, den Inhalt user-data zu überschreiben oder zu entfernen, wenn Sie fertig mit ihm (aber das scheint nicht der Fall zu sein.) Eine Alternative wäre die Schaffung von temporären S3 Anmeldeinformationen für die Dauer des Bereitstellungsprozesses, wenn möglich (diese Anmeldeinformationen zu beeinträchtigen, von user-data, nach dem Bereitstellungsprozess beendet ist und die Anmeldeinformationen mit AWS für ungültig erklärt worden sind, nicht mehr stellt eine Bedrohung für die Sicherheit.)

Wenn die oben nicht anwendbar ist (zB S3 Anmeldeinformationen durch Einsatz Knoten benötigten unbegrenzt) oder nicht möglich (zB nicht nur vorübergehend S3 Anmeldeinformationen für die Bereitstellung ausstellen kann nur) dann die beste Methode bleibt die Kugel und scp die Anmeldeinformationen zu den verschiedenen Knoten zu beißen , möglicherweise parallel mit dem richtigen Eigentümer und Berechtigungen.

Andere Tipps

Ich schrieb einen Artikel untersucht verschiedene Methoden der Geheimnisse einer EC2-Instanz sicher und die Vor- und Nachteile der einzelnen vorbei.

http: // www.shlomoswidler.com/2009/08/how-to-keep-your-aws-credentials-on-ec2.html

Der beste Weg ist Beispiel Profile zu verwenden. Die Grundidee ist:

  • Erstellen Sie eine Instanz Profil
  • Erstellen Sie eine neue IAM Rolle
  • Zuweisen einer Richtlinie zu dem zuvor erstellten Rolle, zum Beispiel:

    {   "Aussage": [     {       "Sid": "Stmt1369049349504",       "Aktion": "sqs: ",       "Effect": "Zulassen",       "Ressource": ""     }   ] }

  • Verknüpfen Sie die Rolle und das Instanzprofil zusammen.

  • Wenn Sie eine neue EC2-Instanz starten, stellen Sie sicher, dass Sie den Instanzprofilnamen angeben.

Wenn alles gut funktioniert, und die Bibliothek, die Sie verwenden, um AWS-Dienste aus Ihrer EC2-Instanz zu verbinden unterstützt die Anmeldeinformationen aus dem Beispiel Meta-Daten abrufen, wird der Code in der Lage, die AWS-Dienste zu nutzen.

Ein vollständiges Beispiel aus der Boto-Benutzer-Mailingliste:

Als erstes müssen Sie ein JSON-Richtliniendokument erstellen, welche Dienste und Ressourcen die IAM Rolle darstellt Zugriff haben sollten. zum Beispiel gewährt diese Politik alle S3 Aktionen für den heißen Stein „my_bucket“. Sie können verwenden, was Politik für Ihre Anwendung geeignet ist.

BUCKET_POLICY = """{
  "Statement":[{
    "Effect":"Allow",
    "Action":["s3:*"],
    "Resource":["arn:aws:s3:::my_bucket"]}]}"""

Als nächstes müssen Sie eine Instanz Profil in IAM erstellen.

import boto
c = boto.connect_iam()
instance_profile = c.create_instance_profile('myinstanceprofile')

Wenn Sie das Instanzprofil haben, müssen Sie die Rolle erstellen, um die Rolle zu Instanzprofil hinzufügen und die Politik mit der Rolle in Verbindung bringen.

role = c.create_role('myrole')
c.add_role_to_instance_profile('myinstanceprofile', 'myrole')
c.put_role_policy('myrole', 'mypolicy', BUCKET_POLICY)

Nun können Sie diese Instanz Profil verwenden, wenn Sie eine Instanz starten:

ec2 = boto.connect_ec2()
ec2.run_instances('ami-xxxxxxx', ..., instance_profile_name='myinstanceprofile')

Ich mag darauf hinweisen, dass es nicht mehr benötigt wird, um alle Anmeldeinformationen zu Ihrer EC2-Instanz zu liefern. Mit IAM können Sie eine Rolle für Ihre EC2-Instanzen erstellen. In diesen Rollen können Sie feinkörnige Richtlinie festlegen, die Ihrer EC2-Instanz erlauben ein bestimmtes Objekt von einem bestimmten S3 Eimern, erhalten zum Beispiel, und nicht mehr. Sie können mehr über IAM-Rollen in der AWS docs lesen:

http://docs.aws.amazon.com/IAM/ latest / Userguide / WorkingWithRoles.html

Wie andere haben schon darauf hier aus, brauchen Sie nicht wirklich AWS Anmeldeinformationen für eine EC2-Instanz zu speichern, die von IAM-Rollen mit -   https: // aws .amazon.com / blogs / Sicherheit / a-safer-Weg-to-distribute-aws-credentials-to-EC2 / . Ich möchte hinzufügen, dass Sie auch die gleiche Methode verwenden, können Sie für die sichere Speicherung von NON-AWS-Anmeldeinformationen für Sie EC2-Instanz, wie sagen, wenn Sie einige db Anmeldeinformationen haben Sie sicher halten wollen. Sie speichern die nicht-aws Anmeldeinformationen auf einem S3 Bukcet, und verwenden Sie IAM Rolle, die Eimer zuzugreifen. Sie können detailliertere Informationen zu diesem hier finden - https://aws.amazon.com/blogs/security/using-iam-roles-to-distribute-non-aws-credentials-to-your-ec2-instances/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top