Debian’da Kullanıcı ve Sudo Yetki Yönetimi

Bir Debian sunucusunu devralırken ya da sıfırdan kurarken yapılacak ilk şeylerden biri kullanıcı ve yetki yönetimini düzgün oturtmak. Bu iş çoğu zaman göz ardı edilir, “root var, ne gerek var başka kullanıcıya” diye düşünülür. Sonra bir gün bir geliştirici yanlışlıkla /etc/passwd dosyasını eziyor ya da uygulama servisi root ile çalışıyor, saldırgan tam yetkiyle sisteme giriyor. Bu yazıda Debian üzerinde kullanıcı yönetimini, sudo yapılandırmasını ve gerçek dünyada işe yarayan pratik güvenlik yaklaşımlarını ele alacağım.

Temel Kullanıcı Yönetimi

Debian’da kullanıcı işlemleri için birkaç temel araç var. useradd daha alt seviye ve ham bir araçken, adduser Debian’a özgü bir Perl scripti olup çok daha kullanıcı dostudur. Sistem yöneticisi olarak günlük işlerde adduser tercih etmek çok daha mantıklı.

Yeni Kullanıcı Oluşturma

# Interaktif kullanıcı oluşturma (önerilen yöntem)
adduser ahmet

# Sistem kullanıcısı oluşturma (servisler için, login kabuğu olmadan)
adduser --system --no-create-home --group nginx_worker

# Belirli parametrelerle kullanıcı oluşturma
adduser --home /opt/uygulama --shell /bin/bash --ingroup developers deploy_user

adduser komutu çalıştırıldığında sırayla şifre, isim, telefon gibi bilgileri sorar. Otomasyon senaryolarında bu interaktif kısım sorun çıkarır. Bunun için --disabled-password flag’i ile kullanıcı oluşturup daha sonra chpasswd ile şifre atamak daha temiz bir yöntem.

# Şifresiz kullanıcı oluştur, sonra şifre ata
adduser --disabled-password --gecos "" mehmet
echo "mehmet:GucluSifre123!" | chpasswd

# Toplu kullanıcı oluşturma scripti
for user in ali veli deli; do
    adduser --disabled-password --gecos "" $user
    echo "$user:TempPass2024!" | chpasswd
    echo "Kullanıcı oluşturuldu: $user"
done

Kullanıcı Bilgilerini Düzenleme

# Kullanıcının kabuğunu değiştir
usermod -s /bin/zsh ahmet

# Kullanıcıyı birden fazla gruba ekle
usermod -aG sudo,docker,developers ahmet

# Kullanıcı home dizinini taşı
usermod -d /home/yeni_dizin -m ahmet

# Kullanıcı hesabını kilitle
usermod -L ahmet

# Hesabı belirli tarihe kadar kilitle (YYYY-MM-DD formatı)
usermod --expiredate 2024-12-31 ahmet

# Kullanıcı hesabını sil (home dizini dahil)
deluser --remove-home ahmet

-aG kullanımında dikkat: usermod -aG yerine usermod -G kullanırsanız, mevcut grup üyeliklerinin tamamı silinir ve sadece belirttiğiniz gruplara üye kalırsınız. Bu ciddi bir hata kaynağı, -a (append) flag’ini unutmayın.

Grup Yönetimi

# Yeni grup oluştur
groupadd developers
groupadd --gid 1500 devops

# Gruba kullanıcı ekle
gpasswd -a ahmet developers

# Gruptan kullanıcı çıkar
gpasswd -d ahmet developers

# Grubun üyelerini listele
getent group developers

# Kullanıcının üye olduğu grupları gör
groups ahmet
id ahmet

/etc/passwd, /etc/shadow ve /etc/group Dosyaları

Bu dosyaları anlamak kullanıcı sorunlarını debug etmek için kritik.

/etc/passwd dosyasındaki her satır şu formatı takip eder: kullaniciaadi:x:UID:GID:yorum:home_dizin:kabuk

Örnek bir satır: ahmet:x:1001:1001:Ahmet Yilmaz,,,:/home/ahmet:/bin/bash

İkinci alandaki x, şifrenin /etc/shadow dosyasında saklandığını gösterir. Eğer bu alan * veya ! ise kullanıcı login yapamaz.

# Belirli kullanıcının bilgilerini getir
getent passwd ahmet

# Sisteme login yapabilecek kullanıcıları listele
grep -v '/nologin|/false' /etc/passwd | cut -d: -f1

# UID 1000 üzeri normal kullanıcıları listele
awk -F: '$3 >= 1000 && $3 != 65534 {print $1, $3}' /etc/passwd

# Şifre yaşlandırma bilgilerini gör
chage -l ahmet

Sudo Yapılandırması

Sudo, Linux yetki yönetiminin kalbi. Yanlış yapılandırılmış bir sudo kurulumu, sistemi neredeyse root erişimi vermiş kadar açık hale getirebilir.

Sudoers Dosyasını Düzenleme

Asla /etc/sudoers dosyasını doğrudan nano veya vim ile düzenlemeyin. Söz dizimi hatası yaparsanız tüm sudo erişimini kaybedebilirsiniz. Her zaman visudo kullanın.

# Sudoers dosyasını güvenli şekilde düzenle
visudo

# Farklı editörle aç
EDITOR=nano visudo

# Söz dizimini doğrula (düzenlemeden önce test)
visudo -c

visudo dosyayı kaydetmeden önce söz dizimini kontrol eder ve hata varsa uyarır. Bu, üretim sistemlerinde hayat kurtarıcı bir özellik.

Temel Sudoers Söz Dizimi

# /etc/sudoers içindeki temel yapı

# Kullanıcı tüm komutları çalıştırabilir
ahmet ALL=(ALL:ALL) ALL

# Kullanıcı şifresiz sudo kullanabilir (dikkatli kullanın)
deploy_user ALL=(ALL) NOPASSWD: ALL

# Kullanıcı sadece belirli komutları çalıştırabilir
mehmet ALL=(ALL) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx

# Grup tabanlı sudo yetkisi (% işareti grup belirtir)
%developers ALL=(ALL) /usr/bin/apt, /usr/bin/systemctl

# Sudo ile başka bir kullanıcı olarak çalıştırma
ali ALL=(www-data) NOPASSWD: /usr/bin/php

/etc/sudoers.d Dizinini Kullanmak

Büyük ortamlarda /etc/sudoers dosyasını doğrudan düzenlemek kaotik hale gelir. Bunun yerine /etc/sudoers.d/ dizini altında ayrı dosyalar oluşturmak çok daha yönetilebilir.

# sudoers.d dizininde yeni kural dosyası oluştur
visudo -f /etc/sudoers.d/developers

# Dosya içeriği örneği
# /etc/sudoers.d/developers
%developers ALL=(ALL) /usr/bin/apt update, /usr/bin/apt upgrade
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart apache2

# Dosya izinlerini düzelt (kritik!)
chmod 440 /etc/sudoers.d/developers

Önemli: sudoers.d altındaki dosyalar 0440 iznine sahip olmalı. Farklı izin verilirse sudo bu dosyaları tamamen görmezden gelir ve sessizce atlar.

Gerçek Dünya Senaryosu: Geliştirici Takımı Kurulumu

Diyelim ki 5 kişilik bir geliştirici takımını sisteme ekleyeceksiniz. Bu geliştiricilerin uygulama servislerini yeniden başlatabilmesi, log dosyalarını okuyabilmesi ama sistemle ilgili kritik işlemleri yapamaması gerekiyor.

# Geliştirici grubu oluştur
groupadd developers
groupadd app_deploy

# Geliştiricileri ekle
for dev in ali veli ayse fatma mehmet; do
    adduser --disabled-password --gecos "" $dev
    usermod -aG developers $dev
    echo "Geliştirici eklendi: $dev"
done

# Deploy kullanıcısı için özel ayar
usermod -aG app_deploy ali
usermod -aG app_deploy veli

Sonra /etc/sudoers.d/developers dosyasını şöyle yapılandırın:

# /etc/sudoers.d/developers

# Tüm geliştiriciler uygulama servislerini yönetebilir
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl status myapp
%developers ALL=(ALL) NOPASSWD: /usr/bin/journalctl -u myapp

# Deploy grubundakiler ek olarak nginx'i yönetebilir
%app_deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx
%app_deploy ALL=(ALL) /usr/bin/rsync

# Paket kurma yetkisi sadece şifreyle
%developers ALL=(ALL) /usr/bin/apt-get install

Sudo Güvenlik Riskleri ve Bunlardan Kaçınma

Sudo yanlış yapılandırıldığında güvenlik duvarı yerine güvenlik deliği haline gelir. En yaygın hatalar ve çözümleri:

Tehlikeli Komutlar ve Privilege Escalation

Bazı komutlar sudo ile verildiğinde tam root erişimi sağlar, dikkatli olmak gerekir.

  • /bin/bash veya /bin/sh: Açıkça root kabuğu açar, hiçbir zaman vermeyin.
  • /usr/bin/vim veya /usr/bin/nano: Editör içinden :!bash ile root kabuğuna geçilebilir.
  • /usr/bin/python3: subprocess modülü ile herhangi bir komut çalıştırılabilir.
  • /usr/bin/find: -exec parametresiyle komut çalıştırılır.
  • /usr/bin/less veya /usr/bin/more: !bash ile kabuğa geçilebilir.
  • /usr/bin/awk: Tek başına sistem komutları çalıştırabilir.
# YANLIŞ - vim sudo ile verilmişse privilege escalation mümkün
mehmet ALL=(ALL) NOPASSWD: /usr/bin/vim /etc/hosts

# DOĞRU - belirli bir config dosyasını salt-okunur görmek için
mehmet ALL=(ALL) NOPASSWD: /usr/bin/cat /etc/nginx/nginx.conf

Sudo Log Takibi

Kim ne zaman ne komutu çalıştırmış? Bu soruyu cevaplayabilmek için sudo loglama kritik.

# Sudo loglarını görüntüle
grep sudo /var/log/auth.log | tail -50

# Belirli kullanıcının sudo aktivitelerini filtrele
grep "sudo.*ahmet" /var/log/auth.log

# Başarısız sudo girişimlerini izle
grep "sudo.*FAILED|sudo.*incorrect" /var/log/auth.log

# Journald ile izleme (systemd sistemlerde)
journalctl _COMM=sudo --since "2024-01-01" --until "today"

Eğer daha ayrıntılı loglama istiyorsanız sudoers dosyasına şunu ekleyin:

# /etc/sudoers başına ekle
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults iolog_dir="/var/log/sudo-io"

log_input ve log_output ile kullanıcının sudo altında yaptığı her şeyin kaydı tutulur. Özellikle uyumluluk gereksinimleri olan ortamlarda bu özellik çok işe yarar.

Şifre Politikası ve Hesap Güvenliği

PAM ile Şifre Politikası

Debian’da şifre politikası PAM (Pluggable Authentication Modules) üzerinden yönetilir.

# PAM şifre karmaşıklık modülünü kur
apt-get install libpam-pwquality

# /etc/pam.d/common-password dosyasını düzenle
# Bu satırı bul ve değiştir:
# password requisite pam_pwquality.so retry=3
# Şu hale getir:
password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1

Yukarıdaki parametrelerin anlamları:

  • retry=3: Şifre değiştirmede 3 deneme hakkı
  • minlen=12: Minimum 12 karakter
  • ucredit=-1: En az 1 büyük harf zorunlu
  • lcredit=-1: En az 1 küçük harf zorunlu
  • dcredit=-1: En az 1 rakam zorunlu
  • ocredit=-1: En az 1 özel karakter zorunlu

Şifre Yaşlandırma

# Kullanıcı için şifre yaşlandırma ayarla
# 90 günde bir şifre değiştirme zorunluluğu
chage -M 90 ahmet

# 7 gün önceden uyarı ver
chage -W 7 ahmet

# Son şifre değiştirme tarihini sıfırla (ilk girişte değiştirmeye zorla)
chage -d 0 ahmet

# Tüm ayarları bir arada yap
chage -M 90 -m 7 -W 14 -I 30 ahmet

# Mevcut ayarları görüntüle
chage -l ahmet

Bu parametreler şu anlama gelir:

  • -M 90: Maksimum şifre yaşı 90 gün
  • -m 7: Minimum şifre yaşı 7 gün (sık değiştirmeyi önler)
  • -W 14: 14 gün önceden uyarı başlar
  • -I 30: Şifre geçtikten 30 gün sonra hesap devre dışı bırakılır

Başarısız Giriş Denemelerinde Hesap Kilitleme

# /etc/pam.d/common-auth dosyasına ekle
auth required pam_tally2.so onerr=fail audit silent deny=5 unlock_time=900

# Kilitli hesabı manuel aç
pam_tally2 --reset --user ahmet

# Faillock kullanımı (daha modern yöntem)
# /etc/pam.d/common-auth başına ekle:
auth required pam_faillock.so preauth silent audit deny=5 unlock_time=900

# Kilidi manuel kaldır
faillock --reset --user ahmet

# Başarısız deneme sayısını kontrol et
faillock --user ahmet

SSH Anahtar Tabanlı Kimlik Doğrulama ile Entegrasyon

Sudo ile SSH anahtar yönetimini birleştirmek gerçek dünyadaki güvenli erişim modelinin temelidir.

# Kullanıcı için SSH anahtarı kur
mkdir -p /home/ahmet/.ssh
chmod 700 /home/ahmet/.ssh

# Public key'i ekle
cat id_rsa_ahmet.pub >> /home/ahmet/.ssh/authorized_keys
chmod 600 /home/ahmet/.ssh/authorized_keys
chown -R ahmet:ahmet /home/ahmet/.ssh

# Şifreli sudo ile SSH anahtarı kombinasyonu (en güvenli)
# sudoers'da:
ahmet ALL=(ALL) ALL
# SSH ile şifresiz gir, sudo için şifre gir - bu ideal denge

Servis Hesapları için En İyi Pratikler

Web uygulamaları, veritabanları, cron joblar için ayrı servis kullanıcıları oluşturmak izolasyon sağlar.

# Uygulama için servis kullanıcısı oluştur
adduser --system --home /opt/myapp --shell /usr/sbin/nologin --group myapp

# Uygulama dizini izinlerini ayarla
chown -R myapp:myapp /opt/myapp
chmod 750 /opt/myapp

# Log dizini için uygun izinler
mkdir -p /var/log/myapp
chown myapp:myapp /var/log/myapp
chmod 755 /var/log/myapp

# Systemd servis dosyasında kullanıcı belirt
# /etc/systemd/system/myapp.service içinde:
# User=myapp
# Group=myapp

Servis kullanıcılarını ayrı tutmanın avantajları:

  • Uygulama tehlikeye girerse sistem geneline erişim kısıtlı kalır
  • Log ve audit trail’de kimin ne yaptığı nettir
  • İzin yönetimi çok daha granüler olur
  • ps aux çıktısında hangi servisin çalıştığını anında görürsünüz

Pratik Kontrol Scriptleri

#!/bin/bash
# Sistem güvenlik kontrolü scripti
# /usr/local/bin/user_audit.sh olarak kaydet

echo "=== Sudo Yetkili Kullanıcılar ==="
getent group sudo | cut -d: -f4 | tr ',' 'n'

echo ""
echo "=== Son 7 Günde Sudo Kullananlar ==="
grep "sudo" /var/log/auth.log | grep "$(date -d '7 days ago' '+%b')|$(date '+%b')" | 
    grep "COMMAND" | awk '{print $5, $8, $NF}' | sort | uniq -c | sort -rn | head -20

echo ""
echo "=== Şifresi Süresi Dolmuş Kullanıcılar ==="
while IFS=: read -r user pass uid gid gecos home shell; do
    if [ $uid -ge 1000 ] && [ $uid -ne 65534 ]; then
        expiry=$(chage -l $user 2>/dev/null | grep "Password expires" | cut -d: -f2)
        echo "$user: $expiry"
    fi
done < /etc/passwd

echo ""
echo "=== Login Kabuğu Olmayan UID 0 Hesaplar ==="
awk -F: '$3 == 0 {print $1}' /etc/passwd

Sonuç

Debian’da kullanıcı ve sudo yönetimi “bir kere yapıp unut” işi değil. Sistem büyüdükçe, takım değiştikçe, uygulamalar eklendikçe bu yapının sürekli gözden geçirilmesi gerekiyor.

Özetlemek gerekirse, önem sırasına göre yapmanız gerekenler şunlar: İlk olarak kimse root ile doğrudan çalışmasın, herkesin kendi kullanıcı hesabı olsun. İkinci olarak sudo yetkilerini en az ayrıcalık prensibine göre verin, kim neye gerçekten ihtiyaç duyuyorsa sadece onu verin. Üçüncü olarak sudoers değişikliklerini her zaman visudo ile yapın ve /etc/sudoers.d/ yapısını kullanın. Dördüncü olarak sudo loglarını düzenli takip edin, beklenmedik komutlar kırmızı bayrak olabilir. Beşinci olarak servis hesaplarını ayrı tutun ve bu hesaplara login kabuğu vermeyin.

Güvenlik her zaman kolaylık ile çatışır, ama bu iki şey arasında makul bir denge kurmak mümkün. Çok kısıtlayıcı bir yapı geliştiricilerin sistem yöneticisini bypass etmelerine yol açar, çok gevşek bir yapı ise güvenlik ihlallerinin kapısını aralar. Orta yolu bulmak, ortamı iyi tanımakla başlar.

Yorum yapın