F-Prot:Linux
Aus KissDoc
Dieses Dokument ist veraltet und wird nicht mehr gewartet. Es gibt jedoch einen "neuen" Weg ;).
Inhaltsverzeichnis |
Thema: F-Prot
Allgemein
Die Software für Linux setzt sich aus drei Teilen zusammen, welche auch einzeln beziehbar sind:
- ein on-demand Scanner f-prot (Primärscanner)
- ein daemon f-protd (per HTTP Protokoll für Scripte verwendbar)
- eine Bibliothek für andere Dienste (RealTime Scan)
Die Installation unter Linux Debian kann nicht mit apt-get
erfolgen, da F-Prot aus lizenzrechtlichen Gründen nicht distributiert wird.
Es ist zwar möglich, sich das Package f-prot-installer
bzw. fp-linux-fs zu installieren,
dieses enthält aber keine aktuelle Version.
Aktuell verwenden wir keine F-Prot mehr. Sollte je wieder ein $Scanner nötig sein, wird es aber wohl wieder F-Prot sein ;).
Installation
Für die Standard-Installation steht zum einen ein Debian-File
fp-linux-fs_x.x.x-x_i386.deb zu Verfügung, zum anderen ein allgemeine Linuxvariante
fp-linux-fs_x.x.x-x_i386.tar.gz. Die .deb-Installation erfolgt einfach mit dpkg,
die tar.gz-Variante wird entpackt und anschliessend ein Installationsskript install-f-prot.pl aufgerufen.
Beide Installationsvarianten führen folgende Schritte durch:
- Die Installation der Binarys in
/usr/local/f-prot - Erstellung eines Symlink des Binarys nach
/usr/local/sbin/f-protd - Erstellung eines Start/Stop-Scripts
/etc/init.d/f-protd - Einrichtung des daemon mit Symlinks
s12f-protin/etc/rc[3|5].dundk21f-protin/etc/rc[1|3|5].d(Die Symlinks sind etwas seltsam verteilt !) - Bereitstellung eines Updatescriptes
/usr/local/f-prot/check-updates.shfür die Virendefinitionsdateien. Dieses ändert allerdings die Zugriffsrechte sicherheitskritisch vonrw-r--r--aufrwxr-x-r-x!
Bei einem Update (Überinstallation) von F-Prot werden alle Binarys und Scripte vollständig ersetzt, funktioniert also gut. Allerdings ist das fest eingebrannte Binary-Verzeichnis /usr/local/f-prot von F-Prot für eine kommerzielle Software nicht gerade günstig.
Kommerzielle Zusatzsoftware sollte aus Übersichtsgründen nach /opt installiert werden. Das hat allerdings den Nachteil: ein per Hand installiert heisst immer per Hand installiert, aber das ist ein anderes Thema. Da beide Varianten (.deb, *tar.gz) den Installationspfad fest eingebrannt haben, sind manuelle Korrekturen notwendig. Dies sind aber (zumindest derzeitig) überblickbar:
- Das Zielverzeichnis
/opt/f-proterstellen. - Die Datei
fp-linux-fs_x.x.x-x_i386.tar.gznach/tmpkopieren und entpacken. - Den Inhalt in das Zielverzeichnis
/opt/f-protkopieren. - Das
/tmp-Verzeichnis wieder säubern - Es werden folgende Symlinks erstellt:
/opt/f-prot/tools/check-updates.plnach/opt/f-prot/check-updates.sh(ist zwar nicht unbedingt notwendig, aber so arbeitet auch die Originalinstallation)/opt/f-prot/f-prot.shnach/usr/local/bin/f-prot/opt/f-prot/f-protdnach/usr/local/sbin/f-protd- Die Manpages aus
man_pagesnach/usr/share/man/man[1-8]/
- Es werden folgende Dateien kopiert | verschoben | gelöscht:
- Das nicht verwendbare Installationsskript
install-f-prot.plwird gelöscht. - Die mitgelieferte html-Dokumentation im Verzeichnis
doc_fswird dahin verschoben, wo sie auch per http zugänglich ist. - Es wird das init-Skript aus
tools/rc_script/f-protd.xxxnach/etc/init.d/f-protkopiert. Die entprechenden Symlinks inrc[0-6].dwerden nicht gesetzt, wir sehen darin momentan keinen Bedarf.
- Das nicht verwendbare Installationsskript
- Durch die fest eingebrannten Pfade müssen wir jetzt noch in einigen Dateien Pfadersetzungen von
/usr/local/f-protnach/opt/f-protvornehmen. Es werden folgende Dateien modifiziert:/opt/f-prot/tools/check-updates.pl/opt/f-prot/f-prot.sh/etc/init.d/f-protd
Testscan
Einen ersten Test, ob der Scanner funktioniert, erreicht man mit f-prot datei. Für ein positives Testergebnis kann der offizielle Testvirus von Eikar verwendet werden. Dazu wird eine Datei mit nachfolgendem Inhalt erstellt, gespeichert und gescant.
X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
F-Prot sollte jetzt einen gefundenen Virus melden. Die Bescheibung des Binarys ist im bekannten man Format gut umgesetzt.
Update der Virusdefinionen
Für das Update der Virendefinitionen steht von F-Prot das Skript tools/check-updates.pl zur Verfügung. Es verbindet sich
mit dem Download-Server von FRISK über Port 80 und lädt die neuesten Viren-Signaturen herunter. Allerdings meldet das Skript momentan auf stderr einen Error, das dieses Update-Skript veraltet sei (obwohl es aus der neuen Installation kommt) und das binary f-prot nicht finden kann. Die Meldung kann aber ignoriert werden, da das Update durchläuft. Ausserdem beinhaltet
dieses Skript keine vernünftige Protokollierung. Deshalb wird ein Skript mit folgenden Erweiterungen vorgeschaltet:
- Eine Start-Meldung zum syslog senden mit Priorität
info - Das von FRISK mitgeliferte Skript
check-updates.plaufrufen und auf Erfolg prüfen - Die Zugriffsrechte der Signaturdateien korrigieren (Die Dateien müssen kein x-Bit haben)
- Eine Stop-Meldung zum Syslog senden mit Priorität
infound folgenden Zusatzinformationen:- Welche Signaturdateien sich geändert haben
- Die Gesamtanzahl der vorhandenen Virensignaturen
- Bei Fehlern von
check-updates.pleine Message mit Prioritätwarnzum syslog senden - Auf eine neue Version von F-Prot prüfen und bei Vorhandensein eine Meldung an syslog mit Priorität
noticesenden (noch nicht sauber möglich, da eine neue Version nur über ein parsen der Webseite von FRISK ermittelbar ist - kein RSS)
Automatisierung
(De)Installation und Update sind Administratoraufgaben. Deshalb ist der einmalige Aufwand eines Skriptes gerechfertigt, welches diese Aufgaben übernimmt. Dazu schreiben wir ein Skript namens fprot.sh, welches folgende Argumente versteht und entsprechend verarbeitet:
- install - Installation von f-prot
- remove - Deinstallation von f-prot
- upgrade - Überinstallation der f-prot Binary, wenn neue Version verfügbar (remove + install)
- update - Aktualisierung der Virus-Signaturen
Der Skriptaufruf mit install, remove und upgrade erfordert
eine Bestätigung, ist also interaktiv. Der Parameter update hingegen ist nicht
interaktiv und eignet sich für einen Cron-Job, um die Virensignaturen für den Scanner
regelmässig auf dem neuesten Stand zu halten. Dass dieses Skript root-Rechte benötigt, versteht
sich von selbst.
Das Script ist für die F-Prot-Version 4.5.4 getestet. Bei einer Installation wird ein bereits
vorhandenes Script /etc/init.d/f-protd überschrieben, eigene Modifikationen sind
also vorher zu sichern.
Da wir dieses Script derzeit nicht beötigen und es auf der Abschußliste steht, stellen wir hier mal die letzte Version ein:
#!/bin/bash
# /usr/local/sbin/fprot.sh
# install|remove|update the f-prot scanner, update is only for the sinature-files
# update:
# - update the virus-signatures, change permissions of signatur-files (*.DEF)
# - send message to syslog
# - use the original-script check-updates.sh from f-prot
# written by Pischti
#SECURITY
if test "$(id -u)" != "0"; then
echo "only for root"
exit 1
fi
#VARIABLES
DIRNAME='f-prot'
OLDPATH='/usr/local/'${DIRNAME}
INSTALLPATH='/opt/'${DIRNAME}
TMPPATH='/tmp'
SOURCEFILE='/usr/local/lib/install/fprot/fp-linux-fs-4.5.4.tar.gz'
INITSCRIPT='/etc/init.d/f-protd'
BINPATH='/usr/local/bin'
SBINPATH='/usr/local/sbin'
DOCPATH='/usr/local/man/security/f-prot/foreign'
MANPATH='/usr/share/man'
#INITSCRIPT='/tmp/f-protdx'
#BINPATH='/tmp'
#SBINPATH='/tmp'
#DOCPATH='/tmp/foreign'
#MANPATH='/tmp'
SIGFILES[0]='MACRO.DEF'
SIGFILES[1]='SIGN.DEF'
SIGFILES[2]='SIGN2.DEF'
PROGRAM=$(basename $0)
FACILITY='user'
PRIORITY='info'
PRIORITY_ERR='warn'
MSG1="starting"
MSG2="updated files:"
MSG_ERR="check-updates.sh failed"
#####################################################################
_install(){
read -p "install f-prot?(y)" quest
if test "${quest}" != "y" ; then
echo "abort install"
exit 1
fi
if ! test -r ${SOURCEFILE}; then
echo "${SOURCEFILE} not exist. abort install."
exit 1
fi
if test -d ${INSTALLPATH}; then
echo "allready installed. abort install"
exit 1
fi
#extract and copy to INSTALLPATH
mkdir -p ${INSTALLPATH}
cp "${SOURCEFILE}" "${TMPPATH}/"
cd ${TMPPATH}
tar -xzf "${TMPPATH}/$(basename ${SOURCEFILE})"
rm "${TMPPATH}/${DIRNAME}/install-f-prot.pl"
cp -R ${TMPPATH}/${DIRNAME}/* "${INSTALLPATH}/"
#clean up TMPDIR
rm "${TMPPATH}/$(basename ${SOURCEFILE})"
rm -r "${TMPPATH}/${DIRNAME}"
#move documentation
mkdir -p ${DOCPATH}
mv "${INSTALLPATH}/doc_fs/"* "${DOCPATH}/"
rmdir "${INSTALLPATH}/doc_fs"
#create the symlinks to bin, sbin, man and updater
ln -s "${INSTALLPATH}/f-prot.sh" "${BINPATH}/f-prot"
ln -s "${INSTALLPATH}/f-protd" "${SBINPATH}/f-protd"
ln -s "${INSTALLPATH}/tools/check-updates.pl" "${INSTALLPATH}/check-updates.sh"
ln -s "${INSTALLPATH}/man_pages/f-prot.1" "${MANPATH}/man1/f-prot.1"
ln -s "${INSTALLPATH}/man_pages/f-protd.8" "${MANPATH}/man8/f-protd.8"
ln -s "${INSTALLPATH}/man_pages/check-updates.pl.8" "${MANPATH}/man8/check-updates.pl.8"
#copy the init-script for daemon
cp "${INSTALLPATH}/tools/rc_scripts/f-protd.rc-debian" "${INITSCRIPT}"
#replace paths in some files
sed -i -s 's%'${OLDPATH}'%'${INSTALLPATH}'%g' "${INITSCRIPT}"
sed -i -s 's%'${OLDPATH}'%'${INSTALLPATH}'%g' "${INSTALLPATH}/f-prot.sh"
sed -i -s 's%'${OLDPATH}'%'${INSTALLPATH}'%g' "${INSTALLPATH}/tools/check-updates.pl"
#set good rights
chmod 0760 "${INITSCRIPT}"
chmod 0755 "${INSTALLPATH}/f-prot.sh"
chmod 0760 "${INSTALLPATH}/tools/check-updates.pl"
echo "install success"
}
_remove(){
read -p "remove f-prot?(y)" quest
if test "${quest}" != "y" ; then
echo "abort remove"
exit 1
fi
rm -r "${INSTALLPATH}"
rm -r "${DOCPATH}"
rm "${BINPATH}/f-prot"
rm "${SBINPATH}/f-protd"
rm "${INITSCRIPT}"
rm "${MANPATH}/man1/f-prot.1"
rm "${MANPATH}/man8/f-protd.8"
rm "${MANPATH}/man8/check-updates.pl.8"
echo "remove success"
}
_upgrade(){
echo "comming soon"
}
_update(){
logger -t $PROGRAM -p $FACILITY.$PRIORITY $MSG1
#read the timestamps before updating
for i in $( seq 0 $[${#SIGFILES[*]}-1] ) ; do
before[$i]=$(ls --time-style="+%Y-%m-%d %H:%M:%S" -l "${INSTALLPATH}/${SIGFILES[$i]}" | awk '{print $6 $7}')
done
#run the f-prot-updater
${INSTALLPATH}/check-updates.sh
ret=$?
if test $ret -ne 0; then
logger -t $PROGRAM -p "$FACILITY.$PRIORITY_ERR" "$MSG_ERR $ret"
exit 1
fi
#read the timestamps after updating
for i in $( seq 0 $[${#SIGFILES[*]}-1] ) ; do
after[$i]=$( ls --time-style="+%Y-%m-%d %H:%M:%S" -l "${INSTALLPATH}/${SIGFILES[$i]}" | awk '{print $6 $7}')
done
#change permission of sinatur-files
for i in $( seq 0 $[${#SIGFILES[*]}-1] ) ; do
chmod 0644 "${INSTALLPATH}/${SIGFILES[$i]}"
done
#complete the update-msg with changeg signatur-files
for i in $( seq 0 $[${#SIGFILES[*]}-1] ) ; do
if test "${before[$i]}" != "${after[$i]}"; then
MSG2_1="${MSG2_1} ${SIGFILES[$i]}"
fi
done
#complete the update-msg with signatures-count
sigcount=$( f-prot -virno | tail -1 | awk '{print $9}' | sed s/\\.//g)
MSG2_2="${sigcount} viruses in database"
logger -t $PROGRAM -p $FACILITY.$PRIORITY "$MSG2 $MSG2_1 - $MSG2_2"
}
case "$1" in
install)
_install
;;
remove)
_remove
;;
upgrade)
_upgrade
;;
update)
_update
;;
*)
echo "USAGE ${PROGRAM} install | remove | upgrade |update "
;;
esac
exit 0

