2008-02-26

Systems Center Essentials 2007

Das Microsoft System Center Essentials 2007, kurz SCE, ist eine kombinierte Lösung für kleine und mittlere Unternehmen.
SCE bündelt dabei Komponenten aus SUS, SMS und MOM - ist also eine komplette Rundum-glücklich-Lösung für die Überwachung und Verwaltung der kompletten IT-Landschaft.

Wenn es denn funktioniert...

Installation
In unserem Fall haben wir die Installations-DVD vorliegen.
Ja, eine DVD! Allerdings ist da zusätzlich noch Microsoft Forefront Client Security drauf zu finden.

Ok, zur Installation:
- DVD einlegen, starten von setupSCE.exe (der Installations-Wizard ist optisch echt nett)
- ca. 20-30 Minuten einplanen (es wird u.a. SQL Express 2005 installiert)
- mit Entsetzen beobachten wie das Setup kurz vor Schluss ein Rollback durchführt!!

Es wird zwar ein Fehlerprotokoll erzeugt aber das tröstet einem auch nicht mehr.
Zumindest kann man dann nach dem Fehler googeln:

SetPropertiesToManagementServerActionAndSDKAccountCA error:
Microsoft.EnterpriseManagement.Common.UnauthorizedAccessMonitoringException :
The specified domain does not exist or cannot be contacted.'.
Das Problem tritt auf, wenn der NETBIOS Name der Domäne nicht mit dem FQDN Namen übereinstimmt (z.B. DOMFIRMA und firma.local). Dann versucht das Setup die Domäne FIRMA per Netbios zu erreichen, was natürlich nicht geht.

Es finden sich etliche Einträge bei Google, die aber alle nicht viel helfen.
Das Einzige was hilft ist ein Hotfix von Microsoft KB937831 !
Der Hotfix ist nicht direkt verfügbar sondern muß angefragt werden, es wird aber nichts berechnet für den Support.
Nach ein paar Stunden erhielt ich dann auch eine Email mit dem Download Link.

Der Hotfix (SCE07-RTM-KB937831-X86-AMD64-ENU.msi) wird auf dem Server einfach ausgeführt und anschliessend läuft das normale Setup per Wizard auch bis zum Ende durch.

Man kann auch vorher schon SQL Express 2005 Advanced installieren, dabei muß man aber den Haken "erweiterte Optionen ausblenden" wegnehmen, da man sonst nicht den ReportingServer installieren kann.
Den sollte man auch fertig konfigurieren lassen, da sonst Probleme mit der Initialisierung der verschlüsselten Daten enstehen.

Während der Installation von SCE kann man dann die fertige Instanz wählen.

Remote Konsole
Das Setup bietet auch an eine Remote-Konsole auf einem Admininistrot-Client zu installieren.
Es gibt hier nur zwei Sachen zu beachten:
Installation erst nachdem :
- die Konfiguration auf dem Server abgeschlossen wurde
- der Agent auf dem Client installiert wurde
Nach der Konfiguration auf dem Server werden zwei Zertifikate für die Übertragung per SSL erstellt, die bei dem Client vorher installiert werden müssen (Wird in der Hilfedatei erläutert).

IIS, Performanz, Clients
Es empfiehlt sich einen Server zu nehmen der KEINE anderen Aufgaben hat. Oder zumindest wenig Ressourcen-verbrauchende. Und möglichst KEINE Standardwebseite bisher hat.
Es geht zwar mit schon vorhandenen Webseiten, aber man hat dann evtl. einige Probleme.
So wird vom Update Service hart kodiert in der Webseite mit der ID 1 einige Dienste installiert, dann einige in der Standardseite (ohne IP-Adressen Zuordnung) und es wird noch eine dritte Webseite erstellt mit den Ports 8530 bzw. 8531 für SSL für die Verwaltung.

Bei uns fehlte die Webseite mit der ID 1 z.B.
Als Lösung habe ich eine neue Webseite erstellt, die Konfiguration in eine XML Datei exportiert, die Seite wieder gelöscht und in der XML Datei die ID auf 1 gesetzt. Anschliessend habe ich dann diese Seite wieder aus der XML Datei eingefügt.

In der Gruppenrichtlinie die SCE erstellt für Windows Update wird der Pfad zur HTTPS Seite eingetragen. Dies funktioniert aber leider nicht immer.
Also habe ich die Webseite ebenfalls exportiert und dann in der Standardwebseite die virtuellen Verzeichnisse wieder aus der Datei importiert und in der Gruppenrichtlinie den Pfad auf diese Webseite gesetzt (ohne HTTPS). Dann funktierte auch auf den Clients Windows Update und der SCE meldete nicht mehr den Fehler SelfUpdate nicht verfügbar.

Das ganze System auf dem Server ist schon recht leistungshungrig.
Unter 1 GB Hauptspeicher sollte man gar nicht anfangen und eine CPU mit mindestens 2GHz ist auch mehr als zu empfehlen.
Desweiteren macht es sich besser wenn man getrennte Festplatten für
- Auslagerungsdatei
- System
- WSUS Dateien
- SQL Daten
hat.

Fazit
Alles in allem ist SCE schon ein umfangreiches Tool mit dem man sehr viel machen kann.
Das man vor der Installation allerdings schon ein Hotfix braucht ist eine Zumutung.
Und das man eigentlich einen zusätzlichen Server benötigt damit SCE auch performant läuft ist gerade für die Zielgruppe (kleinere und mittlere Unternehmen) meistens nicht machbar.



2007-11-08

Exchange Server 2003 Disaster Recovery

Erst letztens habe ich einen detaillierten Backup/Restore Plan für unseren Exchange Server 2003 ausgearbeitet, und schon war es diese Woche soweit!
Das Ereignisprotokoll meldete Disk I/O Fehler und schliesslich wurde die Festplatte mit den Informationspeichern nicht mehr gefunden...

Eine Analyse ergab schnell: es lag nicht an den Festplatten, der Controller auf dem Motherboard war defekt.
Also blieb nur noch eine neue Maschine aufzusetzen und dann ab ans Wiederherstellen!

Hier also erstmal der Plan der Sicherung:

BACKUP
1. lokale Sicherung mit ntbackup
- systemstate
- Exchange Daten
2. remote Sicherung auf Band vom BackupServer
- System-/Windowslaufwerk
- die erzeugten lokalen Backupdateien

RESTORE
1. Betriebsystem installieren
2. Sicherung vom Band über Backupserver remote einspielen
3. SystemState lokal mit ntbackup wiederherstellen
4. neustarten des Systems
5. Exchange Daten wiederherstellen
- Bereitstellung der Informationsspeicher aufheben
- der Dienst MSExchangeIS muss laufen
- mit ntbackup die Informationsspeicher wiederherstellen
- Informationsspeicher wieder bereitstellen

Soweit die Theorie.
Nun zur Praxis:
Das Installieren des Betriebssystems (Server 2003) war kein Problem (klar).
Die Einspielung des Backups vom Band hat zwar lange gedauert (ca. 30GB an Daten...) funktionierte aber auch einwandfrei.
Nach dem wiederherstellen des SystemStates mußte der Server zwar einige Male neugestartet werden bis die neue Hardware wieder komplett erkannt wurde und auch alle Dienste wieder liefen, aber soweit gab es auch hier keine Probleme.
Der Aufruf der Exchange Verwaltungskonsole funktionierte allerdings NICHT. Dies lag a n der falschen Version der mapi.dll, die leider nicht wiederhergestellt wurde.
Diese muss also manuell kopiert werden.
Anschliessend noch schnell die Informationsspeicher wiederherstellen - nochmal neustarten zur Sicherheit ;) und dann lief es!

Ok, es gibt noch ein-zwei Haken... z.b. muß man die WMI für Exchange neu registrieren und kompilieren. Mehr später...

2007-10-12

PokerStars NL Holdem Sit&Go

Heute habe ich mal ein 5-Table Sit&Go mit $1+0.20 buyin probiert.
Hätte kein Problem sein sollen, da ich bisher in den Play-Money SnG meistens sehr gut abgeschnitten habe.

Aber es lief gar nicht - no cards!!

Und dann wenn ich was hatte passiert sowas:

PokerStars Game #12571253864: Tournament #63797686, $1.00+$0.20 Hold'em No Limit - Level II (15/30) - 2007/10/11 - 17:58:42 (ET)
Table '63797686 3' 9-max Seat #3 is the button
Seat 1: lamorte (1450 in chips)
Seat 2: Dr.Krawuttke (545 in chips)
Seat 3: Cindy1961 (1225 in chips)
Seat 4: FabioEXp (1130 in chips)
Seat 5: svetonio (1200 in chips)
Seat 8: tomnaz (6910 in chips)
Seat 9: Becca La La (3380 in chips)
FabioEXp: posts small blind 15
svetonio: posts big blind 30
*** HOLE CARDS ***
Dealt to Dr.Krawuttke [Jd Js]
tomnaz: calls 30
Becca La La: calls 30
Trueblue39 is connected
lamorte: folds
mika974 is connected
Dr.Krawuttke: raises 30 to 60
Cindy1961: calls 60
FabioEXp: calls 45
svetonio: folds
tomnaz: calls 30
Becca La La: calls 30
*** FLOP *** [Jc 8c 9s]
FabioEXp: checks
tomnaz: checks
Becca La La: checks
Dr.Krawuttke: bets 160
Cindy1961: calls 160
FabioEXp: folds
tomnaz: folds
Becca La La: folds
*** TURN *** [Jc 8c 9s] [7d]
Dr.Krawuttke: bets 325 and is all-in
Cindy1961: calls 325
*** RIVER *** [Jc 8c 9s 7d] [7c]
*** SHOW DOWN ***
Dr.Krawuttke: shows [Jd Js] (a full house, Jacks full of Sevens)
Cindy1961: shows [Tc 9c] (a straight flush, Seven to Jack)

Cindy1961 collected 1300 from pot
*** SUMMARY ***
Total pot 1300 | Rake 0
Board [Jc 8c 9s 7d 7c]
Seat 1: lamorte folded before Flop (didn't bet)
Seat 2: Dr.Krawuttke showed [Jd Js] and lost with a full house, Jacks full of Sevens
Seat 3: Cindy1961 (button) showed [Tc 9c] and won (1300) with a straight flush, Seven to Jack
Seat 4: FabioEXp (small blind) folded on the Flop
Seat 5: svetonio (big blind) folded before Flop
Seat 8: tomnaz folded on the Flop
Seat 9: Becca La La folded on the Flop


Naja, schwamm drüber...

2007-10-09

PokerStars Freeroll Turnier

Gestern abend war es mal wieder soweit und ich habe an einem PokerStars Turnier teilgenommen.
Da ich weder Geld noch Zeit habe um mit richtigem Geld zu spielen beschränke ich mich zu Zeit auf Freeroll Turniere.
Der Nachteil ist allerdings: es ist am Anfang eine ziemliche Lotterie da etliche Spieler, da sie ja keinen Einsatz zahlen müssen, etwas seltsam spielen...

NL Holdem, sponsored $100

Ok, bis zur ersten Pause lief es ganz gut, konnte bis dahin 4 von 5 Showdowns mit großen Pots gewinnen und noch ein paar kleinere vorher mitnehmen. Da lag ich noch mit ca. $12k unter den top100.
Nach der Pause schleppte sich das Spiel so dahin und ich konnte fast nur immer Blinds zahlen sonst nichts, aber ein paar Spiele bis kurz vor die 2. Pause gingen dann doch und ich konnte mit knapp $20k in die Pause gehen.
Nach der Pause hatte ich dann einen Run und konnte mich mit gut $40k wieder in die top100 schieben.
Dann hab ich aber 2 Fehler begangen:
1. ich saß in late position mit AJ unsuited
UTG geht all-in mit ca. $7k da er nur noch wenig Chips hat
UTG+1 callt, ich calle, der Rest foldet
Flop: A 9 3 rainbow
UTG+1 checked, ich raise, UTG+1 callt
Turn: 7
UTG+1 checked, ich raise, UTG+1 foldet! Das war gewünscht. UTG mit all-in hatte ich aber vergessen...
River: T
UTG: A9 !!!
War teuer und unnötig...

2. Fehler:
ich saß in middle position mit AK unsuited, raise
button geht all-in mit ca. $25k
alle folden ich calle
button hat QQ und trifft natürlich sein set...

naja, ich bin runter auf ca $2k chips bei 500/1000 Blinds...
ich hab dann nur noch safe gespielt und bin noch ITM gekommen und 11ct gewonnen!
Mit etwas mehr Vorsicht wäre mehr drin gewesen.
Beim nächsten Mal!

2007-09-27

Brute-Force Attacken auf Microsoft FTP Server

Mit penetranter Regelmäßigkeit wird bei uns in der Firma versucht sich unrechtmäßig auf unseren FTP Servern einzuloggen.
Und das nicht nur ab und zu sondern massiv mit Hilfe von Tools die einfach über Stunden Brute-Force Attacken fahren.
Das flutet nicht nur unsere Logfiles, sondern mit ca. 5-10 Versuchen pro Sekunde kommt das schon fast einer DoS Attacke gleich. Ganz abgesehen von der theoretischen Möglichkeit das es ein Spinner durch Zufall schaffen könnte sich einzuloggen...

Da es beim Microsoft eigenen FTP Dienst des IIS 6.0, der mit Server 2003 daherkommt, keine besonderen Schutzmaßnahmen gibt, habe ich ein wenig gesucht und auch ein Skript und eine Umsetzung des Skripts in eine Installation (download, Quellcode) gefunden.
Das funktioniert aber nicht so wie es sollte...

Also habe ich mich hingesetzt und angefangen es zu verändern, bis es kompletter re-write wurde.
Das Skript benutzt den LogParser und durchsucht die Logfiles des MSFTPSVC nach ungültigen Anmeldungen (return-code 530).
Falls nun eine IP-Adresse öfter als x-mal in der Minute den return-code 530 erhält, wird sie auf die Liste der zu sperrenden IP-Adressen gesetzt.
Findet das Skript keine neuen IP-Adressen, passiert nichts weiter. Erst wenn es neue entdeckt werden diese in die Auschlussliste des FTP-Dienstes eingetragen, dieser neu gestartet damit die Änderung in Kraft tritt, und ein Eintrag in das Eventlog geschrieben.
Damit es funktioniert, speichert man den Code in einer .vbs Datei und legt einen Task an, der alle paar Minuten wiederholt wird.
Angepasst werden muss der Pfad zu den Logfiles:

'the place of the logfiles to parse
strLogfiles = "your_path_to_the_MSFTP_logfiles\MSFTPSVC11111111\*"


Hier der komplette Code:
'--------------------------------------------
' BanBruteForceIPsFTP.vbs
'
' adds IPs of brute-force attacks on MSFTP to list of denied IPs in the MSFTPSVC
' uses LogParser to scan the MSFTP-logfiles
' gets all IPs with sc-status=530 (Not logged in = occurs after wrong password)
' that happen more then 60 times a minute
' gets all existing denied IPs and adds new ones
' stops and starts the MSFTPSVC if new IPs found
'
' created: 2007-09-10,
' changed: 2007-09-12,
'--------------------------------------------
Option Explicit

'Variables
Const EVENT_SUCCESS = 0
Dim oRecord, oRecordset, oLogQuery, oIISFormat, objFTPIPSec, objShell
Dim objFTPSVC, objWMIService, objItem, objService, objDictionary
Dim sLogName, strQuery, strIPs, strIP, strComputer, strService
Dim clientIP, strTimes, strLogfiles
Dim i, intSleep
Dim bannedIPArray
Dim colListOfServices

Call Main()

'--------------------------------------------
Sub Main()
Dim IPsAdded
Call init()
Call getIPs()
IPsAdded = addIPs()
'only restart if new IPS have been added
If IPsAdded Then
Call restartSVC()
Call writeEvent("MSFTP neu gestartet, neue IPs gebannt! (BanBruteForceIPsFTP.vbs)")
End If
Call cleanup()
End Sub 'main

'--------------------------------------------
Sub init()
'initial values
'the number of occurences per minute to trigger
strTimes = "60"
'the place of the logfiles to parse
strLogfiles = "your_path_to_the_MSFTP_logfiles\MSFTPSVC11111111\*"
'the LogParser query to execute
strQuery = "SELECT DISTINCT c-ip FROM " &_
strLogfiles &_
" WHERE sc-status=530 GROUP BY c-ip" &_
" HAVING COUNT(EXTRACT_PREFIX(TO_STRING(time, 'hh:mm'), 1, ':'))>" &_
strTimes & " ORDER BY c-ip"
'the machine where the MSFTPSVC is running, .=local
strComputer = "."
'the time between start and stop of MSFTPSVC
intSleep = 5000
'the name of the service
strService = " 'MSFTPSVC' "

'initialize objects
'--------------------------------------------
Set oLogQuery = CreateObject("MSUtil.LogQuery")
Set oIISFormat = CreateObject("MSUtil.LogQuery.IISW3CInputFormat")
Set oRecordSet = oLogQuery.Execute(strQuery, oIISFormat)
Set objFTPSVC = GetObject("IIS://localhost/MSFTPSVC")
Set objFTPIPSec = objFTPSVC.IPSecurity
Set objDictionary = CreateObject("Scripting.Dictionary")
Set objWMIService = GetObject("winmgmts:" &_
"{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colListOfServices = objWMIService.ExecQuery (_
"Select * from Win32_Service Where Name =" & strService & " ")
Set objShell = Wscript.CreateObject("Wscript.Shell")
End Sub 'init

'--------------------------------------------
Sub getIPs()
'parse logfiles with LogParser and get IPs
Do While Not oRecordset.atEnd
Set oRecord = oRecordset.getRecord
objDictionary.Add oRecord.getValue(0), "255.255.255.255"
oRecordset.moveNext()
Loop
oRecordset.close()
End Sub 'getIPs

'--------------------------------------------
Function addIPs()
'get existing denied IPs and add new ones
'only if any IPs are found at all and if MSFTPSVC is granting access by default
'otherwise it would not work to add IPs to ban
Dim retValue
retValue = False
If objDictionary.Count > 0 And objFTPIPSec.GrantByDefault = True Then
'get the existing banned IPs
bannedIPArray = objFTPIPSec.IPDeny
'check if there are new IPs to ban = triggers restart of service
If objDictionary.Count <> UBound(bannedIPArray)+1 Then retValue = True
For i = 0 to ubound(bannedIPArray)
clientIP = Left(bannedIPArray(i),InStr(bannedIPArray(i),",")-1)
'only add new IPs
If objDictionary.Exists(clientIP) = False Then
objDictionary.Add bannedIPArray(i), "255.255.255.255"
End If
Next
'set the new list into MSFTPSVC
objFTPIPSec.IPDeny = objDictionary.Keys
objFTPSVC.IPSecurity = objFTPIPSec
objFTPSVC.SetInfo
End If

addIPs = retValue
End Function 'addIPs

'--------------------------------------------
Sub restartSVC()
'restart the service
For Each objService in colListOfServices
objService.StopService()
WSCript.Sleep intSleep
objService.StartService()
Next
End Sub 'restartSVC

'--------------------------------------------
Sub cleanup()
'clean up
Set oLogQuery = Nothing
Set oIISFormat = Nothing
Set oRecordSet = Nothing
Set oRecord = Nothing
Set objFTPIPSec = Nothing
Set objDictionary = Nothing
Set objFTPSVC = Nothing
Set objWMIService = Nothing
Set colListOfServices = Nothing
Set objShell = Nothing
End Sub 'cleanup

'--------------------------------------------
Sub writeEvent(strInput)
'write String to eventLog
objShell.LogEvent EVENT_SUCCESS, strInput
End Sub 'writeEvent

'--------------------------------------------
'EOF

Eröffnung

So, jetzt bin ich offiziell auch ein blogger...