3 Şubat 2011 Perşembe

UNIX'te izinler

UNIX veya UNIX türevi bir işletim sistemi ile çalışan hemen hemen her kullanıcı "Permission denied" mesajı ile karşılaşmıştır. Mesaj bir çok kullanıcının root hesabını kullanmaya başlamasına neden olan sebeplerden birisidir. Root hesabının kullnaılması da sistemin bir süre sonra sonra işe yaramaz hale gelmesine neden olacaktır. Çünkü bir çok kullanıcı UNIX işleyişini bilmediği için, hata mesajından sakınmak isterken ciddi hatalar yapacak ve sistemi işlemez hale getirecektir. Bu sorunun ortaya çıkmadan önlenebilmesi için kullanıcının UNIX ve türevi istemlerin nasıl işlediğini bilmesi gereklidir.

UNIX ve türevi sistemlerde üç adet temel izin kullanılır: oku (r), yaz (w) ve çalıştır (x).
Sisteminizin / dizininde "ls -la" / komutunu çalıştıracak olursanız aşağıdakine benzer bir Çıktı göreceksiniz.

[goksin@daemon /usr/home/goksin]$ ls -al /
total 69
drwxr-xr-x  21 root  wheel      512 31 Oca 14:34 .
drwxr-xr-x  21 root  wheel      512 31 Oca 14:34 ..
-rw-r--r--   2 root  wheel      798 19 Tem  2010 .cshrc
-rw-r--r--   2 root  wheel      265 19 Tem  2010 .profile
drwxrwxr-x   2 root  operator   512 25 Ağu 09:03 .snap
-r--r--r--   1 root  wheel     6206 19 Tem  2010 COPYRIGHT
drwxr-xr-x   2 root  wheel     1024  2 Ara 16:50 bin
drwxr-xr-x   9 root  wheel     1024  2 Ara 16:52 boot
drwxr-xr-x   2 root  wheel      512 25 Ağu 09:03 cdrom
drwxr-xr-x   2 root  wheel      512 25 Ağu 09:03 cdrom1
lrwxr-xr-x   1 root  wheel       10 25 Ağu 09:11 compat -> usr/compat
dr-xr-xr-x   7 root  wheel      512 31 Oca 13:21 devdev
drwxr-xr-x   2 root  wheel      512 25 Ağu 09:04 distdist
-rw-------   1 root  wheel     4096 29 Oca 05:00 entropy
drwxr-xr-x  20 root  wheel     2560 31 Oca 14:00 etc
lrwxr-xr-x   1 root  wheel        8 25 Ağu 09:15 home -> usr/home
drwxr-xr-x   3 root  wheel     1536  2 Ara 16:51 lib
drwxr-xr-x   2 root  wheel      512  2 Ara 16:50 libexec
drwxr-xr-x   2 root  wheel      512 19 Tem  2010 media
drwxr-xr-x   2 root  wheel      512 19 Tem  2010 mnt
dr-xr-xr-x   2 root  wheel      512 19 Tem  2010 proc
drwxr-xr-x   2 root  wheel     2560  2 Ara 16:51 rescue
drwxr-xr-x  13 root  wheel     1024 28 Oca 18:12 rootroot
drwxr-xr-x   2 root  wheel     2560  2 Ara 16:52 sbin
lrwxr-xr-x   1 root  wheel       11  2 Ara 16:50 sys -> usr/src/sys
drwxrwxrwt  14 root  wheel     6656 31 Oca 14:04 tmp
drwxr-xr-x  17 root  wheel      512 25 Ağu 14:53 usr
drwxr-xr-x  25 root  wheel      512 31 Oca 13:21 var
[goksin@daemon /usr/home/goksin]$

Bir UNIX sistemde her şey dosyadır. Bir diğer deyişle, klavye, monitör, sabit disk vb hepsi birer dosyadır. Dolayısıla da ls -al komutunun çıktısındaki ilk harf söz konu dosyanın türünü belirtir. Örneğin

drwxr-xr-x   2 root  wheel     1024  2 Ara 16:50 bin

bin dosyasının bir dizin olduğunu gösterir. Benzer olarak

-rw-r--r--   2 root  wheel      798 19 Tem  2010 .cshrc
-rw-r--r--   2 root  wheel      265 19 Tem  2010 .profile

satırları ise iki dosyayı göstermektedir. Sembolik bağlar ise aşağıdaki iki örnekte görüldüğü gibi "l" ile başlar ve aynı zamanda işaret ettikleri dosyalar ve dizinlerde tanımlanır.

lrwxr-xr-x   1 root  wheel       10 25 Ağu 09:11 compat -> usr/compat
lrwxr-xr-x   1 root  wheel        8 25 Ağu 09:15 home -> usr/home
lrwxr-xr-x   1 root  wheel       11  2 Ara 16:50 sys -> usr/src/sys

İlk harfi izleyen alanda yer alan dokuz karakter ise dosyanın izinlerini tanımlar. İzinler her zaman oku,yaz, çalıştır sırası ile tanımlanır. Söz konusu dosyada tanımlı olan izin ilgili harf
ile "r,w,x" ile gösterilir. Tanımlanmamış izin ise "-" ile gösterilir. Bir dosya için tanımlı olan izinler dosyanın sahibi, grubu ve diğerleri için olmak üzere üç defa tanımlanır.

-rw-r--r--   2 root  wheel      798 19 Tem  2010 .cshrc
-rw-r--r--   2 root  wheel      265 19 Tem  2010 .profile

.cshrc ve profile birer dosya oldukları için "-" ile başlamaktadır. Her iki dosyanın sahibi root kullanıcısıdır. Dosya üzerinde okuma ve yazma hakına sahiptir ama dosya üzerinde çalıştırma izni yoktur. Dosyanın birincil grubu -wheel- dosya üzerinde okuma hakkına sahiptir ama yazma ve çalıştırma izni yoktur. Diğerleri de dosyayı okuyabilir ama dosyaya yazmaz ve dosyayı çalıştıramazlar.

Dosyanın sahibi ve birincil grubu izinlerin ardından gösterilir. Bunları ise dosyanın byte cinsinden büyüklüğü ile dosya üzerinde yapılan son düzenlemenin tarihi yer alır.En son olarak da dosyanın adı gösterilir.

Bir kullanıcnın bir dosya ile ne yapabileceği dosyanın izinlerine ve dosyanın da içinde bulunduğu dizinin izinlerine göre şekillenir. Bunun istisnası ise root kullanıcıdır. root kullanıcısı dosya ve dizinlerdeki izinlerden bağışıktır.

Eğer bir dosya üzerinde okuma (r) izni verilmiş ise söz konusu dosyanın içeriği cat veya bir metin düzenleyicisi ile görüntülenebilir. Benzer olarak bir dizine okuma izini verildiğinde içerisinde yer alan tüm dizinler ve dosyalar ls komutu ile listelenebilir.

Eğer yazma (w) izni verilmiş ise dosyanın içeriği bir metin düzenleyicisi ile değiştirilebilir. Bir dizin üzerinde yazma izini tanımlandığında ise o dizin içzerisinde alt dizinler ve dosyalar üzerinde yazma hakkı verilmiştir. Bu durumda dosya/dizin oluşturulabilir ve silinebilir.

Eğer çalıştırma (x) izni tanımlanırsa bir program ile bir dosya kabuk programı olarak çalıştırabilir. Eğer dizine çalıştırma izini verilirse bu durumda o dizine cd komutu ile geçebilirsiniz.

"ls -la" komutunun çıktısına yeniden dönelim.

drwxr-xr-x  21 root  wheel      512 31 Oca 14:34 .
drwxr-xr-x  21 root  wheel      512 31 Oca 14:34 ..
-rw-r--r--   2 root  wheel      798 19 Tem  2010 .cshrc
-rw-r--r--   2 root  wheel      265 19 Tem  2010 .profile

"." her zaman için bulunduğunuz dizini ve ".." ise bir üst dizini belirtir. "/" dizini söz konusu olduğunda hem bir üst dizin hem de bulunduğunuz dizin aynıdır. Ancak bu durum / altında yer alan diğer alt dizinlerde farklılık gösterecektir. :)

.cshrc ve .profile dosyaları sistemde yer alana iki farklı kabuk ortamının yapılandırma dosyalarıdır. Bu dosyalar üzerinde sahibinin okuma ve yazma izni bulunurken grubu ve diğerleri için sadece okuma izni tanımlanmıştır. O halde bu dosyalar üzerinde bir işlem yapmak isterseniz ne olur?

Dosyaları bir metin düzenleyicisi, vi, vim veya cat ile açıp okuyabiliriz. Üzerinde düzenleme yapabilirsiniz ama yaptığınız değişiklikleri kayıt edemezsiniz.


[goksin@daemon /usr/home/goksin]$ cd /
[goksin@daemon /]$ cp .profile profile_test
cp: profile_test: Permission denied
[goksin@daemon /]$ mv .profile profile_test
mv: rename .profile to profile_test: Permission denied
[goksin@daemon /]$ rm .cshrc
override rw-r--r--  root/wheel for .cshrc? y
rm: .cshrc: Permission denied
[goksin@daemon /]$

/ dizinine geçiş yapabiliyoruz ama dosyayı kopyalamak, silmek veya yeniden isimlendiremiyoruz. Ancak aynı dosyayı kendi ev dizininize kopyaladığımızda durum değişecektir. Öncelikle kendi ev dizinizdeki izinlere bakalım.

[goksin@daemon /usr/home/goksin]$ ls -al
total 67182
drwxr-xr-x  46 goksin  goksin      3584  1 Şub 15:25 .
drwxr-xr-x   3 root    wheel        512 21 Eyl 18:11 ..

Yeniden ".profile" dosyasını ev dizinine kopyalamayı deneyelim.

[goksin@daemon /usr/home/goksin]$ cp /.profile ~
[goksin@daemon /usr/home/goksin]$ ls -l .profile
-rw-r--r--   2 goksin  goksin      265 19 Tem  2010 .profile
[goksin@daemon /usr/home/goksin]$ mv .profile profile_test
[goksin@daemon /usr/home/goksin]$ ls -l profile*
-rw-r--r--   2 goksin  goksin      265 19 Tem  2010 profile_test
[goksin@daemon /usr/home/goksin]$

Kendi ev dizinizde dosya üzerinde daha önce denediğimiz ama başarılı olamayan işlemleri gerçekleştirebiliyoruz. Ancak dosyayı kendi evi dizinimize taşımak istersek taşıma işlemi başarısız olacaktır. Bu durumu tam olarak anlayabilmek için kopyalama, taşıma işlemlerinin nasıl gerçekleştiğini anlamak gereklidir. UNIX sistemlerde herşey bir dosyadır. Normal dosyalar
içerisinde veri barınıdran metin dosyalarıdır. Örneğin .profile ve .cshrc gibi. Dizinlerde aslında bir dosyadır. İçeriğinde, dizin içerisinde yer alan diğer dosyaların listesi yer alır. Bir dosyayı bir dizinden bir diğerine taşıdığınızda aslında listedeki dosyanın adını bir diğer dosyadaki listeye eklenmektesinizdir. Eğer o dizinde yazma izininiz yoksa dizinden istediğiniz dosyayı bir diğer dizine aktarmanız söz konusu değildir. yani dosyadan söz konusu dosyanın adını silmek, eklemek vb işlemleri yapamazsınız. Bir dosyayı bir başka dizine kopyamak içinde kopyalayacağınız dizinde yazma iznine sahip olmanız zorunludur. .profile dosyasını
ev dizinie taşımak istediğinizde / dizininde yazma izniniz olmadığı için .profile dosyasını ev dizinine taşımanız söz konusu değildir. Öte yandan ev dizininde yazma hakkınız olduğu için kopyalama işlemi gerçekleştirebilirsiniz. Bundan ötürü dosyayı kendi ev dizininize kopyalabilirsiniz.

Bunlardan başka UNIX'te ön tanımlı izinlere ince ayar yapmamıza olanak veren üç farklı özellik bulunmaktadır. Bunlardan ilki SUID-set user id bit. Çalıştırılabilir dosyaların olduğu dizinlerde "ls -l" komutunu çalıştırdığınızda dosya sahibinin çalıştırma izni (x) yerinde (s) veya (S) atanmış olduğunu görebilirsiniz.

SUID bit atanan dosyalarda geçici olarak herhangi bir kullanıcı root yetkileri ile dosyayı çalıştırabilir. Örneğin kullanıcı şifrelerinin yer aldığı veritabanındaki bilgi sadece root kullanıcısı tarafından değiştirilebilir. Öte yandan bir kullanıcı kendi kullanıcı şifresini passwd(1) kullanarakdeğiştirebilir. passwd(1) 'a ls(1) ile bakacak olursanız SUID bit atamasını görürsünüz.

[goksin@daemon /usr/home/goksin]$ whereis -b passwd
passwd: /usr/bin/passwd
[goksin@daemon /usr/home/goksin]$ ls -l /usr/bin/passwd
-r-sr-xr-x  2 root  wheel  6160  2 Ara 16:52 /usr/bin/passwd
[goksin@daemon /usr/home/goksin]$ 

passwd(1) dosyasında SUID bit atanmış olduğu için kullanıcı şifresini düzenlemek istediğinde varitabanının düzenlenebilmesi için geçici olarak root yetkileri ile işlem yapılacaktır. Eğer SUID biti s olarak tanımlanmış ise bu durumda dosyanın sahibi çalıştırma iznine sahiptir ama SUID biti S olarak atanmış ise bu durumda dosyanın sahibinin çalıştırma izni yoktur.

İkinci özellik SGID-set grup id bit. SUID bit benzemekle birlikte geçici olarak grup üyeliğini değiştirir. Genellikle bir programı çalıştırmak için kullanılır. SGID bit atanıp atanmadığını grup izinleri kısmında s veya S tanımı bulunup bulunmadığına bakılarak anlaşılabilir. SGID bit atamasına örnek olarak netstat(1) verilebilir.

[goksin@daemon /usr/home/goksin]$ ls -l /usr/bin/netstat
-r-xr-sr-x  1 root  kmem  150316  2 Ara 16:52 /usr/bin/netstat
[goksin@daemon /usr/home/goksin]$

netstat(1) için SGID bit atamasında S yerine s kullanıldığı için çalıştırma izini de verilmiş olmaktadır.

Üçüncü özellik ise dizinlere atanan stcky bit Bu özellik bir dizinin birden çok kullanıcı tarafından kullanılması durumunda daha da önem kazanmaktadır. Kendi ev dizinizdeki izinleri göz önüne aldığınızda dizinin sahibinin tüm yetkilere sahip olduğunu ama üyesi olduğu grup ve diğerlerinin ise izinlerinin kısıtlanmış olduğunu görebilirsiniz. Bu durum dizinin sahibi için uygun olurken, aynı dizine başka kullanıcıların erişebildiği, aynı anda birden çok kullanıcı tarafından erişilebilen, dosya oluşturulabilen ve düzenlenebilen hatta silenebilen bir dizinde sakıncalar yaratabilecektir. Hele hele UNIX'de bir dosyayı sildiyseniz ebediyen silmiş olduğunuzu düşünürseniz... Bu sakıncalar sticky bit ile ortadan kaldırılmaktadır.

Bir dizine stciky bit atandığında kullanıcılar dizindeki dodyaları düzenleyebilir, değiştirebilir ve sadece kendi oluşturdukları dosyaları silebilirler. Sticky bit atamasına verilebilecek olan en iyi örnek /tmp dizinidir.

[goksin@daemon /usr/home/goksin]$ ls -al /
total 69
drwxr-xr-x  21 root  wheel      512 31 Oca 14:34 .
drwxr-xr-x  21 root  wheel      512 31 Oca 14:34 ..
-rw-r--r--   2 root  wheel      798 19 Tem  2010 .cshrc
-rw-r--r--   2 root  wheel      265 19 Tem  2010 .profile
drwxrwxr-x   2 root  operator   512 25 Ağu 09:03 .snap
-r--r--r--   1 root  wheel     6206 19 Tem  2010 COPYRIGHT
drwxr-xr-x   2 root  wheel     1024  2 Ara 16:50 bin
drwxr-xr-x   9 root  wheel     1024  2 Ara 16:52 boot
drwxr-xr-x   2 root  wheel      512 25 Ağu 09:03 cdrom
drwxr-xr-x   2 root  wheel      512 25 Ağu 09:03 cdrom1
lrwxr-xr-x   1 root  wheel       10 25 Ağu 09:11 compat -> usr/compat
dr-xr-xr-x   7 root  wheel      512 31 Oca 13:21 dev
drwxr-xr-x   2 root  wheel      512 25 Ağu 09:04 dist
-rw-------   1 root  wheel     4096 29 Oca 05:00 entropy
drwxr-xr-x  20 root  wheel     2560 31 Oca 14:00 etc
lrwxr-xr-x   1 root  wheel        8 25 Ağu 09:15 home -> usr/home
drwxr-xr-x   3 root  wheel     1536  2 Ara 16:51 lib
drwxr-xr-x   2 root  wheel      512  2 Ara 16:50 libexec
drwxr-xr-x   2 root  wheel      512 19 Tem  2010 media
drwxr-xr-x   2 root  wheel      512 19 Tem  2010 mnt
dr-xr-xr-x   2 root  wheel      512 19 Tem  2010 proc
drwxr-xr-x   2 root  wheel     2560  2 Ara 16:51 rescue
drwxr-xr-x  13 root  wheel     1024 28 Oca 18:12 root
drwxr-xr-x   2 root  wheel     2560  2 Ara 16:52 sbin
lrwxr-xr-x   1 root  wheel       11  2 Ara 16:50 sys -> usr/src/sys
drwxrwxrwt  14 root  wheel     6656 31 Oca 14:04 tmp
drwxr-xr-x  17 root  wheel      512 25 Ağu 14:53 usr
drwxr-xr-x  25 root  wheel      512 31 Oca 13:21 var
[goksin@daemon /usr/home/goksin]$

UNIX sisteminizdeki izinler üç temel izin ile ek üç özelliğin birleşimi ile düzenlenir. Bu aynı zamanda diğer UNIX türevi işletim sistemleri için de geçerlidir.

İzinlerin chmod(1) ile Düzenlenmesi

UNIX sistemlerde izinler geliştirici ekip tarafından belirlenip uygulanır. Dolayısıyla da bu izinleri değiştirmek veya ince ayar yapmanıza gerek yoktur. Ancka ve ancak sistem yöneticisi veya güvenlik uzmanı iseniz ve bu izinleri düzenlemek için çok çok önemli bir gerekçeniz varsa düzenlemenizde sakınca yoktur, aksi halde olduğu gibi bırakmanızda yarar vardır.

Dosyalar üzerindeki izinleri düzenlemek için chmod(1) kullanılır. chmod(1) iki farklı kipte çalışır: Sayısal ve Sembolik

Sayısal kipte çalıştırıldığında chmod(1) izinleri düzenlemek için sayısal değerlerden, sembolik kipte ise harflerden yararlanılır. Sayısal kipte kullanıldığında dört basamaklı sayısal değerler izinleri düzenlemek için kullanılır.

  • Özel izinler (SUID, SGID ve dizinler için sticky bit)
  • Dosyanın sahibi için izinler (rwx)
  • Dosyanın üyesi olduğu birincil grup için izinler(rwx)
  • Diğerleri için izinler (rwx)

İzinleri düzenlemek için r, w, x, s veya t harflerine karşılık olarak 4, 2 ve 1
sayıları aynı sıra ile kullanılır.

(s/t) r w x  = 421 421 421 (421)

İlk sıradaki sayılar SUID,SGID ve sticky bit tanımlar. SUID=4,SGID=2 ve sticky bit=1 kullanılır. Bunları izleyen sayılar ise oku=4, yaz=2 ve çalıştır=1 olamak üzere sırası ile dosyanın sahibi, grubu ve diğerleri için olan izinleri tanımlar. Eğer bir izini tanımlamayacaksanız sayısal olarak 0 tanımlanmalıdır. ls(1) çıktısında görüldüğü gibi "-" tanımlanmamalıdır.

Bir dosya üzerinde SUID bit ataması ile sahibine rwx, grubu ve diğerlerine ise rx izini vermek istersek sayısal değerler aşağıda görüldüğü gibi olacaktır.

400 421 401 401

chmod(1) ile bu sayısal değerlerin girilebilmesi için sayıların toplanması gereklidir.

400 = 4+0+0 = 4
421 = 4+2+1 = 7
401 = 4+0+1 = 5
401 = 4+0+1 = 5

chmod(1) ile dosyanın izinlerini aşağıdaki komutu kullanarak tanımlayabiliriz.

chmod 4755 dosya_adı

Bunu kendi ev dizinizde oluşturacağınız bir dosya deneyip görebilirsiniz.

[goksin@daemon /usr/home/goksin]$ touch test
[goksin@daemon /usr/home/goksin]$ ls -la test
-rw-r--r--  1 goksin  goksin  0  2 Şub 14:44 test
[goksin@daemon /usr/home/goksin]$ chmod 4755 test
[goksin@daemon /usr/home/goksin]$ ls -la test
-rwsr-xr-x  1 goksin  goksin  0  2 Şub 14:44 test
[goksin@daemon /usr/home/goksin]$

Bir dosya oluşturulduğunda dosyanın birincil grubu her zaman için o dosyayı oluşturan kullanıcının birincil grubu ile aynıdır. Bu özellik, dosyanın izinlerinin sadece dosyayı oluşturan kullanıcı ve root dışında başka bir kullanıcı tarafından değiştirilemeyeceği
için kritik öneme sahiptir.

Şimdi yaptığımız işlemi tersetn yaparak dosya izinlerini ilk duruma getirelim. Dosyanın ilk izinleri aşağıdaki gibiydi.

-rw-r--r--  1 goksin  goksin  0  2 Şub 14:44 test

Dosyanın ilk durumunda s, S, t, or T yer almadığı için ilk değer sıfır olacaktır. Dosyanın sahibinin okuma, yazma, grubunun ve diğerlerinin ise sadece okuma izinleri bulunmaktadır. Bu durumda sayısal karşılıkları aşağıdaki gibi hesaplanabilir.

000 = 0+0+0 = 0
420 = 4+2+0 = 6
400 = 4+0+0 = 4
400 = 4+0+0 = 4

chmod(1) ile dosya izinleri ilk hale getirilebilir.

[goksin@daemon /usr/home/goksin]$ chmod 0644 test
[goksin@daemon /usr/home/goksin]$ ls -la test
-rw-r--r--  1 goksin  goksin  0  2 Şub 14:44 test
[goksin@daemon /usr/home/goksin]$ 

Yukarıdaki işlemi chmod(1) sembolik kipte çalıştırarak da gerçekleştirebiliriz. Sembolik kipte düzenleme yapmak sayısal kip ile karşılaştırıldığında biraz daha uzundur. Sembolik kipte çalışırken chmod izinleri sahip, grup, diğerleri ve hepsi için olmak üzere bir operatör ile birlkikte tanımlanmaktadır.

  • u = kullanıc/sahibi
  • g = grup
  • o = diğerleri
  • a = herkes yada ugo

ve operator aşağıdakilerden birisi olabilir.

  • + izini ver
  • - izini iptal et
  • = izini şuna eşitle
İzinlerde yukarıda açıklandığı üzere r, w, x, s, t veya T olabilir.Burada dikkat edilemsi gereken nokta S tanımlı olmamasıdır. SUID veya GUID biti ataması yaparken çalıştırma özelliğini vermek isterseniz hem s hem de x birlikte kullanılması gereklidir. SUID bit ataması yapacaksanız s ile birlikte u kullanılması gereklidir. SGUD bit ataması için de benzer olarak s ile g birlikte kullanılması zorunludur. Sticky bit taması için de t ile o birlikte kullanılması gereklidir.

Sayısal kip için kullandığımız örneği sembolik kipte yeniden kullanalım. Dosyanın izinlerini aşağıdaki gibi yapmak için:

-rwsr-xr-x  1 goksin  goksin  0  2 Şub 14:44 test

[goksin@daemon /usr/home/goksin]$ ls -la test
-rw-r--r--  1 goksin  goksin  0  2 Şub 14:44 test
[goksin@daemon /usr/home/goksin]$ chmod a+sx test
[goksin@daemon /usr/home/goksin]$ ls -la test
-rwsr-sr-x  1 goksin  goksin  0  2 Şub 14:44 test
[goksin@daemon /usr/home/goksin]$

Bu komut istediğimiz sonucu vermedi ama oldukça yaklaştı. chmod(1) a+sx yazdığımız için SUID ve GUID bitlerini de atamış oluyoruz. Aynı komutu aşağıda görüldüğü gibi yeniden çalıştırıyoruz.

[goksin@daemon /usr/home/goksin]$ rm test
[goksin@daemon /usr/home/goksin]$ chmod u+s test
[goksin@daemon /usr/home/goksin]$ chmod go+x test
[goksin@daemon /usr/home/goksin]$ ls -la test
-rwSr-xr-x  1 goksin  goksin  0  2 Şub 14:44 test
[goksin@daemon /usr/home/goksin]$

Yukarıdaki komutlar ile SUID bit atamasını gerçekleştirmiş olsanız da dosyanın sahibi hariç olmak üzere herkese çalıştırma izni verdik. Ancak halen istediğimiz gibi omadığı için bir defa daha işlem yapmamız gerekecek.

[goksin@daemon /usr/home/goksin]$ rm test
[goksin@daemon /usr/home/goksin]$ chmod u+sx,go+x test
[goksin@daemon /usr/home/goksin]$ ls -la test
-rwsr-xr-x  1 goksin  goksin  0  2 Şub 14:44 test
[goksin@daemon /usr/home/goksin]$

Sembolik kipte yaptığımız işlem sayısal kipteki ile aynı sonucu vermiş oldu. Yukarıdaki örneklerde gördüğünüz gibi izinleri chmod(1) ile değiştiriyorsanız ls(1) ile istediğiniz gibi olup olmadığını kontrol etmeniz yerinde olacaktır.

Bir kullanıcının bir dosya üzerindeki yetkileri hem dosyanın hem de dizinin izinlerine bağlı olarak belirlenir. Ev dizininizde bir dizin oluşturup içerisinde yaratacağınız bir dosya ile bunu görebilirsiniz.

[goksin@daemon /usr/home/goksin]$ mkdir deneme
[goksin@daemon /usr/home/goksin]$ cd deneme
[goksin@daemon /usr/home/goksin/deneme]$ touch test
[goksin@daemon /usr/home/goksin/deneme]$ ls -la test
total 6
drwxr-xr-x   2 goksin  goksin   512  3 Şub 08:44 .
drwxr-xr-x  47 goksin  goksin  3584  3 Şub 08:44 ..
-rw-r--r--   1 goksin  goksin     0  3 Şub 08:44 test
[goksin@daemon /usr/home/goksin/deneme]$

Yukarıdaki çıktıya bakacak olursanız, deneme dizininde değişiklik yapılan zamanının dizinin yaratıldığı zaman değil, test dosyasının oluuşturulduğu zamana işaret ettiğini görebilirsiniz. UNIX sistemlerde dizinlerde dosya olduğu için deneme dizinin üzerinde değişiklik yapıldığı tarih ile test dosyasının oluşturulduğu tarih aynı olmaktadır. Bu dizinde izinlerin kullanıcıları nasıl sınırlandırdığını görmek için farklı bir kullanıcı hesabı ile -root olmamak koşulu ile- sisteme yeniden giriş yapmak yeterli olacaktır. Bunun için fahri adlı kullanıcı hesabını kullanacağım.

[goksin@daemon /usr/home/goksin]$ exit
login: fahri
password:
fahri@/usr/home/fahri$ cd /usr/home/goksin
fahri@/usr/home/goksin/deneme$ ls -al
total 6
drwxr-xr-x   2 goksin  goksin   512  3 Şub 08:44 .
drwxr-xr-x  47 goksin  goksin  3584  3 Şub 08:44 ..
-rw-r--r--   1 goksin  goksin     0  3 Şub 08:44 test
fahri@/usr/home/goksin/deneme]$

Dizinin izinlerine bakıldığında herkes için okuma izini tanımlı olduğu görülmektedir. Dolayısıyla da ls(1) ile dizin içeriğini görüntülenebilir. Ayrıca test dosyasının içeriğini görüntülenebilir. Dosyanın görüntülenmesi sırasında da bir hata mesajı döndürülmez.

fahri@/usr/home/goksin/deneme]$ cat test
fahri@/usr/home/goksin/deneme]$ 

fahri kullanıcsının dizine yazma izini bulunmadığı için dosya/dizin oluşturması söz konusu değildir.

fahri@/usr/home/goksin/deneme]$ touch fahri.txt
touch: fahri: Permission denied
fahri@/usr/home/goksin/deneme]$ rm test
override rw-r--r--  goksin/goksin for test? y
rm: test: Permission denied
fahri@/usr/home/goksin/deneme]$ mv test /usr/home/fahri
mv: rename test to /usr/home/fahri/test: Permission denied
fahri@/usr/home/goksin/deneme]$ cp test /usr/home/fahri/test
fahri@/usr/home/goksin/deneme]$

Görüldüğü üzere /usr/home/goksin/deneme dizininde fahri kullanıcısının yazma izni bulunmamaktadır. Dolayısıyla da bu dizinde kendisine ait olan dosyalar/dizinler hariç olmak üzere diğer dosyalar/dizinler üzerinde yazma işlemleri yapamaz. Bunu yapabilmesi için ise dizine stickybit ataması yaparak fahri kullanıcısının /usr/home/goksin/deneme dizininde yazma işlemleri yapmasını sağlayabiliriz. Stickybit atamasını da sadece dizinin sahibi olan kullanıcı yapabilir. Sticky bit ataması yapmak yerine bir diğer çözüm ise gruplara okuma/yazma ve çalıştırma izinleri vermektir. Bu durumda ise kullanıcının söz konusu grubun üyesi olması gerekir.

Bir kullanıcının hangi grupların üyesi olduğunu groups(1) ile öğrenebilirsiniz. "groups kullanıcı_adı" olarak vereceğiniz komut ile aradığınız kullanıcı adının hangi grupların üyesi olduğunu öğrenebilirsiniz.

[goksin@daemon /usr/home/goksin]$ groups goksin
goksin wheel operator
[goksin@daemon /usr/home/goksin]$ groups fahri
fahri
[goksin@daemon /usr/home/goksin]$

Farklı gruplara üye olan iki kullanıcı hesabının aynı dizini paylaşmasını istiyorsam dizin izinlerini herkese izin verecek şekilde düzenleyebilirim. Bu uygulama izini sistemde tanımlı olan tüm kullanıcılara vermek olacaktır. Diğer çözüm ise iki kullanıcı hesabını aynı grubun üyesi yapıp grub izini düzenlemek olacaktır. Bu durumda ise dosyanın birincil grubunu chown(1) ile değiştirmem gerekecektir. Bunu yapmak için root yetkilerini kullanarak ortak adlı bir grup oluşturup iki kullanıcıyı da bu grubun üyesi yapacağım. Bu işlemi gerçekleştirmek için pw(8) yararlanacağım.

daemon# pw group add ortak
daemon# cat /etc/group | grep "ortak"
ortak:*:1003:
daemon# pw group mod ortak -M goksin,fahri
daemon# cat /etc/group | grep "ortak"
ortak:*:1003:goksin,fahri
daemon# groups goksin
goksin wheel operator ortak
daemon# groups fahri
fahri ortak
daemon#

pw(8) ile ortak grubu oluşturduktan sonra goksin ve fahri kullanıcılarını ortak grubuna üye yaptım. Grubu ve kullanıcıları da kontrol ettikten sonra yapılması gereken /usr/home/goksin/deneme dizininin birincil grubunu değiştirip, goksin ve fahri kullanıcısının dizin üserrindeki izinlerinin grup üyeliği ile istediğimiz şekle dönüştürmüş olacağım. Bunun için goksin kullanıcısının dizinin sahibi olması nedeniyle işlem yapması yeterli olacaktır, dolayısıyla da root yetkilerini kullanmamıza gerek yoktur. chown(8) ile dizinin birincil grubunu değiştirmek için işlem yapacak olan kullanıcının sisteme giriş yapması gereklidir. Yeniden giriş yapılmadan yeni grup düzenlemeleri geçerli olmayacaktır.

chown(8) "kullanıcı_adı:birincil_grup" notasyonu ile kullanıcı ve grup düzenlemleri yapmaktadır. kullanıcı adını kullanmadan sadece birincil grubu değiştirmek için :birincil_grup olarak tanımlama yapılması yeterlidir.

daemon# exit
login: goksin
password:
[goksin@daemon /usr/home/goksin]$ chown :ortak deneme
[goksin@daemon /usr/home/goksin]$ ls -al deneme
total 6
drwxr-xr-x   2 goksin  ortak    512  3 Şub 08:44 .
drwxr-xr-x  47 goksin  goksin  3584  3 Şub 11:10 ..
-rw-r--r--   1 goksin  goksin     0  3 Şub 08:44 test
[goksin@daemon /usr/home/goksin]$

Bu işlemden sonra grup izinlerini değiştirmemiz durumunda sadece ortak grubunun üyesi olan goksin ve fahri kullanıcıları yeni düzenlemeye tabi olacaktır.