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
-mseç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 ahmetkomutu hem hesabı hem ev dizinini siler - passwd: Parola yönetimi için.
sudo passwd -l ahmetile 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/nologinveya/bin/falsekullanın - Geçici hesaplara mutlaka bitiş tarihi koyun
- Gereksiz sudo yetkisi vermeyin, gerekirse
sudoersile 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.logdosyası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.