Benjamin Schieder

OPENPGP KARTEN UND PAM

2006 February 19

Vor ein paar Tagen habe ich meine OpenPGP Karte erhalten und wollte sie natuerlich gleich fuer alles Moegliche in meinem Laptop verwenden.
Dieser verfuegt ueber einen OmniKey CardMan 4000 (PCMCIA) welcher dank Harald Weltes Kernelmodul cm4000_cs auch super funktioniert.

Leider leider ist die Dokumentation zu den Userland Teilen der SmartCard Nutzung eher spaerlich. Das OpenSC Project hat zwar sicherlich viel erreicht, aber wie bei vielen anderen Projekten (ja, auch meinen eigenen) ist die Dokumentation entweder sehr lueckenhaft oder ich bin einfach zu dumm, sie zu verstehen.
Wie auch immer, nachdem ich PCSC-Lite installiert habe konnte ich mittels GnuPG die Karte sehr einfach initialisieren:

blindcoder@fuzzy:~$ gpg --card-edit

Command> admin
Admin commands are allowed

Command> name
Cardholder's surname: Schieder
Cardholder's given name: Benjamin

Admin PIN
Enter Admin PIN:

Command> sex
Sex ((M)ale, (F)emale or space): M

Command> generate

Der Befehl 'generate' erstellte dann ganz wie sonst auch die entsprechenden Keys. Auch das Ver- und Entschluesseln laeuft absolut transparent und problemlos:
blindcoder@fuzzy:~$ gpg -e -r 0xxxxxxxxx > encrypted.msg
gpg: using character set `ANSI_X3.4-1968'
gpg: using secondary key xxxxxxxx instead of primary key xxxxxxxx
gpg: using classic trust model
gpg: key xxxxxxxx: accepted as trusted key
gpg: key xxxxxxxx: accepted as trusted key
gpg: key xxxxxxxx: accepted as trusted key
gpg: key xxxxxxxx: accepted as trusted key
gpg: This key belongs to us
gpg: reading from `[stdin]'
gpg: writing to stdout
gpg: RSA/AES256 encrypted for: "xxxxxxxx Benjamin Schieder (Test Key) "
blah
blah
foo
bar
blindcoder@fuzzy:~$ file encrypted.msg
encrypted.msg: data
blindcoder@fuzzy:~$ gpg -d encrypted.msg
:pubkey enc packet: version 3, algo 1, keyid xxxxxxxxxxxxxxxx
data: [1024 bits]

PIN
Enter PIN:
:encrypted data packet:
length: 74
mdc_method: 2
:compressed packet: algo=2
:literal data packet:
mode b (62), created 1140258244, name="",
raw data: 18 bytes
blah
blah
foo
bar
blindcoder@fuzzy:~$


Wenn doch nur alles so einfach waere. Zum Beispiel PAM-Autentifizierung mit OpenPGP Karten. Da ich leider kein Modul fand, um mich mit einer OpenPGP Karte zu autentifizieren (da man auf OpenPGP Karten kein PKCS#11 Zertifikat ablegen kann, konnte ich pam_pkcs11 leider nicht nutzen), habe ich selbst ein kleines PAM Modul geschrieben.

ACHTUNG AN ALLE PROFESSIONELLEN PAM ENTWICKLER! NICHT WEITERLESEN!

PAM_Extern ist ein PAM Modul welches die Userautenifizierung einem externen Programm ueberlaesst. Dazu ruft es das Programm folgendermassen auf:
programm username passwort

PAM_Extern fragt allerdings erstmal nicht selbst nach einem Passwort. Wird es aber z.B. nach pam_unix aufgerufen, holt es sich das Passwort von dort.
Dazu habe ich ein sehr einfaches Shellscript geschrieben, welches die MD5 Summe der Seriennummer der OpenPGP Karte mit einer hinterlegten MD5 Summe vergleicht und bei Uebereinstimmung den Zugriff erlaubt.
Mit einer entsprechenden PAM Konfiguration sind hier mehrere Szenarien moeglich:

1.) Autentifizierung nur ueber Username und Karte ohne Passwort
2.) Autentifizierung mit Username und Passwort bei Abwesenheit der Karte
3.) Autentifizierung mit Username, Passwort _und_ Karte

Das Ganze laesst sich natuerlich mit weiteren PAM Modulen beliebig erweitern.


EOF

Category: blog

Tags: