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)
- Low
– Potected Mode
- Medium
– LUA
- High
- Elevated
- 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