Dies ist eine alte Version des Dokuments!


Update des Systems

Die Updates werden automatisiert eingespielt, sobald sie für eine bestimmte Region freigegeben sind.

Regionen sind wie folgt vergeben:

00 - Development

01 - Testmaschinen

02 - Testkunden

10 - 99 produktive Kundenserver

Der Updateserver ist unter http://doku.traunau.at/update/<region> erreichbar, wobei <region> die Region von 00 - 99 ist.

In jeder Region liegen folgende Dateien:

datenschutz-server-1.0-SNAPSHOT.jar.enc ... die verschlüsselte Updatedatei 
version.sha256                          ... Die Prüfsumme der unverschlüsselten Updatedatei

Am Updateserver wird unte /home/ec2-user/package die aktuelle Version der Datei datenschutz-server-1.0-SNAPSHOT.jar abgelegt und das Script „package.sh“ als root im selben Verzeichnis aufgerufen. Daraufhin wird die Region 00 mit dem aktuellen Update bespielt (das .jar verschlüsselt und die Checksum gebildet)

Als Verschlüsselung wird ein asymmetrisches Verfahren verwendet, wobei sich der öffentliche Schlüssel unter update-secure.pub.pem am Updateserver befindet und der private Schlüssel in den Clients gespeichert ist.

Danach werden die einzelnen Regionen freigeschalten, indem das Script distribute.sh <src> <dst> aufgerufen wird, wobei src die Ausgangsregion und dst die Zielregion ist.

Ein Beispielaufruf wäre:

# sudo ./distribute.sh 00 01

um die Updates von der Developmentregion auf die Testmaschinen freizugeben.

Inhalte des Verszeichnis /home/ec2-user/package am Updateserver:

-rw-r--r-- 1 ec2-user ec2-user 68093168 Apr  3 16:06 datenschutz-server-1.0-SNAPSHOT.jar
-rwxr--r-- 1 root     root          874 Apr  3 16:33 distribute.sh
-rwx------ 1 root     root          320 Apr  3 13:51 package.sh
-rw------- 1 root     root         1391 Apr  3 13:40 update-secure.pub.pem

package.sh

#!/bin/bash

TARGET_DIR=/var/www/html/update/00
SRC_DIR=/home/ec2-user/package
SRC_JAR=datenschutz-server-1.0-SNAPSHOT.jar

cat $SRC_DIR/$SRC_JAR | sha256sum >$TARGET_DIR/version.sha256

openssl smime -encrypt -binary -text -aes256 -in $SRC_DIR/$SRC_JAR -out $TARGET_DIR/$SRC_JAR.enc -outform DER update-secure.pub.pem

distribute.sh

#!/bin/bash

UPDATE_DIR=/var/www/html/update
ENC_JAR=datenschutz-server-1.0-SNAPSHOT.jar.enc
SHAFILE=version.sha256

if [ -f $UPDATE_DIR/$1/$ENC_JAR ]; then
  if [ -f $UPDATE_DIR/$1/$SHAFILE ]; then

    if [ ! -d $UPDATE_DIR/$2 ]; then
       echo "Directory $2 does not exist... creating"
       mkdir $UPDATE_DIR/$2
    fi

    if [ -f $UPDATE_DIR/$2/$ENC_JAR ]; then
      echo "Removing old JAR"
      rm $UPDATE_DIR/$2/$ENC_JAR
    fi
    if [ -f $UPDATE_DIR/$2/$SHAFILE ]; then
      echo "Removing old checksum"
      rm $UPDATE_DIR/$2/$SHAFILE
    fi

    echo "Distributing from $1 to $2..."
    cp $UPDATE_DIR/$1/$ENC_JAR $UPDATE_DIR/$2/$ENC_JAR
    cp $UPDATE_DIR/$1/$SHAFILE $UPDATE_DIR/$2/$SHAFILE
    echo "Ready."
    exit 0

  else
    echo "SHA 256 file not found, exiting."
    exit 1
  fi
else
  echo "Encrypted JAR file not found, exiting."
  exit 1
fi

Das Updatescript (update.sh) und sämtliche Arbeitsdateien sowie der private Schlüssel (update_priv.pem) befinden sich unter /opt/webserver/update.

Die Inhalte sehen wie folgt aus:

-r-------- 1 root     root 1704 Apr  3 16:20 update_priv.pem
-rwx------ 1 root     root 2883 Apr  3 17:42 update.sh

Zusätzlich können sich auch noch folgende Dateien darin befinden:

current.sha256 mit der Checksumme der aktuell installierten Version

downloaded.sha256 und das Anwendungs - JAR - File wenn die Version heruntergeladen, aber noch nicht installiert wurde.

update.sh

Bitte beachten, dass unter UPDATE_SERVER am Ende die korrekte Region für die Maschine eingetragen werden sollte.

#/bin/bash

UPDATE_SERVER=https://doku.traunau.at/update/00
UPDATE_DIR=/opt/webserver/update
SERVICE=/opt/webserver/service.sh
JAR_FILE=datenschutz-server-1.0-SNAPSHOT.jar

PRODUCTIVE_DIR=/opt/webserver


if [ -f $UPDATE_DIR/$JAR_FILE ]; then
  echo "Update was downloaded and is available. "
else


# Checking against update server
echo "Getting Version SHA256 from $UPDATE_SERVER"
wget -q $UPDATE_SERVER/version.sha256 -O $UPDATE_DIR/version.sha256

echo "Checking if version is newer..."
comp_value=1
if [ -f $UPDATE_DIR/current.sha256 ]; then
  if [ -f $UPDATE_DIR/version.sha256 ]; then
    # check for content of current version and downloaded version sha
    diff $UPDATE_DIR/current.sha256 $UPDATE_DIR/version.sha256  >/dev/null
    comp_value=$?
  else
    echo "version.sha256 does not exist - but it should. Exiting."
    exit 1
  fi
else
  echo "current.sha256 not existing - assuming available update is newer."
fi

# new version available?
if [ $comp_value -eq 1 ]; then

    echo "New version available - downloading now"

    # download new version from update server
    wget -q $UPDATE_SERVER/$JAR_FILE.enc -O $UPDATE_DIR/$JAR_FILE.enc
    echo "Decrypting JAR file..."
    # decrypt the jar with the private key
    openssl smime -decrypt -in $UPDATE_DIR/$JAR_FILE.enc -binary -inform DEM -inkey $UPDATE_DIR/update_priv.pem -out $UPDATE_DIR/$JAR_FILE

    #remove the encrypted file
    rm $UPDATE_DIR/$JAR_FILE.enc

    echo "Checking SHA256 for downloaded file against downloaded SHA for update sanity..."
    if [ -f $UPDATE_DIR/$JAR_FILE ]; then

      # get checksum of encrypted file and check against downloaded sha - if equal both are verified
      cat $UPDATE_DIR/$JAR_FILE | sha256sum >$UPDATE_DIR/downloaded.sha256
      diff $UPDATE_DIR/downloaded.sha256 $UPDATE_DIR/version.sha256  >/dev/null
      comp_value=$?
      if [ $comp_value -eq 0 ]; then
	 echo "Update downloaded and checked, everything OK!"
      else
         rm $UPDATE_DIR/$JAR_FILE
         rm $UPDATE_DIR/downloaded.sha256
         echo "Downloaded and unencrypted file does not match hash."
      fi
    fi


else
    echo "Current version is up to date - no need to do anything"
fi

rm $UPDATE_DIR/version.sha256

fi

# if downloaded.sha256 and jar file are available, install it
if [ -f $UPDATE_DIR/$JAR_FILE ]; then
  if [ -f $UPDATE_DIR/downloaded.sha256 ]; then
    echo "Update verified and ready to install..."

    echo "Stopping service and waiting 10 seconds to gracefully shut down"
    $SERVICE stop
    sleep 10

    $SERVICE check
    isRunning=$?

    if [ $isRunning -eq 1 ]; then

      # do update
      echo "Applying update"
      rm $PRODUCTIVE_DIR/$JAR_FILE
      mv $UPDATE_DIR/$JAR_FILE $PRODUCTIVE_DIR/$JAR_FILE
      mv $UPDATE_DIR/downloaded.sha256 $UPDATE_DIR/current.sha256

    fi

    echo "Service start"
    # start service
    $SERVICE start

  fi
fi

echo "Ready."

Crontab

In der root Crontab wird folgende Zeile angefügt um das Update automatisch nach dem Backup laufen zu lassen:

15 4 * * * /opt/webserver/update/update.sh