Linux Kullanıcı ve Grup Yönetimi: Komutlarla Rehber

useradd, usermod, chmod ve sudo yapılandırmasını gerçek komutlarla anlatan, sunucu yönetiminde doğrudan kullanabileceğiniz pratik bir rehber.

Linux
Linux Kullanıcı ve Grup Yönetimi: Komutlarla Rehber

Bir sunucuda aynı anda çalışan birkaç geliştirici, birkaç servis hesabı ve bir yedekleme scripti varsa, hangi dosyaya kimin dokunabileceğini biri açıkça tanımlamak zorunda. Linux bu işi kullanıcı ve grup sistemiyle çözer: her dosyanın bir sahibi, bir grubu, bir de bu ikisi için ayrı ayrı tanımlanmış izinleri vardır. Beş kullanıcılı küçük bir geliştirme sunucusunda bile bu ayrım gevşerse, biri başkasının .env dosyasını okuyabilir ya da bir cron scripti kendine ait olmayan bir dizine yazmaya çalışıp hata verir.

Bu rehberde useradd'dan chmod'a, gerçek komutlarla kullanıcı ve grup yönetimini anlatıyorum. Örnekler Ubuntu ve Debian tabanlı dağıtımlarda test edildi; RHEL ve Fedora ailesinde komut adları büyük ölçüde aynı kalıyor, yalnızca bazı grup isimleri (örneğin sudo yerine wheel) değişiyor.

Kullanıcı Nasıl Oluşturulur ve Silinir?

Yeni bir kullanıcı eklemenin standart yolu useradd komutudur; ama çıplak haliyle çalıştırıldığında ev dizini oluşturmaz, bu yüzden -m bayrağı gerekir:

sudo useradd -m -s /bin/bash -c "Ahmet Yılmaz" ahmet
sudo passwd ahmet

-s /bin/bash giriş kabuğunu belirler, -c açıklama alanına gerçek adı yazar. Ev dizinini varsayılan /home/ahmet yerine başka bir yere koymak için -d /veri/ahmet bayrağı kullanılır; özellikle /home bölümü küçük, veri ayrı bir diskte tutulan sunucularda bu ayrım işe yarar. Debian tabanlı dağıtımlarda adduser komutu aynı işi interaktif sorularla yapar ve yeni başlayanlar için hata payını azaltır:

sudo adduser ahmet

Bir kullanıcıyı silerken ev dizininin de temizlenip temizlenmeyeceğine dikkat edilmeli:

sudo userdel ahmet
sudo userdel -r ahmet

-r bayrağı olmadan çalıştırıldığında kullanıcı hesabı silinir ama /home/ahmet diskte kalır; sunucu temizliği sırasında bu genelde kime ait olduğu belirsiz bir dosya yığınına dönüşür ve zamanla du -sh /home/* çıktısında sahibi bilinmeyen klasörler birikir. Silmeden önce o dizinin hâlâ gerekip gerekmediğini kontrol etmek, önemli bir proje klasörünü yanlışlıkla kaybetmeyi önler.

Mevcut bir kullanıcının kabuğunu ya da ev dizinini değiştirmek için usermod kullanılır:

sudo usermod -s /usr/sbin/nologin servis-hesabi

Bu satır bir servis hesabının SSH ile interaktif giriş yapmasını engeller; servis yine de systemd üzerinden çalışmaya devam eder. PostgreSQL, nginx ya da Redis gibi paket yöneticisinden kurulan hizmetler genelde kurulum sırasında zaten /usr/sbin/nologin kabuklu bir sistem kullanıcısıyla gelir; bunu getent passwd postgres komutuyla elle doğrulamak mümkündür.

Kullanıcı Bilgisi Nerede Saklanır?

Linux kullanıcı hesaplarını /etc/passwd dosyasında düz metin olarak tutar; parolalar orada değil, /etc/shadow'da şifrelenmiş hâlde durur. /etc/passwd'ın her satırı yedi alana ayrılır:

Terminal ekranında id ve groups komutlarıyla kullanıcı grup üyeliklerinin görüntülenmesi
cat /etc/passwd | grep ahmet

Çıktı şuna benzer görünür: ahmet:x:1001:1001:Ahmet Yılmaz:/home/ahmet:/bin/bash. İkinci alandaki x, parolanın shadow dosyasında saklandığını gösterir; üçüncü ve dördüncü alanlar sırasıyla kullanıcı ID (UID) ve birincil grup ID'sidir (GID). UID 0 her zaman root'a aittir; 1-999 arası genelde sistem hesaplarına, 1000 ve üzeri normal kullanıcılara ayrılır (dağıtıma göre eşik değişir; Debian'da bu sınır 1000, bazı RHEL sürümlerinde 500'dür).

/etc/shadow dosyasına yalnızca root erişebilir; sudo cat /etc/shadow | grep ahmet çalıştırıldığında ikinci alanda $6$ ile başlayan uzun bir dize görünür, bu SHA-512 ile hashlenmiş paroladır. Alan boşsa hesabın parolası yok demektir; ! ya da * işareti hesabın kilitli olduğunu gösterir.

Bir kullanıcının hangi gruplara üye olduğunu görmek için:

id ahmet
groups ahmet

id komutu UID, birincil GID ve tüm ek grupları tek satırda gösterir; sorun giderirken en hızlı başlangıç noktasıdır. id ahmet çıktısı uid=1001(ahmet) gid=1001(ahmet) groups=1001(ahmet),27(sudo),1002(gelistiriciler) şeklinde görünür; groups alanındaki her parantez içi isim, o kullanıcının erişebildiği bir kaynak grubunu temsil eder.

Grup Yönetimi: Neden Tek Tek Değil, Toplu?

On kullanıcıya aynı klasöre yazma izni vermek gerektiğinde, her birine ayrı ayrı izin tanımlamak yerine bir grup oluşturup izni gruba vermek daha az hataya açık. Yeni grup oluşturmak için:

rwx dosya izin yapısını sahip, grup ve diğerleri kategorileriyle gösteren şema
sudo groupadd gelistiriciler

Bir kullanıcıyı mevcut bir gruba eklerken -aG bayrağı kritik; -a olmadan çalıştırıldığında kullanıcının önceki ek grupları silinip yerine yalnızca belirtilen grup atanır:

sudo usermod -aG gelistiriciler ahmet

Bu, kullanıcı yönetiminde en sık yapılan hatalardan biridir: -a unutulduğunda kullanıcı sessizce sudo grubundan düşer ve bir sonraki girişte yetkisiz kalabilir. Grup eklerken önce groups ahmet ile mevcut üyelikleri not almak, komutu çalıştırdıktan sonra tekrar groups ahmet ile karşılaştırmak bu hatayı önler. Kullanıcı oluşturma ve değiştirme komutlarının tüm seçenekleri useradd kılavuz sayfasında ayrıntılıdır.

Grup üyeliğinin işlemesi için genelde kullanıcının oturumu kapatıp tekrar açması gerekir; newgrp gelistiriciler komutu oturumu kapatmadan yeni grubu geçici olarak aktif eder. Bir kullanıcıyı aynı anda birden çok gruba eklemek için grup adları virgülle ayrılabilir: sudo usermod -aG gelistiriciler,docker,sudo ahmet.

Bir grubu silmek için:

sudo groupdel gelistiriciler

Grup hâlâ birincil grup olarak kullanılıyorsa silme işlemi başarısız olur; önce o kullanıcıların birincil grubu değiştirilmeli. Hangi kullanıcıların bir grubu birincil grup olarak kullandığını görmek için grep ':1002:' /etc/passwd araması, o GID'i taşıyan tüm satırları listeler ve silmeden önce hızlı bir kontrol sağlar.

Dosya İzinleri: rwx Üçlüsünü Okumak

ls -l çıktısındaki ilk on karakter izin bilgisini taşır: -rwxr-xr--. İlk karakter dosya tipini gösterir (- dosya, d dizin, l sembolik link), sonraki üç karakter sahibin, ondan sonraki üç karakter grubun, son üç karakter diğer herkesin izinlerini belirtir. ls -la /var/www/proje çalıştırıldığında her satırda bu on karakter, hemen ardından sahip ve grup adı görünür; bir dosyanın neden erişilemediğini anlamanın ilk adımı buradan başlar.

Grupr (oku)w (yaz)x (çalıştır)
Sahip (u)421
Grup (g)421
Diğerleri (o)421

Bu sayılar toplanarak chmod ile sayısal izin verilir:

chmod 750 script.sh
chmod u+x,g-w dosya.txt

750 sahibe okuma-yazma-çalıştırma (7), gruba okuma-çalıştırma (5), diğerlerine hiçbir izin (0) verir. chmod u+x,g-w dosya.txt gibi harf tabanlı kullanım mevcut izinlere göreli değişiklik yapar; sayısal moddan farklı olarak diğer izinleri sıfırlamaz, yalnızca belirtilen biti ekler ya da çıkarır. Bir dizine yazma izni verirken çalıştırma iznini (x) atlamak yaygın bir hata: dizinler için x biti, o dizinin içine girip dosya listeleyebilmeyi sağlar; w olmadan x yalnızca gezinmeye izin verir.

Dosya sahibini ve grubunu değiştirmek için ayrı bir komut kullanılır:

sudo chown ahmet:gelistiriciler dosya.txt
sudo chown -R ahmet:gelistiriciler /var/www/proje

-R bayrağı işlemi dizin içindeki her dosyaya özyinelemeli uygular; bir web kök dizininin sahipliğini tek seferde düzeltmek için sık kullanılır. Örneğin nginx ya da Apache'nin çalışma kullanıcısı www-data ise, deploy sonrası sudo chown -R www-data:www-data /var/www/proje çalıştırmak, sunucunun kendi yazdığı dosyaları (önbellek, upload klasörü) düzgün okuyabilmesini sağlar.

sudo Yetkisi Nasıl Verilir?

Bir kullanıcıya root yetkisi vermenin en güvenli yolu root parolasını paylaşmak değil, sudo grubuna eklemektir. Ubuntu ve Debian'da bu grubun adı genelde sudo, RHEL ve Fedora tabanlı sistemlerde wheel:

Terminal ekranında chage ve usermod komutlarıyla parola politikası ve hesap kilitleme ayarlarının yapılması
sudo usermod -aG sudo ahmet

visudo komutu /etc/sudoers dosyasını güvenli biçimde düzenler; dosyayı doğrudan bir editörle açmak, sözdizimi hatasında sistemi sudo'suz bırakabilir, visudo ise kaydetmeden önce sözdizimini denetler. Hatalı bir satır kaydedildiğinde visudo "what now?" diye sorup değişikliği geri almaya izin verir; nano /etc/sudoers ile doğrudan açıp kaydedildiğinde bu güvenlik ağı yoktur ve bir sonraki sudo çağrısı "syntax error" ile başarısız olabilir:

sudo visudo

Belirli bir kullanıcıya yalnızca tek bir komutu parola sormadan çalıştırma izni vermek için /etc/sudoers.d/ altına ayrı bir dosya eklemek, ana dosyayı doğrudan değiştirmekten daha güvenlidir:

echo "ahmet ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx" | sudo tee /etc/sudoers.d/ahmet-nginx
sudo chmod 440 /etc/sudoers.d/ahmet-nginx

Bu tür dar kapsamlı kurallar, tam sudo yetkisi vermek yerine, servis yeniden başlatma gibi tekrarlayan tek görevler için tercih edilmeli. Geniş yetkili NOPASSWD: ALL kuralları, hesap ele geçirildiğinde saldırgana doğrudan root erişimi verir; bir CI/CD deploy scriptine sudo yetkisi verirken bile yalnızca ihtiyaç duyulan iki komutu (systemctl reload nginx, systemctl restart php-fpm gibi) tanımlamak, tüm sistemi açık kapı bırakmaktan çok daha güvenlidir.

Parola Politikası ve Hesap Kilitleme

Parola yaşlanma kurallarını görmek ve değiştirmek için chage komutu kullanılır:

sudo chage -l ahmet
sudo chage -M 90 ahmet

-l mevcut politikayı listeler (son değişiklik tarihi, son kullanma tarihi, uyarı süresi); -M 90 parolanın en fazla 90 gün geçerli kalmasını zorunlu kılar. -W 7 süre dolmadan yedi gün önce kullanıcıyı uyarmaya başlar, böylece parola aniden geçersiz kalmaz. Bir hesabı geçici olarak kilitlemek, silmeden erişimi durdurmanın en hızlı yoludur:

sudo usermod -L ahmet
sudo usermod -U ahmet

-L hesabı kilitler (shadow dosyasındaki parola hash'inin başına ! ekler), -U kilidi açar. İşten ayrılan bir çalışanın hesabını hemen silmek yerine önce kilitlemek, o hesaba bağlı dosya sahiplikleri ve cron görevlerini kaybetmeden inceleme fırsatı verir.

Kilitli bir hesabın SSH anahtar tabanlı girişini de engellemek için yalnızca usermod -L yeterli olmayabilir, çünkü bazı yapılandırmalarda anahtar tabanlı giriş parola kilidini kontrol etmez; bu durumda usermod -s /usr/sbin/nologin ahmet ile kabuğu da değiştirmek daha kesin bir engel oluşturur.

Aktif oturumları ve son girişleri denetlemek için:

who
last -n 10

last, /var/log/wtmp kaydından son girişleri listeler; beklenmedik bir saatte veya bilinmeyen bir IP'den giriş görülmesi genelde ilk fark edilen anormalliktir. Düzenli olarak /etc/passwd içinde UID 0 sahibi kaç hesap olduğunu kontrol etmek (awk -F: '$3== 0 {print $1}' /etc/passwd), yetkisiz bir root klonu eklenip eklenmediğini yakalamanın basit ama etkili bir yoludur.

Celil Uyanikoglu

Yazan Celil Uyanikoglu

Bilgisayar mühendisiyim; 25 yılı aşkın süredir bilgi işlem sektörünün içindeyim. Bu blogu 2020'de, işimde her gün karşılaştığım sorunların çözümlerini bir yere yazmak için açtım: Linux, güvenlik, tarayıcılar, yapay zeka araçları. Yazdığım her rehberi önce kendi bilgisayarımda ya da sunucumda deniyorum; çalıştığını görmediğim adımı yayınlamam. Hatalı ya da eskimiş bir şey görürsen iletişim sayfasından yaz — düzeltirim.

Yorum

Henüz yorum yok.

Sohbete katıl. Yorumlar yayınlanmadan önce moderasyondan geçer.

Yorum yap

E-posta adresin yayınlanmaz. Yorumlar moderasyondan sonra yayınlanır.

Sırada

İlgili notlar

jekcms 61602b0e6293b42004a1