[PYTHON] Zu berücksichtigende Punkte, wenn Sie die SoftLayer-API über eine App auf Bluemix aufrufen

Was nicht in Qiita geschrieben ist, ist nichts anderes als ein Fehler an technischem Material, daher muss ich selbst hierher fahren [SoftLayer Adventskalender 2015](http://qiita.com/ Ich habe mich bei Advent-Kalender / 2015 / Softlayer registriert). Wenn ich das nicht tun würde, hätte ich das Gefühl, dass es kein technisches Material gibt, aber ich könnte wegen Iloilo überhaupt nicht schreiben. Ich denke, es wird ab dem nächsten Jahr zunehmen (mehr Antrieb).

Jetzt. Kürzlich gab es bei einer internen Python-Lernsitzung einen Plan, Python auf Bluemix zu verwenden, um die API von SoftLayer zu erreichen! Ich schrieb Python-Code mit einer solchen Geschichte und schämte mich, [github](https: //) zu schreiben. Es wird auf github.com/sho7650/python03 veröffentlicht. Dieses Mal dachte ich, ich sollte den Hintergrund berühren, solchen Code schreiben zu müssen, nicht den Code selbst, also schrieb ich ihn. Es ist nicht so, dass ich es leid bin zu erklären, was ich geschrieben habe. Mit allen Mitteln.

Vorausgesetztes Wissen und Ziel zum Lesen danach

Es ist sehr begrenzt, aber es ist wahrscheinlich nur für diejenigen nützlich, die begrenzt zu sein scheinen.

Zu berücksichtigende Punkte beim Aufrufen der SoftLayer-API usw. mit einer Webanwendung

Der Titel hat sich in normal geändert, aber es ist keine wirklich begrenzte Geschichte wie Bluemix oder SoftLayer, es ist ein allgemeines Konzept. Dieses Mal habe ich zufällig den Code geschrieben, der die SoftLayer-API auf Bluemix getroffen hat, also ist er so eingeschränkt geschrieben. Wenn Sie den Code einfügen oder ausprobieren möchten, ist es besser, dass der Code vorhanden ist. Sollte gut sein.

Jetzt. Was ist mit Ihrer USER-ID und Ihrem API-Schlüssel passiert?

Nicht enttäuschend für mich, die meisten von Ihnen starren auf die USER ID und den API-Schlüssel in der Shell. Ist es falsch? Wenn jemand sagt, dass es nicht in der Shell geschrieben ist, müssen Sie es möglicherweise nicht mehr lesen.

Schreiben Sie den API-Schlüssel nicht so, wie er im Programm enthalten ist

Plötzlich zeigte ich die Punkte, die im Titel zu beachten sind, aber das ist es. Es ist nicht auf API-Schlüssel beschränkt, aber es ist üblich, dass Daten geändert werden können und Daten verwendet werden, indem mehrere Optionen angezeigt werden, anstatt im Programm fest codiert zu sein. "Natürlich.

Warum

Daten und Passwörter können sich ändern, aber das Programm zu diesem Zeitpunkt ändern zu müssen, ist problematisch. Es gibt zwei Dinge, an die Sie denken können.

Sicherheitsprobleme

Wir wissen, dass Sie den Inhalt dieser Daten sehen können, wenn Sie das Programm selbst versionieren oder Zugriff auf das Programm selbst haben. Wenn Sie also einen "Schlüssel" oder ein "Passwort" in das Programm schreiben, das schwer zu sehen ist, wird es von jemandem gesehen, der es nicht sehen kann. SoftLayer-API-Schlüssel sind wie Kennwörter wichtige Datenelemente, die nicht verloren gehen sollten. Schreiben Sie sie daher nicht direkt in Ihr Programm.

Aus Sicherheitsgründen ist es wünschenswert, Programme und Daten getrennt verwalten zu können.

Administrative Probleme

Das andere ist, dass jedes Mal, wenn ich den Inhalt der Daten ändere und festschreibe, die Version hochgeht, obwohl ich die Programmlogik überhaupt nicht geändert habe. Mit zunehmender Version gibt es die Regel, dass die Logik selbst sowie der Regressionstest der Anwendung durchgeführt werden müssen. CI führt den Test möglicherweise automatisch aus, auch wenn keine Regeln vorhanden sind. Es ist eine Verschwendung von Ressourcen und Zeit. Auch wenn es keine Änderungen im Programm selbst gibt, steigt nur die Version, so dass es nichts als Verschwendung ist, die geänderten Teile aufzuzeichnen.

Wenn Sie Ihre Daten an einem von Ihrer Logik getrennten Ort speichern, müssen Sie Ihre Anwendungslogik im Falle einer Änderung nicht erneut testen (obwohl viele dies gerne tun würden).

Trennen Sie daher den SoftLayaer-API-Schlüssel in Ihrem Programm ohne Hardcodierung und schreiben Sie ihn an eine andere Stelle.

Also wo? Es gibt vier Muster, und ich werde jedes von ihnen erklären.

  1. Lassen Sie den API-Schlüssel eingeben
  2. Speichern Sie den API-Schlüssel in einer separaten Datei
  3. Registrieren Sie den API-Schlüssel in der Datenbank
  4. Registrieren Sie den API-Schlüssel in der Umgebungsvariablen

1. Lassen Sie den API-Schlüssel eingeben

Es ist eine Methode zur Eingabe über das Eingabefeld nacheinander. Da die Daten nirgendwo gespeichert werden, denken einige Leute möglicherweise, dass sie ('∀`) b gut sind! Aus Sicherheitsgründen. Bluemix ist jedoch "http", wenn Sie es gelegentlich verwenden, ohne etwas zu tun. Auch wenn dies die Benutzerfreundlichkeit beeinträchtigen kann, wenn Sie jedes Mal so lange eingeben, besteht das Risiko, dass der API-Schlüssel an einem anderen Ort gespeichert wird und von dort verloren geht.

Erstens, wenn die Site, die Sie eingeben möchten, eine Phishing-Site ist ... Es scheint, dass diese Methode nicht empfohlen wird, da sie endlos ist, wenn Sie darüber nachdenken.

2. Speichern Sie den API-Schlüssel in einer separaten Datei

Dies ist ein guter Weg, um es zu tun. Es gibt jedoch drei Dinge zu beachten. Es ist wichtig, dass nicht von außen darauf zugegriffen werden kann und nur die erforderlichen Benutzer darauf zugreifen können. In solchen Fällen werden das Programm und die Datendatei jedoch häufig auf demselben Server abgelegt, und wenn der Programmadministrator die entsprechenden Schritte ausführt, sind die Daten möglicherweise zugänglich. Dann kann ein Entwickler problemlos auf die Datendatei zugreifen. Seien Sie also unter diesem Gesichtspunkt vorsichtig.

  1. Platzieren Sie es als statischen Inhalt an einem Ort, auf den von außen nicht zugegriffen werden kann. Ein Verzeichnis höher als "DocumentRoot" in Apache.
  2. Stellen Sie sicher, dass die Benutzerrechte nur den Entwicklern zugänglich sind, die sie verwenden sollten, auf die nicht als statischer Inhalt zugegriffen werden kann.
  3. Wenn möglich verschlüsseln. Es kommt jedoch immer die Frage ins Spiel, was mit diesem Schlüssel zu tun ist.

Als externe Datei gibt es möglicherweise eine Möglichkeit, sie auf dem Dateiserver dahinter abzulegen und den Administrator der Datendatei zu trennen. Ich bin jedoch der Meinung, dass die Zugriffsmethode auf diese Datei problematisch ist. Irgendwie.

3. Registrieren Sie den API-Schlüssel in der Datenbank

Der aktuelle Trend geht dahin. Alle veränderbaren Daten werden wie andere Daten in die Datenbank gestellt. Das Gute daran ist, dass es einfach ist, die Datenverwaltung so zu gestalten, dass sie sich vollständig vom Administrator des Programms unterscheidet. Trotzdem gibt es einige Dinge zu beachten.

  1. Benutzer, die über das Programm auf die Datenbank zugreifen können, sollten nur über die erforderlichen Mindestzugriffsrechte verfügen. Wenn der Benutzer, der die Anwendung verwendet, die Daten selbst steuern kann, die auf die Datenbank zugreifen können, kann der Entwickler sie auch in Ruhe lassen.
  2. Trennen Sie die App und die Datenbank. Wenn Sie einen logisch anderen Server festlegen, sodass nur programmgesteuert auf den DB-Server zugegriffen werden kann, gibt es weniger Möglichkeiten, die Daten in der DB frei anzuzeigen. Es wird ein wenig sicher sein.
  3. Verschlüsseln wir es trotzdem. Auch hier stellt sich die Frage, was mit dem Verschlüsselungsschlüssel zu tun ist, aber nicht so sehr, wenn Sie zuvor eine genaue Kontrolle über den Zugriff auf Ihre Daten haben. Dies erfolgt in Bezug auf die Verschlüsselung, sodass der Datenadministrator nicht sehen kann, wann auf den Datensatz zugegriffen wird.

4. Registrieren Sie den API-Schlüssel in der Umgebungsvariablen

Wenn der Anwendungsserver als untergeordneter Prozess über die Shell gestartet wird, kann er in der Umgebungsvariablen angegeben werden.

Wenn der Executor jedoch immer den Wert in der Umgebungsvariablen definiert und dann die Anwendung startet, kann die Umgebungsvariable nicht als sichere Methode verwendet werden. Es ist eine sehr schlechte Methode. Insbesondere wenn Sie es mit Bluemix ausführen möchten, müssen Sie die Ausführungsmethode und das Shell-Skript angeben, um es in manifest.yml auszuführen und zu starten. In diesem Fall geben Sie schließlich eine Anweisung zum Zuweisen von Daten zur Umgebungsvariablen im Shell-Skript ein, sodass die Verwaltungsmethode mit dem Speichern in einer separaten Datei identisch ist. Derzeit ist es möglich, die Person, die die Shell zum Starten schreibt, von der Person zu trennen, die die Logik schreibt, aber die Dateien voneinander sind vollständig sichtbar.

andere...?

Ich habe mir gerade eine andere Methode ausgedacht, sie aber vergessen. Ich werde es schreiben, wenn ich mich erinnere (´ ・ ω ・ `)

Diesmal wurde die Methode realisiert

Für die Methode, die ich dieses Mal implementiert habe, habe ich die Methode "Registrieren des API-Schlüssels in der Datenbank" gewählt.

Da Django standardmäßig über eine Benutzerverwaltungsfunktion verfügt, kann die Ziel-SoftLayer-Site für jeden Benutzer geändert werden, indem dieser Benutzer dem in der Datenbank registrierten "Benutzernamen" und "API-SCHLÜSSEL" zugeordnet wird. Irgendwie schien das bequemer zu sein.

Dieses Mal habe ich einen Teil erstellt, um die Liste der vom entsprechenden SoftLayer-Benutzer registrierten Konten anzuzeigen. Im Quellcode befindet es sich in accounts / views.py.

views.py


def account_list(request):
    loginname = None
    if request.user.is_authenticated():
        loginname = request.user.username
    username = CustomUser.objects.get(username=loginname)
    user   = softlayer_api.objects.get(pk=username.softlayer_id)
    client = SoftLayer.create_client_from_env(username=user.username, api_key=user.api_key)
    acct   = client['Account'].getUsers()
    return render_to_response('account_list.html', {'accounts': acct}, context_instance=RequestContext(request))

Vor dieser "def" -Deklaration steht "@ login_required", sodass nur authentifizierte angemeldete Benutzer darauf zugreifen können. Trotzdem überprüfe ich zuerst, ob ich der Benutzer bin, der sich ordnungsgemäß authentifiziert hat und auf "Loginname" zugegriffen hat.

Mit dem loginname als Schlüssel habe ich die Informationen von SoftLayer gelesen, die in der DB registriert sind. Es ist der Teil von "Benutzername =" und "Benutzer =". Zu diesem Zeitpunkt enthält die Variable "user" die Informationen "username" "api_key" von SoftLayer, die in der Datenbank registriert sind.

Der nächste Teil, "client =", ruft die SoftLayer-API mit dem angegebenen SoftLayer-Benutzer auf. Mit "acct =" werden alle mit ".getUsers ()" registrierten SoftLayer-Benutzerinformationen aus diesen Benutzerinformationen erfasst. Schließlich führen Sie "render_to_response" aus, um alle diese Informationen anzuzeigen.

Auf diese Weise ist es nicht möglich, Informationen wie "Benutzername" und "api_key" von SoftLayer aus dem Programm zu kennen. Abhängig vom angemeldeten Benutzer ist es auch möglich, zwischen SoftLayer-Benutzern zu wechseln. Ich habe es selbst gemacht und bin euphorisch geworden.

Zusammenfassung

Wenn Sie die SoftLayer-API über eine Web-App auf Bluemix aufrufen möchten, haben Sie folgende Möglichkeiten.

  1. Speichern Sie die API-Informationen in der Datenbank
  2. Bewahren Sie die Datenbank an einem logisch und physisch von der App getrennten Ort auf
  3. Separate Programm- und Datenmanager

Die Verwendung des diesmal erstellten Beispielprogramms wird ordnungsgemäß auf github veröffentlicht. Versuchen Sie es also so, wie es ist. Es sollte funktionieren.

SQLite verschlüsselt jedoch keine Daten. Versuchen Sie daher, einen anderen Server für die Datenbank zu verwenden.

Recommended Posts

Zu berücksichtigende Punkte, wenn Sie die SoftLayer-API über eine App auf Bluemix aufrufen
Zu beachtende Punkte beim Wechsel von NAOqi OS 2.4.3 zu 2.5.5
Treffen Sie Watsons REST-API von Python mit IBM Bluemix
Speichern Sie Bluemix IaaS-Angebote (ehemals SoftLayer) über die API als PDF
(Hinweis) Punkte, auf die Sie bei der Installation von Scilab unter ArchLinux achten sollten
Vorsichtsmaßnahmen beim Ausführen von Python unter EC2 über AWS Lambda (Befehl ausführen)