Exchange 2019 Client Access Rules

Exchange Server 2019 duyurulması ile beraber bizlerde
hızlı bir şekilde yeni özelliklerini sizler ile paylaşmaya başladık. Aslında
geçen hafta yeni özelliklerinin nerede ise tamamına yakınını aşağıdaki makalede
sizler ile paylaştım

http://www.cozumpark.com/blogs/exchangeserver/archive/2018/10/14/exchange-server-2019-yenilikleri.aspx

Ancak burada özellikle bazı teknolojiler için ayrı
makaleler yazacağımı da belirtmiştim. Client Access Rule özelliği de bu
teknolojilerden birisi.

Peki daha önce kullanmadığımız ve Exchange 2019 ile
beraber gelen bu yeni özellik nedir?

Client Access Rule, temel olarak Exchange 2019
organizasyonunuzu yönetmek için kullandığınız Exchange admin center (EAC) ve
remote PowerShell erişimlerini sınırlandırmak için kullanılır. Hub transport
kurallarına benzeyen bu kurallar sayesinde EAC ve remote PowerShell için IP
temelli, kimlik doğrulama türüne ve kullanıcı özelliklerine bağlı olarak
Exchange ‘e kimlerin bağlanacağına siz karar verebilirsiniz.

Peki bu ihtiyaç nereden doğdu? Aslında Exchange 2013
ile beraber web ve powershell temelli yönetim alışkanlıkları arttıkça bu uzak
erişim protokolleri için özellikle şirket dışından veya şirket içerisinden
sıklıkla erişim talepleri arttı. Ancak şirket içerisinden olsun şirket dışında
olsun bu tarz erişimler son derece büyük riskleri beraberinde getirmekteydi.
Exchange sunucusuna RDP yapamayan kötü niyetli bir kişi şirket içerisinden veya
dışından bu tarz uzak yönetim araçları sayesinde tüm mail sistemini ele geçire
bilmekteydi. Tabiki banka, Telekom, gsm gibi büyük kurumlar Exchange Server
önünde konumlandırdıkları WAF veya benzeri güvelik cihazları ile aslında (bazen
de IIS ile) bu tarz istekler için IP bazlı temel bir sınırlandırma getirerek
koruma sağlayabiliyordu.

Ancak müşterilerden gelen yoğun istek üzerine bu tarz
ek bir koruma veya önlem olmadan Exchange server’ ın kendi kendini koruması için
tasarlanmış olan Client Access Rule ortaya çıkmıştır.

Peki örnek kurallara ve nasıl kural yazılacağına
geçmeden önce Client Access Rule için temel bileşenler nelerdir onları
görelim

Conditions- Koşullar

Kuralların en temel bileşeni olup Kimlik doğrulama
tipi, IP adresi, kullanılan protokol, kapsam, kullanıcı ismi, kullanıcı filtresi
gibi hangi koşulda kuralın çalışacağını tanımladığımız bölümdür.

Exceptions – Harici Durumlar

Tanımlanmış bir koşul için harici bırakılacak veya
başka bir deyişle bu kuraldan etkilenmeyecek durumları tanımladığımız
bölümdür.

Action – Aksiyon – Karar

En basit bölüm olup koşullara veya harici durumlara
gelen bir isteği uyup uymamasına göre izin veya yasaklamaların yapılacağına
karar verdiğimiz bölümdür.

Priority – Öncelik

Her kural dizesinde olduğu gibi burada da
önceliklendirme söz konusu olup en düşük numaralı kural en baskın – öncelikli
kuraldır.

Bu kısım önemli çünkü çakışma durumlarında kuralların
nasıl çalışacağını iyi bilmemiz gerekiyor.

Örneğin birden çok kuralda aynı koşul sağlanır ise ilk
kural uygulanır, diğer kurallar görmezden gelinir. Örneğin en yüksek öncelikli
bir PS yasak kuralı olsun ve buna karşın siz bir de daha düşük öncelikli bir
remote powershell izin kuralını belirli bir ip ye veren bir kural yazmış olun,
bu durumda ikinci yazdığınız kuralın hiçbir etkisi olmaz, yani ilgili ip den
gelse bile istek ilk kuraldan dolayı bloklanır. Çözüm ise ilk kurala ek bir
kural yazmaktansa ilk kurala ilgili ip için exception yani bir istisna eklemeniz
doğru çözüm olacaktır.

Ya da başka bir senaryo düşünelim, bir kural içerisinde
birden çok durum söz konusu olsun, yani EAC yasaklanacak ancak finans
departmanındaki bir kullanıcı için. Böyle bir kuralın çalışması için gelen
isteğin kural içerisindeki “tüm” durumları sağlaması şarttır. Bir nevi OR değil
AND olarak çalışır.

Bir kural içerisindeki bir durum için birden çok değer
atanması durumunda OR yani hangisi uyuyor ise kural etkili olur. Örneğin ilgili
kuralda bir ip için EAC veya Remote PowerShell demeniz halinde ikisinden biri
için action davranışı geçerli olacaktır.

Son olarak bir kural içerisinde bir den çok exception
tanımlanmış ise yine firewall mantığındaki OR şeklinde çalışır, yani ip adres
veya protocol olarak basic authentication seçmeniz halinde ikisinden hangisi
eşleşir ise action bu istek için uygulanmaz (exception olduğu için)

Yukarıdaki durumlar biraz gözünüzü korkutmuş olabilir
ama emin olun kural yazmaya başlayınca son derece kolay olduğunu göreceksiniz.
Hele ki Microsoft bize burada test için çok güzel bir komut seti hediye
etmişken;

Test-ClientAccessRule -User< MailboxIdentity>
-AuthenticationType <AuthenticationType> -Protocol <Protocol>
-RemoteAddress <ClientIPAddress> -RemotePort
< TCPPortNumber>

Örnek komut aşağıdaki gibidir;

Test-ClientAccessRule -User hakan@cozumpark.com
-AuthenticationType BasicAuthentication -Protocol ExchangeAdminCenter
-RemoteAddress 192.16.16.16. -RemotePort 443

Aslında son derece basit bir mantık ile çalışıyor, pek
çok firewall, smtp gateway veya benzeri cihazlardaki en temel kural mantığı ile
durumu ve istisnaları seçiyorsunuz, bu durumun gerçekleşmesi durumunda ise ne
yapacağınızı seçiyorsunuz, hepsi bu!

Peki Client Access Rule yönetimini nasıl
yapıyoruz?

Power Shell üzerinden yönetildiği için öncelikle
mutlaka sunucu local erişiminizin olduğuna emin olun, çünkü olası bir hatalı
kural tanımlamasından sonra uzak sunucu erişiminiz kesileceği için bu hatayı
düzeltme şansınız olmayacaktır.

Bu nedenle önerim sunucu üzerinde çalışmanız yönünde
olacaktır. Ancak bu önerim core sürümleri için geçerli değildir, çünkü core
sürümü bir Windows OS üzerine Exchange server kurmuş iseniz ki bunu tavsiye
ediyorum bu senaryo için ise ilk önerim aşağıdaki gibi en temel uzak erişim
kuralını yazmanız olacaktır.

New-ClientAccessRule -Name “Always Allow Remote
PowerShell” -Action Allow -AnyOfProtocols RemotePowerShell -Priority
1

Unutmayın öncelik çok önemli ve bunun çakışma
durumlarını da sizlerle paylaşıyor olacağım.

Peki gelelim kullanım senaryolarına.

Öncelikle mevcut durumda herhangi bir CAR var mı
kontrol edelim;

Get-ClientAccessRule

clip_image001

Herhangi bir CAR olmadığını görüyoruz.

Eğer herhangi bir rule var ise detaylarını görmek için
aşağıdaki gibi bir komut seti çalıştırabiliriz.

Get-ClientAccessRule -Identity “Block PowerShell” |
Format-List

clip_image003

Ya da aşağıdaki gibi sadece ihtiyaç duyduğunuz ayarı
listeleyebilirsiniz

Get-ClientAccessRule -Identity “Block PowerShell” |
Format-List Name,Priority,Enabled,Scope,Action

clip_image005

Peki ilk kuralımızı nasıl oluşturabiliriz;

Not: Exchange Server performans kaygılarından dolayı bu
özelliği pek çok diğer özelliğinde olduğu gibi cache mantığı ile yönetir, bu
nedenle ilk kuralı yazdıktan sonra aktif olarak gerçekleşmesi 24 saat alabilir.
Ek olarak bir kuraldaki değişiklik te en az 1 saat almaktadır. Bu nedenle
kuralları yazdıktan hemen sonra etkisini göremezsiniz.

New-ClientAccessRule -Name “<RuleName>”
[-Priority <PriorityValue>] [-Enabled< $true | $false>] -Action
<AllowAccess | DenyAccess> [<Conditions>]
[<Exceptions>]

Örnek bir yazım şekli aşağıdaki gibidir;

New-ClientAccessRule -Name “Block PowerShell” -Action
DenyAccess -AnyOfProtocols RemotePowerShell
-ExceptAnyOfClientIPAddressesOrRanges 185.25.101.184/25

clip_image007

Yukarıdaki kural 185.25.101.184 nolu ip haricinde gelen
tüm Remote Power Shell isteklerini yasaklamak üzere çalışacaktır.

Başka bir örnek

New-ClientAccessRule -Name “Restrict EAC Access”
-Action DenyAccess -AnyOfProtocols ExchangeAdminCenter
-ExceptAnyOfClientIPAddressesOrRanges 172.16.16.16/24
-ExceptUsernameMatchesAnyOfPatterns *hakan*

Not: Preview sürümünde çalıştırırsanız yukarıdaki
ExceptUsername parametresi tanımsızdır.

Bu sefer Exchange Admin Center yasaklaması yapıyoruz,
ancak yine harici durumlar söz konusu. Harici durumlara baktığımız zaman ip ve
kullanıcı ismi için bir örnek görüyoruz. Ip adresi yine bir önceki örnekte
kullandığım gibi admin olan kullanıcının makinesi veya yönetim makinesi ip
adresi, artı bu ip adresinin yanında ismi içerisinde hakan geçen kullanıcılar da
bu kuraldan etkilenmeyecektir.

Peki istemci erişim kuralları için nasıl tanımlama
yapacağımızı öğrendik. Şimdi sıra mevcut kurallar için nasıl değişiklik
yapacağımızda.

Set-ClientAccessRule -Identity “<RuleName>”
[-Name “<NewName>”] [-Priority< PriorityValue>] [-Enabled <$true
| $false>] -Action< AllowAccess | DenyAccess> [<Conditions>]
[<Exceptions>]

Örnek bir yazım aşağıdaki gibidir;

Set-ClientAccessRule -Identity “Block PowerShell”
-Enabled $false

Örnek ben biraz önce eklediğim kuralı pasif duruma
çekiyorum.

clip_image009

Mevcut bir kuralı aktif iken pasif konumuna
çekiyoruz.

Yukarıdaki gibi bir yazım mevcut değerleri
değiştirmektedir, yani aktif olan kural pasif oldu, ancak bazen kural
içerisinde değişiklik yaparken mevcut bazı değerleri değiştirmeden ekleme
yapmak isteriz, böyle durumlar için aşağıdaki gibi bir yazım dili kullanmamız
gereklidir.

@{Add=”<Value1>”,”<Value2>”…;
Remove=”<Value1>”,”<Value2>”…}

Örnek yazım aşağıdaki gibidir;

Set-ClientAccessRule -Identity “Allow EAC”
-AnyOfClientIPAddressesOrRanges @{Add=”172.17.17.27/16″}

Bu yazıma göre var olan Allow EAC kuralına exception
olarak var olan ip yi silmeden ek olarak 172.17.17.27 nolu ip yi de eklemiş
olduk.

Benzer şekilde kurallar için öncelikte değiştirme
imkanına sahibiz.

Set-ClientAccessRule -Identity “Block PowerShell”
-Priority 2

clip_image011

Block PowerShell kuralı hatırlarsanız benim ilk
oluşturduğum kuraldı, sonra ikinci bir kural oluşturmuştum, şimdi önceliği 1
olan “Block PowerShell” kuralını 2 yaptım, peki 2 olan kurala acaba ne oldu bir
bakalım.

clip_image013

Peki şimdi bir kural daha oluşturalım;

New-ClientAccessRule -Name “Always Allow Remote
PowerShell” -Action Allow -AnyOfProtocols RemotePowerShell

clip_image015

Şimdi 3 tane kuralım var;

clip_image016

En son oluşturduğum kuralın 1 nolu kural olmasını
istiyorum;

Set-ClientAccessRule -Identity “Always Allow Remote
PowerShell” -Priority 1

clip_image018

En sondaki kural yani 3 nolu kural 1 nolu kural olunca,
1 nolu kural 2, 2 nolu kural ise otomatik olarak 3 nolu kural oldu.

Yazdığımız bir kuralı değiştirmek değil de silmek
istersek;

Remove-ClientAccessRule -Identity
“<RuleName>”

Örnek bir yazım;

Remove-ClientAccessRule -Identity “Block
PowerShell”

clip_image020

Veya test etmek istersek ki bunu
paylaşmıştım;

Test-ClientAccessRule -User< MailboxIdentity>
-AuthenticationType <AuthenticationType> -Protocol <Protocol>
-RemoteAddress <ClientIPAddress> -RemotePort
< TCPPortNumber>

Örnek bir yazım aşağıdaki gibidir

Test-ClientAccessRule -User hakan@cozumpark.com
-AuthenticationType BasicAuthentication -Protocol ExchangeAdminCenter
-RemoteAddress 192.16.16.16. -RemotePort 443

clip_image022

Sonuç aşağıdaki gibidir

clip_image023

Gördüğünüz gibi Restrict EAC Access kuralı nedeni ile
“DenyAccess” sonucunun alıyoruz. Bu sorun çözmek için çok güzel bir komut
setidir.

Bu kadar çok komut seti yazdıktan sonra insan ister
istemez parametreleri merak ediyor, yani ben hangi durum tanımlamalarını yaparım
derseniz kullanabileceğiniz parametreler aşağıdaki gibidir;

clip_image025

clip_image027

clip_image029

clip_image031

clip_image033

Evet umarım faydalı bir makale olmuştur. Bir sonraki
makalemde görüşmek üzere.

Kaynak

http://www.cozumpark.com/blogs/exchangeserver/archive/2018/10/21/exchange-2019-client-access-rules.aspx