Spring için Acegi Güvenlik Sistemi. Hazırlayan : Akif Burak Tosun Hacettepe Universitesi - 20221925 İletişim: thunder_burak@hotmail.



Benzer belgeler
Spring Security Framework Harezmi Bilişim Çözümleri

Üst Düzey Programlama

Java EE web uygulamaları geliştirmek için kullanılan açık kaynak web uygulama framework üdür.

Intercepting Filter Tasarım Şablonu KurumsalJava.com

ÖZGÜR YAZILIMLAR İLE J2EE

ĐSTEMCĐ SUNUCU SĐSTEMLER DERSĐ FĐNAL ÇALIŞMASI SORULAR YANITLAR

Spring Ekosisteminde Kurumsal Yazılım Geliştirme. Kenan Sevindik Harezmi Bilişim Çözümleri A.Ş.

Swing ve JDBC ile Database Erişimi

Spring Framework Eğitimi

Mobil Cihazlardan Web Servis Sunumu

Kaynak Kod Güvenliği Bir Güvensiz API Örneği

T.C.SOSYAL GÜVENLİK KURUMU. Genel Sağlık Sigortası Medula Optik E-rapor Web Servisleri Kullanım Kılavuzu

T.C.SOSYAL GÜVENLİK KURUMU. Genel Sağlık Sigortası Medula Optik E-rapor Web Servisleri Kullanım Kılavuzu

Film Arşiv Sistemi. Yazılım Tasarım Belgesi

T.C.SOSYAL GÜVENLİK KURUMU. Genel Sağlık Sigortası Medula Optik E-rapor Web Servisleri Kullanım Kılavuzu

Üst Düzey Programlama

Medula Eczane Stok Bilgileri Web Servisleri Kullanım Kılavuzu

İnternet Programcılığı

Üst Düzey Programlama

EKLER EK 12UY0106-5/A4-1:

ORM & Hibernate. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4 ahmetdemirelli@sabanciuniv.edu

Hızlı Başlangıç Kılavuzu

HP PROCURVE SWITCHLERDE 802.1X KİMLİK DOĞRULAMA KONFİGÜRASYONU. Levent Gönenç GÜLSOY

MVC Kul anıcı Doğrulama ve Yetkilendirme MVC Filtreler Action Filter FilterAttribute IActionFilter FilterAttribute IActionFilter

T.C.SOSYAL GÜVENLİK KURUMU. Genel Sağlık Sigortası Medula Optik E-reçete Web Servisleri Kullanım Kılavuzu

TÜİK e-vt. Web Servis Kılavuzu

Atılım Üniversitesi Bilgi & Đletişim Teknolojileri Müdürlüğü Sistem Yönetim Uzman Yardımcısı Görev Tanımı

Bilgi Servisleri (IS)

Web Uygulama Güvenliği Kontrol Listesi 2010

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

Ağ Yönetiminin Fonksiyonel Mimarisi

State Yönetimi. Bir web sayfası ile sunucu arasındaki etkileşim ;

Üst Düzey Programlama

JBoss Seam Next Generation Integration Framework

8. HAFTA KBT204 İNTERNET PROGRAMCILIĞI II. Öğr.Gör. Hakan YILMAZ.

ProFTPD FTP Sunucusu. Devrim GÜNDÜZ. TR.NET Sistem Destek Uzmanı.

Veritabanı İşlemleri

MOBILEPAX ENTERPRISE API (WEB SERVİS)

5651 ve 5070 Sayılı Kanun Tanımlar Yükümlülükler ve Sorumluluklar Logix v2.3 Firewall. Rekare Bilgi Teknolojileri

Client Server Database

Atılım Üniversitesi Bilgi & Đletişim Teknolojileri Müdürlüğü Sistem Yönetim Uzmanı Görev Tanımı

Veritabanı. Ders 2 VERİTABANI

Android e Giriş. Öğr.Gör. Utku SOBUTAY

Outlook ta Mail Arama

Google Web Toolkit ile Öğretim Elemanı Otomasyon Sistemi

FortiMail Gateway Modunda Kurulum. v4.00-build /08

Güvenlik Java ve Web Uygulama Güvenliği

Yeni Nesil Ağ Güvenliği

MOBILEPAX SOAP PRODUCT API KULLANIM ŞEKLİ

MOBILEPAX XML PRODUCT API KULLANIM ŞEKLİ

Medula Eczane E-Reçete Web Servislerinin Kullanım Kılavuzu (Test amaçlıdır, ödemeye esas teşkil etmeyecektir)

MyFaces Özgür JSF Uyarlaması. Bora Güngören Portakal Teknoloji

Öğr.Gör. Gökhan TURAN Gölhisar Meslek Yüksekokulu

PAKET TRANSFER SİSTEMİ

NESNE YÖNELİMLİ PROGRAMLAMA HAFTA # 10. Yrd.Doç.Dr.Hacer Karacan

VIDEOCELL API. Versiyon 1.0.0

OTURUM AÇMA ADLARI. Tavsiye Edilen Önhazırlık Enterprise Manager'i kullanabilmek.

HTML isteklerini anlayarak HTML sonucu üreten ve yaygın olarak kullanılan temel Servlet sınıfı HttpServlet tir.

Trend Micro Worry-Free Business Security 8.0 İlk Kez Kurulumla İlgili İpuçları ve Püf Noktaları

1.Mailbox Server Role:

Üst Düzey Programlama

Asp.Net Veritabanı İşlemleri

Çekirdek Nedir? Ne yapar?

PAPERWORK TEKNİK MİMARİ

SDD Dökümantasyonu Versࠀyon 1.0. Movࠀe Predࠀctࠀon Orhan Özgün Ergen Ahmet Saday Berkay Erken

Java EE 5 Teknolojileri Jboss Seam

ÇÖZÜM BİLGİSAYAR KOLAY RANDEVU RANDEVU WEB SERVİSLERİ YAZILIM FİRMALARI ENTEGRASYON KILAVUZU Sürüm: 1.0

5651 Sayılı Kanun Hakkında Kanunla ilgili detay bilgiler

Spring Giriş Eğitimi

Eclipse, Nesneler ve Java 2 Java Nereden Çıktı? 2

Microsoft Office Access Ders İçeriği 25 Saat. Access Temel 10 saat

TC KİMLİK NO SMS GÖNDERİM SOAP API

Script. Statik Sayfa. Dinamik Sayfa. Dinamik Web Sitelerinin Avantajları. İçerik Yönetim Sistemi. PHP Nedir? Avantajları.

Nagios XI Günümüzün talep gören kurumsal gereksinimleri için en güçlü BT altyapısı gözetim ve uyarı çözümüdür.

OPC Data Access (DA) Temelleri

Üst Düzey Programlama

YZM 2105 Nesneye Yönelik Programlama

COĞRAFİ BİLGİ SİSTEMLERİ SERVER MİMARİSİ SERVER UYGULAMA GELİŞTİRME EĞİTİMİ

19 Şubat 2016 Cuma

Coslat Monitor (Raporcu)

Bilgi ve Olay Yönetim Sistemi

Aktarımı Çalıştırmak/Geri Almak 146 Alan Seçenekleri 148 Veri Tabanı Şeması 150 Veri Tabanı ile İlgili Bazı Rake Görevleri 162 Modeller 164

«BM364» Veritabanı Uygulamaları

Ağ Bağlantısı Hızlı Kurulum Kılavuzu


JavaServerFaces. Ahmet Demirelli. SCJP 5.0, SCWCD 1.4

Üst Düzey Programlama

ULAKAAI Kimlik Federasyonu. Serdar Yiğit ULAKNETÇE 2011

JAVA RMI ve Hibernate teknolojileri kullanılarak çok amaçlı bir yazılım altyapısı hazırlanması

Exchange Server Kurulumu

Bilgi ve Olay Yönetim Sistemi

İŞLETİM SİSTEMİ KATMANLARI (Çekirdek, kabuk ve diğer temel kavramlar) Bir işletim sisteminin yazılım tasarımında ele alınması gereken iki önemli konu

Bir 802.1x Kimlik Kanıtlama Uygulaması: EDUROAM

COM API v.1.1 BELGE SÜRÜMÜ : 1.1

Basit bir web uygulaması

Medula Eczane E-Reçete Web Servislerinin Kullanım Kılavuzu (Test amaçlıdır, ödemeye esas teşkil etmeyecektir)

Spring Application Framework e Giriş

BİLGİSAYAR AĞLARI. «Uygulama Katmanı»

DRAYTEK VIGOR 3300V VPN Dial-in Fonksiyonu

Bilgi ve İletişim Teknolojileri (JFM 102) Ders 7. LINUX OS (Sistem Yapısı) BİLGİ & İLETİŞİM TEKNOLOJİLERİ. LINUX Yapısı

Transkript:

Spring için Acegi Güvenlik Sistemi Hazırlayan : Akif Burak Tosun Hacettepe Universitesi - 20221925 İletişim: thunder_burak@hotmail.com 1

İçindekiler: Önsöz Bölüm 1: Güvenlik 1.1. Giriş 1.2. Güncel Durum 1.3. Üst Düzeyli Tasarım 1.3.1. Anahtar Bileşenler 1.3.2. Desteklenen Güvenli Nesneler 1.3.3. Kurulum Nitelikleri 1.4. İstem Bağlamları 1.4.1. Tarihsel Gelişim 1.4.2. SecurityContext 1.5. Kimlik Denetimi (Authentication) 1.5.1. Kimlik Denetim İstemleri 1.6. Yetki Protokolü (Authorization) 1.6.1. Verilen Yetkiler 1.6.2. Erişim Kararları Yönetimi Bölüm 2 : Neden ve Nasıl Acegi? 2.1. J2EE de CMA 2.1.1. Temel Kimlik Denetimi 2.1.2. Form Tabanlı Kimlik Denetimi 2.2. Tomcat Alanları 2.3. CMA daki Problemler 2.4. Çözüm: Acegi Güvenlik 2.5. Acegi Güvenlik Ayarları, 2.5.1. web.xml ayarları 2.5.2. appcontext~security.xml ayarları 2

2.5.3. Temel Kimlik Denetimi 2.5.4. Güvenli HTTP İstemi 2.5.5. Form Tabanlı Kimlik Denetimi 2.5.6. KimlikDenetim Sağlayıcıları (Authentication Providers) 2.5.7. Parola Şifreleme 2.5.8. JDBC Sağlayıcısı 2.5.9. SQL Uyarlama 2.5.10. Metotları Rollerle Güvelik Altına Alma 2.6. Diğer Özellikler 2.7. J2EE vs. Acegi Güvenlik Sistemi 3

Spring için Acegi Güvenlik Sistemi (AGS) Önsöz Bu doküman, Spring çatısının getirdiği kimlik denetimi ve yetki protokolünü sağlayan sınıfları içeren Acegi Güvenlik Sistemi(AGS) ne referans veren rehberlik sağlamaktadır. Bölüm 1 : Güvenlik 1.1.Giriş Acegi Güvenlik Sistemi, Spring destekli projeler için kimlik denetimi ve yetki protokolünü popüler web container (kap) lar aracılığıyla sağlayan sistemdir. Bu güvenlik mimarisi The Spring Way gelişiminin üstüne kurulmuş olup ; bağlamlarını, kesiştiricileri ve arabirim sürücülerini programlamayı kapsamaktadır. Sonuç olarak Spring için Acegi Güvenlik Sistemi Spring tabanlı yazılımların güvenliği için aranan ve kompleks mimarilere kolayca uyum sağlayabilen bir sistemdir. Güvenlik iki belirgin işlemi içermektedir, kimlik denetimi (authentication) ve yetki protokolü (authorization). Kimlik denetiminin yaptığı, ziyaretçinin iddia edilen kişi olup olmadığını çözümlemektir. Öte yandan yetki protokolünün ilgilendiği ise kimlik denetimi yapılmış bir ziyaretçinin yapmakta olduğu işlemi yapıp yapamayacağının 4

Spring için AGS de başından sonuna kadar kimlik denetimi yapılacak olan kullanıcı, sistem veya gereç temel olarak ele alınır. Bu güvenlik mimarisinde roller ya da gruplar diye- önceki uygulamalardan alışkın olduğunuz- bir kavram bulunmamasına karşın eşdeğer işlevsellik Acegi Güvenlik tarafından sağlanmıştır. 1.2.Güncel Durum Spring için Acegi Güvenlik Sistemi, Spring Topluluğu tarafından yaygın olarak kullanılmaktadır. Uygulama Programı Arabirimleri (API) durağan olarak ele alınır ve sadece önemsenmeyecek kadar küçük değişiklikler beklenir. Daha önce de söylenildiği gibi, diğer projelerde de yapılan geriye uyumluluk ve gelişim arasındaki dengeyi tutturmak zorundayız. Yürürlülükteki versiyon 0.6.1. da, Acegi Güvenlik Apache Taşınabilir Runtime Projesi nin uyarlanan kılavuzunu kullanmaktadır. Bu kılavuza şu adresten ulaşabilirsiniz : http://apr.apache.org/versioning.html Yayınlanacak versiyon 1.0.0. için öncelikli küçük geliştirmeler her birinin ekstra işlevselliği olmasına rağmen projenin temel arayüzleri ve sınıfları değiştirmeyecektir - şimdiden planlandı. Bu sebeple Spring için Acegi Güvenlik Sistemi nin kullanıcıları şu anki versiyonu gelecekte de rahatlıkla kullanabileceklerdir. 1.3. Üst Düzeyli Tasarım 1.3.1. Anahtar Bileşenler Çoğu şirket uygulamalarının dört temel güvenlik gereksinimi vardır. İlk olarak bir tekil kişiyi tanımlayabilmeleri gerekir. İkincil olarak web istemlerini güvenli hale getirebilmeleri gerekir. Üç, şirket uygulamaları servis katmanı metotlarının güvenliğini sağlayabilmelidir. Son olarak, çok nadir de olsa şirket 5

uygulamaları etki alanındaki örnek nesnelerin de güvenliğini sağlamalıdır. Acegi Güvenlik, bu dört temel şirket uygulaması gereksinimlerini ortak olarak içine alan geniş bir çatıda sağlayabilmektedir. Spring için AGS esasen 8 temel işlevsel kısımdan oluşmaktadır: - Authentication (kimlik denetim) nesnesi: Bu nesne tekil kişiyi, ve bu kişinin otoriteler tarafında verilen güven belgesini ve kimlik belgesini içerir. Ayrıca bu nesne kimlik denetimine ilişkin (kaynağın TCP/IP adresi gibi) ek bilgiler de tutabilir. - ContextHolder (bağlamı tutan) : Authentication nesnesini bir ThreadLocal de (yükümlü nesne) tutar. - AuthenticationManager : ContextHolder aracılığıyla sunulan Authentication nesnesini denetler. - AccessDecisionManager : Verilen bir işlemi onaylar. - RunAsManager : Verilen bir iş işletilirken isteğe bağlı olarak Authentication nesnesinin yerini değiştirir. - Güvenli Nesne kesiştirici (interceptor) : İşletimin ele alınması ve verilen bir işin işletilmesinden sonra ; kimlik denetimini, yetki protokolünü ve işletme yenilenmesini koordine eder. - AfterInvocationManager : Güvenli Nesne kesiştirici den dönen bir nesneyi düzenleyebilir; bu işlemi, tekil şahısın erişim yetkisi olmayan Collection larını silerek yapar. - Erişim Denetim Listesi yönetim paketi : Erişim denetim listelerinin etki alanındaki örnek nesnelere uygun olup olmadığını denetler. 6

Güvenli Nesne kesiştirici, Acegi Güvenlik in çoğu anahtar sınıfını işletir ve aynı zamanda çatının (framework) en önemli özniteliklerini dağıtır. Bunun önemini belirtmek için Şekil-1 de anahtar ilişkilerini ve AbstractSecurityInterceptor ın somut uygulamaları belirtilmiştir. Şekil 1: Güvenli Nesne Modeli Her Güvenli nesne kesiştiricisi (gelecekte güvenlik kesiştiricisi olarak kullanılacaktır) belirli bir güvenli nesne türüyle birlikte çalışır. Peki güvenli nesne nedir? Güvenli nesneler üzerilerine güvenlik uygulanabilen nesnelerdir. Bir güvenli nesne bazı geri çağrım biçimlerini sağlamalıdır böylece güvenlik kesiştiricisi yapması gerekenleri saydam bir şekilde gerçekleştirir ve zamanı geldiğinde istenilen işlemi yapması için ilgili nesneyi geri çağırır. Eğer güvenli nesneler yerel olarak geri çağırma yaklaşımını sağlamıyorsa bir sargı (wrapper) yazılması gerekir ve bu sayede işlem gerçekleştirilir. 7

Her güvenli nesne net.sf.acegisecurity.intercept altında kendi paketine sahiptir. Diğer bütün paketler güvenli nesneden bağımsızdır. Böylece sunulan her tür güvenli nesneyi destekler. Sadece durdurma ve yetkilendirme istemleri için tamamen yeni bir yol tasarlamak isteyen yazılımcılar güvenli nesneleri direkt olarak kullanmalıdır. Örneğin ; MethodInvocations nesnesini kullanmayan mesajlaşma sistemine yapılan çağrıları güvenli kılmak için yeni bir güvenli nesne oluşturulabilir. Çoğu Spring uygulaması günümüzde desteklenen üç temel güvenli nesne türünü (AOP Alliance MethodInvocation, AspectJ JoinPoint ve web istemi FilterInterceptor) şeffaflıkla kullanmaktadır. Yukarıda belirtilen Acegi Güvenlik için gerekli olan sekiz anahtar kısım ın önemli olanları bu dokümanda ele alınacaktır. 1.3.2. Desteklenen Güvenli Nesneler Şekil-1 in tabanında da görüldüğü gibi Spring için Acegi Güvenlik Sistemi günümüzde üç güvenli nesneyi desteklemektedir. İlki AOP Alliance MethodInvocation ı içermektedir. Bu Spring bean lerini korumak için var olan güvenli nesne türüdür. Yazılım geliştiriciler genellikle bu güvenli nesne türünü şirketsel nesneleri korumak için kullanırlar. Standart bir Spring-tabanlı bean i MethodInvocation gibi geçerli kılmak için, bean basitçe bir ProxyFactoryBean veya BeanNameAutoProxyCreator veya DefaultAdvisorAutoProxyCreator tarafından yayınlanır. Çoğu Spring geliştiricisi kendi işlembilgilerinde veya diğer Spring alanlarında bu duruma alışkın hale gelmiştir. İkinci tür AspectJ JoinPoint ı içerir. AspectJ; genellikle Spring bean kabının dışında yönetilmesiyle birlikte, etki alanındaki örnek nesnelerin 8

güvenliğini sağlamada tek yol olarak kullanılır. AspectJ kullanarak new Person(); gibi standart mimariler kullanılabilir ve tüm güvenlik Acegi Güvenlik tarafından sağlanabilir. Tekil durumu yaratıp, uygun kimlik denetim yöneticisine, erişim kararları yöneticisine ve ilgili diğer alanlara ileten AspectJSecurityInterceptor ise hala Spring tarafından yönetilmektedir. Üçüncü ve son tür FilterInvocation dır. Spring için Acegi Güvenli Sistemi nin içerdiği bir nesnedir. İçerdeki bir süzgeç tarafından yaratılır ve HTTP ServletRequest, ServletResponse ve FilterChain ı sarar. FilterInvocation, HTTP kaynaklarının korunmasını sağlar. Yazılım geliştiriciler genellikle bu sistemin hangi mekaniklerle çalıştığını anlamak zorunda değildir çünkü sadece güvenlik süzgeçlerini web.xml e eklerler ve geri kalan işi güvenlik sistemi halleder. 1.3.3. Kurulum nitelikleri Her güvenli nesne sonsuz sayıda bireysel istemi temsil edebilir. Örneğin, bir MethodInvocation herhangi bir metodu herhangi argümanlarla çağrılmasını temsil edebilir, aynı zamanda FilterInvocation da herhangi bir HTTP URL sini temsil edebilir. Spring için Acegi Güvenlik Sistemi, olası her istem için uygulanan kurulumları kaydetmek zorundadır. BankManager.getBalance(int accountnumber) istemi için gerekli güvenlik kurulumu ile, BankManager.approveLoan(int applicationnumber) istemi için gerekli güvenlik kurulumundan çok farklı olmalıdır. Daha basit ele alırsak ; http://some.bank.com/index.htm sayfasına yapılan bir istem için gerekli güvenlik kurulumuyla, http://some.bank.com/manage/timesheet.jsp sayfasına yapılan bir istem için gerekli güvenlik kurulumu birbirinden farklı olmalıdır. 9

Farklı istemlerle alakalı çeşitli güvenlik kurulumlarını saklamak için kurulum niteliği kullanılır. Gerçekleştirim katmanında bir kurulum niteliği ConfigAttribute arayüzü tarafından simgelenir. Alakalı istem ile ilişkilendirilmiş ConfigAttribute lar yığını bir ConfigAttributeDefinition içerisinde tutulur. Bu somut sınıf sadece ConfigAttribute ları tutar bunun dışında başka bir iş yapmaz. Güvenlik kesiştiricisine bir istem geldiğinde, hangi güvenlik kurulumunun uygulanacağını belirlemek zorundadır. Başka bir deyişle, isteme uygulanan ConfigAttributeDefinition ı bulmak zorundadır. Bu karar ObjectDefinitionSource arayüzü tarafından ele alınır. Bu arayüz tarafından sağlanan ana metot public ConfigAttributeDefinition getattributes(object object) metodudur. Buradaki Object güvenli nesnedir. Güvenli nesne geri çağrıldığında isteme dair detayları taşır böylece ObjectDefinitionSource gerçekleştirimi kendisi için gerekli olan detayları ConfigAttributeDefinition içeriğine bakarak bulabilir. 1.4. İstem Bağlamları 1.4.1. Tarihsel Gelişim 0.9.0. sürümünden önceki sürümlerde oturumlar arası bağlamları saklamak için Acegi Güvenlik bir ContextHolder kullanıyordu. Context sınıfına ilişkin bir alt sınıf olan SecureContext tanımlanıyordu ki bu Authentication nesnesini taşımak için bir arayüzü oluşturuyordu. Bu kavram Spring geliştiricileri tarafından uzun tartışmalar sonucu kararlılığı sağlamak adına 0.9.0 sürümünde kaldırılmıştır. Tartışma örneğini incelemek için bağlantıyı izlemeniz yeterlidir: http://article.gmane.org/gmane.comp.java.springframew ork.devel/8290 10

1.4.2. SecurityContext (SecureContext) SecurityContext leri saklamak için Acegi Güvenlik Sistemi SecurityContextHolder kullanır. SecurityContext nesnesi bir tek Authentication get/set metotları içerir. 1.5. Kimlik Denetimi (Authentication) 1.5.1. Kimlik Denetim İstemleri İstemci kendi güvenlik kimliğini Acegi Güvenliğe sunmak için kodunda bir yola ihtiyaç duyar. Bu Authentication arayüzünün görevidir. Authentication arayüzü üç önemli nesneyi tutar : tekil kişi (istemcinin kimliği), kimlik belgesi (istemcinin kimliğinin kanıtı, örneğin parola) ve bu tekil kişiye verilen yetkiler. Tekil kişiye verilen yetkiler AuthenticationManager tarafından yerleştirilirken, Tekil kişi ve bu kişiye ait kimlik belgesi istemci kodu tarafından yerleştirilir. 11

Şekil 2: Anahtar Kimlik Denetim Mimarisi Şekil-2 de görüldüğü üzere Spring için Acegi Güvenlik Sistemi birkaç somut Authetication gerçekleştirimi içerir:! UsernamePasswordAuthenticationToken, kullanıcı adı ve parolanın sırasıyla tekil kişi ve kimlik belgesi olarak kabul edilmesini sağlar. Bu ayrıca HTTP Oturum Kimlik Denetim sistemi tarafından yaratılır.! TestingAuthenticationToken, kimlik denetimi yapılmış bir nesnenin kendisine ilişkilendirilmiş AthenticationProvider olarak kabul edilmesi ve bunun test edilmesini kolaylaştırır. Bir tekil kişiye yüklenen yetkiler GrantedAuthority arayüzü tarafından belirtilir. Bu arayüz yetki protokolü (authorization) bölümünde ele alınır. 12

1.6. Yetki Protokolü (Authorization) 1.6.1. Verilen Yetkiler Kimlik denetimi bölümünde de anlatıldığı gibi tüm Athentication gerçekleştirimlerinde GrantedAuthority nesnelerini saklayacak bir diziye ihtiyaç duyulur. Bu nesneler tekil kişiye verilmiş yetkileri betimlemeye yarar. GrantedAuthority nesneleri Athentication içerisine AthenticationManager tarafından yerleştirilir, daha sonra da AccessDecisionManager tarafından yetki kontrolü yapılırken okunur. GrantedAuthority tek bir metodu olan bir arayüzdür: public String getauthority(); Bu metot AccessDecisionManager a, GrantedAuthority nin kesin bir String betimlemesini elde etmesi kolaylığını sağlar. Böylelikle bu String tabanlı GrantedAuthority nesnesinin betimlemeleri herhangi bir AccessDecisionManager tarafından kolaylıkla okunabilir. Eğer bir GrantedAuthority nesnesi String olarak kesin bir betimlemeye dönüştürülemiyorsa kompleks olarak düşünülür ve getauthority() null döndürür. Bu kompleks durumu engellemek için Acegi Güvenlik Sisteminde tek bir kesin GrantedAuthority String betimlemesine izin verir. Bu sayede kullanıcı tarafından belirlenmiş tüm String betimlemeleri bir GrantedAuthority nesnesine dönüştürülebilir. 13

1.6.2. Erişim Kararları Yönetimi AccessDecisionManager son erişim kontrol kararlarını almadan sorumludur. Bu arayüz üç metot içerir: public void decide(authentication authentication, Object object, ConfigAttributeDefinition config) throws AccessDeniedException; public boolean supports(configattribute attribute); public boolean supports(class clazz); İlk metottan da görülebileceği gibi yetkilendirme kararını alırken tüm ilgili veriler AccessDecisionManager ın elinden geçer. Buradaki güvenli nesne geçişi, denetlenecek asıl güvenli nesnenin argümanlarını geçerli kılar. Örneğin, diyelim ki güvenli nesnemiz MethodInvocation. Herhangi bir Customer argümanı için MethodInvocation ı sorgulamak daha kolay olacaktır, sonra tekil kişinin Customer üzerindeki ilgili işlemi yapma izni olup olmadığını bazı güvenlik mantıklarını gerçekleştirme işi AccessDecisionManager tarafından yapılır. Eğer erişim hakkı yoksa AccessDeniedException aykırı durumu gerçekleştirim tarafından fırlatılır. 14

Bölüm 2 : Neden ve Nasıl Acegi? 2.1. J2EE de CMA! CMA (Container Managed Authentication), Servlet API üzerine kurulmuştur.! security-constraints (güvenlik kısıtlamaları), web.xml içerisinde yapılandırılır.! Kimlik denetim alanı yapılandırması, uygulama sunucusu içerisinde yapılır. 2.1.1. Temel Kimlik Denetimi <security-constraint> <web-resource-collection> <web-resource-name>güvenli Alan</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>*</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>temel</auth-method> <realm-name>güvenli Bölge</realm-name> </login-config> 15

2.1.2. Form Tabanlı Kimlik Denetimi! /WEB-INF/web.xml: <security-constraint> <web-resource-collection> <web-resource-name>güvenli Alan</web-resource-name> <url-pattern>*.html</url-pattern> </web-resource-collection> <auth-constraint> <role-name>*</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>form</auth-method> <form-login-config> <form-login-page>/login.jsp</form-login-page> <form-error-page>/loginerror.jsp</form-error-page> </form-login-config> </login-config>! /login.jsp <form id="loginform" method="post" action="j_security_check"> <p> <label for="j_username">kullanıcı Adı:</label> <input type="text" name="j_username" id="j_username"/><br/> <label for="j_password">parola:</label> <input type="password" name="j_password" id="j_password"/> <button type="submit">giriş</button> </p> </form> 16

! /loginerror.jsp <p> Giriş Hatalı - lütfen <a href="index.jsp">yeniden deneyin</a>. </p> 2.2. Tomcat Alanları (Tomcat Realms)! MemoryRealm, JDBCRealm, DataSourceRealm, JAASRealm, JNDIRealm! JDBCRealm Örneği: <Context path="/equinox-security" docbase="equinox-security" debug="99" reloadable="true" antijarlocking="true" antiresourcelocking="true"> <Realm classname="org.apache.catalina.realm.jdbcrealm" debug="99" drivername="com.mysql.jdbc.driver" connectionurl="jdbc:mysql://localhost/ equinox?autoreconnect=true" connectionname="root" connectionpassword="" usertable="users" usernamecol="username" usercredcol="password" userroletable="user_roles" rolenamecol="rolename"/> </Context> 17

2.3. CMA daki problemler! Düşünüldüğü gibi portatif değildir! Bütün servlet kapları(container) JDBCRealm le taşınamaz! Form tabanlı kimlik denetimi sorunları: 1. Çoğu zaman kullanıcı/rol sorgularını SQL ile kontrol edemeyiz 2. Kullanıcının ilk login olduğu anı /j_security_check üzerinde filtreleyerek yakalama imkanımız yok 3. Gerçekleştirimi farklı sunucularda değişir. 2.4. Çözüm : Acegi Güvenlik! Herşey kendi uygulamamız içerisinde ayarlanabilir! URL lerin güvenliğini her zamanki ifadelerle oluşturulan rollerle sağlayabiliriz.! URL örüntüleri her zamanki ifadelerle veya Ant-türü örüntülerle olabilir (örneğin : /**/admin*.html)! Desteklediği kimlik denetim yöntemleri : Basic, Digest, Form, Yale Central Authentication System(CAS)! Kimlik denetim sağlayıcıları (Authentication providers) : JDBC, XML, LDAP, CAS 18

2.5. Acegi Güvenlik Ayarlamaları 2.5.1. web.xml ayarları <filter> <filter-name>securityfilter</filter-name> <filter-class> net.sf.acegisecurity.util.filtertobeanproxy </filter-class> <init-param> <param-name>targetclass</param-name> <param-value> net.sf.acegisecurity.util.filterchainproxy </param-value> </init-param> </filter> <filter-mapping> <filter-name>securityfilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 2.5.2. appcontext~security.xml ayarları! filterchainproxy bean : Kimlik denetimi işlemi için gerekli süzgeçler(filter) listesini içerir. Bu süzgeçler aşağıdaki spesifik görevleri gerçekleştirir : o httpsessioncontextintegrationfilter: Bu süzgeç kullanıcının kimlik denetimini ContextHolder içerisinde saklamak için kullanıcının açtığı oturumla iletişim kurmakla sorumludur. 19

o basicprocessingfilter: Bu süzgeç bir HTTP isteminin temel kimlik denetimi başlıklarını işleme koyar ve sonuçlarını ContextHolder ın içine yerleştirir. o securityenforcementfilter: Bu süzgeç istemleri, kullanıcıların hangi URL lere gitme izni olduğunu belirleyen FilterSecurityInterceptor a iletir <!-- ======================= FILTER CHAIN ====================== --> <bean id="filterchainproxy" class="net.sf.acegisecurity.util.filterchainproxy"> <property name="filterinvocationdefinitionsource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /j_security_check*= httpsessioncontextintegrationfilter, authenticationprocessingfilter /*.html*=httpsessioncontextintegrationfilter, remoteuserfilter,anonymousprocessingfilter, securityenforcementfilter /*.jsp=httpsessioncontextintegrationfilter, remoteuserfilter </value> </property> 20

2.5.3. Temel Kimlik Denetimi <!-- ================== AUTHENTICATION ================== --> <bean id="authenticationmanager" class="net.sf.acegisecurity.providers.providermanager"> <property name="providers"> <list> <ref local="daoauthenticationprovider"/> </list> </property> <bean id="inmemorydaoimpl" class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl"> <property name="usermap" value="tomcat=tomcat,role_user"/> <bean id="daoauthenticationprovider" class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider"> <property name="authenticationdao" ref="inmemorydaoimpl"/> <bean id="basicprocessingfilter" class="net.sf.acegisecurity.ui.basicauth. BasicProcessingFilter"> <property name="authenticationmanager" ref="authenticationmanager"/> <property name="authenticationentrypoint" ref="basicprocessingfilterentrypoint"/> 21

<bean id="basicprocessingfilterentrypoint" class="net.sf.acegisecurity.ui.basicauth. BasicProcessingFilterEntryPoint"> <property name="realmname" value="protectedarea"/> 2.5.4. Güvenli HTTP İstemi <!-- =============== HTTP REQUEST SECURITY ============== --> <bean id="httpsessioncontextintegrationfilter" class="net.sf.acegisecurity.context. HttpSessionContextIntegrationFilter"> <property name="context" value="net.sf.acegisecurity.context.security. SecureContextImpl"/> <bean id="securityenforcementfilter" class="net.sf.acegisecurity.intercept.web. SecurityEnforcementFilter"> <property name="filtersecurityinterceptor" ref="filterinvocationinterceptor"/> <property name="authenticationentrypoint" ref="basicprocessingfilterentrypoint"/> <bean id="httprequestaccessdecisionmanager" class="net.sf.acegisecurity.vote.affirmativebased"> <property name="allowifallabstaindecisions" value="false"/> <property name="decisionvoters"> <list><ref bean="rolevoter"/></list> </property> 22

<bean id="rolevoter" class="net.sf.acegisecurity.vote.rolevoter"/> <bean id="filterinvocationinterceptor" class="net.sf.acegisecurity.intercept.web. FilterSecurityInterceptor"> <property name="authenticationmanager" ref="authenticationmanager"/> <property name="accessdecisionmanager" ref="httprequestaccessdecisionmanager"/> <property name="objectdefinitionsource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /*.html*=role_user /*.jsp=role_user </value> </property> 2.5.5. Form Tabanlı Kimlik Denetimi! Temel kimlik denetiminden, form tabanlı kimlik denetimine geçiş için sadece XML konfigürasyonu yeterlidir.! Login ve LoginError sayfaları CMA daki gibi olabilir! Beni Hatırla ve Parola Şifreleme gibi işlemler için kod gerekmez sadece xml. 23

2.5.6. Kimlik Denetimi Sağlayıcıları (Authentication Providers) <bean id="daoauthenticationprovider" class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider"> <property name="authenticationdao" ref="inmemorydaoimpl"/> <bean id="inmemorydaoimpl" class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl"> <property name="usermap"> <value> tomcat=tomcat,role_user springlive=springlive,role_user </value> </property> 2.5.7. Parola Şifreleme <bean id="inmemorydaoimpl" class="net.sf.acegisecurity.providers.dao.memory. InMemoryDaoImpl"> <property name="usermap"> <value> tomcat=536c0b339345616c1b33caf454454d8b8a190d6c, ROLE_USER springlive=2a9152cff1d25b5bbaa3e5fbc7acdc6905c9f251, ROLE_USER </value> </property> 24

<bean id="daoauthenticationprovider" class="net.sf.acegisecurity.providers.dao. DaoAuthenticationProvider"> <property name="authenticationdao" ref="inmemorydaoimpl"/> <property name="passwordencoder" ref="passwordencoder"/> <bean id="passwordencoder" class="net.sf.acegisecurity.providers.encoding. ShaPasswordEncoder"/> 2.5.8. JDBC Sağlayıcısı! JDBC kullanabilmek için datasource a bağımlı bir bean tanımlamamız yeterlidir: <bean id="jdbcdaoimpl" class="net.sf.acegisecurity.providers.dao.jdbc. JdbcDaoImpl"> <property name="datasource" ref="datasource"/>! Kullanıcı ve rollerini seçebilmemiz için varsayılan SQL cümlecikleri: "SELECT username,password,enabled FROM users WHERE username =?"; "SELECT username,authority FROM authorities WHERE username =?"; 25

2.5.9. SQL Uyarlama! SQL i yeniden yazmak için usersbyusernamequery ve authoritiesbyusernamequery özelliklerini belirlememiz gerekir: <bean id="jdbcdaoimpl" class="net.sf.acegisecurity.providers.dao.jdbc. JdbcDaoImpl"> <property name="datasource" ref="datasource"/> <property name="usersbyusernamequery"> <value>select username,password,enabled as 'true' FROM users WHERE username =?</value> </property> <property name="authoritiesbyusernamequery"> <value>select username,rolename FROM user_roles WHERE username =?</value> </property> <property name="passwordencoder" ref="passwordencoder"/> 26

2.5.10. Metotları Rollerle Güvelik Altına Alma <bean id="securityinterceptor" class="net.sf.acegisecurity.intercept.method.aopalliance. MethodSecurityInterceptor"> <property name="authenticationmanager" ref="authenticationmanager"/> <property name="accessdecisionmanager" ref="accessdecisionmanager"/> <property name="objectdefinitionsource"> <value> org.appfuse.service.usermanager.getuser=role_admin org.appfuse.service.usermanager.getusers=role_user org.appfuse.service.usermanager.removeuser=role_admin org.appfuse.service.usermanager.saveuser=role_admin </value> </property>... <bean id="usermanager" parent="txproxytemplate"> <property name="target"> <bean class="org.appfuse.service.impl. UserManagerImpl" autowire="byname"/> </property> <property name="preinterceptors"> <list><ref bean="securityinterceptor"/></list> </property> 27

2.6. Diğer Özellikler! Access Control Lists (ACLs) : Her nesne için izin kontrolü yapar.! AfterMethodInvocation Kesiştiricisi : Kullanıcının okuma izni olmadığı nesneleri koleksiyonlardan kaldırır.! Denetim ve Olay Günlükleri : 2.7. J2EE vs. Acegi Güvenlik Sistemi Güvenlik Çerçevesi (Security Framework) J2EE Güvenlik Artıları Uygulama açısından kurulumu kolaydır. Kullanıcı Alanı konfigürasyonu kurgulayan kişinin elindedir. Standart olduğu için hakkında bir çok kaynak bulunabilir. Eksileri Bir uygulama sunucusundan diğer uygulama sunucusuna bağlantı kurmak zordur. Uygulama geliştiricisi konfigürasyonu standartlaştırılmış olmasına rağmen, sunucu için alan konfigürasyonu standart değildir. Servis katmanı metotlarının güvenliği sadece EJB ler kullanılarak yapılabilir. 28

Acegi Güvenlik Güvenlik konfigürasyonları uygulamadan tamamen bağımsızdır uygulama sunucusunun taşınması durumunda kaygı duymanız gerekmez. J2EE güvenliğin eksikliklerini kapatır ve uyarlama özelliği sayesinde aynı şeylere izin de verir. CAS ile tekil oturum açmaya izin verir. Hızla gelişiyor ve yenileniyor. Çok fazla XML konfigürasyonu gerektiriyor Öğrenme eğrisi çok diktir, ilk başlangıçta çok zor gelebilir. Alan bilgisi uygulama ile birlikte paketlenir, yerini değiştirmek oldukça zordur. Kaynaklar: AcegiSecurity / Matt Raible Acegi Security System For Spring / Ben Alex Acegi Security Style / Matthew Porter 29