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) ALL verilmediğinden emin olun
  • Sudoers dosyalarının izinleri 440 veya 440 olmalı, başka kullanıcılar yazmamalı
  • visudo -c komutuyla 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir