Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:passwort_verschluesselt_hinterlegen

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen RevisionVorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste ÜberarbeitungBeide Seiten der Revision
dba:passwort_verschluesselt_hinterlegen [2018/05/31 14:38] – [Password Dialog in der Konsole starten] gpipperrdba:passwort_verschluesselt_hinterlegen [2018/09/05 09:53] – [Wohin nur mit den Passwörtern in Windows und Linux Skripten? - Passwörter in Skripten verschlüsselt hinterlegen.] gpipperr
Zeile 2: Zeile 2:
  
  
 +**Veröffentlicht im Red Stack Magazin der DOAG, September 2018**
 +
 +== Sourcecode Beispiele ==
 +
 +Beispiele im Detail auf https://github.com/gpipperr/RedStack_Magazin_2018_encrypt_password 
 +
 +
 +----
  
 **Das Problem:**  **Das Problem:** 
Zeile 94: Zeile 102:
 Sehr komfortabel ist die Oracle Wallet als Secure External Passwort Store Lösung, mehr dazu unter  Sehr komfortabel ist die Oracle Wallet als Secure External Passwort Store Lösung, mehr dazu unter 
  
-=> [[dba:passwort_schuetzen#secure_external_passwort_store|Secure External Passwort Store]]+=> [[dba:oracle_secure_external_passwort_store|Secure External Passwort Store]]
  
  
Zeile 215: Zeile 223:
 ==== Passwörter unter Linux sicher ver­wah­ren==== ==== Passwörter unter Linux sicher ver­wah­ren====
  
-Unter Linux wird das ganze deutlich schwieriger, gerade in gehosteten Umgebungen muss der Kunde mit dem Vorlieb nehmen, was der Hoster unter Sicherheit versteht, und das heißt meist, möglichst Kosten optimiert zu arbeiten.+Unter Linux wird das ganze etwas schwieriger. Gerade in gehosteten Umgebungen muss der Kunde mit dem Vorlieb nehmen, was der Dienstleister unter Sicherheit versteht. Das heißt meistens rein kosten optimiert zu arbeiten und wenig flexibel auf besondere Softwarewünsche wie ein aktuelles Java oder einen gcc einzugehen.
  
 +SSH und damit „openssl“ steht hier aber überwiegend zur Verfügung, bzw. es spricht sehr wenig dagegen das kostenfrei installieren zu lassen.
  
-SSH und damit openssl steht aber überwiegend zur Verfügung , bzw. spricht sehr wenig dagegen das nach installieren zu lassen.+Damit haben wir mit „openssl“ auf Linux ein Werkzeug zur Verfügung das die kompliziertesten Verschlüsselungs-Verfahren sehr sicher beherrscht.
  
-D.h. wir haben mit openssl schon mal ein Werkzeug zur Verfügung, dass die kompliziertesten Verfahren beherrscht. 
  
-Jetzt müssen wir nur noch einen Schlüssel finden, der länger ist als das Passwort.+Jetzt müssen wir nur noch einen Schlüssel finden, der möglichst länger ist als das Passwort, um das Entschlüsseln für den Angreifer spannender zu gestalten.
  
 Der Schlüssel muss erfüllen: Der Schlüssel muss erfüllen:
  
-  * Muss auf jeden Server dieser Welt eindeutig sein +  * Muss auf jeden Server dieser Welt eindeutig sein. 
-  * Sollte länger als das Passwort sein um das Entschlüsseln ohne Schlüssel spannend zu machen +  * Länger als das Passwort sein 
-  * Sollten so verborgen sein, dass es sich nicht so mit einem Blick erkenne lässt was wir uns da ausgesucht haben+  * Sollte sich nicht auf den ersten Blick erkennen lassen
-  * Sollte sich mit Linux Board mitteln auslesen lassen (wie gesagt, alle neue Software ist dem Hoster ein Graus)+  * Einfaches erzeugen/auslesen unter Linux.
  
 Solche Schlüssel können sein: Solche Schlüssel können sein:
   * WWN oder UUID einer Devices, dass sich nicht so schnell ändert   * WWN oder UUID einer Devices, dass sich nicht so schnell ändert
-  * MAC Adresse +  * Hardware ID wie die MAC Adresse oder die Prozessor ID. 
-  * Prozessor ID +  * Eine eigene Routine in c die eine eindeutige ID erzeugt.
  
  
-Meist verwende ich einfach die UUI von /dev/sda1 als Schlüssel oder die Seriennummer des OS unter HP UX. +Meist verwende ich einfach die UUID von /dev/sda1 als Schlüssel oder die Seriennummer des OS unter HP UX.  
-Hier ist der Phantasie überlassen durch Obfuscation das ganze etwas intransparenter zu erstellen.+ 
 +Hier ist es der Phantasie des Entwicklers überlassen durch Obfuscation das Ganze noch etwas intransparenter zu gestalten. Die Kollegen vom Support aus fernen Ländern sollten das am Ende aber noch bedienen und warten können. 
 + 
 + 
 +===Wie funktioniert das Ganze im Detail?=== 
 + 
 +Das Passwort wird zu Beginn in einer Datei in Klarschrift hinterlegt und dann verschlüsselt. Das kann im Skript gleich beim nächsten Aufruf oder mit einem kleinen Hilfsskript vorab erfolgen. 
 + 
 + 
 + 
 +„openssl“ dient im folgenden dazu die Konfigurationsdatei mit dem Passwort Store 
 +zu verschlüsseln und stellt den kompliziertesten Teil des Ganzen dar. Über folgenden Aufruf „openssl des3 -salt -in  ${PWDFILE} -out ${PWDFILE}.des3 -pass pass:"${SYSTEMIDENTIFIER}"“ wird die Passwort Datei dabei verschlüsselt.
  
-Über Openssl wird der Password Store verschlüsselt: 
 <code bash> <code bash>
 openssl des3 -salt -in  ${PWDFILE} -out ${PWDFILE}.des3 -pass pass:"${SYSTEMIDENTIFIER}"  openssl des3 -salt -in  ${PWDFILE} -out ${PWDFILE}.des3 -pass pass:"${SYSTEMIDENTIFIER}" 
Zeile 252: Zeile 270:
 <code bash> <code bash>
  
-where to store the password store +# password.conf.des3 
- +PWDFILE=.password.conf
-PWDFILE=${SCRIPTS_DIR}/password.conf+
 export PWDFILE export PWDFILE
- +  
-get SYSTEMIDENTIFIER for the encryption of the password +  
 +etwas Eindeutiges aus der Umgebung der Maschine auslesen 
 +# Linux 
 SYSTEMIDENTIFIER=`ls -l /dev/disk/by-uuid/ | awk '{ print $9 }'  | tail -1` SYSTEMIDENTIFIER=`ls -l /dev/disk/by-uuid/ | awk '{ print $9 }'  | tail -1`
 export SYSTEMIDENTIFIER export SYSTEMIDENTIFIER
  
- +  
-##########################################################################+
-# Password file handling +# Password verschlüsseln
 encryptPWDFile () { encryptPWDFile () {
-    if [ -f "/usr/bin/openssl" ]; then +    /usr/bin/openssl des3 -salt -in  ${PWDFILE} -out ${PWDFILE}.des3 -pass pass:"${SYSTEMIDENTIFIER}" > /dev/null 
-        openssl des3 -salt -in  ${PWDFILE} -out ${PWDFILE}.des3 -pass pass:"${SYSTEMIDENTIFIER}" > /dev/null +    Remove orignal file 
-        #debug printf "%s encrypt file :: \n%s to \n%s.des3 \n" "--" "${PWDFILE}" "${PWDFILE}"  +    rm ${PWDFILE} 
-        # remove the clear password file +
-        rm ${PWDFILE}  +
-    else +
-        printError "Openssl not exits - password file will be not encrypted" +
- fi+
 } }
-    + 
 +# Password wieder auslesen
 dencryptPWDFile() { dencryptPWDFile() {
- if [ -f "/usr/bin/openssl" ]; then +    /usr/bin/openssl des3 -d -salt -in ${PWDFILE}.des3 -out ${PWDFILE} -pass pass:"${SYSTEMIDENTIFIER}" > /dev/null
-    openssl des3 -d -salt -in ${PWDFILE}.des3 -out ${PWDFILE} -pass pass:"${SYSTEMIDENTIFIER}" > /dev/null +
-    #debug printf "%s decrypt file :: \n%s.des3 to \n%s \n" "--" "${PWDFILE}" "${PWDFILE}"  +
- else +
-    printError "Openssl not exits - password file will be not dencrypted" +
- fi  +
 } }
- +  
- +  
-## Read encrypted password conf it exits in to memory ######################### +Password in den Speicher laden 
- +Falls verschlüsselte Datei vorliegt 
-Check if the des3 file exits +
 if [ -f "${PWDFILE}.des3" ]; then if [ -f "${PWDFILE}.des3" ]; then
     dencryptPWDFile     dencryptPWDFile
-    # Source the pwd to a enviroment variable+    # in die Umgebung einlesen
     . ${PWDFILE}     . ${PWDFILE}
-    # remove the clear type file+    # Klarschrift Datei wieder entfernen
     rm ${PWDFILE}     rm ${PWDFILE}
 else else
-  if [ -f "${PWDFILE}" ]; then+     # Falls unverschlüsselt vorliegt, Datei verschlüsslen 
 + if [ -f "${PWDFILE}" ]; then
         . ${PWDFILE}         . ${PWDFILE}
-        encryptPWDFile +        encryptPWDFile
-        rm ${PWDFILE}+
     else     else
-     printLine "no preconfiguration file =>password.conf<= found" + echo "no preconfiguration file =>password.conf<= found" 
-     echo "export REPOS_PASSWORD=" > ${PWDFILE} + echo "export DB_PWD=" > ${PWDFILE} 
-     printLine "no preconfiguration password.conf found - edit the file =>password.conf<= and set password and  + echo "no preconfiguration password.conf found - edit the file =>password.conf<= and set password and start again" 
-                start again" + exit 1
-     exit 1+
     fi     fi
 fi fi
 +
 +# Password auf eine interne Variable kopieren und überschreiben
 +# siehe Kasten zu den environ Problem
 +INTERNAL_PWD=${DB_PWD}
 +export DB_PWD=“DU_SOLLST_DAS_NICHT_LESEN“
 +
 +echo "Info --  read encrypted password  =>> ${INTERNAL_PWD} <<=="
  
 </code> </code>
  
 siehe auch https://github.com/gpipperr/RedStack_Magazin_2018_encrypt_password/blob/master/linux_bash/simpleExample.sh siehe auch https://github.com/gpipperr/RedStack_Magazin_2018_encrypt_password/blob/master/linux_bash/simpleExample.sh
 +
 +Um die Sicherheit noch weiter zu erhöhen und um Spuren in der Umgebung so weit wie möglich zu verschleiern, kann das Passwort in der Datei beim Verschlüsseln zuvor noch mit einem symmetrischen Algorithmus so verschlüsselt werden, dass erst zur Laufzeit im Skript an den jeweiligen Stellen das echte Passwort daraus extrahiert daraus wird. Diese sollte dann ohne Umwege in das aufzurufende Programm hinein „gepiped“ werden. Dies ist zwar nicht deutlich sicherer, dient aber dazu auf den ersten Blick den Angreifer etwas mehr zu verwirren.  
 +
 +
  
  
Zeile 331: Zeile 347:
 Ist das nicht genug kann die Zielumgebung über Techniken wie einen  Logon Trigger natürlich zusätzlich gehärtet werden. Ist das nicht genug kann die Zielumgebung über Techniken wie einen  Logon Trigger natürlich zusätzlich gehärtet werden.
  
 +
 +----
 +
 +==== Fazit ====
 +
 +
 +Auch mit diesem Konzept lässt sich in unserer Welt keine endgültige Sicherheit herstellen. Es ist aber ein wichtiger Schritt sensitiver und vor allem proaktiv mit dem Passwortproblem umzugehen.
 +
 +Und das Ganze ohne besonderem Aufwand für den Betrieb mit dem Vorteil die Passwortänderungen zu zentralisieren.
 +
 +Den vollständigen Source Code finden Sie auf Github unter 
 +https://github.com/gpipperr/RedStack_Magazin_2018_encrypt_password
 +
 +Besonders möchte ich mich bei Martina Pippèrr und Sebastian Geddes bedanken, die geduldig geholfen haben diesen Text zu überabeiteten.
 +
 +
 +----
 +
 +----
 +
 +
 +
 +==== Über das Auslesen von Umgebung-Variablen in Linux ====
 +
 +Über /proc die Laufzeit Umgebung eines Linux Prozesses auslesen
 +
 +Mit entsprechenden Rechten (denken sie dabei an ihren Kollegen oder Ihren Dienstleister) kann über das /proc Dateisystem und die „environ“ Datei die gesetzte Umgebung eines Scripts ausgelesen werden. D.h. sensitive Daten wie Passwörter sollten nur so kurz wie möglich in diesem Bereich sichtbar sein!
 +
 +Über diesen Weg lässt sich auch sehr einfach überprüfen, welche Umgebungs-Variablen ein Prozess (wie zum Beispiel ein Oracle Hintergrund Prozess) wirklich sieht und verwendet.
 +
 +Anwendungsbeispiel:  
 +  * Prozess ID ermitteln mit  „ps uafx | grep sqlplus”
 +  * In das Proc File System wechseln „cd /proc/<processid>/“ 
 +  * Über die Datei „environ“ kann nun die Umgebung des Prozesses ausgelesen werden „strings environ | grep NLS_LANG“ 
 +
 +
 +
 +----
  
 ---- ----
dba/passwort_verschluesselt_hinterlegen.txt · Zuletzt geändert: 2022/07/28 16:30 von gpipperr