Microsoft ISA yı neden kullanırlar bilmiyorum. Belki kolay yönetiliyordur. Her neyse. Ama şöyle bir gerçek var microsoft ürünleri active directory gruplarının ne olduğunu şıppadan anlıyor olmalı. Peki bunu ntlm authentication kullanan Squid ile yapmak istersek nasıl yapabiliriz? Olayı daha da somutlaştırmak gerekiyorsa active directory deki "xxx" ve "yyy" grubu internete 10:30 ve 14:30 arası çıkabilsin, diğerleri istediği gibi çıkabilsin.
İlk olarak squid'in ACL'lerinin işin içine gireceğini hemen düşünebiliriz. Doğrudur girecek. Squid de iki tane ACL vardır. Bir tane normal acl olup kafanıza göre yazdığınız acl dir. Diğeri ise bir script veya bir programın outputunun sonucunda calışan external_acl lerdir.
Active directoryden kullanıcıların sorgularının yapılması gerekmektedir. External_Acl ye input olarak verilen LOGIN değerlerinin active directoryden sorgusu yapılıp eğer o kişi istenilen gruptaysa squide OK değilse ERR dönmesi gerekir.
Squid microsoft domainde olmalıdır, zaten ntlm bunu gerektirir. Bir de elimizde güçlü bir microsoft user olmalıdır. Bu usera jedi diyelim. jedi userimiz için kerberos ticket alalım. (Kerberos olayı super bir seydir)
[root@msows219 ~]# kinit jedi@example.com.tr
Bu ticket ile artık active directory sorgularımızı iki de bir şifre girmek zorunda kalmadan yapabileceğiz.
Domaindeki adı ab105560 olan kullanıcıyı sorgulayalım.
[root@msows219 ~]# net ads search sAMAccountName=ab105560
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
cn: Padawan Padawan 105560
sn: Padawan
description: AB105560
givenName: Padawan
distinguishedName: CN=Padawan Padawan 105560,OU=securtydeneme,OU=BilgiIslemPersoneli,OU=oz
el grup,OU=adalet,OU=01_AB_KULLANICI,DC=example,DC=com,DC=tr
displayName: Padawan Padawan 105560
memberOf: CN=xxx,DC=example,DC=com,DC=tr
memberOf: CN=kafanagore,DC=example,DC=com,DC=tr
name: Padawan Padawan 105560
sAMAccountName: AB105560
gibi bir sonuç döner. Fazlalıkları sildiğim bu ldap resultta görüldüğü üzere memberOf attribute ile kişinin hangi ldap dalında olduğu görülebilir. Scriptimiz bunu sorgulamalıdır. Bu member of attributetunun döndüğü değere göre OK veya ERRor dönmelidir.
Hemen bir script yazalım bunun için:
#!/bin/sh
while read login ; do
uid=$(echo $login cut -d% -f2sed -e 's/5c//g')
ayrac=$(net ads search "(&(sAMAccountName=$uid)((memberOf=CN=xxx,DC=example,DC=com,DC=tr)(memberOf=CN=yyy,DC=example,DC=com,DC=tr)))" mail awk {'print $2'})
if [[ $ayrac -eq "1" ]]
then
echo OK
else
echo ERR
fi
done
Bu scripti squid.conf icinden kullanılmasını sağlayalım
external_acl_type ldap_group %LOGIN /ana/grupbelirleme.sh
acl izinliler external ldap_group
Bu şekilde bu scriptin kullanılmasını sağlayacağız ve scripte input olarak ntlm den elde edilen LOGIN değeri giriliyor ve kisi xxx veya yyy grubuna üyeyse OK dönüyor else ERR.
Zaman kriteri için
acl zaman time 10:30-14:30
http_access allow zaman izinliler
diyerekten ACL'yi kullanıma acıyoruz. Bu sayede active directory de xxx ve yyy grubuna üye kişiler saat 10:30-14:30 arasında interneti kullanacaklardır. Artık elimizde active directoryden kullanıcıların sorgusunu yapıp belli grupları sorgulayan ve bu sorgunun sonucuna göre internete çıkışlara izin veren bir proxy'imiz var.
Yazının başında kerberos ticket tan bahsetmiştik. Bu ticket ile sorgularımızı yaptık. Eğer ticket ile değilde her sorguda sifre göndermek istersek net ads search satırlarına -Ujedi%password ün eklenmesi gerekir. Ama bu benim önerdiğim bir sey degildir. Bunun yerine keytab dosyası oluşturulup bu ticket zamanının doluşundan önce yenilenip kinit komutuyla şifre girmeden kullanıma açılabilir. Bunun için microsoftculardan jedi kullanıcısı için keytab dosyasını oluşturmaları istenir. Tabiki bunu oluşturmaları için hangi komutu vermeleri gerektiğini söylemeniz gerekmektedir.
ktpass -princ nssldap/jedi@EXAMPLE.COM.TR -mapuser jedi@EXAMPLE.COM.TR -pass * -out jedi.keytab
ve bu keytab dosyasını alıp linuxe yuklersiniz. Bu dosyanın ne kadar önemli olduğunu söylemeye gerek yoktur. sakın 777 lemeyin dosyayı.
[root@msows219 ~]# kinit -k nssldap/jedi -c /tmp/krb5cc_23
ile uid si 23 olan squid userına ticket verilir.
[root@msows219 ~]# chown squid.squid /tmp/krb5cc_23
ile ticket squid userinin kullanımına sunulur. Tabiki bu işlemi squidin cronuna koyacagınız bir scriptle de yapabilirdiniz. Ticket'in süresi dolmadan bu userin ticketi yenilenip kullanıma devam edililir. Bu yenileme işlemi sırasında ps -ef grep "net ads search" ile active directory de search eden process ler kill edilip yeni ticketi kullanmaları sağlanabilir.
Yukarıdaki işlemler sonucunda Squid proxy yazılımı ile microsoft kullanıcıları active directory ile iletişime geçilip sorgulandı ve belli bir zaman kriterine göre internet çıkışları için izin verildi.
Bakılması gereken linkler:
http://www.squid-cache.org/
http://web.mit.edu/Kerberos/
http://gentoo-wiki.com/HOWTO_Adding_a_Samba_Server_into_an_existing_AD_Domain#Linux_client_configuration
Wednesday, June 27, 2007
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment