Sudo Yetkisi Yönetimi ve /etc/sudoers Güvenli Yapılandırması
Sistem yönetiminde en çok göz ardı edilen ama aynı zamanda en kritik güvenlik noktalarından biri sudo yapılandırmasıdır. Pek çok sysadmin, kurulum sırasında kullanıcıya “sudo her şeyi yapabilsin” deyip geçiyor ve sonradan bu kararın bedelini ödüyor. Bir güvenlik ihlalinde saldırganın eline geçen bir hesabın sudo yetkisi varsa, sistemi kurtarmak neredeyse imkansız hale gelir. Bu yazıda sudo’yu gerçekten nasıl yönetmeniz gerektiğini, /etc/sudoers dosyasını güvenli şekilde nasıl yapılandıracağınızı ve production ortamlarında işe yarayan pratik örnekleri ele alacağız.
Sudo Nedir ve Neden Bu Kadar Önemlidir
Sudo (superuser do), normal kullanıcıların belirli komutları root yetkisiyle çalıştırmasına olanak tanıyan bir araçtır. Ama asıl güzelliği bu değil; asıl güzelliği kimin, hangi komutu, hangi sistemde çalıştırdığını kayıt altına almasıdır. Root ile direkt bağlanıp bir şeyler yaparsanız iz bırakmak zorlaşır. Sudo kullandığınızda ise /var/log/auth.log veya /var/log/secure dosyaları her komutu kullanıcı adıyla birlikte kaydeder.
Bununla birlikte sudo, yanlış yapılandırıldığında ciddi bir güvenlik açığına dönüşür. “Tüm kullanıcılara ALL=(ALL:ALL) ALL ver” anlayışı, sudo’yu anlamsız kılar. Doğru yaklaşım en az ayrıcalık ilkesidir (principle of least privilege): Her kullanıcıya sadece işini yapması için gereken minimum yetkiyi verin.
/etc/sudoers Dosyasına Giriş
Sudoers dosyasını asla doğrudan bir metin editörüyle açmayın. Bunun yerine her zaman visudo komutunu kullanın. Visudo, dosyayı kaydetmeden önce sözdizimi kontrolü yapar ve hatalı bir yapılandırmanın sistemi kilitlemesini engeller.
# Sudoers dosyasını güvenli şekilde düzenle
sudo visudo
# Belirli bir editörle açmak için
sudo EDITOR=nano visudo
# Sözdizimini kontrol et (düzenleme yapmadan)
sudo visudo -c
Dosyanın temel sözdizimi şu şekildedir:
kullanici HOST=(RUNAS) [NOPASSWD:] KOMUTLAR
Bunu açalım:
- kullanici: Yetkinin verileceği kullanıcı adı veya %grup_adi
- HOST: Bu kuralın geçerli olduğu hostname (genellikle ALL)
- RUNAS: Komutun hangi kullanıcı adına çalıştırılacağı
- NOPASSWD: Parola istenmeyeceğini belirtir (dikkatli kullanın)
- KOMUTLAR: İzin verilen komutların tam yolu
Temel Sudoers Yapılandırması
Varsayılan bir sudoers dosyası şuna benzer:
# /etc/sudoers temel yapısı
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Root tanımı
root ALL=(ALL:ALL) ALL
# Sudo grubu üyeleri tüm komutları çalıştırabilir
%sudo ALL=(ALL:ALL) ALL
# Admin grubu (Debian/Ubuntu)
%admin ALL=(ALL) ALL
Bu varsayılan yapılandırma çoğu kurumsal ortam için yeterince kısıtlayıcı değildir. Daha granüler bir kontrol için özel kurallar yazmanız gerekir.
Gerçek Dünya Senaryoları ile Sudoers Yapılandırması
Senaryo 1: Web Sunucusu Yöneticisi
Diyelim ki bir web yöneticisi sadece Apache/Nginx servislerini yönetmeli, başka hiçbir şeye dokunmamalı.
# /etc/sudoers.d/webadmin dosyası
# Web yöneticileri için kısıtlı sudo yetkisi
# Alias tanımlamaları
User_Alias WEBADMINS = ahmet, mehmet, webteam
Cmnd_Alias WEB_CMDS = /usr/bin/systemctl start apache2,
/usr/bin/systemctl stop apache2,
/usr/bin/systemctl restart apache2,
/usr/bin/systemctl reload apache2,
/usr/bin/systemctl status apache2,
/usr/bin/systemctl start nginx,
/usr/bin/systemctl stop nginx,
/usr/bin/systemctl restart nginx,
/usr/bin/tail -f /var/log/apache2/error.log,
/usr/bin/tail -f /var/log/nginx/error.log
WEBADMINS ALL=(ALL) NOPASSWD: WEB_CMDS
Bu yapılandırmayla web yöneticileri Apache ve Nginx servislerini yönetebilir, log dosyalarını izleyebilir ama sisteme başka hiçbir müdahalede bulunamaz.
Senaryo 2: Veritabanı Yöneticisi
# /etc/sudoers.d/dba
User_Alias DBADMINS = dbuser1, dbuser2
Cmnd_Alias DB_CMDS = /usr/bin/systemctl start mysql,
/usr/bin/systemctl stop mysql,
/usr/bin/systemctl restart mysql,
/usr/bin/systemctl start postgresql,
/usr/bin/systemctl stop postgresql,
/usr/bin/systemctl restart postgresql,
/usr/bin/mysqldump,
/usr/bin/mysqlcheck
# DBA'lar belirli komutları çalıştırabilir ama parola gerekli
DBADMINS ALL=(ALL) DB_CMDS
Senaryo 3: Sistem İzleme Ekibi
İzleme ekibine okuma yetkisi verip yazma işlemlerini engelleyebilirsiniz:
# /etc/sudoers.d/monitoring
User_Alias MONITORING = nagios, zabbix, monitor_user
Cmnd_Alias MON_CMDS = /bin/cat /var/log/*,
/usr/bin/tail /var/log/*,
/bin/grep * /var/log/*,
/usr/bin/netstat,
/bin/ss,
/usr/bin/top,
/bin/ps
MONITORING ALL=(ALL) NOPASSWD: MON_CMDS
Tehlikeli Yapılandırmalar ve Kaçınılması Gerekenler
Sudoers yapılandırmasında bazı kombinasyonlar son derece tehlikelidir. Bunları bilmek, yanlışlıkla yapmanızı engeller.
Tehlikeli 1: Wildcard kullanımı
# BU YAPILANDIRMAYI KULLANMAYIN!
# Wildcard ile saldırgan istediği dosyayı okuyabilir
ahmet ALL=(ALL) /bin/cat /var/log/*
# Saldırgan şunu çalıştırabilir:
sudo cat /var/log/../../etc/shadow
Wildcard kullanırken mutlaka tam yol belirtin ve mümkünse wildcard kullanmaktan kaçının.
Tehlikeli 2: Editör yetkileri
# BU YAPILANDIRMAYI KULLANMAYIN!
ahmet ALL=(ALL) /usr/bin/vim
# vim içinden :!/bin/bash çalıştırarak root shell elde edilebilir
Tehlikeli 3: Script çalıştırma yetkisi
# Güvensiz
ahmet ALL=(ALL) /home/ahmet/scripts/*.sh
# Saldırgan scripts/ dizinine kötü amaçlı .sh dosyası koyabilir
Güvenli Sudoers Defaults Ayarları
Varsayılan değerleri güçlendirerek sudo’nun güvenlik düzeyini artırabilirsiniz:
# /etc/sudoers içinde Defaults bölümü
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Sudo oturumunun zaman aşımını 5 dakikaya düşür (varsayılan 15 dk)
Defaults timestamp_timeout=5
# Parola denemesi sayısını sınırla
Defaults passwd_tries=3
# Başarısız sudo denemelerini logla
Defaults logfile="/var/log/sudo.log"
# Her sudo komutunu loglara yaz
Defaults log_input, log_output
# TTY gerektir (bazı exploit'leri engeller)
Defaults requiretty
# Çevre değişkenlerini temizle
Defaults env_reset
Defaults env_delete += "LD_PRELOAD LD_LIBRARY_PATH"
# Belirli kullanıcı için özel timeout
Defaults:ahmet timestamp_timeout=0
timestamp_timeout=0 ayarı, her sudo komutunda parola sorulmasını sağlar. Kritik kullanıcılar için bu ayarı kullanmak mantıklıdır.
sudoers.d Dizinini Kullanmak
Tüm yapılandırmayı tek bir dosyaya yazmak yerine, modüler bir yaklaşım benimseyin. /etc/sudoers.d/ dizini bu iş için tasarlanmıştır.
# Ana sudoers dosyasında bu satırın olduğundan emin olun
@includedir /etc/sudoers.d
# Yeni bir kural dosyası oluştur
sudo visudo -f /etc/sudoers.d/webadmin
# Dosya izinlerini kontrol et (644 veya 440 olmalı)
ls -la /etc/sudoers.d/
# Dosya izinlerini düzelt
sudo chmod 440 /etc/sudoers.d/webadmin
sudo chown root:root /etc/sudoers.d/webadmin
Bu yaklaşımın avantajları:
- Her ekip veya uygulama için ayrı dosya
- Kolayca ekleyip çıkarabilirsiniz
- Configuration management araçlarıyla (Ansible, Puppet) yönetimi kolaylaşır
- Hata ayıklama daha kolay olur
Sudo Loglarını İzleme
Sudo aktivitesini izlemek, güvenlik açısından kritiktir. Kim, ne zaman, hangi komutu çalıştırdı?
# Ubuntu/Debian sistemlerde sudo logları
grep sudo /var/log/auth.log | tail -50
# RHEL/CentOS sistemlerde
grep sudo /var/log/secure | tail -50
# Belirli bir kullanıcının sudo aktivitelerini izle
grep "sudo:.*ahmet" /var/log/auth.log
# Başarısız sudo denemelerini bul
grep "sudo.*FAILED|sudo.*incorrect password" /var/log/auth.log
# Son 24 saatteki sudo komutlarını listele
grep "sudo" /var/log/auth.log | grep "$(date '+%b %e')"
Eğer /etc/sudoers içinde log_output aktif ettiyseniz, detaylı loglar için:
# Sudo loglarının tutulduğu yer (özel log ayarlandıysa)
cat /var/log/sudo.log
# Journald ile sudo loglarını görüntüle
journalctl _COMM=sudo --since "1 hour ago"
# Gerçek zamanlı sudo aktivitelerini izle
journalctl -f _COMM=sudo
Kullanıcı Sudo Yetkilerini Kontrol Etme
Hem yönetici olarak hem de kullanıcı olarak mevcut sudo yetkilerini kontrol edebilirsiniz:
# Mevcut kullanıcının sudo yetkilerini listele
sudo -l
# Belirli bir kullanıcının yetkilerini listele (root gerektirir)
sudo -l -U ahmet
# Belirli bir komutu çalıştırıp çalıştıramayacağını test et
sudo -l -U ahmet /usr/bin/systemctl
# Tüm sudoers kurallarını derle ve göster
sudo -ll
Örnek çıktı:
# sudo -l komutu çıktısı örneği
User ahmet may run the following commands on webserver01:
(ALL) NOPASSWD: /usr/bin/systemctl start apache2
(ALL) NOPASSWD: /usr/bin/systemctl stop apache2
(ALL) NOPASSWD: /usr/bin/systemctl restart apache2
Ansible ile Sudoers Yönetimi
Production ortamında onlarca sunucu varsa sudoers dosyalarını manuel yönetmek hem hataya açık hem de yorucudur. Ansible burada hayat kurtarır:
# sudoers_webadmin.yml
---
- name: Web Admin Sudo Yetkilerini Yapılandır
hosts: webservers
become: yes
tasks:
- name: webadmin sudoers dosyasını oluştur
copy:
content: |
# Web Yönetici Sudo Yetkileri
# Ansible tarafından yönetilmektedir - manuel düzenleme yapma!
User_Alias WEBADMINS = ahmet, mehmet
Cmnd_Alias WEB_CMDS = /usr/bin/systemctl start apache2,
/usr/bin/systemctl stop apache2,
/usr/bin/systemctl restart apache2
WEBADMINS ALL=(ALL) NOPASSWD: WEB_CMDS
dest: /etc/sudoers.d/webadmin
owner: root
group: root
mode: '0440'
validate: '/usr/sbin/visudo -cf %s'
- name: Sudoers dosya sözdizimini doğrula
command: visudo -c
changed_when: false
validate parametresi, dosyayı yerleştirmeden önce sözdizimi kontrolü yapar. Bu, hatalı bir yapılandırmanın sunucuya yazılmasını engeller.
Sudo ile İlgili Güvenlik Testleri
Yapılandırdıktan sonra mutlaka test edin. Hem izin verilen hem de izin verilmeyen komutları deneyin:
# İzin verilen komutu test et
sudo -u ahmet sudo /usr/bin/systemctl status apache2
# İzin verilmeyen komutu test et (hata vermeli)
sudo -u ahmet sudo /bin/bash
# Beklenen çıktı:
# Sorry, user ahmet is not allowed to execute '/bin/bash' as root on webserver01
# Sudo yetkisi olmayan işlemi kontrol et
sudo -u ahmet sudo -l /usr/bin/vim
Ayrıca penetrasyon testi amaçlı olarak GTFOBins (https://gtfobins.github.io) sitesine göz atın. Bu site, hangi komutların sudo yetkisiyle privilege escalation için kullanılabileceğini listeler. Yapılandırmanızı ona göre gözden geçirin.
Acil Durum: Sudo Yapılandırması Kilitlediyse
Eğer yanlış bir yapılandırma yaptıysanız ve sisteme erişiminiz kısıtlandıysa:
# Single-user mode'a gir (GRUB üzerinden)
# GRUB menüsünde 'e' tuşuna bas ve kernel satırına ekle:
# ... ro quiet splash
# Şunu yap:
# ... rw init=/bin/bash
# Root shell aldıktan sonra sudoers'ı düzelt
mount -o remount,rw /
visudo
# Veya sudoers.d dosyasını sil
rm /etc/sudoers.d/hatalı_dosya
# Sistemi yeniden başlat
exec /sbin/init
Bu yüzden production sistemlerde değişiklik yapmadan önce mevcut yapılandırmanın yedeğini almayı alışkanlık haline getirin:
# Değişiklik öncesi yedek al
sudo cp /etc/sudoers /etc/sudoers.backup.$(date +%Y%m%d)
sudo cp -r /etc/sudoers.d /etc/sudoers.d.backup.$(date +%Y%m%d)
Pratik Güvenlik Kontrol Listesi
Sudoers yapılandırmanızı tamamladıktan sonra şu maddeleri kontrol edin:
- Tüm kullanıcılara
ALL=(ALL:ALL) ALLverilmediğinden emin olun - Sudoers dosyalarının izinleri 440 veya 440 olmalı, başka kullanıcılar yazmamalı
visudo -ckomutuyla sözdizimi hatası olmadığını doğrulayın- Her yapılandırma dosyasının sahibi root:root olmalı
- Wildcard kullanılan yerleri gözden geçirin ve mümkünse kaldırın
- vim, nano, less, more gibi editörlere sudo yetkisi vermeyin
- Script dosyalarına sudo yetkisi vermekten kaçının
- NOPASSWD kullanımını minimum düzeyde tutun
- Sudo loglarının düzgün çalıştığını test edin
- Her değişiklikten sonra yedek alın
Sonuç
Sudo yönetimi, Linux güvenliğinin temel taşlarından biridir. “Herkese her şeyi ver” anlayışı kısa vadede kolaylık sağlasa da uzun vadede ciddi güvenlik açıkları doğurur. En az ayrıcalık ilkesini benimseyin, her kullanıcı ve servis hesabı için sadece gerçekten ihtiyaç duyulan komutlara yetki verin.
/etc/sudoers.d/ dizinini modüler yapılandırma için kullanın, değişiklikleri Ansible gibi araçlarla yönetin ve her değişiklikten önce yedek almayı ihmal etmeyin. Sudo loglarını düzenli olarak inceleyin; anormal bir aktivite fark ettiğinizde hızlı aksiyon alabilmek için log izleme otomasyonu kurun.
Güvenli bir sistem kurmak zaman alır ama bir güvenlik ihlalinin yarattığı hasarı onarmak çok daha fazla zaman ve kaynak gerektirir. Sudo yapılandırmanızı bugün gözden geçirin ve gerekli kısıtlamaları uygulayın.
