Passwörter sollten nie im Klartext stehen. Punkt. Bis zur Automic Version 9 hatte man aber ein Problem: Für den Zugriff auf Backend-Systeme (wie z.B. Datenbanken) benötigt man meist einen User plus Passwort. Dabei gab es keine Möglichkeit, das Passwort für die Verwendung in der Script-Karte zu verschlüsseln. Jeder Nutzer konnte es lesen. Das hat sich inzwischen zum Glück geändert. Es gibt zwei Möglichkeiten, verschlüsselte Passwörter zu nutzen.
Zugriff mit JOBS auf Datenbank
Ich will Ihnen zuerst an einem Beispiel zeigen, was ich meine. Nehmen wir an, ich will mit einem Unix-Job auf eine Oracle-Datenbank zugreifen und eine einfache Abfrage durchführen:
SELECT * FROM dept ORDER BY deptno;
Der Job soll die Abfrage als der User “Scott” durchführen. Das ist ein Standard-Oracle DB-User, den man für Demonstrationen nutzen kann. Auch die Tabelle EMP, auf die wir zugreifen, ist eine Standard-Demo-Tabelle von Oracle.
Wenn ich in JOBS sqlplus-Kommandos verwende, benutze ich dafür meistens ein here document. Außerdem stelle ich ein paar Settings ein. Das wichtigste davon: Bei Fehlern soll der Returncode nicht 0, sondern 1 sein. Nur so resultiert der Job bei einem Fehler in ENDED_NOT_OK.
Der vollständige Aufruf sieht so aus:
sqlplus -s scott/tiger << EOSQL whenever sqlerror exit 1; whenever oserror exit 1; set pagesize 0; set linesize 230; set Feedback off; set colsep ";"; SELECT * FROM dept ORDER BY deptno; EOSQL
Sie sehen sicher schon das Problem: Das Passwort “tiger” steht sichtbar im Text.
Lösung 1: LOGIN-Objekte
Wir können dieses Problem über LOGIN-Objekte lösen.
1. Login-Type hinzufügen
Fügen Sie zur Variable UC_LOGIN_TYPES auf Mandant 0000 den gewünschten Typ hinzu (zum Beispiel SQLPLUS). Der Typ ist frei wählbar.
2. Login-Objekt anlegen
Legen Sie ein LOGIN-Objekt für den User an (hier: „scott“) und speichern Sie darin das Passwort. Es wird hier natürlich verschlüsselt angezeigt. Unter „Type“ wählen Sie den vorher erstellten Login-Typ aus (hier: „SQLPLUS“).
3. Informationen im JOBS-Objekt auslesen
Dafür verwenden Sie die Funktion GET_LOGIN:
:SET &USER# = GET_LOGIN("LOGIN.SCOTT",scott,SQLPLUS,LOGIN_INFO) :SET &PASS# = GET_LOGIN("LOGIN.SCOTT",scott,SQLPLUS,PASSWORD)
Jetzt ist in der Variablen &PASS# das verschlüsselte Passwort gespeichert.
4. Mit dem Jobmelder verwenden
Von unserem JOBS aus rufen wir jetzt den Jobmelder auf. Dafür benutzen wir die Variable &UC_JOBMD, in der Pfad und Name des Jobmelders gespeichert sind.
Der Jobmelder kennt den Parameter CMD, um beliebige Kommandos auf dem Agent auszuführen.
Die Kommandos werden als String übergeben, die verschlüsselten Passwörter werden durch Soft-Hyphens am Anfang gekennzeichnet. Der Jobmelder erkennt sie und entschlüsselt sie während der Kommandoausführung.
Der Aufruf sieht also so aus:
&UC_JOBMD CMD=' sqlplus -s &USER#/&PASS# << EOSQL whenever sqlerror exit 1; whenever oserror exit 1; set pagesize 0; set linesize 230; set Feedback off; set colsep ";"; SELECT * FROM dept ORDER BY deptno; EOSQL '
Den fertigen JOBS können Sie im folgenden Screenshot ansehen.
Das Klartext-Passwort taucht auch im generierten Job nicht auf. Erst während der Ausführung wird es vom Jobmelder entschlüsselt.
Lösung 2: PRPT-Objekte
Alternativ können wir statt eines LOGIN-Objekts auch ein PromptSet-Objekt verwenden. Der Ablauf ist ähnlich wie in Lösung 1.
1. PRPT-Objekt anlegen
Legen Sie ein PRPT-Objekt an und erstellen sie ein Text-Feld für den Usernamen. Als Variable legen Sie USER# fest.
Dann erstellen Sie ein zweites Text-Feld mit der Eigenschaft “Als Passwort anzeigen”. Das ist das Passwort-Feld. Die Variable dafür nennen Sie PASS#.
Ich habe als Default-Werte einfach die schon etablierten “scott” und “tiger” benutzt.
2. PRPT-Objekt im JOBS verwenden
Die sqlplus-Kommandos werden wieder über den Jobmelder aufgerufen.
Der fertige JOBS sieht dieses mal so aus:
Keine perfekte Lösung
Beide Lösungen verhindern, dass das Passwort irgendwo im Klartext erscheint. Trotzdem sind sie nicht 100% sicher, denn es handelt sich um reversible Passwörter.
Wer das verschlüsselte Passwort kennt, kann es mit dem Jobmelder entschlüsseln. Dafür ruft man einfach mit dem Jobmelder einen echo Befehl auf.
Außerdem ist es möglich, das Passwort auf Betriebssystem-Ebene aus dem laufenden Kommando zu lesen, z.B: unter Unix mittels „ps –ef“. Dafür gibt es auch gute Lösungen, beispielsweise kann man das Passwort per Pipe übergeben, dadurch ist es nur für den Bruchteil einer Sekunde in der Prozessliste sichtbar.
Kontrollieren Sie auf jeden Fall gut Ihr Namenskonzept und achten Sie darauf, wer Zugriff auf diese LOGIN- und PRPT-Objekte hat.
Viel Spaß mit dem Ausprobieren und ich freue mich wie immer auf euer Feedback!