cub-e.net

just coding...

Windows Vista Kullanıcı Hesap Denetimi (UAC-User Account Control)

Windows Vista Kullanıcı Hesap Denetimi (UAC-User Account Control)

Birçok kişi Vista’ya gıcık olsa da ben Vista’yı gerçekten çok sevdim. Microsoft son zamanlarda hissedilir bir şekilde üzerinde durduğu kullanıcı güvenliği konusunun son halini Vista içerisinde bir program çalıştırırken ya da bir kopyalama işlemi yaparken sürekli karşımıza çıkan o meşhur güvenlik ekranından biliyoruz.  Windows her zaman kullanıcı dostu yapısıyla bilinirken birdenbire birçok son kullanıcı için problemli bir işletim sistemi oldu.

Peki neden Microsoft böyle bir şeye ihtiyaç duydu derseniz? Herkes Windows’un çok güvensiz olduğundan sürekli virüs bulaşmasından ya da Internet Explorer ile bilgisayarımızı ele geçiren (virüs,solucan,trojan...) gibi kötü niyetli yazılımlardan bahseder işte Microsoft da bu durumun farkında. Yani siz sistem üzerinde Administrator (tam yetkili kullanıcı) olarak çalıştığınızdan uygulamalarınızın da Administrator olarak çalışmakta ve herşeye erişmede tam yetkili olmaları durumundan kaynaklanmaktaydı. Vista ile işte bu değişti.

Bu durum Windows uygulaması geliştiren programcılar için de sıkıntılı durumlar yarattı. Artık istediğimiz dosya ya da klasöre yazma işlemini gerçekleştiremiyor, registry üzerinde işlem yapamıyor ya da Sistem üzerindeki WMI gibi arabirimlere bağlanamıyor olduk. Nedeni ise çok basit; çünkü geliştirdiğimiz uygulama, kullanıcı sistem Administrator’u olsa bile  Administrator haklarına sahip değil.

UAC Nedir?

Peki Vista bu işi nasıl yönetiyor diyorsanız; cevap, Vista üzerinde geliştirilen Kullanıcı Hakları Denetimi (UAC – User Account Control) isimli mimari. Kullanıcı Hesaplarını Denetimi (UAC); aynı kullanıcı altında çalışan yazılımların farklı haklar ile çalışabilmesini sağlıyor yani kullanıcıların bir program çalıştırmaya kalktıkları zaman bir uyarı diyaloğu göstererek programa doğrudan girişi engelliyor. Mesela bir program yönetici (administrator) hakları gerektiriyorsa o program çalışmadan önce sizden o programa administrator hakkı verip vermeyeceğinizi soruyor. Kullanıcısı hakkın verilmesini  onaylarsa program yönetici olarak çalışıyor. Windows’ un kendi uygulamaları için de bu durum  geçerli, mesela sistem dosyalarını değiştirmek isterseniz Windows Explorer sizden yönetici onayı istiyor.

Kısacası düşük kullanıcı hakları (LUA-Least Priviliged User Account) ile yazılımları çalıştırmak güvenliğin temel noktalarından biri. Microsoft ise bu şekilde bilgisayarın güvenliğinin en üst düzeye çıktığını ve yöneticiler dışındaki kişilerin bilgisayarda değişiklikler yapmalarının engellediğini savunuyor.

Integrity Levels

UAC’ nin en kritik özelliklerinden biri Integrity Levels. Vista’ da uygulamalar dört farklı seviyede çalışıyorlar (düşükten yükseğe)

  1. Low – Potected Mode
  2. Medium – LUA
  3. High - Elevated
  4. System

Her Integrity Level’in objeye göre hakları olabilir (obje çalışan bir uygulama ya da normal bir dosya olabilir).

Normal yazılımlar özel olarak belirtilmedikçe Medium seviyede çalışıyorlar;

  • High, özel olarak UAC penceresi ile yetkilendirilmiş yazılımlar.
  • System, sistem uygulamaları.

Dolayısıyla bu integerity seviyeleri sadece çalışan programlar ile ilgili değil aynı zamanda dosya sistemindeki erişim haklarıyla da ilgili. Eğer okunmaya çalışan obje dosya sistemindeki bir obje ise çalışan uygulama sadece kendi seviyesindeki ve altında objeleri okuyabilir.

(IE genelde sorun çıkarmaya müsait olduğu için en düşük haklar olan Low – Protected Mode ile çalışıyor.)

Sanallaştırma (Virtualization)

Vista’dan önce (hatta Vista’dan sonra bile) birçok uygulama “C:\windows” ya da en azından kendisinin kurulu olduğu örneğin “c:\Program Files\herhangi bir uygulama\ayarlar.ini” dosyasını okumak hatta buraya yazmak isteyebilir ve sistem işleyişi gereği kullanıcının buralara yazma yetkisi olmayabilir.

Bu durumda Vista sanal dosya ve sanal registry kullanarak orjinal dosya ve registry sistemini korumaya alıyor. Dolayısıyla eğer bir program yönetici yetkileri ilebir şeyler yazmaya çalışırsa Vista bunu otomatik olarak aktif kullanıcının profili altındaki klasöre ve registery' ye yönlendiriyor. Bu sayede bir dizi program hata almaktan kurtuluyor.

UAC File Virtualization Filter Driver (%SystemRoot%\System32\Drivers\Luafv.sys) dosya sistemi üzerindeki bu sanallaştırma işlemini yöneten mimari.

Kısacası bir uygulama “C:\Program Files\uygulama klasörü\ayarlar.ini” isimli bir dosyaya erişmek istediğinde “C:\Users\Username\AppData\Local\VirtualStore\Program Files\uygulama klasörü\ayarlar.ini” dosyasına erişiyor olacak. Eğer aynı uygulama registry üzerindeki “HKEY_LOCAL_MACHINE\Software\uygulama adı\”  düğümüne bir değer yazmak istiyorsa otomatik olarak “HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\Software\uygulama adı” ya da “HKEY_USERS\UserSID_Classes\VirtualStore\Machine\Software\uygulama adı” düğümlerinden birine veri yazıyor olacak. Uygulama böylece bir sandbox’un içinde çalışıyor olacak.

Şimdi bu konulara bir uygulama ile sistemin bizi nasıl sandbox’a alıp sanallaştırdığını görelim.

1.       Visual Studio 2008’i açıp VistaVirtualizationTester isimli bir console uygulaması açalım.

2.       Aşağıdaki kodları uygulamamıza ekleyelim; 

using System;
using System.Collections.Generic;
using System.Text;

using System.IO;

namespace VistaVirtualizationTester
{
   
class Program
   
{
       
static void Main(string[] args)
       
{
           
//dönüş noktamız
       
tryagain:
           
try
           
{
               
//yazılacak metin
               
string lines = "birkaç satır birşeyler \r\ndenemeye değer bir uygulama \r\nBarış KANLICA."

                //yazma işlemi
                string localPath = "c:\\windows";
              
//string localPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
               
System.IO.StreamWriter file = new System.IO.StreamWriter( localPath + "\\test.txt");
               file.WriteLine(lines);
                file.Close(); 

                //ekrana gerçekleşen işlemi yaz
               
Console.WriteLine("Yazma işlemi başarıyla sonuçlandı.");
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                //ekrana hatayı yazdır
                Console.WriteLine("Yazma işlemi sırasında hata oluştuı.");
                Console.WriteLine(ex.Message);
                Console.ReadLine();
                //tekrar dene emri
                goto tryagain;
            }
        }
    }
}

3.       Solution üzerinde sağ tuşa basıp Properties ekranını açalım 

4.       Icon and Manifest kısmı altında “Create application witout manifest” ‘i seçiyoruz. 

Böylece manifest dosyası olmayan bir uygulama yaratmış olduk.  (Manifest nedir diyenler için açıklama da yapalım. Manifest içerisinde assembly metadata'larını bulunduran bölümdür. Asembly adı, versiyonu, başka Assembly'lere olan referanslar gibi bilgilerin tamamına metadata denir. Bu bilgilerin oluşturduğu kümeye Manifest denilmektedir.) Bu yaptığımız adımlar ile biz manifest bölümü olmayan bir assembly yaratmış olduk.

Uygulamamız ise “c:\Windows” içerisine birkaç satır dosya yazmayı amaçlamaktadır. Eğer hata oluşursa kullanıcıya bunu göstermekte ve klavye girdisi beklemektedir. Kullanıcı klavyede enter tuşuna basarsa tekrar aynı kodu çalıştırıp yazma işlemini tekrar deneyecektir.

Uygulamayı bu haliyle çalıştırdığınızda (Uygulamayı Visual Studio içerisinden değil build edilen yerden çalıştırılım.) “C:\Users\<kullanıcı adı>\AppData\Local\VirtualStore\Windows” içerisine test.txt isimli bir dosya oluşturduğunu göreceksiniz. Böylece sanallaştırma ile ilgili yukarıda anlattıklarımı örneklemiş oldum.

Peki bir uygulamanın sanal olarak çalıştığını nasıl anlarım diyebiilirsiniz hatta bir adım daha öteye gidip bir uygulamayı nasıl sanallaştırma içerisine sokabilirim diyebilirsiniz. Bu durumda görev yöneticisi (task manager) devreye giriyor. Task Manager açık iken İşlemler (Process) ekranında Görünüm (View)->Sütun Seç (Select Columns)->Sanallaştırma (Virtualization) sütununu açabilirsiniz. Bu sütunda bir uygulamanın hangi modda çalıştığını görebilirsiniz.

Bizim uygulamamızı tekrar çalıştırdığımızda uygulamanın virtualization modunun enabled olduğunu göreceksiniz. Şimdi bir adım daha ileri gidelim ve uygulammızın manifest durumunu tekrar eski haline alalım yani “Embed manifest with default settings” seçeneğini bu sefer seçelim. Ve uygulamamızı çalıştıralım. (Uygulamayı Visual Studio içerisinden değil build edilen yerden çalıştırılım.)  Çalıştırdığımızda uygulamanın yazamadığını ve hata verdiğini göreceksiniz.

Uygulamamızın Virtaualization kısmının Disabled olduğunu görüyoruz. Peki nasıl aktif hale getirebiliriz ? Çok basit task manager içerisinde uygulama üzerinde sağ tuşa bastığımızda Virtualization’ı tıklarsak bir uyrarı gelecek bu uyarıya evet dersek uygulamamız sanallaştırılmış moda dönecek.

Bu işlemden sonra uygulamamızın üzerine gelip enter’a basarsanız yazma işleminin gerçekleştiğini görebilirsiniz. Biraz daha derine inerek Sanallaştırmanın geçerli olduğu ve olmadığı durumlara da bir göz atalım,

Sanallaştırmanın geçerli olduğu durumlar:

  • 32 bit interaktif işlemler
  • Administrator haklarıyla yazılabilir dosya/klasör ve registry keys

Sanallaştırmanın geçerli olmadığı durumlar:

  • 64 bit işlemler
  • İnteraktif olmayan işlemler
  • İmpersonate kaynaklı işlemler
  • Kernel mod çağrıları
  • requestedExecutionLevel yetkisiyle çalıştırma

UAC ile Yetki İstemek

Bütün bu adımlardan sonra size bir de app.manifest dosyamızda yapacağımız küçük ama etkili bir değişiklik ile uygulamamızın kullanıcıdan nasıl yetki isteyeceğini göstereceğim.

Şunu unutmamak gerekir ki eğer bu yetkilendirme gerekli değilse gerçekten kullanmayın eğer bir klasöre ya da registry’e bir şeyler yazmanız gerekiyor ise Vista’nın size yazma okuma yetkisi verdiği yerleri kullanabilirsiniz. Örnek olarak yönetici yetkisi olmadan dosya yazmak veya okumak için en mantıklı yol Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) gibi komutlar kullanarak kullanıcının yazma yetkisinin olacağı bir klasörü kullanmak.

Ama yok uygulamanızın illa ki bu haklara ihtiyacı varsa mesela IIS üzerinde işlem yapan bir uygulama ya da sistem üzerinden WMI sorgusu çekmeniz gerekiyorsa o zaman app.manifest dosyamızı değiştirmemiz gerekli.

Burada Visual Basic kullanıcıları için bir güzellik yapmış Microsoft ve Visual Studio’nun içerisine bir kısayol gömmüş. 

VB Solution’ınızın üzerinde sağ tuşa basar ve Properties’e gelirseniz;

 

 

View UAC Settings isimli bir düğme bulacaksınız bu düğmeye tıkladığınızda ise;

 

 

App.manifest dosyanızın geldiğini göreceksiniz. 

C# kullananlar ise farklı bir yol izlemek zorunda. Yine solution üzerinde sağ tuşa tıklayarak bu sefer “ add->new item” demelisiniz açılan pencereden Application Manifest File dosyanızı seçip projenize ekleyebilirsiniz.

App.manifest dosyamızın içeriği şöyledir; 

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <
requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <!-- UAC Manifest Options
            If you want to change the Windows User Account Control level replace the
            requestedExecutionLevel node with one of the following.

        <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
        <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
        <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

            If you want to utilize File and Registry Virtualization for backward
            compatibility then delete the requestedExecutionLevel node.
       
-->
        <
requestedExecutionLevel level="asInvoker" uiAccess="false" />
      </requestedPrivileges>
    </
security>
  </
trustInfo>
</asmv1:assembly>

“requestedExecutionLevel” seviyesinin standart olarak “asInvoker” olarak ayarlı olduğu görebilirsiniz.

Değer

Açıklama

asInvoker

Uygulama en düşük yetki seviyesinde çalışır.

highestAvailable

Uygulama kendisini çağıran kullanıcıdan daha yüksek yetki ile çalışır ve mevcut kullanıcıdan yetki ister.

requireAdministrator

Uygulama administrator yetkisiyle çalışır ve mevcut kullanıcıdan yetki ister.

Bu durumda bizim asInvoker yazan yere requireAdministrator yazmamız gerekmekte. Bu değişikliği yapıp projeyi Visual Studio içerisinden çalıştırmak istediğimizde Visual Studio da yönetici haklarını bizden isteyecektir. “Restart under different credentials”’ı seçmemiz gerekmekte.

Ve Visual Studio kapanıp yeniden açılacaktır. Açıldığından onun da yönetici moduyla çıldığını görürüz.

Hatta uygulamamızın klasörüne gidip baktığımızda ise uygulamızın simgesinin altına Shield işaretinin geldiğini görebiliriz. 

Uygulamızı her çalıştırmak istediğimizde bizden yetki isteyecek. Eğer kullanıcı onaylarsa uygulamamız yönetici (administrator) haklarıyla çalışacak ve sistem üzerinde tam yetkili olacaktır. Tam bu noktada şu açıklamayı yapmak ta sanıyorum yerinde olacaktır. Eğer Windows’ un nasıl çalıştığı hakkında detaylı bilginiz varsa (en azından Windows’un mesaj tabanlı bir işletim sistemi olduğunu biliyorsanız) Windows’ un iç mesajlarını kullanarak başka yazılımlara istek göndermek ve bu sayede haklarınızı yükseltmek (privilige escelation) şeklinde saldırıya uğradığını da duymuşsunuzdur. (Shatter Saldırıları)

Bu nedenle UAC penceresi ayrı bir masaüstü olan “Session0” da çalışıyor. Bu bağlamda masaüstleri tamamen ayrı durumdalar ve birbirlerine windows mesajları ile mesaj gönderememektedirler. (Hatta arkadaki siyah plan bile aslında gerçek değil, isteğin yapıldığı anda arka planın kaydedilmiş bir resmi.)

UAC’nin devreye giridği işlemlerin tam listesi ise şöyle; 

·         Program Vista’ nın Uyumluluk listesindeyse

·         Program manifest dosyasında bunu belirtirse 

·         API ile bu istek yapılırsa

·         Kullanıcı özel olarak bir programın “Run As Administrator” ile çalıştırırsa (Bu noktada yine küçük bir bilgi vereyim; eğer çok sık kullandığınız bir program var ise üzerinde sağ tuşa basıp Uyumluluk (Compatibility) sekmesi üzerinde “Bu programı yönetici yetkisiyle çalıştır” (run this program as an administrator) checkini işaretlerseniz artık sizden yetki istemeyecek otomatik olarak yönetici haklarıyla çalıştıracaktır)

·         Vista bir programın “installer” programı olduğunu düşünürse.

UAC’yi Devre Dışı Bırakmak ya da Tekrar Aktif Hale Getirmek

UAC devre dışı da bırakılabilen bir yapı ve bir Vista üzerinde 2 şekilde devre dışı bırakabilirsiniz;

1.       Denetim Masasından (Control Panel)

a.       Denetim Masası içerisinde Kullanıcı Hesapları (User Accounts) altından

b.      Kullanıcı Hesapları Denetimi’ni aç ya da kapat (Turn User Account Control on or off) düğmesine tıklayınca karşınıza bir ayar ekranı açılır.

c.       Buradaki tiki kaldırarak kapatabilir ya da açabilirsiniz.

2.       Komut Satırı üzerinden (Command Prompt) 

a.       Aktive etmek

C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 1 /f

b.      Kapatmak

C:\Windows\System32\cmd.exe /k %windir%\System32\reg.exe ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System /v EnableLUA /t REG_DWORD /d 0 /f

 

Windows 7’de Nasıl Olacak

Gelecek senenin sonlarında çıkarılması planlanan yeni işletim sistemi Windows 7’de de bu uygulamayı devam ettirilecek. Tabi arabirimde köklü değişiklikler yapılacak bu sefer devam uyarıların sıklığı kullanıcıların kendisi tarafından ayarlanabilecekmiş hatta açılması istenen programla ilgili açıklayıcı sorular sorulacakmış.

2007'nin ağustos ayından 2008'in ağustos ayına kadar "yönetici olarak çalıştırma" gerektiren programlar tam %75 oranında azalmış. Yani, yazılım firmaları Vista ile beraber “Microsoft Standartlarında” güvenli yazılımlar üretmeye başlamışlar.

Son Sözler

Konuyu toparlayacak olursak. Windows 7’de de bu uygulama süreceğine göre artık yazılımlarımızı buna göre geliştirmeye alışmamız gerekiyor. Microsoft bence bu konuda da çok haklı çünkü herkes sistem üzerinde istediği gibi davranırsa Windows sürekli problem çıkartan bir işletim sistemi olur ve bu zamana kadar da öyle oldu zaten. Eğer gerçekten yönetici haklarına ihtiyacınız yoksa sanallaştırmanın bize sunduğu ile yetinip yolumuza devam edelim ve sistemi stabil kılan uygulamalar yazalım. Bir makale de burada biter hepiniz hoşçakalın.

Diğer Kaynaklar

  • Programların hangi integrity seviyesinde çalıştığını görebilmek için AccessChk
  • Dosya sisteminde bu hakları görmek için icacls
  • Windows Engineering Blog için tıklayınız
  • Technet Magazinden konuyla ilgili bir makale için tıklayınız

Barış KANLICA
Yazılım Uzmanı – Software Specialist

brsk@e-kolay.net
www.cub-e.net
forum.cub-e.net

Loading