Çoðu UNIX sistemleri kullanýcý bilgileri ve kriptolanmýþ þifreleri depolamak için benzer metodlar kullanýrlar. Buna düz eski /etc/passwd veya gölge þifreler kullanýmýnda /etc/shadow da dahil. Elbetteki bunlarin çeþitleri var. HPUX 10.x ve üzerinde üç seçeneðiniz var: Normal sürüm 7 tipi, gölge þifreler yada onlarýn 'sadece güvenilen sistemler için' olan 'korunan þifre veritabaný'.
HP Güvenilen Sistemler`inin tam açiklamasi bu yazinin disina çikiyor, o yüzden ben sadece korunan sifre veritabani sistemi üzerinde duracagim. Güvenilen sistemler, basitçe, HPUX ile birlikte kurma seçeneginiz olan bir paket (HPUX`i iyi bilenlerden özür diliyorum). Anahtar özelliklerden birisi HPUX makine üzerinde uyguladigi korunan sifre veritabani.
Korunan þifre veritabani nedir? Diyelimki üzerinde güvenilen sistemler çalýþýyor olan bir HPUX makineye login oldunuz. 'cat /etc/passwd' yazdýnýz ve þifrelerin yerinde eski '*' karakteri var. Sonrada gölge þifreleler kullanýmda mý diye görmek için 'ls /etc/shadow' yaptýnýz fakat bir iz yok. Ve '/tcb/files' dizini dikkatinizi çekti. Ýþte burasý güvenilen sistemler dizini ve kullanýcý bilgileri ve þifreleride '/tcb/files/auth' dizininde tutuluyor.
Artýk kullanýcý bilgilerinin nerede tutulduðunu bildiðimize göre, tipik bir kullanýcý dosyasýna bakalým. Her kullanýcýnýn isminin ilk harfiyle baþlayan bir dizin içinde kendine it bir düz yazý dosyasý vardýr. Bu, '/etc/passwd' gibi tüm kullanýcýlarý içeren bir dosyanýn güvensizliði durumunda tüm kullanýcýlar etkilendiði için daha iyi bir özellik.
jblow: uname=jblow:u_id@2876:\
:u_pwd=3E/IbASoPe6k2:\
:u_auditid#5219:\
:u_auditflag#1:\
:u_succhg@979762751:u_llogin#0:u_pw_expire_warning#0:u_suclog#984723623:\
:u_suctty=pts/tg:u_unsuclog#984278635:u_unsuctty=pts/ti:u_lock@:\
:chkent:
Eðer iyi incelenirse '/tcb/files/auth/j/jblow' altýnda bulunan bu dosyanýn pek çok deðerli bilgi içerdiði görülebilir. Eðer getprpwnam(3) man sayfalarýna bakarsak tüm bunlarýn ne anlama geldiðini ve kullanýlmayan alanlarýn listelenmediðini göreceðiz. Gerçekte, güvenilen sistemleri çok 'özel' yapan düzinelerce alan ve flag`ler mevcut (ör. kullanýcýnýn ne yapýp ne yapamayacaðýnýn kontrolü).
Peki bu dosyada nasýl deðiþiklikler yapabiliriz? Bunu yapmanýn yollarýndan biri HPUX`in lame sistem yönetim aracý 'sam'ý kullanmak. Fakat C kodu yzamak daha eðlenceli ve ilgi çekici. jblow kullanýcý hesabý ile ilgili birþeyler yapacaðýmýzý düþünelim. Ýþte kullanýcýnýn tüm alan ve flag`lerinin yapýsýný veren bir C kodu (bir kez daha, getprpwnam(3) man sayfasý):
#include <sys/types.h>
#include <hpsecurity.h>
#include <prot.h>
struct pr_passwd* userinfo;
struct pr_passwd* temp;
temp = getprpwnam('jblow');
if(temp == NULL)
{
printf('Geçersiz kullanýcý ismi.\n');
exit(1);
}
else
{
userinfo = (struct pr_passwd *) malloc(sizeof(*temp));
if (userinfo != NULL)
memcpy(userinfo,temp,sizeof(*temp));
}
Burda yapýyý geçici bir yapýya kopyaladýk. Bu güvenli programlama için. gdb gibi bir debugger ile karýþýk bir print rutini yazmadan 'userinfo' yapýsýna göz atabilirsiniz. Bu þekilde yapý içerisinde neler olduðuna dair iyi bir bilginiz olur. Bir sonraki adým jblow`un kullanýcý hesabýnda bir þekilde deðiþiklikler yapmak. Ben eðlence için þifre alanýný seçtim. HPUX`da þifre alaný eski iyi crypt(3) fonksiyonu kullanýlarak yaratýlýyor. Eðer man sayfalarýna bakarsak aþaðýdakileri göreceðiz:
NAME
crypt, setkey, encrypt - generate hashing encryption
SYNOPSIS
#include <crypt.h>
#include <unistd.h>
char *crypt(const char *key, const char *salt);
falan filan...
Anlaþýldýðýna göre, key kriptolanacak olan karakterler ve salt da 2 karakterlik ... salt iþte! Crypt kullanmanýn dezavantajlarýndan biri sadece 8 karakterlik bölümler kriptolayabileceðinden þifre uzunluðunu kýsýtlamasýdýr. Bu sebeple, jblow`a bakarsak: 3E/IbASoPe6k2. Burda '3E' salt karakterleri ve '/IbASoPe6k2' kriptolanmýþ þifre. Eðer 8 karakterden daha fazlasýný kriptolamak isterseniz, bir salt ve ilk 8 karakteri geçirmeniz gerekli ve sonra kriptolanmýþ karakterlerin ilk ikisini bir sonraki için salt olarak kullanmanýz gerekli vs. Örneðin, '/I' bir sonraki salt olarak kullanýlabilirdi. Tabi boyut sýnýrýný aþan bigcrypt(3) fonksiyonu olduðundan baþýmýz aðrýmýyor. Þimdi örnek olarak biraz C koduna bakalým (hala jblow`un userinfo yapýsýný kullanýyoruz):
char *newpass; /* bu örnek için yeni bir þifre */
/* içerdiðini varsayalým */
int length = strlen(newpass);
/* güvenilir sistem uyumluluðu kontrolü */
for (i=0;i<length;i++)
{
if (isalpha(newpass))
num_alpha++;
else
num_nonalpha++;
}
if (!((num_alpha>=2)&&(num_nonalpha>=1)))
{
printf('Yeni þifre en az iki alfa-karakter ve');
printf('bir alfa-olmayan karakter içermeli');
exit(1);
}
/* yeni þifreyi kriptola ve yerine koy */
encrpyt_pw = (char *)bigcrypt(newpass, salt);
strcpy(userinfo->ufld.fd.encrypt,encrypt_pw);
/* Bu kullanýcý hesabýnýn þifre deðiþikliðine zorlayýp */
/* zorlamayacaðýný kontrol edin */
if(userinfo->ufld.fd_schange == 0)
{
/* o halde login olurken þifre deðiþtirmeye zorlanacak */
userinfo->ufld.fd_schange=time(&tloc); /* o anki tarih */
}
if (!putprpwnam(user,userinfo))
{
printf('Hata, þifre deðiþmedi.\n');
exit(1);
}
Yukarda da göreceðiniz gibi güvenilen sistemler can sýkýcý. Tüm bunlarýn detayý sistem tarafýndan uygulanan politikalara (policy) baðlý. Yukarda fd_schange alanýný kontrol ettiðimi farketmiþsinizdir. Bunun sebebi man sayfalarý fd_schange için 'last successful change in secs past 1/1/70' yazýyor. Eðer bu 0 ise ve 'son baþarýlý deðiþtirme' yok ise ve sistem þifre deðiþikliðine zorlarsa bununla ilgilenmek gerekli.
Sistem politikalarýný bulmak zor olabilir. Baþlangýç olarak '/tcb/files/auth/default' dizinine bakmanýzý öneririm. Bunun dýþýnda, kendi baþýnasýnýz.
Sonuç olarak, HPUX büyük ihtimalle bu sistemi uzun süre tutmayacak. Web üzerinde kýsa bir araþtýrma güvenilen sistemler ile ilgili pek çok problem yaþandýðýný gösteriyor. Güvenilen sistemlerin PAM ile çalýþmamasý gibi ek bir yararýda var. Bu sebeple, bence HPUX`in yeni bir þeyle ortaya çýkýp bunlardan kurtulmasý an meselesi. Fakat bunu kullanan çok sistem var, özellikle de akademik sektörde.