PowerShell Temel Dersler 5 (Execution POLICY)

Merhaba Arkadaşlar, yeni bir makalede yine birlikteyiz. Bundan önceki dört makalemizde anlaşılmayan bir konunun olmadığını düşünüyorum. Hangi işte olursa olsun bir işin temeli iyi değilse temelden sonraki kısımlarda hep sorun olur o yüzden powershell in temel mantığının oturması için elimden gelen gayreti sarf etmeye çalışıyorum. Şimdide powershell in temel derslerdeki en önemli konularından birine geldik. Bu makalemizin konusu Powershell policy ler. Yeni başlayan arkadaşların bu iki kelimenin yanyana kullanılmasından hiçbirşey anlamadığını biliyorum. Birebir Türkçeye çevirsek ancak powershell kuralları diye bir açıklama çıkar ki buda anlamak için yeterli değil.

Bugüne kadar hep komutlarımızı Powershell in mavi ekran zeminli komut arayüzünden kullandık. Bugünde yine aynı şekilde kullanacağız. Genel olarak ifade etmek gerekirse önce komutumuzu sonra ihtiyaç duyuyorsak komutun parametrelerini giriyorduk.

Powershellin iki türlü kullanımı vardır bunlardan biri konsole ekranında powershell e komut vermek ki bunun için ekstra bir işlem yapmaya gerek yoktur. Konsolu açarsınız komutunuzu ve varsa parametrelerinizi yazarsınız ve çalıştırırsınız. Powershell komutu çalıştırıp çıktıları size verir. İkinci kullanımda şöyle; birden fazla komutunuz var ve bunları sırayla çalıştırmak istiyorsunuz. Aslında bunuda yaparsınız komutları sırayla yazıp çalıştırırsnız yada komutlarınızı bir “.txt” dosyasına yazıp ordan kopyala yapıştır ile konsola yazıp çalıştırırsınız sanırım bu biraz daha kolay 🙂 Diyelimki elinizde komut parçacıkları var ve bunu günün belirli saatlerinde çalıştırmak istiyorsunuz o zaman işiniz var demektir. 🙂 Elbetteki bu işler böyle olmuyor.

Şimdi ortaya script kavramı çıkıyor. Hani bazı şeyleri bilirsiniz ama ifade edemezsinizya o yüzden bende script kelimesinin  anlamını öğrenmek için şöyle küçük bir araştırma yaptım. Türkçe manası yazılı yönerge demek olurken ingilizlerde senaryo anlamına gelmekte… Bana senaryo anlamı daha uygun geldi çünkü biz bir senaryo yazacağız ve powershell de o senaryoyu oynayacak bizde izleyeceğiz. Scriptler temel olarak notepad gibi “.txt” yorumlayıcılarına yazılıp bir uygulama ile  burada powershell oluyor çalıştırılması demektir. Yani arka arkaya çalıştırılan komutlar dizisi demektir. Powershell in notepad gibi bir “.txt” yorumlayıcısına yazılmış olan bir scripti anlayabilmesi için dosyanın uzantısının “.txt” değilde “.ps1” olması gerekir. Neden “.ps1” diye sorarsanız da bu microsoftun kararıdır. Her programlama dilinin kendine özgü kural ve dosya uzantıları vardır. Yanılmıyorsam bu java scriptler için “.js” dir.

Şimdi asıl konumuz olan powershell policy lerine dönelim. Powershell güvenlik gereği toplu komut çalıştırmada yani script dosyaları çalıştırma noktasında yaptığımız işin güvenlik riski oluşturabileceğini ve bu işten emin olmamızı bizden istemektedir. Bunun için kendince bir takım kurallar oluşturup bu kurallara uymamız konusunda bizi uyarmaktadır olayın hepsi bu abartmaya gerek yok 🙂 Burda birşey yanlış anlaşılmasın güvenlik gereğinden kastım yanlışlıkla yapılan bir işlemin sisteme zarar vermesinden bahsediliyor. Dışardan gelecek olan bir saldırıya yada bir hackerın sisteme sızdıktan sonra kod çalıştırmasına engel bir durum değil bu policyler  bypass edilebilir.

Resimde görüldüğü üzere basit bir Ms-Dos script dosyası ve içeriği hemen altındada bir powershell script dosyası ve içeriği görülmekte. Ms-Dos Script dosyası çift tıklayıp çalıştırılabilirken powershell script dosyasını sağ tıklayıp “Run with Powershell” diyerek çalıştırabilirsiniz.

Snap_2018.02.22 17.28.54_012

Veya dosyanın bulunduğu path e geçip .\Psscript.ps1 yazıp ilgili scripti çalıştırabilirsiniz.

Snap_2018.02.22 17.41.55_014

Powershell çalıştırdığımız scripte göre policylerini devreye sokar. Örneğin kendi yazdığımız bir scripte farklı, internetten indirdiğimiz bir scripte farklı, daha önceden yazılıp sertifika ile güvenilir hale getirilip çalıştırılmış scriptlere farklı davranır. Sertifikalanmış script nedir konusu kafanızı karıştırmasın. Kısaca değinmek gerekirse script dosyasının en altında yani kodların yada komutların bittiği yerde şifrelenmiş bir metinler topluluğu bulunur. Bu şifreli metinler scriptin sertifikalı olduğunu gösterir.Buna temel derslerin dışındaki makalelerde mutlaka değiniyor olacağız. Şimdilik sorun etmeyin.

Şimdi powershell imizin scriptleri çalıştırılması için gerekli kurallar nelerdir bu kuralları nasıl düzenleriz konusuna geçelim.

İlk olarak mevcut durumda powershell imizin execution policy si yani scriptleri çalıştırma kuralı nedir onu görelim. Bunu öğrenmek için çalıştırmamız gereken komut     Get-ExecutionPolicy, bu komutu çalıştırdığımızda mevcut kuralın “RemoteSigned” olduğunu görüyoruz. Peki nedir bu “RemoteSigned” ?

Snap_2018.02.22 17.49.18_015

Execution Policy, hangi PowerShell scriptlerinin  çalışmasına izin verileceği bilgisini tutar. “RemoteSigned” da bu bilgilerden yalnızca birisidir.

İzni olmayan script aşağıdaki gibi bir hata ile karşılaşır.

Psscript.ps1 : File Psscript.ps1 cannot be loaded because running scripts is disabled on this system.

Execution Policy’de işletim sistemi sürümüne göre dört veya altı seçenek mevcuttur:

Restricted: Hiç bir script çalışmaz. Ne kendi yazdığınız scriptler nede internetten bulup indirdiğiniz scriptler. PowerShell sadece etkileşimli modda çalışır. Yani konsoldan komut girersiniz powershell komutu işler ve sonucunu gösterir.

RemoteSigned: Kendi yazdığınız scriptler çalışır. Güvenilir bir yayımcı tarafından imzalı, internet üzerinden indirilmiş olan scriptler çalışabilir. (İmzalı scriptler konusuna daha sonra değineceğiz.)

AllSigned: Sadece güvenilir bir yayımcı tarafından imzalanmış script’ler çalışabilir. Bu konuyada daha sonra değineceğiz.

Unrestricted: Tüm script’ler çalışabilir. (Eğer güvenilir bir yayımcı tarafından imzalanmamış, internetten indirilmiş bir script çalıştırılmadan önce uyarı gösterilir.)

Bypass: Tüm script’ler çalışabilir. (Güvenilir bir yayımcı tarafından imzalanmamış, internetten indirilmiş bir script olsa dahi çalıştırılmadan önce yetki istenmez, uyarı gösterilmez.)

Undefined: Geçerli kapsamda belirlenmiş olan Execution Policy’nin silinmesini sağlar.

Execution Policy konfigürasyonu varsayılan olarak  Windows Serverlarda RemoteSigned Windows Vista, 7, ve üzeri işletim sistemlerinde  Restricted‘dir.

Mevcut konfigürasyonun durumunu görmek için Get-ExecutionPolicy komutunu kullanıyorduk. Peki ya bunu değiştirmek için ne yapacağız?

Set-ExecutionPolicy komutu tamda bu işe yarıyor.

C:\>Set-ExecutionPolicy -ExecutionPolicy AllSigned Komutu ile policy mizi “AllSigned” ayarlamış oluyoruz. (Veya Set-ExecutionPolicy AllSigned komutu ikiside aynı şeyler)

Tekrar varsayılan hale getirmek içinde

C:\>Set-ExecutionPolicy Default komutunu girebiliriz.

Artık scriptlerin powershellde çalışma kurallarınıda öğrendiğimize göre basit bir script yazarak uygulamalarımızı yapalım. Powershell scriptlerin çalışması ile ilgili neden kural koyma gereği duydu (En temel gerekce güvenlik) Bu kurallar nelerdir nasıl uygulanır konu başlıklarınıda öğrendiğimizi düşünüyorum.

Şimdi bir script hazırlayacağız hazırlayacağımız scripti ister Notepad uygulamasını açıp içerisine komut ve kodlarımızı yazarak, istersek de notepad e gerek duymadan powershell ile bir dosya oluşturup içerisine yine powershell komutları ile komut ve kodlar yazabiliriz. Arkadaşlar dikkat ederseniz ilk defa kod kavramından bahsetmeye başladım. Powershell konsol ekranındayken hep komut ve komutun parametrelerini girdik fakat konu script olunca yeni kavramlar ortaya çıkmaya başlayacak örneğin değişken tanımlama döngü kurma gibi bunlarda genelde kod tabiri ile ifade edilirler. Çokmu detaycıyım bilmiyorum ama amacım detay vermek değil konuya hakim olmanızı sağlamak bazen detaycılık insanı asıl konudan uzaklaştırır bazende konuya tam hakim olmanızı sağlar ben bu dengeyi kurmaya çalışacağım. Geri bildirimleriniz benim için çok önemlidir her türlü yorumunuzu değerlendiririm gerektiğindede tartışabiliriz 🙂

İlk olarak powershell komutları ile bir script dosyası oluşturacağız.

Adım 1: İlk olarak New-Item komutu ile belirlediğimiz bir path altında dosya oluşturuyoruz. New-Item komutu basit anlamda dosya veya klasör oluşturmaya yarar.    -Item parametresini File verirsek dosya Folder verirsek klasör oluşturur.

New-Item -ItemType File -Path C:\Temp -Name ilk_scriptim.ps1

Snap_2018.02.23 11.24.45_018

C:\temp klasörü altında ilk_scriptim.ps1 isimli bir dosya oluşturduk. İçi boşta olsa artık bir script dosyamız oldu.

Adım 2: Script dosyamıza ilk komutu ekliyoruz.

Add-Content -Path C:\Temp\ilk_scriptim.ps1 -Value ‘Get-Date’

Bu komutla scriptimizin içine Get-Date komutunu koymuş olduk.

Ben yerinizde olsaydım boş bir “.txt” dosyası açıp içerisine gerekli kod ve komutları yazıp “.ps1” uzantısı ile kaydederdim. Powershell e aşina olalım diye işleri biraz uzatıyoruz.

Şimdide script dosyamızın içeriğine bir gözatalım bunun içinde iki yol var birincisi dosyayı notepad gibi bir uygulama ile açabiliriz. İkincisi powershell komutu ile içinde ne var ne yok görebiliriz.

Get-Content -Path C:\Temp\ilk_scriptim.ps1 ile

Snap_2018.02.23 16.00.44_019

Makalemizi toparlamak gerekirse şimdiye kadar neler öğrendik;

Powershell in script çalıştırma noktasında güvenlik gereği kurallar uyguladığını buna Execution Policy dediğimizi. Bu kuralın powershell oturumumuz için ne olduğunuz Get-ExecutionPolicy  olduğunu (Powershell oturumu demek açmış olduğunuz herbir powershell ekranı ayrı bir oturumdur. Detaylar ilerleyen konularda…)  Bu policy nin Set-ExecutionPolicy komutu ile nasıl değiştirildiğini ve bu değerlerin neler olduğunu açıklamaları ile öğrendik.

Şimdi oluşturduğumuz scriptimizi çalıştıralım. İlgili path e geçip .\ilk_scriptim.ps1 yazmamız yeterli

Snap_2018.02.23 16.22.31_020

Böylece scriptimizin içerisindeki kodlar sırayla çalıştırıldı.

Son olarakta scriptimizi Execution policy kuralları dışında nasıl çalıştırırız onu görelim.

Bunun için;

powershell.exe -ExecutionPolicy Bypass -Command “c:\temp\ilk_scriptim.ps1” komutu ile mevcutta bulunan policy ne olursa olsun bypass ederek çalıştırabiliyoruz.

Şunu unutmayalım Execution Policy bir güvenlik önlemi değildir sadece kullanıcıların yanlışlıkla sisteme zarar vermelerinin önüne geçmek anlamında bir güvenliktir.

Evet arkadaşlar bir makalemizin daha sonuna geldik. Bu konuda bu kadar. Yorum ve önerilerinizi bekliyorum.

Kürşat ARI / System Engineer & PowerShell Developer

 

 

 

 

 

 

 

 

 

 

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap /  Değiştir )

Connecting to %s