F-Prot:Windows
Aus KissDoc
Dieses Dokument ist veraltet und wird nicht mehr gewartet. Es gibt jedoch einen "neuen" Weg ;).
Inhaltsverzeichnis |
Thema: F-Prot
Vorwort
Sorry, aber ich konnte hier keine loyale Beschreibung niederlegen. Ich hab's versucht. Wenn man eine Weile mit Software aus einigen OpenSource Projekten, von IBM oder Microsoft arbeitet, ist man eine gewisse Qualität gewöhnt. Man vergisst ganz, dass die Wirklichkeit wesentlich grauenvoller ist. FRISK wurde dabei schon unter vier verschiedenen Herstellern ausgewählt, was immer eine Menge Arbeit bedeutet. Ein Virenscanner ist IT-eigene Last (ABM). Es wird dadurch nichts aus dem Kerngeschäft einer Firma gelöst. Im allgemeinen sollte sich mal wieder jeder Gedanken machen, wozu ein Rechner eingesetzt wird. In vielen Fällen sind auch heute noch Schreibmaschinen sinnvoll!
Installation
Eigentlich benötigt man nur den Konsolenscanner und den (nicht konfigurierbaren) RealTime Scanner. Dummerweise läßt sich der RealTime Scanner nicht alleine installieren. Mit dem WinScanner geben wir dem User etwas zum spielen. Für mehrfache Installationen bis hin zu unattended Installationen (ohne SMS, da LXServer) eignet sich hervorragend das MS-MSI Format. FRISK sieht das scheinbar anders. Kommerzscheiß in der vollendetsten Form hat einen Alias: InstallShit.
Wir mußten deshalb ein spezielles Script fprot.wsf einsetzen. Dies funktioniert aber nur mit den InstallShit Rohdaten. Dazu muß man das Download von FRISK mit einem ZIP Packer entpacken.
Serveranforderungen
Ein Server zentralisiert. Hierbei sind zwei Primäraufgaben auszumachen:
- Bereitstellung aktueller Virendefinitionen
- Informationssammlung (Protokolle)
Nun, der erste Punkt wird von FRISK recht gut unterstützt, da es denen sonst durch unsinnige Downloads an den eigenen Geldbeutel geht. Der Updater lässt sich auf ein lokales Share legen. Wir verwenden einfach ein zentrales Application Share.
Bei den Protokollen schlägt der kommerzielle Schwachsinn mit einer vollen Breitseite zu. Ist ja auch nicht wichtig. Ein Scanner hat ja nicht als Primäraufgabe, uns eine Infektion zu melden. Die Systemprotokolle laufen jedenfalls durch FRISK nicht voll. Schade, denn sonst hätte man die normalen Logroutinen bis hin zu syslog verwenden können. Es werden zwar Textdateien geschrieben, welche sogar auf ein Share gelegt werden können. Leider steht im Log selbst aber nicht der Hostname. Also kein Zentrallog. Bei einem Hostlog ist das dumme, dass Umgebungsvariablen in der Pathdefinition nicht geparst werden. Dadurch ist der WinScanner unbrauchbar. Der unkonfigurierbare RealTime Scanner meldet sich nur per GUI. Der Admin darf dann im Jahre 2005 noch zum User wandern, vorausgesetzt dieser meldet sich. Es ist auch nicht wichtig für den Admin zu wissen, dass und welcher Virus aufgetreten ist. Auch ist es demnach nicht wichtig wie oder woher dieser Virus in das Netz gelangen konnte. Der Admin bleibt einfach unwissend. Die reine Existenz eines Scanners macht ja auch alle anderen Sicherheitsüberlegungen, selbst die vorbeugenden, überflüssig. Der Konsolenscanner wird zum Glück von außen mit Parametern beschossen, bei denen FRISK Software nicht arbeitet muß. Der Inhalt der Loginformationen ist zwar etwas besser geworden, setzt aber immer noch eigene umfangreiche Auswertungsscripte voraus. Kommerz bei FRISK bedeutet, dass für verwendbare Software eine eigene Entwicklungsabteilung nötig ist. Von den Rechten mal ganz abgesehen, benötigt man zum Zentralisieren der Protokolle mittels Konsolenscann ein für alle User schreibbares Share.
Damit ergeben sich folgende Dienste bzw. Sambafreigaben:
\\server\log(rw) für die Protokolle\\server\appli\fprot(r) für den Konsolenscanner und die Virendefinitionen\\server\install\fprot(r) für die Rohdaten der Installation
Konsolenscanner
Der Konsolenscanner fpcmd.exe ist einzeln verwendbar und unser
Primärscanner. Der Scanner benötigt nur die folgenden Dateien:
fpcmd.exeenglish.tx0macro.defsign.defsign2.deffpav-help.chm
Dabei ist die Hilfe nicht unbedingt erforderlich. Wir haben diese Dateien in ein
Verzeichnis gelegt, welches über \\servername\\appli\fprot allen
Rechnern zur Verfügung gestellt wird. Die *.def Dateien sind symbolische Links
auf die *.def Dateien in /usr/local/f-prot/*.def
bzw. /opt/f-prot/*.def. Diese
Dateien werden durch den Updater des Servers aktualisiert und sind somit immer aktuell.
Dadurch ist jeder Rechner mit einem Scanner ausgerüstet, ohne
den Client installieren zu müssen (Lizenzen beachten!). Dies eignet sich z.B. für Testrechner oder einen
PreScan vor einer Installation. Bei Bedarf kann hier auch noch der DOS Scanner
f-prot.exe für irgendwelche alten Bootdisketten abgelegt werden.
Bei der Erstinstallation oder einem Update der Software muß man einmal eine händige
Installation auf einer Testmaschine durchführen und die drei Dateien
fpcmd.exe, english.tx0 und
fpav-help.chm nach \\servername\\appli\fprot
kopieren.
fprot.wsf
Primär für die Installation auf mehreren Rechnern (dank InstallShit)
haben wir ein kleines WSH Script (cscript) namens fprot.wsf eingesetzt.
Das fprot.wsf Script sollte neben dem Konsolenscanner (w32) liegen. Dort sind alle benötigten Dateien. Sollte das Script verschoben werden, muss es leicht modifizert werden. Das Script kann neben der Installation einen Konsolenscan für alle lokalen Datenträger mit cscript fprot.wsf /scan oder cscript fprot.wsf /scan /log:\\server\log durchführen. Die Deinstallation ist derzeit nicht ganz unattended möglich. Spart euch die Zeit, auf den InstallShit Seiten nach Hilfe zu suchen bzw. den Support von FRISK zu befragen. Bei FRISK sitzt am Telefon scheinbar eine Aushilfe. Hoffnung auf den
2nd Level Support ist reine Illusion. Soviel zu kommerzieller Software! Wir hoffen einfach mal, das FRISK irgendwann reine *.msi Dateien verwendet.
Achtung: Das Script verwendet ein externes Programm namens kill.exe von Microsoft. Das Programm wird bei der Installation und auch Deinstallation zum Beenden des RealTime Scanners (f-stopw.exe) benötigt.
Microsoft stellt das Programm im ResKit bereit. Da es im Script ohne Path aufgerufen wird, muß
auf dem System die Umgebungsvariable PATH entsprechend gesetzt werden.
Dazu ist das Tool setx.exe von Microsoft verwendbar.
Weitere Informationen zum Script findet ihr,
indem ihr das Script fprot.wsf einfach mal ohne Parameter aufruft. Hier ein fixer Dump des Scriptes:
<?XML version="1.0" standalone="yes" ?>
<package>
<job id="fprot">
<runtime >
<named name="scan" helpstring="scan all local shares (from a net share)" type="simple" required="false"/>
<named name="scanpath" helpstring="the local path to scan (else all local drives)" type="string" required="false"/>
<named name="log" helpstring="log path or unc for scan parameter" type="string" required="false" />
<named name="update" helpstring="update the local virus definitions" type="simple" required="false"/>
<named name="install" helpstring="install fprot" type="simple" required="false"/>
<named name="remove" helpstring="remove fprot" type="simple" required="false" />
<named name="prescan" helpstring="scan before install" type="simple" required="false" />
<named name="installsource" helpstring="path or unc to the setup.exe for (de)install" type="string" required="false" />
<named name="version" helpstring="installed f-prot version" type="simple" required="false" />
<named name="revision" helpstring="this script version" type="simple" required="false" />
<example>
Samples:
updating the local virus signatures from the application directory
cscript fprot.wsf /update
test if f-prot for win are installed and show the versions
cscript fprot.wsf /version
to scan all local drives
cscript fprot.wsf /scan
to scan wich a logfile
cscript fprot.wsf /scan /log:\\servername\logshare
to scan a spezified local path wich a logfile
cscript fprot.wsf /scan /scanpath:c:\winnt /log:\\servername\logshare
to scan more local paths wich a logfile
cscript fprot.wsf /scan /scanpath:"c:\winnt c:\test" /log:\\server\logshare
to remove local installtion
cscript fprot.wsf /remove /installsource:\\servername\install\fprot
to install a local instance witch a prescan
cscript fprot.wsf /install /prescan /installsource:c:\install
to install a local instance witch a specified prescan
cscript fprot.wsf /install /prescan /scanpath:c:\ /installsource:c:\install
</example>
<description>
CCD-fprot: CScript Virus-Detection with FPROT, $Revision: 0.1.1.6 $
Copyright (C) CCD 2004 *FREEWARE*
</description>
</runtime>
<script type="text/ecmascript" >
if ( WScript.FullName.toLowerCase().indexOf("cscript.exe") == -1)
err ("Bad script engine!\nUsing CScript interpreter!");
var fp = new FProt();
if (WScript.Arguments.Named.Exists("install")) fp.Install();
else if (WScript.Arguments.Named.Exists("scan")) fp.Scan();
else if (WScript.Arguments.Named.Exists("remove")) fp.Remove();
else if (WScript.Arguments.Named.Exists("update")) fp.Update();
else if (WScript.Arguments.Named.Exists("version")) WScript.Echo(fp.Version);
else if (WScript.Arguments.Named.Exists("revision")) WScript.Echo(fp.Revision);
else {WScript.Arguments.ShowUsage(); WScript.Quit();}
function err(msg){
WScript.Echo(msg);
WScript.Arguments.ShowUsage();
WScript.Quit();
}
//** FProt CLASS
//*********************************************************
//function FProt (parent)
function FProt ()
{
var sh = new ActiveXObject("WScript.Shell");
this.Revision = "$Revision: 0.1.1.6 $".split(' ')[1];
this.RegKey = new String ("HKLM\\Software\\FRISK Software International");
this.WorkingDirectory = WScript.ScriptFullName.substring(0,WScript.ScriptFullName.lastIndexOf('\\') + 1);
this.ProductName = new String ("FProt");
this.Setup = new String("setup.exe");
this.UpdateBin = new String("updater.exe");
this.CommandDemand = new String ("fpcmd.exe");
this.ISource = false;
try{ this.Version = sh.RegRead (this.RegKey + "\\FP-Win\\Version\\Package version");}
catch (e) { this.Version = false;}
try{ this.Root = sh.RegRead (this.RegKey + "\\F-Prot for Windows\\Program root");}
catch (e) { this.Root = false;}
try{ this.UpdateRoot = sh.RegRead (this.RegKey + "\\FP-Updater\\ProgramRoot");}
catch (e) { this.UpdateRoot = false;}
if (WScript.Arguments.Named.Exists("installsource")){
this.ISource = WScript.Arguments.Named.Item('installsource');
this.ISource = this.ISource.charAt(this.ISource.length - 1) == '\\' ? this.ISource : this.ISource + '\\';
this.ISource+= this.Setup;
}
this.Install = FProt_Install;
this.Remove = FProt_Remove;
this.Scan = FProt_Scan;
this.Exec = FProt_Exec;
this.Kill = FProt_Kill;
this.Update = FProt_Update;
}
function FProt_Scan() {
var bin = new String(), options = new String(), parameters = new String(), log = new String();
var fso = new ActiveXObject("Scripting.FileSystemObject");
var drives = new Enumerator(fso.Drives);
var net = WScript.CreateObject("WScript.Network");
bin = this.WorkingDirectory + this.CommandDemand;
options = " -ai -append -archive -auto -disinf -delete -dumb -packed -saferemove ";
//logging (optional)
if (WScript.Arguments.Named.Exists("log")){
log = WScript.Arguments.Named.Item('log');
log = log.charAt(log.length - 1) == '\\' ? log: log + '\\';
options+= "-report=" + log + net.ComputerName + "."+ this.ProductName + ".log.txt ";
}
if (WScript.Arguments.Named.Exists("scanpath")){
parameters = WScript.Arguments.Named.Item('scanpath');
}
else {
//get all local drives
while (!drives.atEnd()) {
if (drives.item().DriveType != 3 && drives.item().IsReady) {
parameters = parameters + drives.item().DriveLetter;
parameters+= ":\\ ";
}
drives.moveNext()
}
}
WScript.Echo("scan local share(s) "+ parameters + " now...");
this.Exec(bin + options + parameters);
}
function FProt_Install() {
var destifolder = new String(), cmd = new String();
var sh = new ActiveXObject("WScript.Shell");
if (!this.ISource) err('YOU NEED AN INSTALL SOURCE PATH!');
this.Kill;
destifolder = sh.Environment('PROCESS').Item('ProgramFiles') + '\\' + this.ProductName;
cmd = this.ISource + ' /INSTALLDIR=' + destifolder + ' /INSTALL=CUSTOM[FPWIN,FPSTOP,FPUPDATER]';
cmd+= ' /VDEFS=' + this.WorkingDirectory + ' /AUTO /HIDDEN /NORUN /INSTALLMENU=System';
if (WScript.Arguments.Named.Exists("prescan")) this.Scan();
WScript.Echo("install now ...");
this.Exec(cmd);
}
function FProt_Remove() {
var cmd = new String();
if (!this.Version) err("RemoveError: the application is not installed");
if (!this.ISource) err('YOU NEED AN INSTALL SOURCE PATH!');
this.Kill;
cmd = this.ISource + ' /uninst /s' ;
this.Exec(cmd);
}
function FProt_Update() {
var cmd = new String();
if (!this.Version) err("can't update: the apllication is not installed");
cmd = this.UpdateRoot + this.UpdateBin + ' /LAN=' + this.WorkingDirectory + ' /RUN /QUIT /HIDDEN';
this.Exec(cmd);
}
function FProt_Exec(cmd){
var sh = new ActiveXObject("WScript.Shell"), answer = new String();
var app = sh.Exec(cmd);
while (!app.StdOut.AtEndOfStream)
answer += app.StdOut.Read(1);
WScript.Sleep(100);
WScript.Echo (answer);
}
function FProt_Kill(){
if (this.Version){
WScript.Echo("stop the realtime scanner");
this.Exec("kill f-stopw.exe");
}
}
</script>
</job>
</package>

