Under Construction
Verifizieren der digitalen Signatur eines Filesets (DSB)
Wir zeigen den Ablauf bei der Verifizierung eines Filesets mit Digital Signature Block (DSB) im Detail. Dazu verwenden wir das Fileset-Update bos.net.tcp.ftp in der Version 7.3.2.2, das wir im temporären Verzeichnis /tmp/lpps abgelegt haben:
$ ls -lA /tmp/lpps
total 512
-rw-r--r-- 1 root system 443 Aug 16 12:35 .toc
-rw-r--r-- 1 root system 257280 Aug 16 12:35 bos.net.tcp.ftp.7.3.2.2.U
$
Beim Installieren eines Filesets wird zur Überprüfung der digitalen Signatur zunächst das neue Kommando (Skript) /usr/sbin/dsblkchk aufgerufen. Als Argument wird die Option „-d“ mit einem temporären Arbeitsverzeichnis und der absolute Pfad des zu überprüfenden Filesets angegeben:
# dsblkchk -d /tmp /tmp/lpps/bos.net.tcp.ftp.7.3.2.2.U
# echo $?
0
#
Hinweis: Wir haben als Arbeitsverzeichnis /tmp verwendet, von installp wird ein temporäres Unterverzeichnis unterhalb /admin/tmp verwendet.
Ein Exit-Status von 0 bedeutet das das Fileset einen DSB besitzt und die enthaltene Signatur erfolgreich verifiziert werden konnte. Ist die Überprüfung nicht erfolgreich, wird zwischen den folgenden beiden Möglichkeiten unterschieden:
- Exit-Status 1: Der enthaltene DSB ist nicht korrekt, oder die digitale Signatur war nicht korrekt.
- Exit-Status 2: Das Fileset enthält keinen DSB.
Dementsprechend war die Überprüfung im obigen Falle erfolgreich. Eine Überprüfung mit dem alten Verfahren über den DSC erfolgt dann nicht mehr!
Das Shell-Skript /usr/sbin/dsblkchk kann auch manuell als root aufgerufen werden. Nachfolgend beschreiben wir die wichtigsten Schritte für den Fall des obigen Filesets.
Das Skript kopiert das zu überprüfende Fileset in ein temporäres Arbeitsverzeichnis (Variable DIR_LOCATION):
+279 cp $PKG $DIR_LOCATION/ >/dev/null 2>&1
Anschließend wird für die Kopie des Filesets das Kommando /usr/sbin/dsblkdet aufgerufen:
+291 # call the dsblkdet function
+292 dsblkdet -d $DIR_LOCATION $PKG_NAME >>$dsblk_echo_log 2>>$dsblk_echo_log
Das Kommando untersucht zunächst ob das Fileset einen DSB am Dateiende besitzt. Der DSB kann an der besonderen Markierung „INUTUEYE“, dem sogenannten DSB Eye Catcher erkannt werden. Besitzt das Fileset keinen DSB, so liefert dsblkdet den Exit-Status 2 zurück, vom Skript erzeugte temporäre Dateien werden gelöscht und dsblkchk beendet sich mit Exit-Status 2:
+293 if [[ $? -eq 2 ]]; then
+294 echo "dsblkchk:No signature block found in pkg=$PKG_NAME, proceed with dsc inventory\n" >>$dsblk_echo_log
+295 cleanup
+296 exit 2
+297 fi
Wurde ein DSB am Ende des Filesets gefunden, so wird aus dem DSB der Pfad des zu verwendenden Public-Key in der Datei pkg_file.cert_loc abgespeichert. Es wird überprüft, ob der Public-Key auch auf dem System vorhanden ist:
+302 if [[ ! -f $(cat /$DIR_LOCATION/pkg_file.cert_loc) ]];then
+303 echo "dsblkchk:$(cat /$DIR_LOCATION/pkg_file.cert_loc) is not present\n
+304 in the system for pkg=$PKG_NAME, proceed with dsc inventory\n" >>$dsblk_echo_log
+305 cleanup
+306 exit 1
+307 fi
Die im DSB enthaltene digitale Signatur wird in der Datei pkg_file.sig abgespeichert. Der DSB am Ende der Fileset-Kopie wird entfernt.
Der zur Überprüfung der Signatur zu verwendende Public-Key muss im Verzeichnis /etc/security/certificates vorhanden sein. Ein anderes Verzeichnis ist nicht erlaubt und führt zum Abbruch der Überprüfung:
+309 #Make sure we are only using the certificate file located in "/etc/security/certificates"
+310 secure_path=$(awk '{ sub("/[^/]*$", ""); print }' /$DIR_LOCATION/pkg_file.cert_loc)
+311 if [[ "$secure_path" = "/etc/security/certificates" ]];then
+312 key_location=$(cat /$DIR_LOCATION/pkg_file.cert_loc)
+313 else
+314 echo "dsblkchk:certificate file is not available in secure location\n" >>$dsblk_echo_log
+315 cleanup
+316 exit 1
+317 fi
Als letzter Schritt wird dann die digitale Signatur überprüft:
+324 dsblk_out=$(LANG=C /usr/bin/openssl dgst -${key_hash} -verify $key_location -signature /$DIR_LOCATION/$Sig_file /$DIR_LOCATION/$PKG_NAME)
Schlägt die Überprüfung der Signatur fehl, wird das Skript mit dem Exit-Status 1 beendet:
+327 if [[ "$dsblk_out" = "Verified OK" ]]; then
+328 echo "dsblkchk:Signature validation is successful for pkg=$PKG_NAME\n" >>$dsblk_echo_log
+329 else
+330 echo "dsblkchk:Signature validation failed for pkg=$PKG_NAME\n" >>$dsblk_echo_log
+331 cleanup
+332 exit 1
+333 fi
Bei erfolgreicher Prüfung ist der Exit-Status 0:
+334 cleanup
+335
+336 exit 0
Über die Funktion cleanup werden alle temporär angelegten Dateien und Verzeichnisse bei Beendigung des Skripts dsblkchk wieder entfernt.
Der Ablauf bei der Überprüfung der digitalen Signatur mit Digital Signature Block ist deutlich einfacher als bei der alten Version mit Digital Signature Catalog.