NGINX Reverse Proxy für Exchange 2016

Folgende Pakete müssen auf einem Ubuntu 16.04 LTS installiert werden:

apt install nginx nginx-extras

Die Konfiguration wird abgelegt unter /etc/nginx/conf.d/exchange.conf

Folgende Dinge müssen angepasst werden:

  • DNS Name unter dem OWA etc. erreichbar sein soll z.B. mail.example.org
  • Autodiscover DNS Name z.B. autodiscover.example.org
  • Interner Exchange Server z.B. exchange-server.example.internal
server {
    listen 80;
    server_name mail.example.org autodiscover.example.org;
    return 301 https://$host$request_uri;
}

server {
    tcp_nodelay on;
    listen 443;
    ssl                     on;
    ssl_certificate /etc/ssl/certs/star.example.org.pem;
    ssl_certificate_key /etc/ssl/private/star.example.org.key;

    ssl_session_timeout     5m;
    server_name mail.example.org;

    location / {
            return 301 https://mail.example.org/owa;
    }

    proxy_http_version      1.1;
    proxy_read_timeout      360;
    proxy_pass_header       Date;
    proxy_pass_header       Server;
    proxy_pass_header       Authorization;
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For  $proxy_add_x_forwarded_for;
    proxy_pass_request_headers on;
    more_set_input_headers 'Authorization: $http_authorization';
    proxy_set_header Accept-Encoding "";
    more_set_headers -s 401 'WWW-Authenticate: Basic realm="exchange-server.example.internal"';
    # proxy_request_buffering off;
    proxy_buffering off;
    proxy_set_header Connection "Keep-Alive";

    location ~* ^/owa { proxy_pass https://exchange-server.example.internal; }
    location ~* ^/Microsoft-Server-ActiveSync { proxy_pass https://exchange-server.example.internal; }
    location ~* ^/ecp { proxy_pass https://exchange-server.example.internal; }
    location ~* ^/rpc { proxy_pass https://exchange-server.example.internal; }
    location ~* ^/autodiscover { proxy_pass https://exchange-server.example.internal; }
    location ~* ^/oab { proxy_pass https://exchange-server.example.internal; }

    error_log /var/log/nginx/exchange-rproxy-ssl-error.log;
    access_log /var/log/nginx/exchange-rproxy-ssl-access.log;
}

Ob alles einwandfrei Funktioniert lässt sich über einen Webservice von Microsoft testen:

https://testconnectivity.microsoft.com/

 

Quellen:

Viel Spaß 😉

Managed Service Accounts (MSA) für Services unter Windows 2008 R2

Unter Windows 2008 R2 gibt es sog. Managed Service Accounts. Diese Accounts sind für Dienste / Services gedacht. Vorteil dieser Accounts ist, das diese keine festen Passwörter mehr benötigen. Früher wurde für einen Service ein Account mit einem festen Passwort angelegt das nicht abläuft. Mit dieser neuen Funktion ist das nicht mehr notwendig da der Server selbständig in der Lage ein neues Passwort zu vergeben wenn es ausläuft.

Für die Erstellung von MSA´s benötigt man die PowerShell im Adminmodus.

Benötigt wird das Modul ActiveDirectory.

import-module activedirectory
New-ADServiceAccount -name msa1
New-ADServiceAccount -name msa2 -AccountPassword (ConvertTo-SecureString -AsPlainText 1q2w3e4r%T -Force)
Add-ADComputerServiceAccount -Identity romulus -ServiceAccount msa1
Add-ADComputerServiceAccount -Identity romulus -ServiceAccount msa2

New-ADServiceAccount legt einen neuen MSA an. Falls man für eine Dienstinstallation ein Passwort benötigt kann man mit dem Zusatz -AccountPasswort (siehe MSA2) ein Startpasswort definieren. Nach Ablauf der Passwortgültigtkeit wird dann ebenfalls ein neues gesetzt. Mit Add-ADComputerServiceAccount wird festgelegt für welche Maschine der Serviceaccount ist.

Auf der Maschine wo der ServiceAccount benötigt wird muss dieser noch Installiert werden.

Import-Module ActiveDirectory
Install-ADServiceAccount -Identity msa1
Install-ADServiceAccount -Identity msa2

Mit dem Kommando Install-ADServiceAccount wird der Maschine der ServiceAccount bekannt gemacht. Ab diesen Moment weiß die Maschine das sie für diesen Account auch die Passwörter wechseln muss wenn es soweit ist.

 Wie werden die MSA`s verwendet?

Zum Testen habe ich einfach schnell 2 Dienste über die Kommandozeile angelegt.

Wichtig sind die Leerzeichen nach dem Istgleich.

sc create Dienst1 type= own binpath= c:\dienst1.exe
sc create Dienst2 type= own binpath= c:\dienst2.exe

Jetzt benötigen wir die services.msc Managementkonsole, dort tauchen jetzt auch unsere 2 neuen Dienste auf.

Einen der Testdienste mit Doppelklick öffnen und in den Reiter „Logon“ gehen. Hier „This Account“ auswählen und auf „Browse“ gehen. In das Suchfeld msa1 oder msa2 eingeben und suchen. Das ganze mit OK bestätigen.

Der Account wird als msa1$ oder msa2$ angezeigt. Passwort kann man irgendwas eingeben, um das Passwort kümmert sich Windows selbst. Alles mit OK bestätigen.

Noch ein kleines „Nice to know“

Es gibt die Möglichkeit ACLs für Dienste selbst zu vergeben, d.H. nicht nur für Dienste die unter einem User laufen sondern auch für Dienste die im LOCAL SYSTEM laufen. Hier kann man den Diensten Rechte nehemen oder geben.

Als Location muss die Maschine selbst angegeben werden, in dem Fall „ROMULUS“. Im Suchfeld muss der entsprechende Dienst mit dem Prefix „nt service\“ eingegeben werden, also „nt service\dienst1“. Ohne das Prefix findet Windows den Dienst nicht!

Auf einen Dienst können alle ACLs die auf einen User anwendbar sind ebenfalls angewendet werden.

Die PowerShell

Dieser Artikel ist nur ein kleiner Überblick der mächtigen PowerShell. Die PowerShell wurde von Microsoft entwickelt um administrative Aufgaben effizienter erledigen zu können und um eine zentrale, einheitliche Schnittstelle zu bieten. Für viele neue Microsoft Produkte ist die PowerShell unabdingbar (z.B. Microsoft Exchange 2010).

Allgemeines

Die PowerShell besteht aus kleinen Einheiten die sich Cmdlets nennen. Die Kommandos sind alle nach dem Schema Verb-Substantiv aufgebaut, z.B. get-help. Groß-/Kleinschreibung spielt keine Rolle. Für bestimmte Kommandos und Cmdlets gibt es Aliase.

 

Wichtige Kommandos

 

Kommando/Cmdlet Beschreibung
get-help Zeigt die Hilfe an
get-help <Kommando/Cmdlet> Zeigt die Hilfe zu einem Kommando/Cmdlet an
get-variable Zeigt alle gesetzten Variablen an
get-alias Zeit alle gesetzten Aliase an
get-module -ListAvailable Zeigt vorhandene Module an
import-module <modulname> Importiert das Modul in die aktuelle Sitzung (z.B. import-module activedirectory)
get-command Zeigt die verfügbaren Kommandos / Cmdlets an
sort-object Sortieren einer Datenmenge
select-object Einen bestimmten Bereich selektieren (z.B. select-object -First 3)
export-csv Datenmenge in CSV exportieren
get-psdrive Zeigt PowerShell Laufwerke an
invoke-command Kommandos Remote auf anderen Server ausführen
enable-psremoting Aktiviert Remote Power Shell
new-pssession Baut eine Verbindung zu einem Remote Power Shell Server auf
enter-pssession Geht in die Remote Verbindung rein
exit-pssession Verlässt die Remote Session
get-credential Frägt über einen Popup Anmeldeinformationen ab wenn man nicht die Sitzungsanmeldeinformationen verwenden will
get-aduser <username> Frägt aus dem AD Informationen über einen User ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.)
get-adobject <filter> Frägt ein Objekt aus dem AD ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.)
get-adcomputer <computer> Frägt aus dem AD Computerinformationen ab (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.)
set-adaccountpassword Setzt Passwort für einen User (Nur Verfügbar wenn das ActiveDirectory Modul geladen ist.)

Vergleichs- und Verknüpfungsoperatoren

 

Operator Beschreibung
-eq (equal) gleich
-ne (not equal) nicht gleich
-gt (greater than) größer als
-lt (less than) kleiner als
-ge (greater equal) größer gleich
-le (less equal) kleiner gleich
-like wie .z.B. „a*“
-notlike nicht wie z.B. „a*“
-match „^ABC“ (Regex)
-AND und
-OR oder
-NOT nicht

Beispiel: get-service

get-service gibt den Status der Prozesse zurück.

Will man jetzt z.B. nur Dienste sehen die sich im Status „Running“ befinden so kann man das Ergebnis an ein anderes Kommando pipen.

get-service | where-object {$_.status -eq "running"}

Das Resultat:

Alternativ für where-object gibt es einen Alias der „?“ heißt. Also wäre auch folgender Befehl möglich:

get-service | ? {$_.status -eq "running"}

Das ganze lässt sich mit einem Verbindungsoperator noch erweitern:

get-service | ? {($_.name -like "A*") -AND ($_.status -like "run*")}

Als Resultat bekommen wir alle Prozesse die mit A…. beginnen und laufen.

Jetzt können wir uns noch alle Prozesse mit A ausgeben lassen und diese absteigend sortieren.

get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending

Die Ausgabe können wir jetzt noch auf 3 Resultate beschränken:

get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending | select-object -First 3

Das können wir jetzt noch in eine CSV Datei exportieren:

get-service | ? {$_.name -like "a*"} | sort-object displayname -Descending | select-object -First 3 | export-csv -path export.csv

Inhalt export.csv:

#TYPE System.ServiceProcess.ServiceController
"Name","RequiredServices","CanPauseAndContinue","CanShutdown","CanStop","DisplayName","DependentServices","MachineName","ServiceName","ServicesDependedOn","ServiceHandle","Status","ServiceType","Site","Container"
"AudioEndpointBuilder","System.ServiceProcess.ServiceController[]","False","False","True","Windows Audio Endpoint Builder","System.ServiceProcess.ServiceController[]",".","AudioEndpointBuilder","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Running","Win32ShareProcess",,
"AudioSrv","System.ServiceProcess.ServiceController[]","False","False","True","Windows Audio","System.ServiceProcess.ServiceController[]",".","AudioSrv","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Running","Win32ShareProcess",,
"AppMgmt","System.ServiceProcess.ServiceController[]","False","False","False","Application Management","System.ServiceProcess.ServiceController[]",".","AppMgmt","System.ServiceProcess.ServiceController[]","SafeServiceHandle","Stopped","Win32ShareProcess",,

PowerShell Drives

In der PowerShell kann man auf verschiedene Daten über das Filesystem zugreifen. Darunter sind unter anderem der Certificate Store und die Registry.

 

get-psdrive
cd HKLM:
cd .\SOFTWARE
dir

Remote PowerShell

In der PowerShell ist es möglich einen RemoteAccess zu aktivieren. Einmal aktiviert bleibt er auch aktiviert, er lässt sich aber wieder abschalten. Der PowerShell Remote Service läuft auf 2 TCP Ports. TCP/5985 ohne SSL und TCP/5986 mit SSL.

Aktivieren der Remote Shell:

enable-psremoting

Die beide Abfragen mit „Y“ bestätigen, eine automatische Firewallregel wird installiert.

Es gibt 2 Möglichkeiten mit der Remote PowerShell zu arbeiten.

1. Wir können ein Kommandosatz übermitteln und das Ergebnis verarbeiten

invoke-command -computername romulus.thoma.local -scriptblock {get-service}

2. Wir können uns eine vollständige Remote Shell öffnen

new-pssession -computername romulus

Nach dem Verbindungsaufbau muss man in die Session einsteigen

enter-pssession 1

Am Beginn der Zeile steht jetzt der Hostname der Remotemaschine. Um die Remotemaschine zu verlassen benötigt man folgendes Kommando:

exit-pssession

Die Sessions verschwinden nach 15 Minuten von alleine, wer nicht warten will kann mit

remove-pssession 1

die Session löschen.

Mit anderen Credentials Remote anmelden

Es gibt 2 verschiedene Möglichkeiten Credentials mitzugeben.

1. Im Script

Windows benötigt gehashte Passwörter für die Anmeldung.

$secpasswd = Convert-To-SecureString "1q2w3e4r%T" -AsPlainText -Force
$username="max"
$mycreds = new-object system.management.automation.pscredential ($username, $secpasswd)
invoke-command -credential $mycreds -computername romulus.thoma.local -scriptblock {get-service}

2. Per Popup

$mycreds = get-credential
invoke-command -credential $mycreds -computername romulus.thoma.local -scriptblock {get-service}

Windows 2008 R2 Server Active Directory Papierkorb aktivieren und verwenden

In der aktuellen Windows 2008 R2 Server Version gibt es die Möglichkeit das gelöschte AD Objekte in einem Papierkorb aufbewahrt werden. Das gab es zwar schon früher, allerdings werden bei dem AD Papierkorb alle Werte erhalten incl. Passwort. Dies war bei der vorhergehenden Lösung nicht der Fall. Der AD Papierkorb setzt voraus das der Forrest Funcional Level „Windows 2008 R2“ ist. Ist die Domäne auf Windows 2003 aufgebaut und wurde zu 2008 R2 migriert werden die Objekte im Papierkorb für 60 Tage gespeichert. Ist die Domäne direkt mit Windows 2008 / 2008 R2 aufgebaut werden die Objekte für 180 Tage gespeichert. Der Wert lässt sich auch ändern.

Wichtig! Die AD Papierkorbfunktion gibt es nur unter Windows 2008 R2 Server.

Um den AD Papierkorb zu aktivieren muss auf dem Schema-Master in einer administrativen Power Shell folgender Befehl ausgeführt werden.

Wer ist der Schema-Master? Dies lässt sich mit netdom ermitteln:

C:\>netdom query fsmo

Falls keine Remote Powershell aktiviert ist muss man sich via RDP verbinden oder sich direkt an die Maschine begeben.

In der PowerShell muss das Modul ActiveDirectory nachgeladen werden. Der DN muss angepasst werden auf die entsprechende Domäne genauso wie das Target.

PS C:\>import-module activedirectory
PS C:\>enable-adoptionalfeature -identity "cn=recycle bin feature,cn=optional features,cn=directory service,cn=windows nt,cn=services,cn=configuration,dc=thoma,dc=local" -scope forestorconfigurationset -target "thoma.local"

ACHTUNG! Das Feature lässt sich nicht mehr abschalten. Anschließend mit „Y“ bestätigen.

 Wie kann man den AD Papierkorb verwenden ?

Ich habe zum Test den User dummy1 gelöscht. Der User befindet sich jetzt in diesem Papierkorb.

Mit einer administrativen PowerShell können wir den User suchen.

PS C:\>import-module activedirectory
PS C:\>get-adobject -filter {name -like "*dummy1*"} -includedeletedobject

Will man diesen User jetzt wiederherstellen so muss man folgenden Befehl verwenden:

PS C:\>get-adobject -filter {name -like "*dummy1*"} -includedeletedobject | restore-adobject

Ruft man jetzt erneut den „get-adobject -filter {name -like „*dummy1*“} -includedeletedobject“ Befehl auf sieht man das der User nichtmehr das Flag „Deleted“ besitzt und wieder seinen orginalen DN hat.

Windows 2008 Active Directory Snapshot erstellen und mounten

Windows 2008 / 2008 R2 Server bietet ein cooles Feature um regelmäßig und schnell das Active Directory zu sichern. Die Sicherung kann im Betrieb erfolgen. Für den Snapshot wird der Volume Shadow Service verwendet.

Zum Anlegen des Snapshots wird das mitgelieferte Tool ntdsutil verwendet.

Wichtig! Das Tool benötigt Admin Rechte. cmd Box mit Adminrechten starten!

Mit dem Kommando

ntdsutil "ac i ntds" "sn" "cr" "q" "q"

verbindet sich das Tool zum Active Directory und startet das Anlegen des Snapshots.

Die bereits erstellten Snapshots kann man sich mit

ntdsutil "sn" "l a" "q" "q"

anzeigen lassen.

 

Um einen Snapshot zu verwenden muss er gemountet werden. Das Mounten erfolgt mit dem Kommando:

ntdsutil "sn" "l a" "mo 10" "q" "q"

10 gibt die Version an die sich auf die Nummer aus der Liste der Snapshots bezieht.

 

Nach dem Mounten ist der Snapshot unter C:\$SNAP_201107141124_VOLUMEC$\ verfügbar. Der Name ist abhängig vom Snapshot.

Aus dem Snapshot können wir jetzt das gesicherte Active Directory parallel starten. Hierzu muss man in den Ordner C:\$SNAP_201107141124_VOLUMEC$\Windows\NTDS\ wechseln. Der Ordner kann abweichen je nachdem wo man die AD Informationen abgelegt hat.

Mit dem Tool dsamain lässt sich die Kopie parallel starten.

Dem Tool dsamain werden 2 Parameter beim Start mitgegeben. Dem Parameter dbpath geben wir unser Active Directory aus dem Snapshot mit. Mit dem Parameter ldapport geben wir noch einen freien Port mit auf den wir uns dann mit einem LDAP Explorer oder mit der dsa.msc verbinden können. Per Default wird das AD aus dem Snapshot im Read Only Modus gestartet.

dsamain -dbpath ntds.dit -ldapport 6500

Jetzt können wir uns mit der dsa.msc auf das gemountete AD verbinden.

Um unser Snapshot AD sehen zu können müssen wir uns lokal auf Port 6500 verbinden.

Hiezu auf die Domäne einen Rechtsklick und „Change Domain Controller“ auswählen.

In diesem Fenster muss bei <Type a Directory Server name[:port] here> localhost:6500 eingetragen werden.

Das ganze mit Ok bestätigen.

Wir sind jetzt mit dem Snapshot AD verbunden und können alles ansehen. Öffnet man ein Objekt stellt man fest das die Objekte, wie oben bereits erwähnt, Read Only sind.

Natürlich kann man auf dieses gemountete AD auch mit anderen Tools wie ldifde, csvde, usw. arbeiten.

Nach der Arbeit sollte man den Snapshot noch unmounten.

Der Unmount kann mit dem folgenden Befehl durchgeführt werden. Hier ist wieder die richtige Index ID einzugeben.

ntdsutil "sn" "l a" "un 10" "q" "q"

Einrichten einer NPS Policy für HP Procurve Geräte

  • Im Baum auf „Netzwerkrichtlinien“ einen Rechtsklick und „Neu“ auswählen

  • Einen Policy Namen festlegen z.B. „HP Device Access“

  • Folgende Bedinungen werden benötigt
    • Windows-Gruppe: radius_nw_equipment_access
    • NAS-Porttyp: Virtuell (VPN)

  • Zugriff gewähren

  • Haken von MS-CHAPv2 und MS-CHAP entfernen und nur PAP auswählen

  • Hier wird nichts verändert, Weiter…

  • Framed-Protocol und Service-Type entfernen

  • Unter „Standard“ den Typ „Service-Type“ mit dem Attributwert „Administrative“ (Manager) oder „NAS Prompt“ (Operator) hinzufügen

  • Fertigstellen

  • Die Policy mit Rechtsklick „Nach oben“ in die oberste Position befördern

Einrichten einer NPS Policy für Cisco Geräte

  • Im Baum auf „Netzwerkrichtlinien“ einen Rechtsklick und „Neu“ auswählen

  • Einen Policy Namen festlegen z.B. „Cisco Device Access“

  • Folgende Bedinungen werden benötigt
    • Windows-Gruppe: radius_nw_equipment_access
    • Clientanzeigename: CISCO-R?
    • NAS-Porttyp: Virtuell (VPN)

  • Zugriff gewähren

  • Haken von MS-CHAPv2 und MS-CHAP entfernen und nur PAP auswählen

  • Hier wird nichts verändert, Weiter…

  • Framed-Protocol und Service-Type entfernen

  • Unter „Herstellerspezifisch“ den Typ „Cisco-AV-Pair“ mit dem Attributwert „shell:priv-lvl=15“ hinzufügen

  • Fertigstellen

  • Die Policy mit Rechtsklick „Nach oben“ in die oberste Position befördern

Fertig.

Installation des Radiusservers (NPS Rolle)

  • Öffnen Sie den Servermanager
  • Klicken Sie „Rollen hinzufügen“ an

  • Wählen Sie „Netzwerkrichtlinien- und Zugriffsdienste“ aus

  • Wählen Sie „Netzwerkrichtlinienserver“ aus und schließen Sie die Installation ab

Vorbereitungen im AD

  • Einrichten einer Sicherheitsgruppe für die berechtigten User

  • Im User muss der Haken „Kennwort mit umkehrbarer Verschlüsselung speichern“ ausgewählt sein
  • Nach dem setzen des Hakens muss das Passwort zurückgesetzt werden !!!

  • Den User der Sicherheitsgruppe hinzufügen

Einrichten des NPS

NPS

  • Gehen Sie in den Server-Manager und suchen Sie im Baum den Punkt „NPS“

Radius Clients hinzufügen

  • Der Anzeigename kann frei definiert werden
  • Bei IP-Adresse die Adresse des Geräts eingeben (normalerweise die Management IP Adresse des Geräts)
  • Gemeinsamen geheimen Schlüssel eingeben oder generieren (diesen Merken oder Aufschreiben)