İçeriğe geç
academia.sh

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, x konumları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; 710 değ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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat