İçeriğe geç
academia.sh

Ders 15 / 20

Yetki Yükseltme

Süper kullanıcının denetim atlama ayrıcalığı, kullanıcı değiştirme ile komut başına yetki devri arasındaki fark, yetki devri politikasının yapısı ve en az yetki ilkesi.

İçindekiler

Önceki derste sahip devri “Operation not permitted” ile reddedildi. Bazı işlemler kök yetkisi ister; ama kök hesabıyla oturum açıp gün boyu çalışmak, her yazım hatasının tüm sistemi etkileyebilmesi demektir.

Bu ders yetkinin nasıl geçici ve sınırlı biçimde alındığını ele alır. Konu bir komut öğrenmekten çok bir ilke uygulamaktır: bir işlem için gereken en dar yetki, gereken en kısa süre için alınır.

Süper Kullanıcı

Kullanıcı kimliği sıfır olan hesap süper kullanıcıdır. Ayrıcalığı, çekirdeğin izin denetimlerinin çoğunu bu kimlik için atlamasından gelir: dosya izinlerine bakılmaz, sahiplik değiştirilebilir, ayrıcalıklı bağlantı noktaları açılabilir, dosya sistemleri bağlanabilir.

Ayrıcalık sınırsız değildir. Salt okunur takılmış bir dosya sistemine kök kullanıcı da yazamaz; donanım düzeyinde yazma korumalı bir aygıta yazamaz. Bunlar izin denetimi değildir, dolayısıyla atlanamazlar.

Kök hesabıyla sürekli çalışmanın üç somut sakıncası vardır:

Hata yarıçapı. Yanlış dizinde çalıştırılan yıkıcı bir komut, sıradan kullanıcıda kendi dosyalarıyla sınırlı kalır; kök kullanıcıda sınır yoktur.

Denetim izi. Kök oturumunda yapılan işlem, hangi kişinin yaptığını kaydetmez. Birden çok yöneticinin bulunduğu sistemlerde bu, sorunun kaynağını bulmayı olanaksızlaştırır.

Yanlışlıkla kalıcı etki. Kök hesabıyla oluşturulan dosyalar kök kullanıcıya ait olur. Ev dizininde kök hesabıyla oluşturulmuş bir dosya, sıradan kullanıcı için erişilemez bir artık bırakır.

Çoğu kurulumda kök hesabında parola tanımlı değildir ve doğrudan oturum açılamaz. Yetki, aşağıdaki iki yoldan biriyle alınır.

Kullanıcı Değiştirme

su komutu, mevcut oturumun içinde hedef kullanıcıya geçer ve yeni bir kabuk açar. Doğrulama için hedef kullanıcının parolası sorulur.

$ su -
Password: su: Authentication failure

Baştaki tire önemlidir: verildiğinde hedef kullanıcının oturum açma ortamı da kurulur — ev dizini, PATH ve diğer ortam değişkenleri hedef hesabınkine ayarlanır. Verilmediğinde kullanıcı değişir ama ortam eski kullanıcınınki kalır ve bu karışıklık kaynağıdır.

Yaklaşımın iki zayıflığı vardır. Birincisi, kök parolasının paylaşılmasını gerektirir; parolayı bilen herkes her şeyi yapabilir ve parola değiştirildiğinde herkese yeniden dağıtılması gerekir. İkincisi, açılan kabukta yapılan işlemler tek tek kaydedilmez.

Komut Başına Yetki Devri

sudo farklı bir modeldir: kullanıcı kendi parolasıyla doğrulanır ve bir politika dosyasında tanımlanmış komutları, tanımlanmış bir hesabın yetkisiyle çalıştırır.

$ sudo id
[sudo] password for ogrenci: 
uid=0(root) gid=0(root) groups=0(root)

Komut kök kimliğiyle çalışmıştır. Parola sorulan hesap ogrenci’dir; kök parolası bilinmemektedir ve gerekmemiştir.

Doğrulama bir süre önbelleklenir: aynı oturumda kısa süre içinde verilen ikinci komutta parola yeniden sorulmaz. Önbellek sudo -k ile temizlenir; yukarıdaki örneklerde her denemeden önce bu yapılmıştır.

İki modelin karşılaştırması:

Ölçüt su sudo
Sorulan parola Hedef hesabın Kendi hesabının
Kapsam Tüm kabuk oturumu Tek komut
Sınırlanabilirlik Yok, tam yetki Politikayla komut düzeyinde
Kayıt Oturum düzeyinde Komut düzeyinde
Parola paylaşımı Gerekir Gerekmez

Politikayı Okumak

Kullanıcının hangi komutları çalıştırabildiği sorulabilir:

$ sudo -l
[sudo] password for ogrenci: 
Matching Defaults entries for ogrenci on makine:
    env_reset, mail_badpass,
    secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin,
    use_pty

User ogrenci may run the following commands on makine:
    (root) /usr/bin/id, /usr/bin/chown

Son satır politikanın özüdür. Parantez içindeki root, komutun hangi hesabın yetkisiyle çalışacağını; devamı ise izin verilen komutların tam yollarını gösterir. Bu kullanıcı kök yetkisiyle yalnızca iki programı çalıştırabilir.

Politika satırlarının genel biçimi dört parçalıdır: hangi kullanıcı, hangi makinede, hangi hesap adına, hangi komutlar. Kullanıcı yerine grup adı da yazılabilir; yönetici yetkisi çoğunlukla belirli bir gruba üyelik üzerinden verilir. Parola sorulmadan çalışmasına izin veren bir işaret de vardır ve otomatik çalışan işler için kullanılır.

Politika dosyası doğrudan düzenlenmez. Sözdizimi hatası içeren bir politika, sistemde hiç kimsenin yetki alamamasına yol açar; bu nedenle dosya, kaydetmeden önce sözdizimini denetleyen özel bir araçla düzenlenir.

En Az Yetki İlkesi

Politikanın dar tutulması, izin verilmeyen bir komutta doğrudan görünür:

$ sudo cat /etc/shadow
[sudo] password for ogrenci: 
Sorry, user ogrenci is not allowed to execute '/usr/bin/cat /etc/shadow' as root on makine.

En az yetki ilkesi, her özneye görevini yapmak için gereken en dar yetkinin verilmesini söyler. Uygulamada bu, politikada “tüm komutlar” yerine belirli komutların sayılması demektir.

İlke, uygulanması göründüğünden zor bir ilkedir çünkü bazı komutlar dar görünüp geniş yetki taşır:

Kabuk açabilen komutlar. Metin editörlerinin ve sayfalayıcıların çoğu, içinden komut çalıştırma özelliği taşır. Kök yetkisiyle çalıştırılmasına izin verilen bir editör, kök kabuğu vermeye eşdeğerdir.

Argümanı serbest bırakılan komutlar. Yukarıdaki politikada chown için argüman kısıtlanmamıştır; kullanıcı istediği dosyanın sahibini değiştirebilir, dolayısıyla sistem dosyalarının sahipliğini kendine geçirebilir. Politika dar görünse de sonucu geniştir.

Dosya yazan komutlar. Kök yetkisiyle herhangi bir dosyaya yazabilen bir komut, hesap dosyasına satır ekleyerek yeni bir ayrıcalıklı kullanıcı oluşturabilir.

Politika yazarken sorulacak soru “bu komut zararlı mı” değil, **“bu komutla kök kabuğu elde edilebilir mi”**dir.

Ortamın Temizlenmesi

Politika çıktısındaki env_reset ve secure_path ayarları, yetki devrinin sessiz ama kritik bir parçasıdır. Komut yolu dersindeki gölgeleme, tam olarak burada saldırıya dönüşürdü:

$ printf '#!/bin/sh\necho sahte kimlik\n' > /tmp/deneme/id
$ chmod +x /tmp/deneme/id
$ PATH="/tmp/deneme:$PATH"
$ id
sahte kimlik
$ sudo id
[sudo] password for ogrenci: 
uid=0(root) gid=0(root) groups=0(root)

Kullanıcının kendi oturumunda id adı sahte programa çözülmüştür. Yetkili çalıştırmada ise gerçek program çalışmıştır: yetki devri aracı, kullanıcının PATH değerini yok sayıp politikada tanımlı güvenli listeyi kullanmıştır.

Bu olmasaydı, “yalnızca id çalıştırabilir” biçimindeki bir politika hiçbir şey ifade etmezdi; kullanıcı kendi yazdığı id adlı programı kök yetkisiyle çalıştırırdı. Ortam değişkenlerinin de sıfırlanması aynı gerekçeye dayanır: kütüphane arama yolu gibi değişkenler, çalıştırılan programın davranışını dışarıdan değiştirebilir.

Aynı gerekçe, sıradan kullanıcı için de geçerli bir alışkanlık doğurur: yetkili çalıştırılacak komutlar tam yollarıyla yazılır.

Özet

  • Süper kullanıcı, çekirdeğin izin denetimlerinin çoğunu atlar; salt okunur bağlama gibi izin dışı kısıtları atlamaz.
  • Kök hesabıyla sürekli çalışmak hata yarıçapını büyütür, denetim izini yok eder ve erişilemez artıklar bırakır.
  • su hedef hesabın parolasını ister ve tüm oturumu devreder; sudo kendi parolasını ister ve komut başına, politikayla sınırlı yetki verir.
  • Politika dört parçadan oluşur: kullanıcı, makine, adına çalışılan hesap ve izin verilen komutlar.
  • En az yetki ilkesinde ölçüt, komutun zararlı görünüp görünmemesi değil, o komutla kök kabuğu elde edilip edilemeyeceğidir.
  • Yetki devri aracı PATH ve ortam değişkenlerini sıfırlar; aksi hâlde komut adı gölgelenerek politika etkisiz hâle getirilebilirdi.

Sonraki Adım

Yetki devri, bir komutu başka bir kimlikle çalıştırmanın dışarıdan yapılandırılan yoluydu. Aynı etkinin dosyanın kendi üstverisine gömülü bir biçimi de vardır: kullanıcılar dersinde görülen -rwsr-xr-x dizesindeki s harfi. Sonraki ders bu üç ek biti — çalıştıranın kimliğini değiştiren iki bit ile dizinlerdeki silme yetkisini daraltan bir bit — ele alarak konuyu 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