Exchange 2013 Änderung des fqdn

Änderung des internen Servernamens zu einem öffentlichen fqdn

Problem: SAN/UCC Zertifikate mit irgendwas.local, irgendwas.abc, irgendwas.lan usw.  werden  durch CAs nicht mehr ausgestellt

Also: „Umbenennen“ des Servers exchange.example.local nach exchange.example.com, damit Netzwerkinterne Clients kleine Zertifikatsfehlermeldungen erhalten

Autodiscover URL

  • Verbinde dich mit der Exchange Managemend Shell
Set-ClientAccessServer -Identity Your_Server_Name
 Set-ClientAccessServer -Identity Your_Server_Name -AutodiscoverServiceInternalUri <a class="external free" href="https://exchange.example.com/autodiscover/autodiscover.xml" rel="nofollow">https://exchange.example.com/autodiscover/autodiscover.xml</a>

EWS URL

Anpassung der InternalURL

 Set-WebServicesVirtualDirectory -Identity "Your_Server_Name\EWS (Default Web Site)" -InternalUrl <a class="external free" href="https://exchange.example.com/ews/exchange.asmx" rel="nofollow">https://exchange.example.com/ews/exchange.asmx</a>

OAB URL

Anpassen der InternalURL

 Set-OABVirtualDirectory -Identity "Your_Server_Name\oab (Default Web Site)" -InternalUrl <a class="external free" href="https://exchange.example.com/oab" rel="nofollow">https://exchange.example.com/oab</a>

 UM Web URL

Falls verwendet: Anpassen der UM Web InternalURL

 Set-UMVirtualDirectory -Identity “Your_Server_Name\unifiedmessaging (Default Web Site)-InternalUrl <a class="external free" href="https://exchange.example.com/unifiedmessaging/service.asmx" rel="nofollow">https://exchange.example.com/unifiedmessaging/service.asmx</a>

IIS App Pool Recycle

  • Öffne den IIS Manager
  • Gehe zum Server -> Application Pool / Anwendungspool
  • Suche MSExchangeAutodiscoverAppPool -> rechtsklick Recycle / Wiederverwenden
  • zur Sicherheit IIS Neustarten iisreset

 Quelle

Quelle: GoDaddy (im Google Cache)

   Help/SSL Certificates/Reconfiguring Microsoft Exchange Server to Use a Fully Qualified Domain Name

Inhaltliche Wiedergabe und Zusammenfassung

fqdn setzen bzw. anpassen

Um die .local, .lan, .intern Sünden zu beheben und vor allem spätestens, wenn es notwendig wird, einem internen Dienst ein „ordentlich“, soll heißen öffentlichen CA, signierten Zertifikat auszustatten ist sinnvoll und notwendig den Maschinen einen Fully Qualified Name mit gültiger tld.

Also passen wir hier in unseren vorhandenen Debian Systemen mal fleißig die Namen an:

  1. /etc/init.d/hostname.sh stop
  2. echo fliege.home.example.org > /etc/mailname
  3. echo fliege > /etc/hostname
  4. in der /etc/hosts „192.168.102.12   fliege.home.example.org fliege“
  5. /etc/init.d/hostname.sh start

Danach sollte sich die Maschine wie folgt verhalten:

fliege:~# hostname
fliege
fliege:~# hostname -f
fliege.home.example.org

Wirklich ausschlaggebend ist eigentlich nur die /etc/hosts

127.0.0.1       localhost.localdomain localhost
192.168.102.12   fliege.home.example.org fliege

Die Datei /etc/hostname ist eigentlich nur anzupassen, wenn sich der Hostname selber ändert

Die Datei /etc/mailname ist nur vorhanden, wenn auch ein MTA installiert ist – hier sollte der gleiche fqdn gesetzt sein, wie in der /etc/hosts

LDAP Abfrage für einen vorgelagerten Postfix

Wie so schon in Beiträgen wie diesen beschrieben, kann ein Postfix wunderbar dem Netzwerkinternen Exchange Server vorgeschaltet werden. Bei der LDAP Abfrage gegenüber dem AD möchte mensch natürlich nur gültige eMailadressen annehmen und dem Exchange Server weiter leiten. Dafür reicht der folgende LDAP Query Filter prinzipiell aus:

query_filter = (|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))
result_attribute = mail

Allerdings kann es in einer Domainumgebung vorkommen, daß Menschen eine Organisation verlassen und der Account z.B. zu einem Bestimmten Zeitpunkt auslaufen / gesperrt werden. Diese Information wird im AD bei dem Benutzer in dem Attribut „accountExpires“ gespeichert. Der Defaultwert ist dabei in Dezimal: 9223372036854775807 oder auch 0x7FFFFFFFFFFFFFFF als Hexadezimalwert. Die entsprechende Dokumentation des Attributes kann bei Microsoft im Artikel ms675098 gefunden werden.

Darüber hinaus ist es möglicherweise nicht gewünscht, daß für deaktivierte Accounts / gesperrte Accounts überhaupt eMails angenommen werden. Ob ein Account gesperrt ist oder welchen zustand dieser so gerade hat, wird im AD bei dem Benutzer im Attribut „userAccountControl“ abgespeichert.

Ein aktivierter Account hat den Dezimalwert 512, ein aktivierter Account ohne ablaufenden Kennwort wird Dezimal als 66048 repräsentiert. Beide werte sind also für aktive Accounts

query_filter = (&(|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))(&(accountExpires=9223372036854775807)(|(userAccountControl=512)(userAccountControl=66048))))

Diese Abfrage filtert demnach a) die gültige eMailadresse, b) ob der Account nicht Abgelaufen ist und c) ob der Account aktiviert ist.

Bei der Abfrage ob ein Account aktiviert ist, stellt sich hier das Problem, daß ein Account gerade deaktiviert wurde oder in Zukunft deaktiviert, eMails aber noch angenommen werden sollen (z.B.: um per auto-replay mitzuteilen, daß mensch nicht mehr dabei ist und zukünftig andere Personen zuständig sind)

Mit Hilfe der Powershell lässt sich die aktuelle Zeit einfach in einen entsprechenden Zeitstempel umrechnen und ausgeben

PS> (Get-Date).ToFileTime()

Der Filter lässt sich wie folgt anpassen:

query_filter = (&(|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))(&(accountExpires>=130954282658740101)(|(userAccountControl=512)(userAccountControl=66048))))

somit werden eMails an einen Account, der eine kleinen kleineren Zeitstempel, als der in der Abfrage, hat, nicht mehr zugestellt. Diesen Zeitstempel muß mensch ggf. regelmäßig im Filter der LDAP Abfrage anpassen.

Mit dem bisher gebauten filter sind leider keine Exchange eMail Gruppen berücksichtigt. Um diese zu berücksichtigen erweitern wir den Filter um die Frage nach der „objectClass„.

query_filter = (&(|(mail=%u@%d)(uid=%u)(proxyAddresses=*smtp:%u@%d*))(|(&(accountExpires>=130954282658740101)(|(userAccountControl=512)(userAccountControl=66048))(objectClass=person))(objectClass=group)))

Was genau macht dieser Filter jetzt?

  1. gibt es die eMailadresse: ja
  2. ist das Object eine Gruppe: ja
    => alles schick: gibt die eMailadresse zurück
  1. gibt es die eMailadresse; ja
  2. ist das Object ein Benutzer: ja
  3. ist der Benutzer weder gesperrt noch abgelaufen?: ja
    => alles schick: gibt die eMailadresse zurück