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.