Ders 16 / 20
Özel İzin Bitleri
Dokuz izin bitinin üstündeki üç bit; çalıştıranın kimliğini değiştiren setuid ve setgid, dizinlerde grup mirası ve silme yetkisini daraltan yapışkan bit.
İçindekiler
Kullanıcılar dersinde bir ayrıntı açıkta bırakılmıştı: parola değiştirme programının izin
dizesinde, sahip sınıfının üçüncü konumunda x yerine s vardı.
$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 72056 May 30 2024 /usr/bin/passwd
Bu ders o harfi ve iki kardeşini açıklar. Üç ek bit, dokuz izin bitinin çözemediği üç ayrı sorunu çözer ve üçü de yetki yükseltmenin — bu kez dosyanın kendi üstverisine gömülü — biçimleridir.
Dört Basamaklı Gösterim
İzin alanı aslında dokuz değil on iki bittir. Üç ek bit, sekizlik gösterimde soldan dördüncü basamağı oluşturur:
| Bit | Sekizlik | Adı |
|---|---|---|
| setuid | 4000 | Kullanıcı kimliğini ayarla |
| setgid | 2000 | Grup kimliğini ayarla |
| yapışkan | 1000 | Sticky |
Tam değer stat ile okunabilir:
$ stat -c '%a %A %n' betik/ozet.sh paylasim 4755 -rwsr-xr-x betik/ozet.sh 3770 drwxrws--T paylasim
4755 setuid artı 755, 3770 ise setgid artı yapışkan artı 770 demektir. chmod
komutuna dört basamaklı değer verilebilir; simgesel biçimde karşılıkları u+s, g+s ve
+t’dir.
Ek bitler ayrı sütunlarda gösterilmez; var olan x konumlarının harfini değiştirirler:
| Konum | x açıkken |
x kapalıyken |
|---|---|---|
| Sahip (setuid) | s |
S |
| Grup (setgid) | s |
S |
| Diğerleri (yapışkan) | t |
T |
Büyük harf, ek bitin açık ama altındaki çalıştırma bitinin kapalı olduğunu bildirir. Bu
çoğunlukla bir yapılandırma hatasının işaretidir; yukarıdaki drwxrws--T çıktısı ise
istenmiş bir durumdur — dizinin “diğerleri” sınıfına hiç izin verilmemiştir.
setuid: Çalıştıranın Kimliğini Değiştirmek
Normalde bir program, onu çalıştıran kullanıcının kimliğiyle çalışır. setuid biti açık bir çalıştırılabilir dosya ise, çalıştıranın değil sahibinin kimliğiyle çalışır.
Parola değiştirme programı bu yüzden işaretlidir. Program kök kullanıcıya aittir ve setuid biti açıktır; sıradan bir kullanıcı onu çalıştırdığında süreç kök yetkisiyle çalışır ve yalnızca kök tarafından yazılabilen parola dosyasını güncelleyebilir. Kullanıcı dosyaya doğrudan erişemez; erişimi olan, denetimli bir programa erişir.
Model, yetki yükseltme dersindeki politikayla aynı ilkeyi izler ama yetkiyi dışarıdan tanımlanan bir politikada değil, dosyanın üstverisinde tutar. Buradan iki sonuç çıkar.
setuid programlar saldırı yüzeyidir. Böyle bir programdaki her hata, ayrıcalık
kazanmaya dönüşebilir. Bu nedenle setuid programlar az sayıda tutulur, dar iş yapar ve
girdilerini titizlikle denetler. Sistem üzerindeki setuid dosyaların listesi find ile
çıkarılabilir; ölçüt seçeneği -perm adını taşır ve düzenli denetimlerin standart
adımlarından biridir.
Kabuk betiklerinde yok sayılır. Çekirdek, yorumlayıcıyla çalıştırılan dosyalarda bu biti uygulamaz:
$ printf '#!/bin/sh\nid -un\n' > /tmp/kimlik.sh $ chmod 4755 /tmp/kimlik.sh $ ls -l /tmp/kimlik.sh -rwsr-xr-x 1 ogrenci ogrenci 17 Jul 26 19:31 /tmp/kimlik.sh
Başka bir kullanıcı çalıştırdığında sonuç değişmez:
$ id -un yedek $ /tmp/kimlik.sh yedek
Bit açık görünmesine karşın süreç yedek kimliğiyle çalışmıştır. Nedeni bir yarış
durumudur: çekirdek dosyayı açıp yorumlayıcıyı çalıştırana kadar geçen sürede dosya
değiştirilebilir ve ayrıcalıklı yorumlayıcı başka bir betiği çalıştırabilirdi. Bu kapı,
biti yok sayarak kapatılmıştır.
setgid: Dosyalarda ve Dizinlerde
setgid biti çalıştırılabilir dosyalarda setuid’in grup karşılığıdır: süreç, çalıştıranın değil dosyanın grubuyla çalışır.
Dizinlerde ise bambaşka ve çok daha sık kullanılan bir anlam taşır: dizinde oluşturulan yeni dosyalar, oluşturanın birincil grubunu değil dizinin grubunu alır.
Sahiplik dersinde bırakılan sorun tam olarak buydu. Ağacın grubu değiştirilmişti, ama yeni dosyalar yine kullanıcının birincil grubuyla oluşuyordu.
$ mkdir -p paylasim $ chgrp proje paylasim $ chmod 770 paylasim $ ls -ld paylasim drwxrwx--- 2 ogrenci proje 4096 Jul 26 19:30 paylasim $ touch paylasim/deneme-1.csv $ ls -l paylasim total 0 -rw-r--r-- 1 ogrenci ogrenci 0 Jul 26 19:30 deneme-1.csv
Dizin proje grubuna ait olmasına karşın, içinde oluşan dosya ogrenci grubunu almıştır;
grup üyeleri bu dosyayı yazamaz. setgid biti eklendiğinde davranış değişir:
$ chmod g+s paylasim $ ls -ld paylasim drwxrws--- 2 ogrenci proje 4096 Jul 26 19:30 paylasim $ touch paylasim/deneme-2.csv $ ls -l paylasim total 0 -rw-r--r-- 1 ogrenci ogrenci 0 Jul 26 19:30 deneme-1.csv -rw-r--r-- 1 ogrenci proje 0 Jul 26 19:30 deneme-2.csv
Bitten önce oluşan dosya eski grubunu korumuş, sonra oluşan dosya dizinin grubunu almıştır. Bit ayrıca yeni oluşturulan alt dizinlere de kopyalanır; böylece ağacın tamamında miras sürer.
Grup paylaşımının çalışması için üç ayarın birlikte yapılması gerekir: dizinin grubu, grup yazma izni ve setgid biti. Üçünden biri eksikse paylaşım çalışmaz ve eksikliğin belirtisi her seferinde farklı görünür.
Yeni dosyaların grup yazma iznini de alması için maske de düzenlenmelidir; izin bitleri
dersindeki 022 maskesi grup yazmasını kapatır. Paylaşılan dizinlerde çalışırken maske
002 yapılır.
Yolun Geçilebilir Olması
Paylaşım, dizin izinleriyle bitmez. Yol çözümlemesi dersindeki kural burada devreye girer: paylaşılan dizine ulaşmak için yol üzerindeki her dizinde geçiş izni gerekir.
$ chgrp proje ~ $ chmod 710 ~ $ ls -ld ~ drwx--x--- 5 ogrenci proje 4096 Jul 26 19:13 /home/ogrenci
710 değeri sahibe tam yetki, gruba yalnızca geçiş izni verir. Grup üyeleri ev dizininin
içeriğini listeleyemez ama içinden geçebilir:
$ id -un yedek $ ls /home/ogrenci ls: cannot open directory '/home/ogrenci': Permission denied $ ls /home/ogrenci/proje/paylasim deneme-1.csv deneme-2.csv
İzin bitleri dersindeki “okuma var, geçiş yok” örneğinin tersi burada gerçek bir yapılandırmaya dönüşmüştür: ev dizininin içeriği gizli kalırken, adı bilinen alt dizin paylaşılabilir.
Yapışkan Bit
Paylaşılan dizin artık çalışıyor, ama izin bitleri dersinde bırakılan boşluk açık: dizinde yazma izni olan kullanıcı, içindeki her dosyayı silebilir.
$ id -un yedek $ ls -l total 0 -rw-rw-r-- 1 ogrenci proje 0 Jul 26 19:31 deneme-1.csv -rw-rw-r-- 1 ogrenci proje 0 Jul 26 19:31 deneme-2.csv $ rm deneme-1.csv $ ls -l total 0 -rw-rw-r-- 1 ogrenci proje 0 Jul 26 19:31 deneme-2.csv
yedek kullanıcısı, sahibi olmadığı bir dosyayı silmiştir. Silme dersindeki tanım bunu
açıklar: silmek dizin girdisini kaldırmaktır ve aranan izin dizinin yazma iznidir.
Yapışkan bit bu kuralı daraltır. Bit açık bir dizinde bir girdiyi yalnızca üç taraf kaldırabilir: dosyanın sahibi, dizinin sahibi ve kök kullanıcı.
$ chmod +t paylasim $ ls -ld paylasim drwxrws--T 2 ogrenci proje 4096 Jul 26 19:31 paylasim
Aynı kullanıcı aynı işlemi yeniden dener:
$ rm deneme-2.csv rm: cannot remove 'deneme-2.csv': Operation not permitted $ touch yedek-notu.csv $ ls -l total 0 -rw-rw-r-- 1 ogrenci proje 0 Jul 26 19:31 deneme-2.csv -rw-r--r-- 1 yedek proje 0 Jul 26 19:31 yedek-notu.csv $ rm yedek-notu.csv $ ls -l total 0 -rw-rw-r-- 1 ogrenci proje 0 Jul 26 19:31 deneme-2.csv
Başkasının dosyasını silmek engellenmiş, kendi oluşturduğu dosyayı silmek engellenmemiştir. Yazma izni de kaybolmamıştır — dizine yeni dosya eklenebilmektedir. Bit yalnızca silme ve yeniden adlandırma işlemlerini daraltır.
Bu, sistemdeki geçici dizinlerin standart yapılandırmasıdır:
$ ls -ld /tmp drwxrwxrwt 1 root root 4096 Jul 26 19:24 /tmp
rwxrwxrwt dizesi şunu söyler: herkes yazabilir, ama herkes yalnızca kendi dosyasını
silebilir. Yapışkan bit olmasaydı, geçici dizin herkesin birbirinin dosyasını
silebildiği bir alan olurdu.
Özet
- İzin alanı on iki bittir; ek üç bit sekizlik gösterimde dördüncü basamağı oluşturur.
- Ek bitler ayrı sütun almaz,
xkonumlarının harfini değiştirir; büyük harf altındaki çalıştırma bitinin kapalı olduğunu bildirir. - setuid işaretli çalıştırılabilir dosya, çalıştıranın değil sahibinin kimliğiyle çalışır; kabuk betiklerinde yarış durumu nedeniyle yok sayılır.
- Dizinlerde setgid, yeni dosyaların dizinin grubunu almasını sağlar ve alt dizinlere kopyalanır; grup paylaşımı için grup, yazma izni ve bu bit birlikte gerekir.
- Paylaşılan dizine erişim için yol üzerindeki her dizinde geçiş izni gerekir;
710değeri listelemeden geçiş verir. - Yapışkan bit, dizindeki bir girdiyi yalnızca dosyanın sahibinin, dizinin sahibinin ve kök kullanıcının kaldırabilmesini sağlar; geçici dizinlerin standart yapılandırmasıdır.
Sonraki Adım
Kimlik, izin ve yetki modeli tamamlandı; proje ağacı bir grupla güvenli biçimde paylaşılabilir durumda. Geriye sistemin kendisiyle ilgili son bir katman kalıyor: bu ağaçta çalışmak için kullanılan araçlar sisteme nasıl geldi, nasıl güncellenir ve nasıl kaldırılır? Sonraki konu paket yöneticisi kavramıyla başlar ve kursu, ağacı düzenlemek için gereken metin editörleriyle kapatır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.