Powershell ve Azure Network Kontrolü Part 1

Azure ve Powershell serisine network ayarlarıyla devam ediyorum. Bu yazımda sadece VM’lerin network ve endpoint ayarları üzerine duracağım. İleride ki yazılarımdaysa virtual network yaratılması ve yönetilmesi konularıyla devam edebilirim.  İlk önce en temel ve sanırım en çok duyular ihtiyaçtan başlayalım.

VM’e statik ip nasıl atanır?

İlk önce atamak istediğimiz ip’nin uygun olup olmadığından emin olmamız gerekiyor. Birçok network ve sistem yöneticisi ip listelerini tutmak için çeşitli yöntem ve araçları kullansalar da her zaman ekstradan bir kontrol kullanmanın kimseye bir zararı olmaz.

Test-AzureStaticVNetIP –VNetName Network_Azure_Test –IPAddress 10.0.0.65

Azure’da yaratılan her sanal network’ün kendi ip range’i olduğunu hatırlayalım, bundan dolayıdır ki -VNetName parametresini kullanarak VM’in dâhil olduğu network içerisinde ip’inin uygunluk durumunu kontrol etmemiz gerekiyor. Yukarıda ki komutu çalıştırdığımızda çıktısı aşağıda ki gibi olacaktır.

testnetwork

Gördüğünüz gibi ip uygun (IsAvailable:True), bu durumda bir sunucuya atamamız için bir engel görülmemektedir. Atama işlemi için iki alternatifimiz var, ip’yi ya yeni kurulum esnasında veya mevcut bir sunucuya atayabiliriz. Daha önce ki bir yazımda VM’i powershell yardımıyla nasıl kuracağımızdan bahsetmiştik. İlgili yazıda daha önce bahsetmiş olduğum “New-AzureVMConfig” içerisine bazı ek parametreler ekleyeceğim.

New-AzureVMConfig -Name "vmTest" -InstanceSize "Small" -Image $vmOs | Set-AzureSubnet “Dev” | Set-AzureStaticVNetIP –IPAdress “10.0.0.65”

Yukarıda ki işlemi parça parça açıklamam gerekirse; “Set-AzureSubnet” ile VM’in içerisinde bulunacağı Subnet’i belirtiyoruz, eğer subnet’inizi bilmiyorsanız Azure portalı üzerinden network ayarlarınızı kontrol ederseniz hangi subnet’leri tanımladığınızı görebilirsiniz.
subnet

Bir sonra ki “Set-AzureStaticVNetIP” komutuyla da VM’e istediğimiz statik ip’yi ilk kurulum esnasında tanımlamış oluruz. Eğer mevcut hali hazırda kurulu bir VM’imiz varsa onun ip’sini atamak içinse aşağıda ki komutu kullanmamız gerekiyor.

Get-AzureVM -ServiceName vmTest -Name vmTest | Set-AzureStaticVNetIP -IPAddress 10.0.0.65 | Update-AzureVM

Burada ki Update-AzureVM önemli bir noktadır. VM’de yapısal bir değişikliğe gidildikten sonra mutlaka güncelleme işleminden geçirmeniz gereklidir.Aksi taktirde yaptığınız değişiklikler işlemeyecektir.
Peki, statik ip’yi değiştirmek istiyorsunuz. Maalesef şu anda direk ip değiştiremiyoruz bu yüzden ilk önce eski statik ip’i kaldırmalı ve sonrasında tekrardan eklemelisiniz. Statik ip’yi kaldırmak için,

Get-AzureVM -ServiceName vmTest -Name vmTest | Remove-AzureStaticVnetIP | Update-AzureVM

Bir sonra ki örneğimiz bir VM’in subnetini değiştirmek olacaktır. Bu işlem oldukça basittir. Mesela yukarıda ki örnekte kullandığımız VM’i Dev subnetinden Web’e taşıyalım.

$vmSub = Get-AzureVM –ServiceName vmTest –Name vmTest
Set-AzureSubnet –SubnetNames “Web” –VM $vmSub |Update-AzureVM

Tüm yapmamız gereken şey bu kadar.

Peki, VM’e Endpoint eklemek ve yönetmek istersek bu işlemleri nasıl yapacağız? Öncelikle endpoint’in ne olduğunu tekrar hatırlatmak isterim. Endpoint, Azure’da bulunan bir VM’in dış dünya(internet) ile hangi portlar üzerinden iletişime geçebileceği ve içerideki hangi portlara yönleneceğini belirleyen elementtir. Mesela bir Linux sunucunun SSH portu ön tanımlı olarak 22’dir, bir endpoint tanımlarken public portunu 2222 ve private portunu 22 olarak tanımlarsam. İnternetten sunucuma ssh yapmak için 2222 numaralı portu kullanmam gerekiyor ama VPN ile bağlı bir istemci veya aynı network içerisinde ki bir VM üzerinden direk 22. portu kullanarak giriş yapabilirim.
Endpointler anlaşıldıysa Powershell üzerinden nasıl kontrol edeceğimize geçelim. İlk önce mevcut bir VM’e endpoint ekleyelim.

Get-AzureVM –ServiceName vmTest –Name vmTest |Add-AzureEndpoint –Name “SSH” –Protocol “tcp” –PublicPort 4895 –LocalPort 22 | Update-AzureVM

Kullanmamız yeterlidir. Şimdi gelelim son kısma yani Access control list’lere. Eğer network’e ilginiz varsa ACL kavramı size çok tanıdık gelecektir. Bir network kaynağına(subnet,port,ip gibi) olan erişim yetkilerini belirleyen kurallar dizinine ACL denir. Azure’da ACL’ler endpoint’ler için tanımlanabilir bu sayede sadece belli bir ip’nin veya bloğun erişimine izin verebilir veya kaldırabilirsiniz.ACL’ler VM’lerin üzerinde bulunduğu fiziksel sunucuları tarafından çalıştırılırlar bu sayede bir saldırı durumunda kara listeye aldığınız bir ip sizin kaynaklarınızı tüketmeden sunucu tarafından yasaklanırlar, bu özellik CPU kullanımı açısından çok büyük bir avantaj sağlamaktadır. ACL yapı olarak birkaç bileşenden oluşur. Bunlar “Order”,”Action” ve “Remote Subnet’tir”.“Order”, ACL’ler arasında ki sırayı belirler. Düşük numaralı kuraldan yüksek numaralı olana doğru kurallar işlenirler. Kurallarınız arasında çakışma olmaması için sıralama çok ama çok önemlidir. Örnek verirsem yarattığımız Linux sunucumuz bulunduğunuz ofise hizmet vermeye başladı tüm kullanıcılar web üzerinden sunucuya erişip portalınıza girebiliyorlar ama siz sadece sistem yöneticilerinin ssh portuna erişebilmesini istiyorsunuz, öteki 80. port içinse bir erişim kısıtının olmasını istemiyorsunuz. Bunun için ilk ilgili endpointe gelip “Manage ACL” sekmesine tıklayıp aşağıda ki şekilde bir ayarlama yapabiliriz.
Aşağıda ki örnekte ilk önce tüm ofisin ip bloğunu “Deny” ettim daha sonraysa sadece erişmesini istediğim ip’lerin subnetine “Permit” verdim.Eğer tersi olsaydı ikinci kural yani “Deny” ilk kuralı yani “Permit’i” ezecekti ve kimse ssh üzerinden erişemeyecekti.

subnet

İlk yapmamız gereken “New-AzureAclConfig” komutunu kullanarak bir ACLConfig oluşturmak. Burada ki amaç endpoint’e birden fazla ACL kuralı girmemiz gerekiyorsa burada toplayıp endpoint’e tanımlayabiliriz. Tabii daha önceki adımlarda bir adet endpoint yarattığınızı varsayıyorum.

$sshAcl = New-AzureAclConfig
Set-AzureAclConfig –AddRule –ACL $sshACL –Order 1 –Action Deny  –RemoteSubnet “192.168.1.0/24” –Description “ofis”
Set-AzureAclConfig –AddRule –ACL $sshACL –Order 2 –Action Action –RemoteSubnet “192.168.1.19/2” –Description “IT”

“Set-azureaclconfig” kullanarak ACL’leri yarattık ama daha hangi vm ve endpoint’e işleyeceğimizi belirtmedik bunun için.

Get-AzureVM -ServiceName vmTest -Name vmTest | Add-AzureEndpoint –Name “web” –Protocol tcp –Localport 22 - PublicPort 22 –ACL $ssAcl1|Update-AzureVM

Eğer tek bir ACL kuralı kaldırmak istersek yine “Set-AzureAclConfig” kullanmamız gerekiyor ama bu sefer “RemoveRule” parametresini ve sileceğimiz ACL’in RuleID numarasını da eklememiz gerekiyor. VM üzerinde ki ACL’leri ve RuleID’lerini “Get-AzureACLConfig” ile alabilirsiniz. Aşağıda ki komut VM üzerinde tanımlı endpointin tüm ACL’lini getirir.

Get-AzureVM -ServiceName "vmTest" -Name "vmTest" | Get-AzureAclConfig -EndpointName "ssh"

ruleid

RuleId numarasını bulduğumuza göre artık ACL kuralını silebiliriz.

Get-AzureVM -ServiceName "vmTest" -Name "vmTest" | Get-AzureAclConfig -EndpointName "ssh" | Set-AzureAclConfig –RemoveRule –RuleID 0 –ACL $sshAcl

Son olarak ACL’li tekrar endpoint’e tanımlayıp VM’i update edelim.

Get-AzureVM -ServiceName "vmTest" -Name "vmTest" | Set-AzureAclConfig -EndpointName –ACL $sshAcl –Name "ssh" | update-azurevm

Eğer komple ACL’li kaldırmak istiyorsak yöntemimiz daha basittir.

Get-AzureVM -ServiceName "vmTest" -Name "vmTest" | Remove-AzureAclConfig -EndpointName –Name "ssh" | update-azurevm

Bir notla yazımı kapatmak istiyorum. ACL’lerden bir rule silerseniz bu sadece ilgili endpoint ve VM için geçerli olacaktır.Eğer birden fazla VM’I etkilemesini istiyorsanız ya tek tek bu işlemleri yapacaksınız veya script yazmanız gerekiyor.

Bu blog yazısı Emre Bozlak tarafından paylaşılmıştır. Referans vererek istediğiniz gibi kullanabilirsiniz. Eğer bir sorunuz olursa eposta veya sosyal medya hesaplarım üzerinden bana ulaşabilirsiniz. Yazılarımı Twitter'dan @emrebozlak veya RSS üzerinden takip edebilirsiniz.

One Trackback

  1. […] VM’lerinin Network yönetimine biraz daha detaylı olarak bakacağız. Bu yazımı okumdan önce ilk kısmı okumanızı tavsiye […]

Leave a comment