İzinler ve kullanıcılar
- İzin dizesini okumayı, sekizli sayıya çevirmeyi, chmod ile değiştirmeyi ve SUID bitinin neden yetki yükseltmenin kapısı olduğunu öğrenirsin.
- umask, ACL ve sudo ile bir dosyaya kimin dokunabildiğini adım adım daraltır, beklenmeyen SUID dosyasını envanterle yakalarsın.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +55 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Linux'ta güvenliğin büyük bölümü tek bir soruya iner: bu dosyaya kim dokunabilir? Yanıtı izinler verir. Her dosyanın bir sahibi, bir grubu ve üç kitle için ayrı ayrı tanımlı hakları vardır.
Bu derste izin dizesini okumayı, sekizli sayıya çevirmeyi ve chmod ile değiştirmeyi öğrenirsin. Ardından SUID bitinin neden yetki yükseltmenin en klasik kapısı olduğunu ve savunan tarafın bu kapıyı nasıl denetlediğini göreceksin. Konu kuru görünür, ama bir sunucudaki pek çok açığın kökü yanlış verilmiş izinlerdir.
Üç kitle, üç hak
Linux'ta her dosyanın bir sahibi ve bir grubu vardır. Çekirdek erişimi üç kitleye göre ayırır: sahip, grup ve diğerleri. Her kitle için üç hak tanımlanır: r okuma, w yazma, x çalıştırma.
Bir kullanıcı dosyaya dokunduğunda çekirdek önce onun hangi kitleye girdiğine bakar, sonra o kitlenin haklarına. Sahipsen sahip hakları, sahip değil ama gruptaysan grup hakları, hiçbiri değilsen diğerleri hakları geçerlidir. Bir dosyaya aynı anda birden çok kitleden bakılmaz; ilk uyan kitle kararı verir.
ls -l çıktısının ilk sütunu on karakterlik izin dizesidir. İlk karakter türü söyler: tire normal dosya, d dizin, l sembolik bağlantıdır. Kalan dokuz karakter üçer üçer okunur. İlk üçlü sahibe, ikincisi gruba, üçüncüsü diğerlerine aittir.
Hak yoksa harfin yerinde tire durur. Örneğin -rw-r----- dizesinde sahip okur ve yazar, grup yalnız okur, diğerleri hiçbir şey yapamaz. Dizeyi soldan sağa okumak alışkanlık hâline gelince izinleri bir bakışta çözersin.
Aynı satırın geri kalanı da bilgi doludur. İzin dizesinden sonra bağlantı sayısı, dosyanın sahibi, sahibin grubu, bayt cinsinden boyut, son değişim tarihi ve en sonda dosya adı gelir. Sahip ile grubu birbirinden ayırmak önemlidir: auth.log dosyasının sahibi syslog, grubu adm olabilir.
Bir dosyaya erişemediğinde önce bu iki alana bak; çoğu zaman sorun, senin dosyanın sahibi ya da grubunda olmamandır. Sahibi root olan bir dosyayı normal kullanıcı olarak değiştiremezsin.
-rw-r--r-- 1 ege ege 1024 Eyl 19 10:02 notlar.txt → 644 -rw-r----- 1 syslog adm 81234 Eyl 19 09:30 auth.log → 640 -rwxr-xr-x 1 ege ege 8512 Eyl 12 08:00 yedekle.sh → 755 -rw------- 1 ege ege 411 Eyl 17 14:20 id_ed25519 → 600
Aynı haklar sekizli sayıyla da yazılır. Okuma 4, yazma 2, çalıştırma 1 eder. Her kitlenin haklarını toplar ve tek haneye indirirsin: rwx 7, rw- 6, r-x 5, r-- 4 olur.
İlk hane sahibe, ikincisi gruba, üçüncüsü diğerlerine bakar. Böylece -rw-r----- dizesi 640 eder. Sekizli yazım kısa ve kesindir; bir komutta bütün hakları bir kerede kurar. Harfli ve sekizli biçim aynı bilgiyi anlatır, yalnız biri daha okunur, öbürü daha kısadır.
Etkinlik 1 / 7
Bir dosyanın izni sekizli olarak 640. Bu değer kime hangi hakkı tanır?
Dizinler, gruplar ve umask
Dizinlerde harflerin anlamı değişir. r dizindeki adları listelemeye yeter. w dizine dosya eklemeyi ve dizinden dosya silmeyi açar. x ise dizinin içinden geçme hakkıdır; x yoksa dosyanın tam adını bilsen bile ona ulaşamazsın.
Buradan şaşırtıcı bir sonuç çıkar: bir dosyayı silme hakkı dosyanın değil, bulunduğu dizinin iznine bağlıdır. Yazma ve geçme hakkın olan bir dizinde, sana ait olmayan bir dosyayı da silebilirsin. Bu yüzden ortak dizinlerin izni dikkatle verilir.
Grup, birden çok kullanıcıya aynı hakkı vermenin yoludur. id komutu senin kullanıcı numaranı ve üye olduğun grupları yazar; groups ise yalnız grup adlarını listeler. Gruplar /etc/group dosyasında tanımlıdır ve her satır grup adı ile üyeleri taşır.
Bir kullanıcıyı bir gruba eklemek, o grubun haklarını ona açar; örneğin sudo grubuna eklenen kullanıcı yönetici komutlarını çalıştırabilir. Bir incelemede sudo ve adm gibi güçlü grupların üye listesine bakmak, kimin neye erişebildiğini hızla gösterir.
Yeni oluşan dosyanın başlangıç iznini umask belirler. umask, verilmeyecek hakları gösteren bir maskedir: sistem izinden maskeyi düşer. Yaygın değer 022'dir. Dosyalar en çok 666 ile doğabilir; 022 maskesi grup ve diğerlerinden yazmayı düşer ve dosya 644 olur.
Dizinler en çok 777 ile doğar; aynı maske onları 755 yapar. umask 077 kullanırsan yeni dosya 600, yeni dizin 700 olur ve varsayılan olarak kimse senin dosyana bakamaz.
Etkinlik 2 / 7
umask değeri 077 iken yeni oluşturulan bir dosyanın izni sekizli olarak ____ olur.
İzni değiştirmek
İzni chmod değiştirir ve iki yazım kabul eder. Sekizli yazım bütün hakları bir kerede kurar: chmod 600 anahtar.txt. Harfli yazım tek bir hakkı oynatır: chmod u+x betik.sh yalnız sahibe çalıştırma ekler, chmod o-r rapor.txt diğerlerinden okumayı alır.
Harflerde u sahip, g grup, o diğerleri, a hepsi demektir. Sahipliği chmod değil chown değiştirir ve root yetkisi ister: chown app:app .env dosyanın sahibini ve grubunu app yapar.
chmod -R bir dizini bütün içeriğiyle birlikte değiştirir ve burada dikkatli ol. Bir web dizinine chmod -R 777 vermek bütün dosya ve alt dizinleri herkese açar; üstelik dosyalara çalıştırma hakkı da verir, bu da gereksizdir. Dosya ile dizin aynı izni istemez: dizinin geçme hakkına, düz dosyanın ise çalıştırma hakkına ihtiyacı vardır.
find ile türü ayırıp farklı hak vermek doğru yoldur: dizinlere 755, dosyalara 644. Bir dizine toplu hak dağıtırken ne yaptığını iki kez düşün.
Üç kitle bazen yetmez. Dosyayı sahip ve gruba ek olarak tek bir kullanıcıya da açmak istersen, erişim denetim listesi (ACL) kullanırsın. getfacl bir dosyanın tüm ACL kayıtlarını listeler, setfacl yeni bir kayıt ekler.
Örneğin setfacl -m u:veri:r rapor.txt yalnız veri kullanıcısına okuma verir, başka kimseyi etkilemez. ls -l çıktısında iznin sonundaki artı işareti dosyada bir ACL olduğunu gösterir; onu görünce getfacl ile ayrıntıya bakarsın.
$ chmod 600 anahtar.txt $ ls -l anahtar.txt -rw------- 1 ege ege 411 Eyl 19 11:04 anahtar.txt $ getfacl rapor.txt # file: rapor.txt # owner: ege # group: ege user::rw- user:veri:r-- group::r-- mask::r-- other::---
Etkinlik 3 / 7
yedekle.sh dosyasını sahibi için okunur, yazılır ve çalıştırılır; grup ile diğerleri için yalnız okunur ve çalıştırılır yap.
Etkinlik 4 / 7
Sekizli izni anlamıyla eşleştir.
root, sudo ve özel bitler
root, yani kullanıcı numarası 0 olan hesap, dosya izni denetimlerini büyük ölçüde atlar. Normal kullanıcı ise kendi dosyalarıyla sınırlıdır. sudo, belirli komutları root adına çalıştırma yetkisi verir ve kurallarını /etc/sudoers dosyasından okur.
sudo -l sana tanınan komutları listeler ve her sudo kullanımı kayda geçer. Bir incelemede önce sudo -l çıktısına bakarsın, çünkü tek bir komuta verilen geniş yetki bile tehlikeli olabilir: program içinden kabuk açılabiliyorsa, o kabuk root olarak çalışır.
Özel bitler bu düzene istisna açar. SUID taşıyan bir program, kim çalıştırırsa çalıştırsın dosya sahibinin yetkisiyle çalışır. İzin dizesinde sahibin x hanesinde x yerine s görürsün: -rwsr-xr-x.
Sekizli yazımda başa dördüncü bir hane, 4, eklenir ve değer 4755 olur. /usr/bin/passwd bunun meşru örneğidir: normal kullanıcı kendi parolasını değiştirir, program da parola özetlerini tutan /etc/shadow dosyasına root olarak yazar. SUID olmadan bu iş yapılamazdı.
SUID'in iki akrabası vardır. SGID, grup kimliğiyle aynı işi yapar ve dizinlerde kullanıldığında yeni dosyalara dizinin grubunu verir. Yapışkan bit sayesinde bir dizinde herkes yalnız kendi dosyasını siler; /tmp bu bitle korunur ve dizenin sonunda t olarak görünür.
Modern çekirdekler ayrıca root'un gücünü capabilities adı verilen küçük parçalara böler. Örneğin ping programının bütün root yetkisine değil, yalnız ham ağ paketi gönderme yeteneğine ihtiyacı vardır. getcap -r / komutu hangi programın hangi yeteneği taşıdığını listeler; cap_setuid gibi güçlü bir yetenek yanlış bir programda dururken yetki yükseltmeye kapı açar.
$ sudo -l
User ege may run the following commands on srv1:
(root) NOPASSWD: /usr/bin/systemctl restart nginx
$ getcap -r /usr/bin 2>/dev/null
/usr/bin/ping cap_net_raw=epDerinleş:SUID neden silah olur
root'a ait bir programın SUID taşıması tek başına sorun değildir; sorun, o programın fazladan ne yapabildiğidir. Bir program kabuk açabiliyor, istenen dosyayı yazabiliyor ya da komut çalıştırabiliyorsa, SUID onu bir yetki yükseltme aracına çevirir. find komutunun -exec seçeneği istenen komutu çalıştırır; vim gibi düzenleyiciler içeriden kabuk açar; awk bir komutu koşturabilir. Bu programlardan biri root'a ait ve SUID ise, saldırgan onu kullanarak root kabuğu alabilir.
GTFOBins adlı açık kaynak proje, hangi programın bu amaçla nasıl kötüye kullanılabileceğini derler ve savunan taraf aynı listeyi tersten okur: bu programların hiçbirine gereksiz yere SUID takma. En etkili savunma da budur, çünkü var olmayan bir biti kimse kötüye kullanamaz. MITRE ATT&CK bu tekniği T1548.001 olarak izler.
Etkinlik 5 / 7
Doğru mu, yanlış mı?
Sahibi root olan SUID bir programı normal kullanıcı çalıştırdığında program root yetkisiyle çalışır.
Savunma: SUID envanteri
Savunma tarafı düzenli bir SUID envanteri tutar. find / -perm -4000 -type f komutu SUID biti açık bütün dosyaları listeler; sen de çıktıyı bilinen bir listeyle karşılaştırırsın. passwd, sudo, su, mount gibi sistem araçlarının SUID taşıması beklenir. Beklenmeyen ise bir alarmdır: /tmp altındaki bir dosya, ev dizininde duran bir kopya ya da kabuk açabilen bir düzenleyici.
En iyi yöntem, kurulumun hemen ardından bir temel liste almak ve sonraki taramaları bu listeyle karşılaştırmaktır; listede olmayan her yeni SUID dosyası tek tek incelenir. Böyle bir dosyayı bulunca SUID bitini kaldırır, dosyayı incelemeye alır ve sisteme nasıl geldiğini araştırırsın.
Etkinlik 6 / 7
find / -perm -4000 -type f çıktısındaki dosyaları sınıflandır.
Önce bir seçeneğe, sonra aşağıdaki uygun kutuya bas. İstersen seçeneği kutuya sürükleyip bırak. Yerini değiştirmek için aynı işlemi tekrarla.
0/6 seçenek yerleşti.
Aynı mantığı bir web uygulamasına uygula. Uygulamanın .env dosyası veritabanı parolasını taşır. Dosyanın sahibi, uygulamayı çalıştıran hesap olmalı ve yalnız o hesap dosyayı okuyup güncelleyebilmeli. Sunucudaki başka hiçbir kullanıcı dosyayı görmemeli.
Sık görülen bir sızıntı, dosyanın herkese okunur 644 izniyle bırakılmasından doğar; aynı makinedeki başka bir servis açığa düşünce saldırgan parolayı da okur. Modülün ilk dersinde bu dosyanın belge kökünün dışına alınması gerektiğini öğrenmiştin; izin bunun ikinci yarısıdır. İki önlem birlikte olunca, tek bir yanlış yapılandırma parolayı açığa çıkarmaz.
Etkinlik 7 / 7
.env dosyasını yalnız sahibinin okuyup yazabileceği hale getirmek için chmod ____ .env yazarsın.
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.