Sistem yöneticiliğinde en sık yapılan işlemlerin başında kullanıcı yönetimi gelir. Linux ortamında yeni bir çalışan işe girdiğinde, bir servis hesabı oluşturmanız gerektiğinde ya da bir uygulamanın kendi kullanıcısına ihtiyaç duyduğunda, bu işlemleri hızlı ve doğru yapabilmek kritik önem taşır. Yanlış yapılandırılmış bir kullanıcı hesabı güvenlik açığına dönüşebilir, eksik grup üyeliği ise saatlerce süren sorun giderme seanslarına yol açabilir. Bu yazıda Linux’ta kullanıcı eklemenin tüm detaylarını, gerçek dünya senaryolarıyla birlikte ele alacağız.
useradd ve adduser Arasındaki Fark
Pek çok yeni sistem yöneticisi bu iki komutu birbirine karıştırır. useradd, düşük seviyeli bir ikili dosyadır ve tüm Linux dağıtımlarında bulunur. adduser ise Debian tabanlı sistemlerde Perl ile yazılmış, useradd’ı saran daha kullanıcı dostu bir betiktir.
Red Hat, CentOS, Rocky Linux gibi dağıtımlarda adduser aslında useradd’ın bir sembolik bağlantısıdır. Debian, Ubuntu gibi sistemlerde ise adduser size interaktif sorular sorarak kullanıcıyı adım adım oluşturur.
Üretim ortamında, özellikle betikler yazarken her zaman useradd kullanmanızı öneririm. Davranışı öngörülebilirdir ve tüm dağıtımlarda tutarlı çalışır.
Temel Kullanıcı Oluşturma
En basit haliyle kullanıcı eklemek tek satırlık bir işlemdir:
useradd ahmet
Ancak bu komut tek başına pek de kullanışlı değildir. Ev dizini oluşturmaz (bazı dağıtımlarda), kabuk atamaz ve kullanıcı hakkında hiçbir meta bilgi içermez. Gerçek dünyada kullanacağınız komut çok daha kapsamlı olacaktır:
useradd -m -s /bin/bash -c "Ahmet Yilmaz - Yazilim Gelistirici" -G sudo,docker ahmet
Bu komuttaki parametreleri açıklayalım:
- -m: Ev dizinini oluştur (/home/ahmet)
- -s /bin/bash: Varsayılan kabuğu bash olarak ayarla
- -c “…”: Kullanıcı hakkında açıklama (GECOS alanı)
- -G sudo,docker: Kullanıcıyı bu gruplara ekle
- ahmet: Kullanıcı adı
Kullanıcıyı oluşturduktan sonra mutlaka parola belirlemeniz gerekir:
passwd ahmet
Ya da betik içinde sessiz parola atamak için:
echo "ahmet:GucluParola123!" | chpasswd
/etc/passwd, /etc/shadow ve /etc/group Dosyalarını Anlamak
Kullanıcı oluşturduğunuzda Linux sisteminde üç temel dosya güncellenir. Bunları anlamak, sorun giderme süreçlerinde size çok yardımcı olur.
/etc/passwd dosyasında her kullanıcı için bir satır bulunur:
cat /etc/passwd | grep ahmet
# ahmet:x:1001:1001:Ahmet Yilmaz - Yazilim Gelistirici:/home/ahmet:/bin/bash
Bu satırdaki alanlar sırasıyla şunlardır: kullanıcı adı, parola yeri (x işareti shadow kullanıldığını gösterir), UID, GID, GECOS, ev dizini ve kabuk.
/etc/shadow dosyası gerçek parola hash’ini tutar ve sadece root okuyabilir:
sudo cat /etc/shadow | grep ahmet
/etc/group dosyası ise grup üyeliklerini barındırır:
cat /etc/group | grep ahmet
UID ve GID Yönetimi
Kurumsal ortamlarda, özellikle NFS veya LDAP kullandığınızda UID/GID tutarlılığı hayati öneme sahiptir. Farklı sunuculardaki aynı kullanıcının farklı UID’lere sahip olması, dosya erişim sorunlarına yol açar.
Belirli bir UID ile kullanıcı oluşturmak için:
useradd -m -u 2001 -g 2001 -s /bin/bash -c "Mehmet Kaya - DBA" mehmet
Mevcut UID aralığını kontrol etmek ve boş UID bulmak için küçük bir betik işinize yarar:
#!/bin/bash
# Kullanilmayan ilk UID'yi bul (1000-60000 arasinda)
for uid in $(seq 1000 60000); do
if ! getent passwd $uid > /dev/null 2>&1; then
echo "Kullanilabilir UID: $uid"
break
fi
done
Sistem Kullanıcıları ve Servis Hesapları
Her uygulama için ayrı bir sistem kullanıcısı oluşturmak güvenlik açısından en iyi pratiktir. Nginx, PostgreSQL, Redis gibi servisler kendi kullanıcılarıyla çalışmalıdır. Bu kullanıcıların interaktif girişe ihtiyacı yoktur.
# Sistem kullanicisi olustur (giris yapamaz, ev dizini yok)
useradd -r -s /sbin/nologin -c "Nginx Servis Hesabi" nginx-app
# Ya da ev diziniyle ama yine de giris yapamaz
useradd -r -m -d /opt/myapp -s /sbin/nologin -c "MyApp Servis Hesabi" myapp
Buradaki -r parametresi kullanıcıyı sistem kullanıcısı olarak işaretler ve UID’sini sistem UID aralığından (genellikle 1-999) seçer.
/sbin/nologin kabuğu atanan kullanıcılar SSH ile giriş yapmaya çalıştıklarında kibarca reddedilir. Bu, uygulama hesaplarının ele geçirilmesi durumunda saldırganın interaktif bir kabuk elde etmesini engeller.
Gerçek Dünya Senaryosu: Yeni Geliştirici Onboarding Betiği
Bir şirkete 5 yeni geliştirici katıldığını düşünelim. Her birinin standart yapılandırmaya ihtiyacı var: sudo erişimi, docker grubu, SSH anahtar dizini ve bazı temel konfigürasyon dosyaları. Bunu tek tek yapmak yerine bir betik yazalım:
#!/bin/bash
# Gelistirici hesabi olusturma betigi
# Kullanim: ./create_dev_user.sh kullanici_adi "Ad Soyad" email
set -euo pipefail
KULLANICI=$1
AD_SOYAD=$2
EMAIL=$3
VARSAYILAN_GRUPLAR="sudo,docker,git"
LOG_DOSYASI="/var/log/kullanici_olusturma.log"
if [ "$EUID" -ne 0 ]; then
echo "Bu betik root olarak calistirilmalidir!"
exit 1
fi
if id "$KULLANICI" &>/dev/null; then
echo "HATA: $KULLANICI kullanicisi zaten mevcut!"
exit 1
fi
echo "$(date): $KULLANICI hesabi olusturuluyor..." | tee -a $LOG_DOSYASI
# Kullaniciy olustur
useradd -m -s /bin/bash
-c "$AD_SOYAD <$EMAIL>"
-G "$VARSAYILAN_GRUPLAR"
"$KULLANICI"
# SSH dizinini hazirla
mkdir -p /home/$KULLANICI/.ssh
chmod 700 /home/$KULLANICI/.ssh
chown $KULLANICI:$KULLANICI /home/$KULLANICI/.ssh
# Bos authorized_keys dosyasi olustur
touch /home/$KULLANICI/.ssh/authorized_keys
chmod 600 /home/$KULLANICI/.ssh/authorized_keys
chown $KULLANICI:$KULLANICI /home/$KULLANICI/.ssh/authorized_keys
# Gecici parola olustur ve kullaniciya ilk giriste degistirmesini zorla
GECICI_PAROLA=$(openssl rand -base64 12)
echo "$KULLANICI:$GECICI_PAROLA" | chpasswd
chage -d 0 $KULLANICI
echo "$(date): $KULLANICI hesabi basariyla olusturuldu." | tee -a $LOG_DOSYASI
echo "Gecici parola: $GECICI_PAROLA"
echo "Kullanici ilk giriste parolasini degistirmek zorunda kalacak."
Bu betiği kullanmak son derece basit:
chmod +x create_dev_user.sh
sudo ./create_dev_user.sh ahmet "Ahmet Yilmaz" [email protected]
Kullanıcı Bilgilerini Değiştirme: usermod
Kullanıcı oluşturulduktan sonra çeşitli bilgilerini değiştirmeniz gerekebilir. Bu işlem için usermod komutunu kullanırız.
# Kullaniciya ek grup ekle (-a olmadan -G tum gruplari sifirlar, dikkat!)
usermod -aG wheel,developers ahmet
# Kullanicinin kabuğunu degistir
usermod -s /bin/zsh ahmet
# Ev dizinini tasiy ve yeni dizin olustur
usermod -m -d /home/yeni_ahmet ahmet
# Kullanici adini degistir
usermod -l yeni_ad eski_ad
# Hesabi kilitle
usermod -L ahmet
# Hesabi ac
usermod -U ahmet
-aG parametresindeki -a (append) son derece önemlidir. Sadece -G kullanırsanız, mevcut grup üyeliklerini silersiniz ve kullanıcı yalnızca belirttiğiniz gruplarda kalır. Bu hatayı ben de ilk yıllarda yapmıştım, bir kullanıcının sudo erişimi ortadan kalkmıştı ve neden giriş yapamadığını anlamak biraz zaman almıştı.
Parola Politikaları ve Hesap Süresi
Kurumsal ortamlarda parola politikaları kritik güvenlik gereksinimlerinden biridir. chage komutu parola yaşlandırma ayarlarını yönetmenizi sağlar:
# Parola bilgilerini goruntule
chage -l ahmet
# Parola gecerlilik suresi: 90 gun
chage -M 90 ahmet
# Minimum parola suresi: 7 gun (kullanicinin hemen degistirmesini engeller)
chage -m 7 ahmet
# Parola suresi dolmadan 14 gun once uyari ver
chage -W 14 ahmet
# Hesap son kullanma tarihi belirle (gecici calisanlar icin)
chage -E 2024-12-31 ahmet
# Hesabi hemen devre disi birak (parola suresi dolmus sayilir)
chage -d 0 ahmet
Parola karmasıklık kuralları için PAM modüllerini kullanmanız gerekir. pam_pwquality modülü bu işi yapar:
# /etc/security/pwquality.conf dosyasini duzenle
sudo nano /etc/security/pwquality.conf
Dosyaya eklenecek temel ayarlar:
# Minimum uzunluk
minlen = 12
# En az bir buyuk harf
ucredit = -1
# En az bir kucuk harf
lcredit = -1
# En az bir rakam
dcredit = -1
# En az bir ozel karakter
ocredit = -1
# Son 5 paroladan farkli olmali
remember = 5
Toplu Kullanıcı Oluşturma: newusers Komutu
Onlarca kullanıcıyı bir anda oluşturmanız gerektiğinde newusers komutu hayat kurtarır. Bu komut, /etc/passwd formatında bir dosya okuyarak kullanıcıları toplu oluşturur:
# kullanicilar.txt dosyasini hazirla
# format: kullanici:parola:uid:gid:gecos:ev_dizini:kabuk
cat > /tmp/yeni_kullanicilar.txt << 'EOF'
zeynep:Parola123!:2010:2010:Zeynep Arslan:/home/zeynep:/bin/bash
can:Parola123!:2011:2011:Can Demir:/home/can:/bin/bash
elif:Parola123!:2012:2012:Elif Sahin:/home/elif:/bin/bash
EOF
# Toplu olustur
sudo newusers /tmp/yeni_kullanicilar.txt
# Dosyayi hemen sil (icinde parola var!)
shred -u /tmp/yeni_kullanicilar.txt
Dosyayı kullandıktan sonra shred ile silmek önemlidir, çünkü içinde açık metin parolalar bulunur.
Kullanıcı Şablonları: /etc/skel Dizini
Her yeni kullanıcı oluşturulduğunda /etc/skel dizininin içeriği kullanıcının ev dizinine kopyalanır. Bu dizini özelleştirerek tüm yeni kullanıcılara standart bir başlangıç yapılandırması sağlayabilirsiniz:
# /etc/skel dizinini gor
ls -la /etc/skel
# Ornek: Tum kullanicilara .bashrc eklentisi
cat >> /etc/skel/.bashrc << 'EOF'
# Sirket standart ayarlari
export HISTSIZE=10000
export HISTTIMEFORMAT="%F %T "
alias ll='ls -alFh'
alias grep='grep --color=auto'
# Proxy ayarlari (gerekirse)
# export http_proxy="http://proxy.sirket.com:8080"
EOF
# Ornek: Standart bin dizini olustur
mkdir /etc/skel/bin
mkdir /etc/skel/.config
# Artik bu dosyalarla olusturulan kullanicilar otomatik bu yapiya sahip olur
useradd -m -s /bin/bash yeni_kullanici
Kullanıcı Doğrulama ve Sorun Giderme
Bir kullanıcı neden giriş yapamıyor? Bu soruyu yanıtlamak için kullanacağınız komutlar:
# Kullanicinin mevcut durumunu kontrol et
id ahmet
getent passwd ahmet
getent shadow ahmet
# Hesap kilitli mi?
passwd -S ahmet
# Cikti ornegi: ahmet L 2024-01-15 0 99999 7 -1 (L = Locked)
# Parola suresi dolmus mu?
chage -l ahmet
# Grup uyeliglerini kontrol et
groups ahmet
# Son giris bilgileri
last ahmet
lastlog -u ahmet
# Basarisiz giris denemeleri
lastb ahmet 2>/dev/null || grep ahmet /var/log/auth.log | tail -20
Gerçek bir senaryo: Bir geliştirici “sudo: ahmet is not in the sudoers file” hatası alıyordu. Sorun şuydu:
# Hatali kullanim - mevcut gruplari sifirladi!
usermod -G docker ahmet
# Dogru kullanim - mevcut gruplara ekledi
usermod -aG sudo ahmet
# Kontrol
groups ahmet
Kullanıcının tekrar giriş yapması ya da şu komutu çalıştırması gerekir:
# Yeni grup uyeligini aninda aktifles
newgrp sudo
# Ya da oturumu kapat/ac
useradd Varsayılan Ayarlarını Yapılandırma
/etc/default/useradd ve /etc/login.defs dosyaları useradd’ın varsayılan davranışını belirler. Bu dosyaları kurumunuzun standartlarına göre düzenlemek, tutarlı kullanıcı oluşturma süreçleri sağlar:
# Mevcut varsayilanlari goster
useradd -D
# /etc/default/useradd icerigi
cat /etc/default/useradd
Bu dosyada yapabileceğiniz önemli ayarlar:
# /etc/default/useradd
GROUP=100
HOME=/home
INACTIVE=30 # Parola suresinden 30 gun sonra hesabi devre disi birak
EXPIRE= # Hesap son kullanma tarihi (bos = suresiz)
SHELL=/bin/bash # Varsayilan kabuk
SKEL=/etc/skel # Skel dizini
CREATE_MAIL_SPOOL=no
/etc/login.defs dosyasındaki kritik ayarlar:
# UID araliklari
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
# Parola politikalari
PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
# Umask
UMASK 027
Kullanıcı Silme: userdel
Bir çalışan şirketten ayrıldığında hesabı nasıl ele alacağınız önemli bir karardır. Hemen silmek yerine genellikle önce kilitlemek, ardından belirli bir süre bekledikten sonra silmek daha güvenli bir yaklaşımdır:
# Adim 1: Hesabi kilitle
usermod -L ahmet
chage -E 1 ahmet # 1970-01-02, yani gecmis bir tarih = hesap devre disi
# Adim 2: Aktif oturumları sonlandir
pkill -u ahmet
loginctl terminate-user ahmet
# Adim 3: (30 gun sonra) Ev diziniyle birlikte sil
userdel -r ahmet
# Adim 4: Sahipsiz dosyalari kontrol et
find / -nouser -o -nogroup 2>/dev/null | head -20
-r parametresi ev dizinini ve mail spool’unu siler. Bunu yapmadan önce kullanıcının dosyalarını yedeklediğinizden emin olun:
# Once yedekle
tar -czf /backup/ahmet_$(date +%Y%m%d).tar.gz /home/ahmet/
# Sonra sil
userdel -r ahmet
Active Directory ve LDAP Entegrasyonu ile Kullanıcı Yönetimi
Kurumsal ortamlarda Linux sunucularını Active Directory ile entegre etmek, merkezi kullanıcı yönetimi sağlar. realmd ve sssd bu entegrasyonu kolaylaştırır:
# Realm kesfet
realm discover sirket.com
# AD'ye katil
realm join -U Administrator sirket.com
# AD kullanicisinin Linux'a girebilmesi icin izin ver
realm permit [email protected]
# Tum AD kullanicilarına izin ver
realm permit --all
# Mevcut durumu kontrol et
realm list
# AD kullanicisini test et
id [email protected]
getent passwd [email protected]
SSSD yapılandırması /etc/sssd/sssd.conf dosyasından yönetilir. Yerel kullanıcı oluşturmaya gerek kalmadan AD hesaplarıyla giriş yapılabilir.
Kullanıcı Denetim ve Raporlama
Hangi kullanıcıların sisteminizde olduğunu, hangilerinin aktif olduğunu düzenli olarak denetlemek güvenlik açısından önemlidir:
#!/bin/bash
# Kullanici denetim raporu
echo "=== SISTEM KULLANICI RAPORU ==="
echo "Olusturulma tarihi: $(date)"
echo ""
echo "--- Normal Kullanicilar (UID >= 1000) ---"
awk -F: '$3 >= 1000 && $3 < 65534 {print $1, "UID:"$3, "Kabuk:"$7}' /etc/passwd
echo ""
echo "--- Son 30 Gunde Giris Yapmayanlar ---"
for kullanici in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
son_giris=$(lastlog -u $kullanici | tail -1 | awk '{print $4, $5, $6, $9}')
if echo "$son_giris" | grep -q "Never"; then
echo "$kullanici: Hic giris yapmamis"
fi
done
echo ""
echo "--- Sudo Grubundaki Kullanicilar ---"
getent group sudo wheel 2>/dev/null | awk -F: '{print $1": "$4}'
echo ""
echo "--- Kilili Hesaplar ---"
awk -F: '$3 >= 1000 {print $1}' /etc/passwd | while read u; do
passwd -S $u 2>/dev/null | grep -q " L " && echo "$u: KILILI"
done
Sonuç
Linux kullanıcı yönetimi, sysadmin’in temel taşlarından biridir. Basit görünen useradd komutunun ardında güvenlik, tutarlılık ve otomasyon açısından göz önünde bulundurmanız gereken onlarca detay bulunur.
Özet olarak dikkat etmeniz gereken kritik noktalar:
- Servis hesapları için her zaman -r ve /sbin/nologin kombinasyonunu kullanın
- usermod -G yerine her zaman usermod -aG tercih edin
- /etc/skel dizinini kurumsal standartlarınıza göre özelleştirin
- Parola politikalarını /etc/login.defs ve PAM üzerinden merkezi yönetin
- Kullanıcı silerken önce kilitle, yedekle, sonra sil prensibini uygulayın
- Büyük ortamlarda LDAP/AD entegrasyonu yerel kullanıcı yönetiminden çok daha verimlidir
- Denetim betiklerini düzenli çalıştırarak sahipsiz hesapları tespit edin
Bu komutları ve yaklaşımları günlük iş akışınıza entegre ettiğinizde, kullanıcı yönetimi artık vakit alan bir görev olmaktan çıkıp saniyeler içinde halledilebilen rutin bir işleme dönüşecektir.