useradd Komutu ile Linux’ta Kullanıcı Oluşturma ve Yönetimi

Linux sistemlerde kullanıcı yönetimi, bir sistem yöneticisinin en temel sorumluluklarından biridir. Yeni bir çalışan işe başladığında, bir uygulama için servis hesabı oluşturmanız gerektiğinde ya da geçici bir test ortamı kurduğunuzda ilk başvurduğunuz araç useradd komutudur. Görünürde basit bir komut gibi dursa da, arkasında ciddi bir esneklik ve ince ayar yapabilme kapasitesi saklıdır. Bu yazıda useradd komutunu her yönüyle ele alacağız; temel kullanımdan ileri seviye senaryolara kadar gerçek dünyada işinize yarayacak örneklerle ilerleyeceğiz.

useradd Nedir ve Nasıl Çalışır?

useradd, Linux sistemlerde yeni kullanıcı hesapları oluşturmak için kullanılan düşük seviyeli bir komuttur. “Düşük seviyeli” derken kastettiğim şu: Bu komut, herhangi bir el tutma ya da sizi yönlendirme yapmadan tam olarak ne söylediğinizi yapan bir araçtır. Bunu adduser komutuyla karıştırmamak gerekir. adduser Debian tabanlı sistemlerde bulunan ve kullanıcıya çeşitli sorular soran, daha kullanıcı dostu bir sarmalayıcıdır. useradd ise ham, doğrudan ve betik yazımına son derece uygun bir komuttur.

Komut çalıştırıldığında arka planda şu dosyalar üzerinde değişiklikler yapılır:

  • /etc/passwd: Kullanıcı hesabı bilgilerinin tutulduğu ana dosya
  • /etc/shadow: Şifreli parola bilgilerinin saklandığı dosya
  • /etc/group: Grup üyeliklerinin yönetildiği dosya
  • /etc/gshadow: Grup parolalarının tutulduğu dosya
  • /home/kullaniciadi: Kullanıcının ev dizini (eğer -m seçeneği kullanılırsa)

Bu dosyaların yapısını anlamak, bir şeyler ters gittiğinde nerede bakmanız gerektiğini bilmenizi sağlar.

Temel Kullanım

En basit haliyle useradd şöyle kullanılır:

sudo useradd ahmet

Ancak dikkat edin: Bu komut kullanıcıyı oluşturur ama ev dizini oluşturmaz, kabuk atamaz ve parola belirlemez. Production ortamında bu kadar minimal bir kullanıcı genellikle işinize yaramaz. Gerçek dünyada kullanacağınız daha kapsamlı bir örnek şöyle görünür:

sudo useradd -m -s /bin/bash -c "Ahmet Yilmaz" -G sudo,developers ahmet

Bu komutla şunları yaptık:

  • -m: Ev dizini oluştur (/home/ahmet)
  • -s /bin/bash: Varsayılan kabuk olarak bash ata
  • -c “Ahmet Yilmaz”: Kullanıcı için açıklama ekle (GECOS alanı)
  • -G sudo,developers: Kullanıcıyı ek gruplara ekle

Kullanıcıyı oluşturduktan sonra parola belirlemeyi unutmayın:

sudo passwd ahmet

Temel Parametreler

useradd komutunun en çok kullanılan parametrelerini şöyle sıralayabiliriz:

  • -m: Kullanıcının ev dizinini oluşturur. Eğer /etc/skel dizininde şablon dosyalar varsa onları da kopyalar
  • -M: Ev dizini oluşturma (varsayılan davranışı geçersiz kılar)
  • -d /path/to/home: Özel bir ev dizini yolu belirtir
  • -s /bin/bash: Kullanıcının varsayılan kabuğunu belirler
  • -c “Aciklama”: Kullanıcı için yorum veya açıklama ekler (GECOS alanı)
  • -g grupadi: Birincil grubu belirler
  • -G grup1,grup2: Kullanıcıyı ek gruplara ekler
  • -u 1500: Belirli bir UID (kullanıcı kimlik numarası) atar
  • -e 2025-12-31: Hesap bitiş tarihi belirler (YYYY-AA-GG formatında)
  • -f 30: Parola süresi dolduktan kaç gün sonra hesabın devre dışı bırakılacağını belirler
  • -r: Sistem hesabı oluşturur (UID 1000 altında, ev dizinsiz)
  • -N: Kullanıcı adıyla aynı isimli grup oluşturma
  • -U: Kullanıcı adıyla aynı isimli grup oluştur (varsayılan davranış)
  • -D: Varsayılan değerleri görüntüler veya değiştirir
  • -p: Şifrelenmiş parola belirler (betiklerde dikkatli kullanın)
  • -k /path: Skel dizini olarak özel bir konum belirtir

Gerçek Dünya Senaryoları

Senaryo 1: Yeni Bir Geliştirici Ekibi Üyesi

Diyelim ki takımınıza yeni bir backend geliştirici katıldı ve bu kişinin sunuculara erişmesi gerekiyor. Standart bir geliştirici hesabı oluşturmak için şöyle bir yaklaşım izleyebilirsiniz:

# Önce developers grubunun var olduğundan emin olun
sudo groupadd developers

# Kullanıcıyı oluştur
sudo useradd -m 
  -s /bin/bash 
  -c "Mehmet Demir - Backend Dev" 
  -G developers,docker 
  -d /home/mdemir 
  mdemir

# Parolayı belirle
sudo passwd mdemir

# İlk girişte parola değiştirmeye zorla
sudo chage -d 0 mdemir

Son satırdaki chage -d 0 komutu, kullanıcının bir sonraki girişte parolasını mutlaka değiştirmesini zorunlu kılar. Bu, güvenlik açısından önemli bir alışkanlıktır.

Senaryo 2: Servis Hesabı Oluşturma

Uygulamalar için ayrı servis hesapları kullanmak, güvenlik açısından en iyi pratiklerden biridir. Nginx, PostgreSQL veya özel bir uygulama için servis hesabı oluştururken şu pattern’i kullanabilirsiniz:

# Servis hesabı oluştur (giriş yapamaz, ev dizini yok, sistem UID kullanır)
sudo useradd 
  -r 
  -s /sbin/nologin 
  -c "MyApp Service Account" 
  -d /opt/myapp 
  -M 
  myapp

# Uygulama dizini oluştur ve sahipliği ver
sudo mkdir -p /opt/myapp
sudo chown myapp:myapp /opt/myapp

Burada -r parametresi sistem hesabı oluşturur ve -s /sbin/nologin ile bu hesapla SSH girişi engellenir. Güvenlik açısından servis hesapları asla normal shell erişimine sahip olmamalıdır.

Senaryo 3: Toplu Kullanıcı Oluşturma Betiği

Bir şirket migrasyonu ya da yeni bir proje başlangıcında onlarca kullanıcıyı tek tek oluşturmak can sıkıcıdır. Bunun için basit bir bash betiği yazabilirsiniz:

#!/bin/bash
# kullanici_olustur.sh
# Kullanım: ./kullanici_olustur.sh kullanicilar.txt

KULLANICI_DOSYASI=$1
LOG_DOSYASI="/var/log/kullanici_olusturma.log"
VARSAYILAN_GRUP="staff"
VARSAYILAN_KABUK="/bin/bash"

if [ ! -f "$KULLANICI_DOSYASI" ]; then
    echo "Hata: Dosya bulunamadi: $KULLANICI_DOSYASI"
    exit 1
fi

while IFS=: read -r kullanici tam_ad grup; do
    # Kullanıcı zaten var mı kontrol et
    if id "$kullanici" &>/dev/null; then
        echo "[ATLA] $kullanici zaten mevcut" | tee -a "$LOG_DOSYASI"
        continue
    fi

    # Grup belirlenmemişse varsayılanı kullan
    grup=${grup:-$VARSAYILAN_GRUP}

    # Kullanıcıyı oluştur
    if sudo useradd -m -s "$VARSAYILAN_KABUK" -c "$tam_ad" -G "$grup" "$kullanici"; then
        # Geçici parola olarak kullanıcı adını ata
        echo "$kullanici:$(echo "$kullanici"123 | openssl passwd -6 -stdin)" | sudo chpasswd -e
        # İlk girişte parola değiştirmeye zorla
        sudo chage -d 0 "$kullanici"
        echo "[TAMAM] $kullanici olusturuldu" | tee -a "$LOG_DOSYASI"
    else
        echo "[HATA] $kullanici olusturulamadi" | tee -a "$LOG_DOSYASI"
    fi
done < "$KULLANICI_DOSYASI"

echo "Islem tamamlandi. Log: $LOG_DOSYASI"

Bu betik için kullanicilar.txt dosyası şu formatta olabilir:

jdoe:John Doe:developers
asmith:Alice Smith:devops
bwilson:Bob Wilson:staff

Senaryo 4: Belirli Bir Süre İçin Geçici Hesap

Stajyer veya danışman gibi geçici çalışanlar için belirli bir tarihte otomatik olarak devre dışı kalacak hesaplar oluşturabilirsiniz:

# 3 ay sonra expire olacak hesap
sudo useradd 
  -m 
  -s /bin/bash 
  -c "Stajyer - Ali Kaya" 
  -e $(date -d "+3 months" +%Y-%m-%d) 
  -G intern 
  akaya

sudo passwd akaya

# Hesap bitiş tarihini doğrula
sudo chage -l akaya

date -d "+3 months" +%Y-%m-%d komutu bugünden 3 ay sonrasının tarihini otomatik olarak hesaplar, bu sayede her seferinde tarihi elle girmek zorunda kalmazsınız.

/etc/skel Dizinini Özelleştirme

useradd -m komutu ev dizini oluştururken /etc/skel dizinindeki dosyaları kopyalar. Bu dizini özelleştirerek tüm yeni kullanıcılara otomatik olarak belirli yapılandırma dosyaları dağıtabilirsiniz:

# Şirket standart bash yapılandırması
sudo cat > /etc/skel/.bashrc << 'EOF'
# Şirket standart bashrc
export PS1='u@h:w$ '
export EDITOR=vim
export HISTSIZE=10000
export HISTTIMEFORMAT="%d/%m/%y %T "

# Yararlı alias'lar
alias ll='ls -alF'
alias la='ls -A'
alias grep='grep --color=auto'

# PATH düzenlemeleri
export PATH="$HOME/.local/bin:$PATH"
EOF

# Standart bir SSH dizini şablonu
sudo mkdir -p /etc/skel/.ssh
sudo chmod 700 /etc/skel/.ssh
sudo touch /etc/skel/.ssh/authorized_keys
sudo chmod 600 /etc/skel/.ssh/authorized_keys

# Şimdi bu yapılandırmayla kullanıcı oluştur
sudo useradd -m -s /bin/bash yenikullanici

Artık yenikullanici oluşturulduğunda otomatik olarak bu özelleştirilmiş .bashrc dosyasına sahip olacak.

Varsayılan Değerleri Anlamak ve Değiştirmek

useradd -D komutu, komutun varsayılan değerlerini gösterir:

sudo useradd -D

Çıktı şöyle bir şey olur:

GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/sh
SKEL=/etc/skel
CREATE_MAIL_SPOOL=no

Bu varsayılanlar /etc/default/useradd dosyasında saklanır. Organizasyonunuzun ihtiyaçlarına göre bu değerleri değiştirebilirsiniz:

# Varsayılan kabuğu bash olarak değiştir
sudo useradd -D -s /bin/bash

# Varsayılan parola inaktivite süresini 30 gün yap
sudo useradd -D -f 30

# Değişiklikleri doğrula
sudo useradd -D

Bu ayarı yaptıktan sonra artık her useradd komutunda -s /bin/bash belirtmenize gerek kalmaz.

Kullanıcı Bilgilerini Doğrulama

Kullanıcı oluşturduktan sonra her şeyin doğru olduğunu kontrol etmek iyi bir alışkanlıktır:

# Kullanıcı var mı?
id ahmet

# Kullanıcı bilgilerini görüntüle
getent passwd ahmet

# Grup üyeliklerini kontrol et
groups ahmet

# Parola ve hesap durumunu kontrol et
sudo chage -l ahmet

# Ev dizini ve izinleri
ls -la /home/ahmet

getent passwd ahmet komutu şöyle bir çıktı verir:

ahmet:x:1001:1001:Ahmet Yilmaz:/home/ahmet:/bin/bash

Bu satırı soldan sağa okuyunca: kullanıcı adı, parola (x = shadow’da), UID, GID, GECOS, ev dizini, kabuk.

Sık Yapılan Hatalar ve Çözümleri

Ev dizini oluşturulmadı: En yaygın sorundur. -m parametresini unutmak. Sonradan ev dizini oluşturmak için:

sudo mkhomedir_helper ahmet
# veya
sudo mkdir /home/ahmet
sudo cp -r /etc/skel/. /home/ahmet/
sudo chown -R ahmet:ahmet /home/ahmet
sudo chmod 700 /home/ahmet

UID çakışması: Özellikle farklı sistemler arasında kullanıcı taşıma yaparken UID çakışmaları olabilir. Önce kontrol edin:

# Belirli bir UID kullanımda mı?
getent passwd 1500

# Sonraki boş UID'yi bul
awk -F: '($3 >= 1000) && ($3 < 60000) {print $3}' /etc/passwd | sort -n | tail -1

Kullanıcı gruba eklenemiyor: Grup mevcut değilse önce grubu oluşturmanız gerekir:

# Grup var mı kontrol et
getent group developers

# Yoksa oluştur
sudo groupadd developers

# Sonra kullanıcıyı oluştur
sudo useradd -m -G developers yenikullanici

useradd ile Birlikte Kullanılan Komutlar

useradd tek başına bir ekosistem oluşturmaz. Kullanıcı yönetiminin tam resmini görmek için şu komutları da bilmeniz gerekir:

  • usermod: Mevcut kullanıcı özelliklerini değiştirmek için. Örneğin gruba sonradan eklemek: sudo usermod -aG docker ahmet
  • userdel: Kullanıcı silmek için. sudo userdel -r ahmet komutu hem hesabı hem ev dizinini siler
  • passwd: Parola yönetimi için. sudo passwd -l ahmet ile hesabı kilitleyebilirsiniz
  • chage: Parola yaşlandırma politikalarını yönetmek için
  • id: Kullanıcı ve grup bilgilerini görüntülemek için
  • getent: NSS veritabanlarını sorgulamak için

Güvenlik İpuçları

Kullanıcı oluştururken aklınızda bulundurmanız gereken bazı güvenlik pratikleri:

  • Servis hesapları için her zaman /sbin/nologin veya /bin/false kullanın
  • Geçici hesaplara mutlaka bitiş tarihi koyun
  • Gereksiz sudo yetkisi vermeyin, gerekirse sudoers ile komut bazlı kısıtlama yapın
  • Yeni kullanıcıların ilk girişte parola değiştirmesini zorunlu kılın
  • Kullanıcı oluşturma işlemlerini logla; /var/log/auth.log dosyasını düzenli kontrol edin
  • UID ve GID değerlerini sistemler arasında tutarlı tutun; NFS ve LDAP ortamlarında bu kritiktir

Sonuç

useradd komutu, ilk bakışta basit görünen ama gerçekte çok katmanlı bir araçtır. Doğru parametrelerle kullandığınızda kullanıcı oluşturma sürecinizi hem güvenli hem de tekrarlanabilir hale getirirsiniz. Bu yazıda anlattıklarımı özetlemek gerekirse: her zaman -m ile ev dizini oluşturun, servis hesaplarına -s /sbin/nologin ekleyin, geçici hesaplara -e ile bitiş tarihi verin ve toplu işlemler için mutlaka betik yazın.

Gerçek dünya ortamlarında bu komutları LDAP, Active Directory veya Ansible gibi araçlarla entegre edebilirsiniz. Ancak temeli sağlam atmadan üst katmanlara geçmek, bir gün sizi sıkıştırabilir. useradd ve çevresindeki araçları iyi kavramak, daha büyük sistemleri anlamanın sağlam bir başlangıç noktasıdır.

Yorum yapın