Sistem yöneticiliğinin belki de en kritik sorumluluklarından biri kullanıcı şifrelerini düzgün yönetmektir. Yanlış yapılandırılmış bir şifre politikası, sistemin kapısını ardına kadar açık bırakmak anlamına gelir. passwd komutu, bu sorumluluğun merkezinde yer alır ve göründüğünden çok daha fazla özellik sunar. Basit bir şifre değiştirme aracı gibi görünse de güvenlik politikaları uygulamak, hesapları kilitlemek ve şifre yaşam döngüsünü yönetmek için güçlü bir araçtır.
passwd Komutu Nedir ve Nasıl Çalışır?
passwd komutu, Linux sistemlerinde kullanıcı şifrelerini yönetmek için kullanılan temel araçtır. Normal bir kullanıcı bu komutu yalnızca kendi şifresini değiştirmek için kullanabilirken, root veya sudo yetkisine sahip bir yönetici tüm kullanıcıların şifrelerini yönetebilir, hesapları kilitleyebilir veya şifre politikalarını uygulayabilir.
Şifre bilgileri /etc/shadow dosyasında şifrelenmiş olarak saklanır. Eski sistemlerde /etc/passwd dosyasında tutulurdu, ancak güvenlik gerekçesiyle bu bilgiler shadow dosyasına taşındı. /etc/passwd artık yalnızca kullanıcı hesap bilgilerini içerir, şifre alanında genellikle x karakteri görürsünüz, bu da gerçek şifrenin shadow dosyasında olduğunu belirtir.
# /etc/shadow dosyasından bir satır örneği
ahmet:$6$rounds=5000$tuz_degeri$sifrelenmis_hash:19000:0:90:7:::
Bu satırdaki alanlar sırasıyla kullanıcı adı, şifrelenmiş hash, son değişiklik tarihi (epoch’tan gün olarak), minimum yaş, maksimum yaş, uyarı günü, pasif süre ve hesap bitiş tarihini temsil eder.
Temel Kullanım
En basit haliyle passwd komutunu parametresiz çalıştırdığınızda mevcut kullanıcının şifresini değiştirirsiniz:
passwd
Sistem eski şifrenizi sorar, ardından yeni şifreyi iki kez girmenizi ister. Root olarak başka bir kullanıcının şifresini değiştirmek için:
sudo passwd ahmet
Root olduğunuzda eski şifre sorulmaz, doğrudan yeni şifreyi girebilirsiniz. Bu, kullanıcı şifresini unuttuğunda işe yarar ama aynı zamanda büyük bir sorumluluk gerektirir.
Önemli Parametreler
-l (lock): Kullanıcı hesabını kilitler. Shadow dosyasındaki hash’in başına ! işareti ekler, bu da şifrenin geçersiz hale gelmesini sağlar.
-u (unlock): Kilitlenmiş hesabı açar. -l ile eklenen ! işaretini kaldırır.
-d (delete): Kullanıcının şifresini siler, hesabı şifresiz bırakır. Güvenlik açısından tehlikeli, sadece özel durumlarda kullanın.
-e (expire): Şifreyi hemen sona erdirir. Kullanıcı bir sonraki girişte şifresini değiştirmek zorunda kalır.
-n (mindays): Şifrenin değiştirilebilmesi için gereken minimum gün sayısını ayarlar.
-x (maxdays): Şifrenin geçerli olduğu maksimum gün sayısını belirler.
-w (warndays): Şifre süresi dolmadan kaç gün önce uyarı verileceğini ayarlar.
-i (inactive): Şifre süresi dolduktan sonra hesabın kaç gün aktif kalacağını belirler.
-S (status): Hesabın şifre durumunu gösterir.
--stdin: Şifreyi standart girdiden okur. Otomasyon scriptlerinde kullanışlıdır (bazı dağıtımlarda desteklenmeyebilir).
Hesap Kilitleme ve Açma
Güvenlik olaylarında veya çalışan işten ayrıldığında hesabı hızla kilitlemek kritik önem taşır:
# Hesabı kilitle
sudo passwd -l mehmet
# Kilit durumunu kontrol et
sudo passwd -S mehmet
# Çıktı: mehmet L 2024-01-15 0 90 7 -1 (Locked)
# Hesabı tekrar aç
sudo passwd -u mehmet
Kilitleme işleminin nasıl çalıştığını shadow dosyasından görebilirsiniz:
# Kilitlemeden önce
sudo grep mehmet /etc/shadow
# mehmet:$6$abc123...:19000:0:90:7:::
# Kilitledikten sonra
sudo grep mehmet /etc/shadow
# mehmet:!$6$abc123...:19000:0:90:7:::
Başındaki ! işareti hesabın kilitli olduğunu gösterir. Önemli bir not: passwd -l ile kilitleme SSH anahtar tabanlı girişi engellemez. Bunu da engellemek istiyorsanız usermod -s /sbin/nologin veya usermod -e 1 komutlarını da kullanmanız gerekir.
# Tam anlamıyla hesabı devre dışı bırakmak için
sudo passwd -l mehmet
sudo usermod -s /sbin/nologin mehmet
Şifre Politikaları Uygulamak
Gerçek bir sysadmin senaryosu düşünelim: Kurumsal bir ortamda 50 kullanıcınız var ve tüm kullanıcıların şifrelerinin 90 günde bir yenilenmesini, şifre değiştirildikten sonra en az 7 gün beklemeden tekrar değiştirilememesini, süresi dolmadan 14 gün önce uyarı almasını istiyorsunuz.
# Tek bir kullanıcı için şifre politikası ayarla
sudo passwd -n 7 -x 90 -w 14 ahmet
# Mevcut durumu kontrol et
sudo passwd -S ahmet
# ahmet P 2024-01-15 7 90 14 -1 (Password set, SHA512 crypt.)
Tüm mevcut kullanıcılara bu politikayı uygulamak için bir script yazabilirsiniz:
#!/bin/bash
# Tüm normal kullanıcılara şifre politikası uygula
# UID 1000 ve üzeri olan hesaplar normal kullanıcılardır
for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
echo "Politika uygulanıyor: $user"
sudo passwd -n 7 -x 90 -w 14 -i 30 "$user"
done
echo "Tüm kullanıcılara şifre politikası uygulandı."
Şifreyi Zorla Sona Erdirme
Güvenlik ihlali şüphesi varsa veya tüm kullanıcıların bir sonraki girişte şifrelerini değiştirmesini istiyorsanız:
# Tek kullanıcı için şifreyi hemen sona erdir
sudo passwd -e ahmet
# Birden fazla kullanıcı için
for user in ahmet mehmet fatma; do
sudo passwd -e "$user"
echo "$user kullanıcısının şifresi sona erdirildi."
done
Kullanıcı bir sonraki SSH veya konsol girişinde şu mesajla karşılaşacak:
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for ahmet.
Current password:
Otomasyon Senaryoları
Script’lerde interaktif olmayan şifre değiştirme ihtiyacınız olabilir. Bunun için birkaç yöntem var:
# chpasswd komutu ile toplu şifre değiştirme
echo "ahmet:yeni_sifre_123" | sudo chpasswd
# Birden fazla kullanıcı için
sudo chpasswd << EOF
ahmet:Ahmet2024!
mehmet:Mehmet2024!
fatma:Fatma2024!
EOF
Bazı sistemlerde passwd --stdin de çalışır:
# RedHat/CentOS tabanlı sistemlerde
echo "yeni_sifre" | sudo passwd --stdin ahmet
Yeni kullanıcı oluşturup şifre atayan bir script:
#!/bin/bash
# Yeni kullanıcı oluştur ve şifre belirle
KULLANICI=$1
SIFRE=$2
if [ -z "$KULLANICI" ] || [ -z "$SIFRE" ]; then
echo "Kullanim: $0 <kullanici_adi> <sifre>"
exit 1
fi
# Kullaniciyi olustur
sudo useradd -m -s /bin/bash "$KULLANICI"
# Sifreyi ata
echo "$KULLANICI:$SIFRE" | sudo chpasswd
# Sifre politikasini uygula
sudo passwd -n 7 -x 90 -w 14 "$KULLANICI"
# Ilk girisde sifre degistirmeye zorla
sudo passwd -e "$KULLANICI"
echo "$KULLANICI kullanicisi olusturuldu ve sifre politikasi uygulandı."
Şifre Durumunu İzleme
Sisteminizdeki şifre durumlarını düzenli kontrol etmek iyi bir alışkanlıktır:
# Tüm kullanıcıların şifre durumunu listele
sudo for user in $(awk -F: '$3 >= 1000 && $3 < 65534 {print $1}' /etc/passwd); do
sudo passwd -S "$user"
done
# Süresi dolmuş veya yakında dolacak şifreleri bul
sudo awk -F: '
{
if ($5 != "" && $5 != "99999" && $5 > 0) {
today = systime() / 86400
expire_day = $3 + $5
days_left = expire_day - today
if (days_left < 14 && days_left > 0) {
print $1 " - " days_left " gün kaldı"
} else if (days_left <= 0) {
print $1 " - Süresi dolmuş!"
}
}
}' /etc/shadow
chage Komutu ile Birlikte Kullanım
passwd ile birlikte chage komutu da şifre politikası yönetiminde sıkça kullanılır. İkisi birbirini tamamlar:
# chage ile mevcut politikayı görüntüle
sudo chage -l ahmet
# Çıktı şöyle görünür:
# Last password change : Jan 15, 2024
# Password expires : Apr 14, 2024
# Password inactive : never
# Account expires : never
# Minimum number of days between password change : 7
# Maximum number of days between password change : 90
# Number of days of warning before password expires : 14
# chage ile hesap bitiş tarihi belirle
sudo chage -E 2024-12-31 ahmet
# Belirli bir tarihten sonra şifreyi geçersiz kıl
sudo chage -M 60 -W 7 -I 14 ahmet
Gerçek Dünya Senaryosu: Güvenlik İhlali Sonrası Müdahale
Diyelim ki sunucunuzda şüpheli bir aktivite fark ettiniz ve bir kullanıcı hesabının ele geçirilmiş olabileceğini düşünüyorsunuz. İşte adım adım müdahale süreci:
#!/bin/bash
# Güvenlik müdahale scripti
SUPHE_LI_KULLANICI="ahmet"
echo "=== Güvenlik Müdahalesi Başlıyor ==="
# 1. Hesabı hemen kilitle
sudo passwd -l "$SUPHE_LI_KULLANICI"
echo "[+] Hesap kilitlendi: $SUPHE_LI_KULLANICI"
# 2. Shell erişimini kapat
sudo usermod -s /sbin/nologin "$SUPHE_LI_KULLANICI"
echo "[+] Shell erişimi kapatıldı"
# 3. Aktif oturumları sonlandır
sudo pkill -u "$SUPHE_LI_KULLANICI"
echo "[+] Aktif oturumlar sonlandırıldı"
# 4. Son giriş bilgilerini kaydet
echo "[*] Son giriş bilgileri:"
sudo last "$SUPHE_LI_KULLANICI" | head -5
# 5. Durum kontrolü
sudo passwd -S "$SUPHE_LI_KULLANICI"
echo "=== Müdahale Tamamlandı ==="
Hesabı tekrar aktif etmek gerektiğinde:
# Hesabı temizle ve yeniden aktif et
sudo passwd -u ahmet
sudo usermod -s /bin/bash ahmet
# Yeni güçlü şifre ata ve hemen değiştirmeye zorla
echo "ahmet:GeciciSifre!2024" | sudo chpasswd
sudo passwd -e ahmet
echo "Hesap yeniden aktif edildi, kullanıcı ilk girişte şifre değiştirmek zorunda."
/etc/login.defs ile Sistem Geneli Politikalar
Bireysel kullanıcı ayarlarının yanı sıra sistem genelinde varsayılan şifre politikalarını /etc/login.defs dosyasından yapılandırabilirsiniz:
# /etc/login.defs içindeki önemli parametreler
sudo grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_WARN_AGE" /etc/login.defs
# Tipik çıktı:
# PASS_MAX_DAYS 99999
# PASS_MIN_DAYS 0
# PASS_WARN_AGE 7
# Değerleri düzenlemek için
sudo sed -i 's/^PASS_MAX_DAYS.*/PASS_MAX_DAYS 90/' /etc/login.defs
sudo sed -i 's/^PASS_MIN_DAYS.*/PASS_MIN_DAYS 7/' /etc/login.defs
sudo sed -i 's/^PASS_WARN_AGE.*/PASS_WARN_AGE 14/' /etc/login.defs
Bu değişiklikler yalnızca yeni oluşturulacak kullanıcılar için geçerlidir. Mevcut kullanıcılar etkilenmez, onlar için passwd veya chage kullanmanız gerekir.
Şifre Karmaşıklığı Zorunluluğu
passwd komutu şifre karmaşıklığını tek başına zorlamaz; bunun için PAM (Pluggable Authentication Modules) kullanılır. Ancak sysadmin olarak bu iki konunun birlikte çalıştığını bilmeniz gerekir:
# pam_pwquality veya pam_cracklib kurulu mu kontrol et
sudo cat /etc/pam.d/common-password | grep -E "pwquality|cracklib"
# Tipik bir PAM şifre politikası satırı
# password requisite pam_pwquality.so retry=3 minlen=12 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
# pwquality.conf dosyasını kontrol et
sudo cat /etc/security/pwquality.conf
Sık Yapılan Hatalar ve Dikkat Edilmesi Gerekenler
Yıllar içinde gördüğüm ve bizzat yaptığım bazı hataları paylaşayım:
Root hesabını kilitlemek: sudo passwd -l root komutunu çalıştırmadan önce iki kez düşünün. Root’u kilitlerseniz ve sudo erişiminiz de bir şekilde sorun yaşarsa kendinizi sistemden kilitleyebilirsiniz. Root’u kilitlemek yerine usermod -s /sbin/nologin root kullanmak daha güvenlidir.
Şifresiz hesap bırakmak: passwd -d ile şifreyi silmek bazı servis hesapları için mantıklı görünebilir, ancak genellikle tehlikelidir. Servis hesapları için bunun yerine usermod -s /sbin/nologin kullanın.
Toplu değişiklikte shadow dosyasını doğrudan düzenlemek: Hiçbir zaman /etc/shadow dosyasını elle düzenlemeyin. Yanlış bir karakter tüm kimlik doğrulama sistemini çökertebilir. Her zaman passwd, chage veya chpasswd kullanın.
Şifreleri script’lerde açık metin olarak saklamak: Otomasyon scriptlerinde şifreleri değişken olarak tanımlamak yerine, şifreli bir vault sistemi (Ansible Vault, HashiCorp Vault gibi) kullanın.
Günlük Yönetim için Pratik Komutlar
# Şifresi hiç belirlenmemiş kullanıcıları bul
sudo awk -F: '($2 == "" ) { print $1 }' /etc/shadow
# Şifresi süresi dolmuş kullanıcıları listele
sudo passwd -S -a | grep " E "
# Kilitli hesapları listele
sudo passwd -S -a | grep " L "
# Belirli kullanıcının şifre durumu özeti
sudo chage -l ahmet && sudo passwd -S ahmet
Sonuç
passwd komutu, göründüğünden çok daha kapsamlı bir araçtır. Günlük şifre değiştirme işlemlerinin ötesinde, güvenlik politikalarını uygulamak, hesap yaşam döngüsünü yönetmek ve acil güvenlik müdahalelerinde hızlı aksiyon almak için vazgeçilmezdir.
İyi bir sysadmin olarak şifre yönetiminde dikkat etmeniz gereken temel noktaları özetleyeyim: Sistem geneli politikaları /etc/login.defs üzerinden belirleyin, mevcut kullanıcılara bu politikaları passwd ve chage ile uygulayın, şifre karmaşıklığını PAM modülleriyle zorunlu kılın ve hesap güvenliği olaylarında hızlı kilitleme prosedürleriniz hazır olsun. Ayrıca şifre değişikliklerini ve hesap kilitlemelerini mutlaka merkezi bir log sistemine kaydedin; bu hem güvenlik denetimleri için hem de sorun gidermede hayat kurtarır.
Şifre yönetimi tek başına yeterli değildir elbette. SSH anahtar tabanlı kimlik doğrulama, çok faktörlü doğrulama ve düzenli güvenlik denetimleriyle birlikte uygulandığında gerçek anlamda güvenli bir sistem elde edersiniz. Ama her şey bu basit passwd komutuyla başlar.