Dieser Beitrag erschien zuerst auf Ollis Blog.
Sophos SafeGuard Enterprise ist eine Software-Lösung für Endpoint-Security, mit der man im wesentlichen eine zentral verwaltete Verschlüsselungslösung für Clients aufbauen kann. Die Lösung lässt sich eigentlich gut ins Monitoring einbinden – wenn da nicht ein ärgerlicher Bug in der XML-Komponente wäre. In diesem Artikel stelle ich eine Lösung dafür vor.
Wesentliche Komponenten der Software sind:
- Zertifizierte Verschlüsselungstechnologien (FIPS, Common Criteria)
- Hohe Verschlüsselungsstärke (AES 256 Bit)
- Festplattenverschlüsselung
- Verschlüsselung von Wechselmedien
- Verschlüsselter Datenaustausch, ohne dass der Empfänger selber das Produkt installiert haben muss
- Verschlüsselung für CloudStorage (Dropbox usw.) mit Zugriffsmöglichkeiten auf Mobilgeräte
- Verschlüsselung für Netzwerk-Freigaben
- Unterstützung von BitLocker, FileVault etc
- Token-basierte Authentifizierung
- OU-basierte Zuweisung von Richtlinien
- Client-Unterstützung: Windows XP – 8.1, MAC OSX 10.5 – 10.9
- Datenbank-Unterstützung: SQL Server 2005 – 2012 SP1 (jeweils auch Express)
- Management-Server: Windows Server 2003 – 2012 R2
- Management-Konsole: Windows Server 2003 – 2012 R2, XP – 8.1
Die Installation des Clients kann bequem mittels einer Software-Verteilung erfolgen, die Kommunikation mit dem Server erfolgt dann bidirektional (z.B. Richtlinien abrufen, Zustand hochladen), über HTTP optional mit SSL-Verschlüsselung. Die Überwachung von Sophos SafeGuard Enterprise gestaltet sich relativ einfach, da Sophos bereits eine Web-Schnittstelle für die wichtigsten Komponenten bereitstellt:
- WebService (wie bereits oben beschrieben, eine sehr kritische Komponente)
- DBAuth: Zugriff auf die Datenbank
Da der Abruf der Informationen aus Sicherheitsgründen nur über Localhost gestattet ist und der Server/Management Center nur auf einem Windows Server installiert werden kann, konnte ich ohne Interpreter-Installation auf dem Server leider keine meiner bevorzugten Sprachen nutzen. Daher habe ich das Plugin in VBS geschrieben und bin dabei auf einen unschönen Bug in der Web-Schnittstelle gestoßen. Die Informationen der Schnittstelle werden als XML abgerufen, allerdings werden die spitzen Klammern als HTML Steuerzeichen ausgegeben und können somit nicht direkt verarbeitet werden:
Falsches XML:
<string xmlns=“http://tempuri.org/“><?xml version=“1.0″ encoding=“utf-8″?>
<string xmlns=“http://tempuri.org/“><Dataroot><WebService>OK</WebService>
<DBAuth>OK</DBAuth>
<Info>
<Database>SafeGuard</Database>
<Server>SGE1\SQLEXPRESS</Server>
<Version>11.00.3000</Version>
<Name>DBFactorySql on process: w3wp
Process ID: 33264</Name>
<Owner>[dbo]</Owner>
<ConnectionInfo>SQL Server credentials are used for authentication.</ConnectionInfo>
</Info>
</Dataroot></string></string>
Valides XML:
<string xmlns=“http://tempuri.org/“><dataroot><webservice><?xml version=“1.0″?>
<string xmlns=“http://tempuri.org/“><Dataroot><WebService>OK</WebService>
<DBAuth>OK</DBAuth>
<Info>
<Database>SafeGuard</Database>
<Server>SGE1\SQLEXPRESS</Server>
<Version>11.00.3000</Version>
<Name>DBFactorySql on process: w3wp
Process ID: 49588</Name>
<Owner>[dbo]</Owner>
<ConnectionInfo>SQL Server credentials are used for authentication.</ConnectionInfo>
</Info>
</Dataroot></string></webservice><info><connectioninfo></connectioninfo>
</info>
</dataroot></string>
Durch diesen Bug musste ich im Plugin ein Tempfile erstellen (%windir%/temp) und in diesem das XML gerade biegen. Dabei kommt dann folgendes raus:
' Author: Oliver Skibbe ' Date: 2014-06-18 ' Required Variables Const PROGNAME = "check_sge" Const VERSION = "1.0.0" ' Nagios helper functions nsclientDir = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) Include nsclientDir & "\lib\NagiosPlugins.vbs" ' Create the NagiosPlugin object Set np = New NagiosPlugin Set WshShell = WScript.CreateObject("WScript.Shell") Set xmlDoc = CreateObject("Msxml2.DOMDocument") Set objFSO = CreateObject("Scripting.FileSystemObject") ' fetch xml, per default "CheckConnection" is only available via localhost Set oXMLHTTP = CreateObject("Msxml2.ServerXMLHTTP.3.0") oXMLHTTP.SetOption 2, oXMLHTTP.GetOption(2) - SXH_SERVER_CERT_IGNORE_ALL_SERVER_ERRORS oXMLHTTP.Open "POST", "https://localhost/SGNSRV/Trans.asmx/CheckConnection", False oXMLHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" oXMLHTTP.Send "" ' Ugly, but we have to build a Tempfile, cause SafeGuard Enterprise does not provide a valid xml file ' Sophos Support: might be fixed in 6.20 ' temporary file, strWinDir = WshShell.ExpandEnvironmentStrings("%WinDir%") TEMPFILE = strWinDir & "\Temp\nagios_sge.xml" ' load fetched xml file Set myFile = objFSO.CreateTextFile(TEMPFILE, True) bodyStr = oXMLHTTP.responseXML.xml ' this is the magic, replace broken html stuff with real ">" & "<" bodyXML = Replace(bodyStr, "<", "<") bodyXML = Replace(bodyXML, ">", ">") ' save file myFile.write(bodyXML) ' Website is responding and returns OK If oXMLHTTP.Status = 200 Then ' Parse XML xmlDoc.load(TEMPFILE) If isObject(xmlDoc) Then ' prepare output For Each x In xmlDoc.documentElement.selectNodes("//string/Dataroot") WebService = x.selectSingleNode("WebService").Text DBAuth = x.selectSingleNode("DBAuth").Text Info = "Database: " & x.selectSingleNode("Info/Database").Text Info = Info & vbcrlf & "DBServer: " & x.selectSingleNode("Info/Server").Text Info = Info & vbcrlf & "DBVersion: " & x.selectSingleNode("Info/Version").Text Info = Info & vbcrlf & "DBOwner: " & x.selectSingleNode("Info/Owner").Text Info = Info & vbcrlf & "DBConnectionInfo: " & x.selectSingleNode("Info/ConnectionInfo").Text Next If WebService = "OK" And DBAuth = "OK" Then return_code = OK return_msg = "Everything's fine!" Else return_code = CRITICAL return_msg = "Something happened!" End If ' end if webserver and dbauth ' prepare return msg return_msg = return_msg & " WebService: " & WebService & " DBAuth: " & DBAuth & vbcrlf & Info Else ' XML not loaded return_code = CRITICAL return_msg = "XML could not be read" End If ' end if xml load Else ' Webservice reporting something other than 200 (OK) MsgBox("Error: " & oXMLHTTP.Status) return_code = CRITICAL return_msg = "Webservice answered something strange, http status: " & oXMLHTTP.Status End If ' end if Webservice status 200 (OK) ' exit np.nagios_exit return_msg, return_code ' helper for including nagios lib Sub Include( cNameScript ) Set oFS = CreateObject("Scripting.FileSystemObject") Set oFile = oFS.OpenTextFile( cNameScript ) ExecuteGlobal oFile.ReadAll() oFile.Close End Sub ' EOF
Das Plugin wird kritisch, wenn:
- DBAuth und/oder WebService nicht „OK“ sind
- HTTP Status nicht gleich 200
- Fehler bei der XML Verarbeitung aufgetreten sind
Download: Nagios Exchange
http://faq-o-matic.net/?p=5971