EFS Schlüsselerzeugung per OpenSSL

EFS Schlüssel per OpenSSL erstellen

Alle die ihre Encrypting-File-System – oder kurz EFS – Schlüssel nicht vom Microsoft OS oder einer Microsoft-CA erzeugen möchten, erhalten hier die Anleitung diese per OpenSSL zu erstellen.

Funktionsweise

Hier die Funktionsweise aus Wikipedia:

Wenn eine Datei per EFS verschlüsselt wird, generiert das System zunächst einen zufälligen Schlüssel, den sogenannten File Encryption Key (FEK), mit dem die Datei dann mittels des symmetrischen Verschlüsselungsverfahrens DES oder ab Windows XP SP1 mittels AES chiffriert wird. Der FEK wird dann mittels des asymmetrischen RSA-Algorithmus unter Benutzung des öffentlichen Schlüssels des Benutzers verschlüsselt und mit der Datei zusammen abgespeichert. Soll die Datei gelesen werden, wird der FEK mittels des geheimen Schlüssels des Benutzers entschlüsselt, um damit den Klartext der verschlüsselten Datei wiederherzustellen.

Ich nutze in meinem Code-Beispiel einen Ubuntu 16.04 LTE Server mit OpenSSL Version 1.0.2g-fips. Da die Befehlsyntax von OpenSSL aber auf allen unterstützten Systemen ident ist, wird das Script auf anderen Linux / Unix Systemen und auch mit neues OpenSSL wie der Version 1.1.* ebenfalls laufen.

Erstellung eines EFS-Schlüssels mit OpenSSL

Einfach als User oder Administrator das u.a Shell-Script als efs-cert-generate.sh speichern. Dann die Dateirechte mit chmod +x efs-cert-generate.sh ändern, um das Script in der Shell direkt aufrufen zu können.

Mit Hilfe meines Scripts kannst du beliebig viele Encrypting-File-System-Schlüssel für unterschiedliche Benutzer erzeugen und ggfls. auch am Linux-Server (am besten mit RAID) sicher speichern.

#!/bin/bash
read -p "Accountname (z.B. mmustermann):" account

mkdir ${account}
cd ${account}

cat >${account}.cnf <<-EOF
[ req ]
default_bits            = 2048
distinguished_name      = req_distinguished_name
string_mask = utf8only

[ req_distinguished_name ]
countryName                     = Land (2 Zeichen, z.B. AT, DE, CH)
countryName_default             = AT
countryName_min                 = 2
countryName_max                 = 2
localityName                    = Ort bzw. Stadt (z.B. Wien)
localityName_default            = Wien
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Meine Firma
commonName                      = Dein Name (z.B. Max Mustermann)
commonName_default              = Andreas Schuster [Verschlüsselt.IT]
commonName_max                  = 64
emailAddress                    = Email Address
emailAddress_max                = 64

[ usr_cert ]
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = 1.3.6.1.4.1.311.10.3.4
EOF

### Generiert einen Schlüssel für den Benutzer, Schlüsseldatei ist mit einem Passwort geschützt
echo "Ein neuer Schlüssel für den Benutzer <${account}> wird generiert..."
openssl genrsa -des3 -out ${account}.key 2048

### Speicherung der Schlüsseldatei ohne Passwort, unsicherer im Backup,  aber besser für ein späteres Recovery ;-)
echo "Der Schlüssel wird nun ohne Passwort gespeichert..."
openssl rsa -in ${account}.key -out ${account}.nopass.key

### Ein Certificate-Signing-Request wird mit den Parametern des Config-File erstellt
echo "Der Zertifikatsantrag (CSR) wird erstellt..."
openssl req -new -key ${account}.nopass.key -out ${account}.csr -config ${account}.cnf

### Optional: Ausgabe des Certificate-Signing-Request zur Kontrolle durch den Administrator
echo "Dies ist der Inhalt des Zertifikats..."
openssl req -text -noout -in ${account}.csr

### Generierung eines Self-Signed Zertifikates mit XX Jahren Laufzeit
echo "Das selbst-signierte Zertifikat mit Windows kompatiblen EFS-Eigenschaften wird erstellt..."
tage=365
jahre=20
laufzeit=`expr $tage \* $jahre`
openssl x509 -req -days ${laufzeit} -in ${account}.csr -signkey ${account}.nopass.key -out ${account}.crt -extensions v3_req -extfile ${account}.cnf

### Erstellung einer .P12/.PFX Datei, die am Windows Client importiert werden kann
echo "Die .P12/.PFX Datei (X.509 Zertifikat + privater Schlüssel) wird erstellt..."
openssl pkcs12 -export -in ${account}.crt -inkey ${account}.nopass.key -out ${account}.p12
SchlüsselDATEI erzeugen

Nach dem Aufruf des Script und der Eingabe der selbsterklärenden Parameter findest du in einem Unterverzeichnis, das nach dem Accountnamen benannt ist, eine passwortgeschützte .p12 Datei. Diese kannst du nach dem Kopien auf ein Windows-System unter Windows direkt per Doppelklick importieren und für das verschlüsselnde Dateisystem nutzen. Der private Schlüssel beim Import-Vorgang sollte als nicht exportierbar markiert werden. Ein Passwortschutz (die Option “Hohe Sicherheit” beim Import) auf den privaten Schlüssel wird vom Encrypting-File-System leider nicht unterstützt.

Erstelle ein EFS-Schlüssel-Backup!

Die .p12 Schlüsseldatei speichere bitte an einem sicheren Ort mit einem aussagekräftigen Passworthinweis. Ob ein USB-Stick in mehreren Jahren noch korrekt funktioniert, würde ich nicht dem Zufall überlassen. Als geeignet halte ich eine gebrannte CD und zusätzlich eine Ablage auf einem Cloud-Speicher.

Einen ähnlichen Artikel gibt es auch zur Erstellung von S/MIME Schlüsseln mit OpenSSL, siehe S/MIME Zertifikat per OpenSSL erstellen

Hast Du Erfahrungen mit Microsoft Encrypted File System und EFS-Schlüssel? Ich freue mich auf Deine Kommentare!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert