Windows Vista’da Kullanıcı Hesap Denetimi (User Account Control – UAC)

Kullanıcı Hesap Denetimi (UAC) neyi amaçlar?

UAC olmadan, yönetici kimliğiyle oturum açtığınızda, başlattığınız bütün programlar yönetici haklarına sahip olacaktır. Örneğin, tarayıcınızın bütün program dosyalarınızı alt üst etme, kayıtlarınızı yeniden yazma ve genel olarak kargaşaya neden olma yetkisi olabilirdi. Ama söz konusu olan sadece bir tarayıcı, öyleyse neden ona böylesine bir yetki vermek isteyesiniz ki? Organize suç işlemeye odaklanmış hackerların tarayıcıların zayıf noktalarını keşfetme uğraşı içinde olduğu bu günlerde, tarayıcı gibi bir programın yönetici haklarına gerek duymaması şeklinde default olarak ayarlanması çılgınlık olurdu – bu tartışma götürmez bir gerçek. Basit bir şekilde ve de çok önemsemeden UAC kullanımını reddeden kişilerin bunu yapmadan dikkatli bir şekilde yeniden düşünmelerini tavsiye etmekteyiz.

Eğer UAC aktif ise programların büyük çoğunluğu yönetici haklarından yoksun olarak başlatılır. Herhangi bir programın yönetici haklarını talep etmesi veya ihtiyaç duyması durumunda bu hakları, yani dolayısıyla “meşhur” UAC komut istemini, talep etmesi gerekir.

User Account Control mevcut haliyle nasıl çalışır?

Aşağıda, “programlar” ve “işlemler” ele alınacaktır. Bir program Notepad.exe gibi uygulanabilir bir dosya iken bir işlem ise çalışmakta olan bir programın tek bir anını ifade eder. Örneğin iki metin dosyasını Notepad ile birlikte açtığınızda, birbirinden bağımsız olarak iki işlem meydana gelecektir.

– Her işlemin kendi için ayrılmış belleği ve yine kendine özel erişim hakkı vardır.
– Hiç bir işlem başka bir işleme doğrudan erişim olanağına sahip değildir.
Bir programla bir işlem arasındaki fark çoğu zaman önemsizdir, bu yüzden bu gibi durumlarda, daha yaygın bir kullanıma sahip olduğu için “program” terimi kullanılacaktır.

Her işlem, başlatıldığı anda belirli haklar ve imtiyazlar içerir – ki bunların sistem üzerinde kritik değişiklilikler yapılmasına izin verilmeden önce check edilir. Örneğin, sistem zamanını ayarlayabilmek için bir işlemin SE_SYSTEMTIME imtiyazına sahip olması gerekir. Eğer gerekli imtiyaza sahip olunmazsa, bunun için talepte bulunulabilir. Bu örnekte, işlemin yönetici hakları ile başlatılması söz konusu ise talep zamanın değiştirilmesine olanak tanıyarak onaylanacaktır. Burada gözden kaçırılmaması gereken nokta hakların ve imtiyazların aynı şey olmadığıdır.

  • Haklar, bir işlem başladığı anda sabittir ve değiştirilemez.
  • İmtiyazlar ise haklar tarafından sınırlandırılmakla birlikte ayarlanabilir bir niteliğe sahiptir.
  • Herhangi bir imtiyaz talebinde bulunulduğunda, ne kullanıcıyı bilgilendiren ne de yetkilendirme talep eden bir iletişim kutusu ile karşılaşılmaz.

Hakikaten, şu haliyle bakıldığında birbirinden bağımsız haklara ve imtiyazlara sahip olunması saçma bir şeyden öteye gitmez – öyle ki bu durumun tek sonucu programcılar için işleri daha da zorlaştırmaktır; üstelik güvenlik konusunda da hiçbir katkısı olmadan… Biz yine de User Account Control kullanımına bir giriş yapalım ve ne gibi farklılıklar yarattığını görelim.

Dünyanın değişik yerlerinde saati gösteren GlobalClocks isimli bir program yazmak istediğimizi varsayalım. Bütünlük açısından kullanıcının sistem saatini direkt olarak değiştirmesine izin vermek isteyelim. Dolayısıyla, tıklandığında bir iletişim kutusu açan ve bu iletişim kutusuna kullanıcının yeni saati girebileceği bir buton yaratmış oluruz. Daha sonra program SE_SYSTEMTIME imtiyazını talep eder ve reddedilir! UAC etkinleştirildiğinde, kullanıcı bir yönetici kimliği ile oturum açmış olsa dahi, program standart bir kullanıcının sahip olduğu halklarla birlikte başlatılmış olacaktır, bu nedenle saati değiştirmek mümkün olmayacaktır.

  • Eğer bir program yönetici haklarına ihtiyaç duyuyorsa, bu haklar program başlatıldığında talep edilmelidir; aksi durumda geç kalınmış olacaktır.
    Basit programlar, kendi kendilerini yeniden başlatarak ve yönetici haklarını talep ederek (ve bir UAC komut isteminin görüntülenmesine neden olarak) bu sınırlandırmanın dışında çalışma özelliğine sahip olabilir.
  • Eğer kullanıcı haklarına sahip olarak çalışan bir program başka bir program açarsa yeni işlem ihtiyaç duysun veya duymasın yönetici haklarına sahip olarak çalıştırılacaktır. Ayrıca herhangi bir UAC komut istemi de söz konusu olmayacaktır.
  • Yeni bir program başlatıldığında, hata ileti diyaloglarının gerçek sahibi imiş gibi davranmak için bir pencere işleci belirlemek gayet doğaldır. Bu işleç, ayrıca UAC de dahil olmak üzere çeşitli yamalarda da kullanılmaktadır. Eğer bu işleç odaklanılan bir pencerenin kimliğini saptarsa, bir önplan UAC komut istemi yayınlanır, aksi durumda ise bir arkaplan UAC komut istemi yayınlanır (yanıp sönen bir görev çubuğu butonu). Eğer bir boş pencere işleci kullanılırsa dokümantasyon, bir arkaplan UAC komut isteminin yayınlanmasını önermektedir, ne var ki gerçekte genellikle bir önplan UAC komut istemi sonucu ile karşılaşılır (muhtemelen Vista piyasaya sürülmeden önce bir son dakika değişikliği).

Şu da var ki, programlar artık kendi program dizinlerinde veri depolayamaz, çünkü bütün “Program Files” dizini korumalıdır ve yazma erişimi için yönetici haklarını şart koşmaktadır. Ancak Vistaya uyumlu olmayan programlar (yani program manifestosunda gerekli hakları belirtmeyen programlar) file-virtualization (dosya sanallaştırma) olarak bilinen bir uygulamaya haizdir. Dosyaları  program-files dizinine kaydetmek için gösterilen çabalar, dosyaların kullanıcıya göre değişen başka bir yerde “şeffaf” bir şekilde kaydedilmesi sonucunu doğuracaktır. Bu şu anlama gelir: farklı kullanıcılar artık bu tip dosyaları paylaşamaz ancak hiçbir uyarı da verilmeyecektir! Benzer bir yaklaşım kayıt konusu ile birlikte de kullanılmaktadır.

Ayrıca, standart haklarla çalışan bir program yönetici hakları ile çalışan bir programı açmak isterse, bu programın “RunAs” eylemini kullanması gerekir (tabi ki eğer programın her zaman için yönetici haklarını gerektireceği önceden belirlenmemişse). Maalesef, “RunAs” eylemi zaten XP’de kullanılmakta!

User Account Control nasıl uygulanmalı?

Şu anda UAC sisteminin nasıl çalıştığı ile ilgili olarak az yada çok bir bilgi sahibi olmuş durumdayız. Bu durum şu soruyu gündeme getiriyor: “Daha iyisini yapmak mümkün mü?” Aşağıda sunulacak olan tartışmada alternatif bir yaklaşım ana hatlarıyla çizilmeye çalışılmıştır. Tam olarak hangi yöntemin en iyi olduğuna ilişkin fikirler değişebilir, ancak mevcut sistemin ciddi biçimde geliştirilebilir olduğu konusunda herkesin net olması gerekir.

  1. İşlemler, başlatıldıktan sonra yönetici haklarını talep edebilmelidir. İşin doğrusu, işlemler bundan sonra yeniden standart kullanıcı haklarına dönebilmelidir. Daha da ötesi, hangi işlemlerin halihazırda yönetici haklarına sahip olduğunu göstermek için görev çubuğu veya başlık çubukları üzerinde bir simge paylaşımı (veya başka bir gösterge) kullanılabilir.
    Bir işleme ait erişim haklarının sadece depolanmış veriler olduğunu varsayalım, bu durumda bu verileri işleyebilen ve bu sayede mevcut işlem haklarını değiştirebilen bir UAC yöneticisi yaratarak bu işlemi yapmak mümkün olmalıdır. Bu, ciddi bir çaba gerektirebilir ama programcılar için hayatı önemli ölçüde kolaylaştıracak ve 2 ve 3 numaralı öğelere olan ihtiyacı etkin bir şekilde ortadan kaldıracaktır. Bunun yaratacağı ekstra faydalar aşağıda sıralanmıştır.
  2. Yönetici haklarına sahip olarak çalışan programların standart haklara sahip programları (“RunAsUser” eylemini kullanarak) başlatabilmesi gerekir. Bunu yapabilmek için hiçbir engelle karşılaşılmaması şarttır; çünkü (her ne kadar farklı bir kullanıcı ismi kullanarak da olsa) bunu XP’de yapabilmek için “RunAs” eyleminin kullanılması gerekir.
    Şu haliyle bu iş tam bir baş ağrısına dönüşmektedir. Örneğin, eğer bir yükleyici, yüklemeyi bitirdiğinde herhangi bir programı standart haklar ile birlikte başlatmak isterse, söz konusu programın kendi kendine standart haklarla birlikte başlaması, yüklemeyi sonuçlandırabilmek için yönetici haklarına sahip başka bir program daha çalıştırması, gizli bir şekilde yüklemenin bitmesini beklemesi, benzer bir mekanizma kullanarak neyi çalıştırması gerektiğine ilişkin komutları toplaması ve nihayet çalıştırması gerekecektir; ki bu tümüyle saçma sapan bir uğraştır. (Aslına bakılacak olursa, bu işi yapmak için en az iki farklı yol daha vardır; ama muhtemelen burada bahsedilen yöntem en basit olanıdır.)
  3. Yeni bir eylem olan “RunAsAdmin”’in de tanıtılması gerekir. Ayrıca “Edit” gibi standart eylemler kullanılırken aynı fonksiyonları yerine getirmek için ilave SEE_ işaretleri ile birlikte API fonksiyonu olan ShellExecuteEx fonksiyonunun sağlanması gerekir.
  4. Eğer çağrı dizisi mevcut önplan penceresine sahipse, bir önplan UAC komut isteminin yayınlanması gerekir. Bu küçük bir teknik ayrıntı olarak görülebilir ama UAC komut dizilerinin önplanda veya arkaplanda doğru bir şekilde yerleştirilmesini sağlamak ancak bu şekilde mümkün olacaktır.
  5. İdeal olarak programlar kendilerine ait “program files” alt dizinlerine yazmak için erişim hakkına sahip olmaları gerekir (öte taraftan çalıştırılabilir dosyaları değiştirememeleri gerekir). Ne var ki, bu Vista’da etkin çalışmayan bir işlem olduğu için sağlayacağı faydalar da tartışmalı durumdadır.

UAC’nin esas amacı bilgisayarı virüslere ve kötü niyetli yazılımlara karşı korumaktır; bunu bir kez daha göz önünde bulundurmamız gerekiyor. UAC, bazı programların standart haklarla ve diğer bazılarının da yönetici hakları ile birlikte çalıştırılabilmesi için konfigüre edilebilir. İnternete bağlanan programların sadece standart haklarla birlikte çalıştırılması mantıklı görünmektedir. Ayrıca herhangi bir kullanıcının yeni bir program için yönetici hakları talep etmesi durumunda kullanıcıdan bilgi istenmesi gerekliliği de akla yatkın görünmektedir.

Böylece, tüm bunlar akılda tutularak, yönetici haklarına izin vermek veya reddetmek için (veya kullanıcılardan bilgi istemek için) gerekli yönergelerin yanı sıra programların düzenlenebilir bir whitelist’ine (kabul edilen öğeler listesi) ihtiyaç duyulduğu görülecektir. Buna ilave olarak, yönetici haklarına sahip olarak çalışan bir program internete bağlanmaya çalıştığında veya internete bağlanan (veya bağlanmış olan) bir program yönetici hakları talep ettiğinde bir uyarı verilmesi gerekir. Mevcut durumda UAC komut istemlerinin pek çoğu güvenlik konusunda hiçbir katkıda bulunmadan kullanıcıları kızdırmaktan başka işe yaramaz.

Diğer yandan, (yükleyicileri ortaya çıkarmak için mevcut Vista stratejileri ile birlikte) eğer bir whitelist kullanılıyorsa, Windows XP’de kullanılmak üzere bu teknolojiyi engellemenin önünde hiçbir ciddi engelin olmaması gerekir. Eğer programlar çalıştıkları sırada yönetici hakları talep edebiliyorlarsa bunun özellikle doğru olacaktır. Böylesi bir durumda, sınırlandırılmış bir eylemi yapmak için gösterilen herhangi bir çaba, talebe izin verme, reddetme veya programı sonlandırma seçenekleri ile birlikte bir UAC komut istemi ile sonuçlanabilir. Sınırlandırılmış eylemleri yapmadan önce yapılan bütün güvenlik denetimleri, büyük ihtimalle erişime izin verilip verilmediğini belirlemek için tek bir fonksiyon üzerinden geçiş yapmış olacaktır; dolayısıyla sadece bu özel fonksiyon, istendiğinde UAC komut istemlerini görüntülemek üzere upgrade edilme gereksinimi duymalıdır. Bu, gerçekten de çözülmesi güç bir sorundur. Bu şekilde User Account Control eski yazılımlara, kırılmaya gerek duymadan, uygulanabilir. UAC ayrıca whitelist’de depolanana bilgiler genişletilerek kişisel imtiyazlara ve hatta kişisel dizinlere ve kayıt defteri anahtarlarına da uygulanabilir. Bu yolla programların sadece gerçekten ihtiyaç duydukları haklarla çalıştırılması sağlanabilir. Örneğin, kayıt defterine tam erişim hakkı verilmeksizin, bir programın saati değiştirme hakkının verilebilmelidir.

Data Execution Protection (Veri Yürütümünün Korunması)

User Account Control’un burada belirtilen ölçülere göre uygulandığı varsayılırsa, bu uygulamaya Data Execution Protection (DEP)’ı da dahil etmek mantıklı olacaktır. DEP, farkında olmaksızın program kodu olarak çalışan verileri engelleyen modern CPUs tarafından desteklenen bir donanım teknolojisidir – bu, hackerlar tarafından yapılan ve “buffer-overrun” (ara bellek aşımı) denilen saldırıların özünü teşkil eder. DEP, mevcut haliyle bütün programlar için default olarak kapatılır (Çünkü açık olması halinde bazı programların çökmesine neden olabilir ve bunu oldukça kurnaz bir şekilde yapar). Bunu yapmaktansa, DEP’in internete bağlanan bütün programlar için default olarak etkinleştirilmesi gerekir. Kendisi için DEP’in kapatıldığı bir programın internete bağlanmaya çalışması durumunda, bağlantıyı reddetme veya programın bağlanmak için DEP gerektirdiğini işaretleme seçeneklerine sahip bir uyarının görüntülenmesi gerekir. Bu durumda kullanıcı programı kapatıp yeniden başlatabilir. DEP’i tanıyan programları tanımlayan yeni bir bildirim açıklamasının tanıtılması gerekir (ancak sadece internete bağlanan programlar bunu kullanma gereksinimi duyacaktır).

User Account Control’un Ötesi

İnternet erişim olan programlar “standart kullanıcı” haklarından ziyade “misafir kullanıcı” hakları ile sınırlandırılabilir. Bu sınırlandırmanın, herhangi bir saldırıyı başarıyla uygulasa dahi bir hackerin kullanıcı başlangıç ayarlarını düzenleyen bir kodu (veya program kodunu) tanıtma olasılığını ortadan kaldırması gerekir ki bu da bir programın resetlenmesi dışında ayakta kalamaz. Ek olarak, tarayıcılar güvenli sayfaların her zaman için yeni bir işlem dahilinde (yeni sekmede değil yeni pencerede açılmasını gerektirecek şekilde) açılmasını sağlayacak şekilde ayarlanabilir. Bu şu anlama gelir; eğer bir hacker bir tarayıcı içerisine geçici olarak bir keylogger tanıtmayı başarabilirse, güvenli bir sayfaya girilen verilere erişme imkanı olmayacaktır.

Casus Yazılımlarla Mücadele

Suçluların güvenliği kırmak için başvurdukları diğer bir yol yazılıma keylogger, vb. ekleyerek daha sonra bunların download edilmesini ve kurulmasını sağlamaktır.

Casus yazılımın (spyware) çalışabilmesi için her şeyden önce klavyeyi, mouse’u ve/veya internet faaliyetini izleyebilmesi gerekir. Merkezi işletim sisteminin unsurları hariç olmak üzere, oldukça az sayıda yasal program tuş vuruşu gibi olayların izlenmesi için global bir hook’un yüklenmesini gerektirecektir. Bu nedenle herhangi bir program böyle bir şey yaptığında, bilgisayar standby ve benzeri bir konuma geçer geçmez ayrı bir popup uyarısının görüntülenmesi gerekir.

İnternet faaliyetlerinin izlenmesi sırasında da benzer bir yaklaşıma gerek duyulacaktır; ama yine de kullanıcıların Microsoft onaylı şirketler tarafından yayınlanan ZoneAlarm gibi güvenlik duvarlarını whitelist edebilmeleri gerekir. Bu gibi değişiklikler mevcut güvenlik ortamında herhangi bir zafiyete yol açmayacağı gibi herhangi bir casus yazılımın mevcudiyeti halinde de onları büyük ölçüde etkisizleştirerek kullanıcıları uyaracaktır. Bu, yasal izleme yazılımı yükleyen şirketlerin çalışanları içinde de etkili bir uyarı sisteminin ortaya çıkmasını sağlayacaktır.

Tüm bunlara ek olarak, giden e-mail trafiği her saptandığında eğer ayrı bir uyarı mesajı görüntüleniyorsa, kullanıcılar da (spam gönderiminde kullanılan) botnet yazılımın mevcudiyeti konusunda uyarılabilir. Bazı e-mail istemcileri zaten yasal giden e-mailler için benzer bir özellik kullanmaktadır; bu nedenle bu uygulama kullanıcıların başını ağrıtmayacaktır

Sonuç – Bu değişiklikler kullanıcılar için nasıl daha iyi hale getirilebilir?

User Account Control’un temel konsepti oldukça faydalıdır. Bütün programlar yönetici haklarına ihtiyaç duymaz (ve internete bağlanan programlar için bu tür hakların reddedilmesi gerekir). Ancak, Microsoft’un bunu uygulamak konusunda yapabileceği en kötü işi yaptığı açıktır.

Şu haliyle UAC komut istemleri, neredeyse tümüyle görünmez hale gelerek (görev çubuğu butonu üzerinde yanıp sönerek) veya doğrudan karşınıza çıkarak gereksiz derecede can sıkıcı hale gelmiştir. Ama daha da kötüsü, bu komut istemleri çoğu zaman uygun olmaktan da uzaktır. Örnek vermek gerekirse, bir programı yüklemeden önce, söz konusu program mevcut Windows konfigürasyonunu değiştirebileceği için, bir UAC komut istemi mantıklıdır; ama kayıt düzenleyicisini açmadan önce ortaya çıkan bir komut istemi gerçekten de mantıklı değildir (sadece kritik değişiklikler yapılmadan önce gerekli olabilir). Ayrıca, standart haklarla çalışan bir programı yönetici haklarıyla çalışan bir programla uzaktan kumanda etmenin bir yolu olmadığını varsayarsak, Windows Explorer yönetici hakları ile birlikte güvenli bir şekilde çalışabilir; ki bu şu anlama gelir: UAC komut istemleri korumalı dosyaları silmek veya yeniden isimlendirmek için her zaman için gerekli olmak durumunda değildir. Doğal olarak bu yukarıda ele alınan whitelist tarafından kontrol edilebilir. Yani şu haliyle Windows Explorer’ı yönetici haklarıyla birlikte açabilmenize rağmen, bu eylem UAC’nin sağladığı bütün yararları olumsuzlayacaktır çünkü Explorer’dan açılan bütün programlar aynı zamanda otomatik olarak yönetici haklarına da sahip olacaktır – gerçekten de bütünüyle aptalca bir durum.

Windows 7 için neredeyse bütün mevcut UAC kodlarının ıskartaya çıkarılması ve yukarıda kabaca belirtildiği şekilde yeniden düzenlenmesi gerekmektedir. Mevcut UAC özelliklerinin yeni bir sistemde düzenlenmesi ve uygulanması önemli bir anlaşılırlığa vesile olacaktır ve bu sayede mevcut Vista uygulamaları ile ilgili olarak ihtilaflı hiçbir konu ortaya çıkmayacaktır. Daha toptan bir değerlendirme yapmak gerekirse, bu uygulama programcıların işlerini kolaylaştıracak ve bu sayede onların faydalı özellikler yaratmak gibi işlere daha fazla zaman ayırmaları sağlanacaktır. Dahası, bu sayede Vista daha esnek, daha güvenli hale getirilebilir ve ortaya çıkacak sonuç sadece kullanıcılar için bir ilerleme olarak daha az komut istemi olacaktır.

Ayrıca, User Account Control uygun bir açıklamaya (ve “Program Access Control” gibi yeni bir isime) da ihtiyaç duyar. Sorunsuz bir şekilde çalışabilmesi için insanların bunun ne olduğunu, ne yaptığını ve neden ihtiyaç duyulduğunu anlamış olması gerekir; aksi takdirde pek çok insan basit bir şekilde “Allow” butonuna tıklayacaktır ve neredeyse tümüyle değersizleştirecektir. Bu maksatla, bir DVD’nin bile bilgisayar güvenliğine ilişkin temel bilgileri içeren kısa bir öğretici çizelge ile birlikte üretilmesi gerekir. Böylesi bir çizelge yetişkinler için evde bir çırpıda anlamak için yeterli olması gerekir ve bu materyal ayrıca okul çağındaki çocukların eğitimi için de üç veya beş derslik programlarda kullanılabilir ve bu eğitimler soru ve tartışmalarla pekiştirilebilir.

Ayrıca, eğer Microsoft interneti güvenli hale getirmek konusunda gerçekten ciddi ise, Windows’un daha önceki versiyonların yeterince iyi olmadığını kabul etmeleri gerekir. Yapmaları gereken bu teknolojiyi Vista SP2/3 ve XP ServicePack 4’e dahil etmek ve (Win2000 için yeterli) eski donanım üzerinde kullanılmak üzere Windows’un daha düşük maliyetli, hafif siklet ve güvenli bir versiyonunu piyasaya sürmektir. Microsoft, her çocuğa bir laptop projesi ile ilgili olarak XP’nin indirgenmiş bir versiyonu üzerinde çalışmakta olduğu için, bunun herhangi bir problem teşkil etmemesi gerekir. Ayrıca eski bilgisayarların kullanım ömrünü uzatmak suretiyle çevre için de iyi bir şey yapılabilir; bu ayrıca yoksul ülkeler için de iyi olacaktır. Bu yolla faydalı bir ek gelir akımı bile yaratmak mümkündür!