Donnerstag, 19. Juni 2014

Monitoring: Sophos SafeGuard Enterprise

Was ist Sophos SafeGuard Enterprise?

Sophos SafeGuard Enterprise ist eine Software-Lösung für Endpoint-Security, mit der man im wesentlichen eine managed Verschlüsselungslösung für Clients aufbauen kann.

Wesentliche Komponenten 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 und co) mit Zugriffsmöglichkeiten auf mobile devices
  • 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 als 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 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:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">&lt;Dataroot&gt;&lt;WebService&gt;OK&lt;/WebService&gt;
&lt;DBAuth&gt;OK&lt;/DBAuth&gt;
&lt;Info&gt;
&lt;Database&gt;SafeGuard&lt;/Database&gt;
   &lt;Server&gt;SGE1\SQLEXPRESS&lt;/Server&gt;
   &lt;Version&gt;11.00.3000&lt;/Version&gt;
   &lt;Name&gt;DBFactorySql on process: w3wp
Process ID: 33264&lt;/Name&gt;
   &lt;Owner&gt;[dbo]&lt;/Owner&gt;
   &lt;ConnectionInfo&gt;SQL Server credentials are used for authentication.&lt;/ConnectionInfo&gt;
&lt;/Info&gt;
&lt;/Dataroot&gt;</string>

Valides XML:
<?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>


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 entweder:
  • DBAuth und/oder WebService nicht "OK" sind
  • HTTP Status != 200
  • Fehler bei der XML Verarbeitung aufgetreten sind

Download: Nagios Exchange


Bei Fragen bitte einfach melden.

Mittwoch, 11. Juni 2014

Nützliche Dinge rund um die Bash und den Prompt

Da wir Admins generell faul sind, suchen wir Wege um unsere Arbeit effizienter zu gestalten.

Unter Linux gibt es da mit der Bash einige schöne Möglichkeiten, von denen ich einige mal vorstellen möchte:

(Alle Beispiele gehören in die $HOME/.bash_alias, damit sie auch beim Login aktiv sind)

Farbige Manpages (kann natürlich auch in die /etc/environments eingetragen werden)

export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'

Textdateien

alias t="tail -f -n200" # t /var/log/apache2/error.log -> tail wird im fortlaufenden Modus gestartet
alias nocomment='grep -Ev '\''^(#|$)'\''' # nocomment /etc/apache2/apache2.conf -> Ausgabe der Zieldatei, allerdings ohne Kommentare
alias lvim="vim -c \"normal '0\"" # erneut die zuletzt geöffnete Datei im vim öffnen

 

 Nützliche "Tools"

alias mkdir="mkdir -pv" # erstellung von rekursiven Ordnern und Anzeige der zuerstellenden Ordner
alias lsmount="mount|column -t" # formatierte Ausgabe von mount
alias path='echo -e ${PATH//:/\\n}' # formatierte Ausgabe des Path

# System
alias meminfo='free -m -l -t' # erweiterte RAM Ausgabe
alias psmem='ps auxf | sort -nr -k 4' # sortierte Ausgabe aller Prozesse nach RAM Auslastung
alias pscpu='ps auxf | sort -nr -k 3' # sortierte Ausgabe aller Prozesse nach CPU Auslastung
alias j="jobs -l" # Ausgabe der aktiven Jobs (Strg+Z, fg)
alias h="history" # Kurzform für Ausgabe der History

# Datum
alias nowtime='date +"%T"' # formatierte Ausgabe der Uhrzeit
alias nowdate='date +"%d-%m-%Y"' # formatierte Ausgabe des Datums

# Netzwerk
alias ports='netstat -tulanp' # Anzeige aller offenen Ports

# Web
alias header='curl -I' # Abruf des Headers von Argument Webseite 
alias headerc='curl -I --compress' # same, allerdings mit Komprimierung
alias apache2test='/usr/sbin/apachectl -t && /usr/sbin/apachectl -t -D DUMP_VHOSTS' # Apache2 Configtest 

function cdl(){ cd "$@"; ls -al;} # Bei der Nutzung von cdl, anstelle von cd, wird nun der Inhalt des Zielordners angezeigt

## Zeigt die aktuelle Verzeichnisstruktur an, sehr huebsch
function tree(){
        pwd
        ls -R | grep ":$" | \
        sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/ /' -e 's/-/|/'
}

# Für die Apt Nutzer unter uns
alias upd="apt-get update" # refresh der sourcen
alias del="apt-get remove " # Entfernen (kein purge!) von Paketen
alias get="apt-get install " # Installation von Paketen
alias upg="apt-get upgrade" # Aktualisierung des Systems 
alias searchpkg="apt-cache search " # Paketsuche
alias update="apt-get update && apt-get upgrade" # Refresh der Sourcen und Aktualisierung der Pakete kombiniert



Wenn man diese Funktionen / Aliases und Variablen in der .bash_alias verankert hat, erspart man sich eine Menge Zeit und kann diese Zeit in die Weiterentwicklung der System-Landschaft stecken.

Tipp: Natürlich gibt es da noch mehr Möglichkeiten,  einfach mal sich selber über die Schulter schauen und überlegen ob man sein Nutzverhalten nicht mit eigenen Aliases/Funktionen noch optimieren kann


Bei Fragen bitte einfach kurz melden :-)