24 Mayıs 2010

Java Applet Policy

Java eklentisi, tarayıcılarda appletler çalıştırılırken kullanıcının sistem kaynaklarına erişimi güvenli kılmak için Security Manager kullanıyor. Bu özellik ile zarar verici içeriğe sahip ya da güvenilir olmayan kaynaklardaki appletlerin bilgisayarınıza erişimi kontrol altına alınıyor.

Bu konuyu araştırma ihtiyacı ise Yapay Zeka ve Uzman Sistemler dersinde geliştirdiğimiz bir oyun projesi üzerinde çalışırken doğdu. Proje hakkında kısaca bahsetmek gerekirse, projemiz iki kişilik bir strateji oyunu. Her takımın 4 farklı tipte 8'er adet kahramanı bulunuyor ve her karakter için farklı hareket ve savaşma yetenekleri tanımlanıyor. Örneğin; 'Ok' karakterimiz sağ-sol-yukarı-aşağı yönlerde 1 birim ilerleyerek, etrafındaki yine aynı yönlerdeki 4 kare birimlik çember içerisindeki düşman karakterlerin canlarından 4'er puan düşürebiliyor. Hamlelerin minimax algoritmasının gerçekleştirimi ile hesaplandığı projede değerlendirme fonksiyonu olarak takımdaki tüm kahramanların rakip takım kahramanlarına olan uzaklıkları toplamı ile takımların kalan toplam güçlerinin farkı kullanıldı.

Oyunu oynayabilmek için ise bir sunucuya bağlanılıyor ve yapılan hamleler sunucu tarafından kontrol ediliyor. İşte bu noktada sunucuya bağlanma ve appletlerin karşılıklı çalıştırılabilmesi için ya appletlerimizi güvenli olarak imzalamamız gerekiyor ya da policy dosyaları tanımlayarak appletin kaynağını belirtip, o kaynaktan çalışan applete sistemimiz üzerinde yapabileceği işlemler için izinler tanımladığımız bir kayıt oluşturuyoruz. Eğer tanımlamazsak Java konsolu bizi şöyle bir hata ile karşılıyor:


Biz projemizde appletler için policy kayıtları oluşturmayı tercih ettik ve kısaca bunun nasıl yapıldığından bahsedeceğim.

Policy kaydı düz metin dosyalarıdır ve tanımlanan kuralları herhangi bir metin editörüyle açıp görüntüleyebilirsiniz. Basit bir policy kaydının içeriği şöyledir:


grant codeBase "http://www.example.com/projects/applets/applet1/" {
permission java.io.FilePermission "/home/metin/-", "read";
permission java.io.FilePermission "/home/metin/-", "write, delete";
};

grant codeBase "file:/home/metin/NetBeansProjects/-" {
permission java.util.PropertyPermission "user.home", "read";
};

İlk kayıt dosyası http://www.example.com/projects/applets/applet1/ kaynağında yer alan kodlara, sistemizde yolu /home/metin olarak verilen kullanıcı dizinine (ve onun alt dizinlerine) erişim (okuma, yazma ve silme) hakkı veriyor. İkinci kayıt dosyası ise kendi bilgisayarımızda yer alan /home/metin/NetBeansProjects dizini altındaki tüm kodlara kullanıcı dizini için okuma yetkisi veriyor.

Bu kayıt dosyalarını oluşturmak için Java ile beraber gelen, grafik arayüzüne sahip policytool aracını kullanmak hem zaman kazandırıyor hem de söz dizimi hataları ve bunlardan kaynaklanan hatalar ile uğraşmaktan bizi kurtarıyor. Konsoldan policytool komutunu verdiğimizde bizi aşağıdaki ekran karşılıyor:



Add Policy Entry yardımıyla yeni bir policy girdisi oluşturuyoruz. Edit Policy Entry varolan policy girdilerimizi düzenlememizi sağlarken, Remove Policy Entry seçeneği de, adından anlaşılacağı gibi, listelenen policy girdilerinden istediğimizi silmemizi sağlıyor.
Şimdi hızlı bir şekilde bir applet uygulamasına izinler tanımlamak için yeni bir policy girdisi oluşturuyoruz. Add Policy Entry seçeneğine tıklayınca şu ekran ile karşılaşıyoruz:


CodeBase satırı çeşitli izinler tanımlayacağımız kodların kaynak adresini temsil ediyor. Burada tanımlanan yol internet üzerinde yer alan bir kaynak adresi olabileceği gibi sistemizde yer alan bir dizini de gösterebilir.

AddPermission seçeneği ile bu yeni policy kaydımız için yeni izinler tanımlayabiliyoruz. Bu noktada farklı izin tipleri olduğundan ve her izin tipi için de çeşitli seçenekler tanımlandığını belirtmek istiyorum. Bunları kısaca açıklamak gerekirse:
  • Permission : Önceden tanımlanmış izinlerin listesi. FilePermission, SocketPermission, NetPermission vb. Tüm izinleri kapsayan AllPermission da tanımlıdır.
  • Target Name: Seçtiğimizi izinlere yönelik öntanımlı hedefler listelenir. Örneğin; RuntimePermission için exitVM, stopThread, getstackTrace seçenekleri tanımlıdır.
  • Actions: Seçilen izin tipine özel tanımlanmış, yapılabilecek eylemlerin listelendiği seçenektir. Örneğin; dosyalar ile ilgili izin olan FilePermission için, dosyaları okuma, dosyaya yazma, dosyayı çalıştırma, dosya silme eylemleri tanımlanmıştır (read, write, delete, execute).
Şimdi projemize geri dönelim. İstemcilerin sunucu ile iletişim kurabilmeleri için projemizin yer aldığı dizini gösterip, bu dizinde yer alan kodlara SocketPermission izni ve bu izin için accept, connect, listen, resolve eylemlerini gerçekleştirebilme hakkı tanımlıyoruz. Bu izinleri içeren policy kaydımızı da ev dizinimizde .java.policy şeklinde kaydederek uygulamamızı tarayıcı üzerinde istemciler birbiriyle iletişim kuracak şekilde çalıştırabiliriz.

0 yorum:

Yorum Gönder