Ekip büyüdükçe “herkese sudo ver, geç git” felsefesi er ya da geç sizi yakacak. Bir geliştirici yanlışlıkla production veritabanını siler, bir stajyer log dosyalarını temizler ya da birisi sistem servislerini kapatır. Bunların hepsi yaşandı, yaşanıyor ve yaşanmaya devam edecek. Linux grup yönetimi tam da bu noktada devreye giriyor: doğru yapılandırıldığında, her ekip üyesinin sadece kendi işini yapabildiği, başkasının alanına giremediği güvenli bir ortam oluşturabiliyorsunuz.
Linux Grup Sisteminin Temelleri
Linux’ta her kullanıcının bir birincil grubu (primary group) ve sıfır ya da daha fazla ikincil grubu (secondary group) bulunur. Dosya izinleri bu grup yapısı üzerine inşa edilmiştir. Bir dosya oluşturduğunuzda, o dosya otomatik olarak oluşturan kullanıcının birincil grubuyla ilişkilendirilir.
Sistem üzerindeki tüm gruplar /etc/group dosyasında saklanır. Yapısı şu şekildedir:
cat /etc/group
# grupadi:parola:GID:uye1,uye2,uye3
developers:x:1001:ahmet,mehmet,ayse
devops:x:1002:ali,veli
Parola alanındaki x genellikle kullanılmaz, GID ise grup kimlik numarasıdır. Sisteme yeni katılan bir sysadmin olarak bu dosyayı doğrudan düzenlemeye çalışmayın, bunun için komutlar var.
Mevcut grupları ve üyeliklerini hızlıca görmek için:
# Tüm grupları listele
getent group
# Belirli bir grubun üyelerini gör
getent group developers
# Mevcut kullanıcının üye olduğu grupları gör
groups
# Başka bir kullanıcının gruplarını gör
groups ahmet
# Daha detaylı bilgi için
id ahmet
Gerçek Dünya Senaryosu: Yazılım Geliştirme Şirketi
Diyelim ki orta ölçekli bir yazılım şirketinde çalışıyorsunuz. Şirketin şu ekipleri var:
- developers: Uygulama geliştiriciler
- devops: Sistem ve altyapı ekibi
- qa: Kalite güvence ekibi
- readonly: Sadece log okuma yetkisi olan destek ekibi
- dba: Veritabanı yöneticileri
Her ekibin farklı dizinlere, farklı servislere ve farklı kaynaklara erişmesi gerekiyor. Hadi bunu adım adım kuralım.
Grup Oluşturma ve Yönetme
Yeni grup oluşturmak için groupadd komutunu kullanıyoruz:
# Temel grup oluşturma
sudo groupadd developers
sudo groupadd devops
sudo groupadd qa
sudo groupadd readonly
sudo groupadd dba
# Belirli bir GID ile grup oluşturma (tutarlılık için)
sudo groupadd -g 2001 developers
sudo groupadd -g 2002 devops
sudo groupadd -g 2003 qa
# Sistem grubu oluşturma (GID 1000'in altında)
sudo groupadd -r appservice
Grup bilgilerini değiştirmek için groupmod:
# Grup adını değiştir
sudo groupmod -n yeni_ad eski_ad
# GID değiştir
sudo groupmod -g 2010 developers
Grup silmek için groupdel:
sudo groupdel eski_grup
Dikkat: Bir grubu silmeden önce o gruba ait dosyaları kontrol edin. Silinen grubun GID’sine sahip dosyalar sahipsiz kalır.
Kullanıcıları Gruplara Ekleme
Kullanıcıları gruplara eklerken iki farklı yöntem var ve bu farkı bilmek kritik:
# Kullanıcıyı gruba ekle (mevcut gruplarını KORUYARAK)
sudo usermod -aG developers ahmet
sudo usermod -aG developers,qa mehmet
# DİKKAT: -a olmadan kullanırsanız mevcut gruplar SİLİNİR
# sudo usermod -G developers ahmet <- Bunu yapma!
# gpasswd ile ekle
sudo gpasswd -a ahmet developers
# Kullanıcıyı gruptan çıkar
sudo gpasswd -d ahmet developers
-a parametresini unutmak çok yaygın bir hata. usermod -G komutunu -a olmadan çalıştırırsanız, kullanıcının tüm mevcut grup üyelikleri silinir ve sadece belirttiğiniz gruba eklenir. Bunu fark etmeden production’da çalıştırırsanız ciddi sorunlar çıkabilir.
Kullanıcı birincil grubunu değiştirmek için:
# Birincil grubu değiştir
sudo usermod -g developers ahmet
Grup değişikliklerinin etkili olması için kullanıcının oturumu yeniden açması gerekir. Ama bunu beklemeden test etmek istiyorsanız:
# Yeni grup oturumu başlat
newgrp developers
# Kullanıcının mevcut grup oturumunu kontrol et
id
Dizin İzinleri ile Grup Erişim Kontrolü
Grupları oluşturduktan sonra asıl iş dizin izinlerini doğru ayarlamak. Önce proje dizin yapısını oluşturalım:
# Ana proje dizini
sudo mkdir -p /srv/projects/{app,logs,config,db_dumps}
# Sahiplik ve izinleri ayarla
sudo chown root:developers /srv/projects/app
sudo chmod 2775 /srv/projects/app
sudo chown root:devops /srv/projects/config
sudo chmod 2750 /srv/projects/config
sudo chown root:readonly /srv/projects/logs
sudo chmod 2750 /srv/projects/logs
sudo chown root:dba /srv/projects/db_dumps
sudo chmod 2770 /srv/projects/db_dumps
Burada kullandığım 2775 izin bitlerini açıklayayım:
- 2xxx: SetGID biti. Bu dizinde oluşturulan yeni dosyalar otomatik olarak dizinin grubunu miras alır. Ekip çalışması için şart.
- 7: Sahip için okuma + yazma + çalıştırma
- 7: Grup üyeleri için okuma + yazma + çalıştırma
- 5: Diğerleri için okuma + çalıştırma (sadece girip dosyalara bakabilir, yazamaz)
SetGID olmadan şu sorunla karşılaşırsınız: Ahmet /srv/projects/app içinde bir dosya oluşturur, bu dosyanın grubu ahmet olur, Mehmet bu dosyayı düzenleyemez.
# SetGID bitini doğrula
ls -la /srv/projects/
# drwxrwsr-x 2 root developers ... app
# 's' harfi SetGID'in aktif olduğunu gösterir
umask ile Varsayılan İzinleri Yönetmek
Tek tek dosya izni ayarlamak yorucu. umask değerini doğru ayarlarsanız, kullanıcıların oluşturduğu dosyalar otomatik olarak doğru izinlerle gelir.
# Mevcut umask değerini gör
umask
# 0022 -> Varsayılan: dosyalar 644, dizinler 755
# Ekip ortamı için daha uygun umask
umask 0002
# Dosyalar 664 (grup yazabilir), dizinler 775
Bu ayarı kalıcı yapmak için:
# /etc/profile.d/ altına dosya oluştur
sudo nano /etc/profile.d/team-umask.sh
#!/bin/bash
# Ekip üyeleri için umask ayarı
if id -nG "$USER" | grep -qw "developers|devops|qa"; then
umask 0002
fi
ACL ile Gelişmiş Erişim Kontrolü
Standart Unix izinleri bazen yetersiz kalır. Örneğin, /srv/projects/logs dizinine readonly grubunun okuması ve devops grubunun yazması gerekiyorsa ne yapacaksınız? İşte burada ACL (Access Control List) devreye giriyor.
# ACL araçlarını yükle
sudo apt install acl # Debian/Ubuntu
sudo rpm -q acl || sudo dnf install acl # RHEL/CentOS
# Mevcut ACL'leri görüntüle
getfacl /srv/projects/logs
# devops grubuna yazma izni ver
sudo setfacl -m g:devops:rwx /srv/projects/logs
# readonly grubuna sadece okuma izni ver
sudo setfacl -m g:readonly:r-x /srv/projects/logs
# Yeni oluşturulan dosyalar için varsayılan ACL
sudo setfacl -d -m g:devops:rwx /srv/projects/logs
sudo setfacl -d -m g:readonly:r-x /srv/projects/logs
# ACL'leri kontrol et
getfacl /srv/projects/logs
Çıktı şöyle görünmeli:
# file: srv/projects/logs
# owner: root
# group: readonly
user::rwx
group::r-x
group:devops:rwx
group:readonly:r-x
mask::rwx
other::---
default:group:devops:rwx
default:group:readonly:r-x
ACL’yi kaldırmak için:
# Belirli bir ACL girişini kaldır
sudo setfacl -x g:devops /srv/projects/logs
# Tüm ACL'leri temizle
sudo setfacl -b /srv/projects/logs
sudo ile Grup Tabanlı Yetki Yönetimi
Grup yönetiminin en kritik kısımlarından biri sudo yetkilerini gruplar üzerinden ayarlamak. Bu sayede bireysel kullanıcılara sudo vermek yerine gruba veriyorsunuz, kullanıcı eklenince veya çıkarılınca otomatik olarak yetki de değişiyor.
sudo visudo
# veya
sudo nano /etc/sudoers.d/team-permissions
# DevOps ekibi - sistem yönetimi için tam yetki
%devops ALL=(ALL) ALL
# Geliştiriciler - sadece uygulama servisini yönetebilir
%developers ALL=(ALL) NOPASSWD: /bin/systemctl restart myapp,
/bin/systemctl stop myapp,
/bin/systemctl start myapp,
/bin/systemctl status myapp
# QA ekibi - test ortamını yönetebilir
%qa ALL=(ALL) NOPASSWD: /usr/bin/docker-compose,
/usr/bin/docker ps,
/usr/bin/docker logs *
# DBA ekibi - veritabanı servislerini yönetebilir
%dba ALL=(ALL) NOPASSWD: /bin/systemctl * postgresql,
/bin/systemctl * mysql
Sudoers dosyasını doğrulamak için:
sudo visudo -c
# /etc/sudoers: parsed OK
Toplu Kullanıcı Yönetimi ile Zaman Kazanma
Gerçek hayatta 50 kişilik bir ekibi tek tek eklemek istemezsiniz. İşte işinizi kolaylaştıracak bir script:
#!/bin/bash
# ekip-kurulum.sh - Toplu ekip üyesi ekleme scripti
DEVELOPERS="ahmet mehmet ayse fatma"
DEVOPS="ali veli"
QA="zeynep burak"
DBA="kemal"
READONLY="destek1 destek2 destek3"
# Grupları oluştur
for grup in developers devops qa dba readonly; do
if ! getent group "$grup" > /dev/null 2>&1; then
groupadd "$grup"
echo "Grup oluşturuldu: $grup"
fi
done
# Kullanıcıları gruplara ekle
for kullanici in $DEVELOPERS; do
if id "$kullanici" &>/dev/null; then
usermod -aG developers "$kullanici"
echo "$kullanici developers grubuna eklendi"
else
echo "UYARI: $kullanici kullanıcısı bulunamadı"
fi
done
for kullanici in $DEVOPS; do
id "$kullanici" &>/dev/null && usermod -aG devops "$kullanici"
done
for kullanici in $QA; do
id "$kullanici" &>/dev/null && usermod -aG qa "$kullanici"
done
# Sonucu doğrula
echo "--- Grup Üyelikleri ---"
for grup in developers devops qa dba readonly; do
echo "$grup: $(getent group $grup | cut -d: -f4)"
done
Grup Üyeliklerini Denetlemek ve Raporlamak
Her sysadmin periyodik olarak “kim hangi gruba üye?” sorusuna yanıt verebilmeli. Özellikle güvenlik denetimleri için:
#!/bin/bash
# grup-raporu.sh - Grup üyelik raporu
echo "=== GRUP ÜYELİK RAPORU ==="
echo "Tarih: $(date)"
echo ""
KRITIK_GRUPLAR="sudo wheel docker developers devops dba"
for grup in $KRITIK_GRUPLAR; do
if getent group "$grup" > /dev/null 2>&1; then
uyeler=$(getent group "$grup" | cut -d: -f4)
if [ -n "$uyeler" ]; then
echo "[$grup]"
echo "$uyeler" | tr ',' 'n' | sed 's/^/ - /'
echo ""
fi
fi
done
echo "=== SUDO YETKİSİ OLAN KULLANICILAR ==="
grep -v '^#' /etc/sudoers | grep -v '^$' | grep '%|ALL'
echo ""
echo "=== SON 7 GÜNDE OTURUM AÇANLAR ==="
last -n 20 | head -20
Bu scripti cron’a ekleyerek haftalık rapor alabilirsiniz:
# Her Pazartesi 09:00'da çalıştır
0 9 * * 1 /opt/scripts/grup-raporu.sh | mail -s "Haftalık Grup Raporu" [email protected]
Yaygın Hatalar ve Çözümleri
Yıllar içinde gördüğüm en sık yapılan hataları paylaşayım:
newgrp’yi Unutmak
Kullanıcıya yeni bir grup eklediniz ama kullanıcı hala “permission denied” alıyor. Neden? Çünkü grup değişikliği aktif oturum için geçerli değil. Kullanıcı çıkıp girmeli ya da newgrp grupadi çalıştırmalı.
Sahipsiz Dosyalar
Bir kullanıcıyı sildikten sonra o kullanıcıya ait dosyalar sahipsiz kalır. Bu dosyaları bulmak için:
# Geçersiz UID'ye sahip dosyaları bul
find / -nouser -print 2>/dev/null
# Geçersiz GID'ye sahip dosyaları bul
find / -nogroup -print 2>/dev/null
# Sahipsiz dosyaların sahipliğini düzelt
find /srv/projects -nouser -exec chown root:developers {} ;
SetGID Bitinin Kaybolması
chmod komutunu yanlış kullanırsanız SetGID biti kaybolabilir:
# YANLIŞ - SetGID bitini kaybedebilir
chmod 775 /srv/projects/app
# DOĞRU - SetGID'i koru
chmod 2775 /srv/projects/app
# veya
chmod g+s /srv/projects/app
Docker Grubu Güvenlik Riski
docker grubuna kullanıcı eklemek aslında o kullanıcıya root yetkisi vermek anlamına gelir. Docker daemon root olarak çalışır ve grup üyeleri bu daemon üzerinden sisteme tam erişim sağlayabilir. Bunu gerçekten düşünerek yapın.
Gruba Özel Ortam Değişkenleri
Bazı durumlarda belirli grupların farklı ortam değişkenlerine ihtiyacı olabilir. Bunu /etc/profile.d/ altında yönetebilirsiniz:
sudo nano /etc/profile.d/group-environments.sh
#!/bin/bash
# DBA ekibi için veritabanı ayarları
if id -nG "$USER" | grep -qw "dba"; then
export PGHOST="db01.internal"
export PGPORT="5432"
export DB_BACKUP_PATH="/srv/projects/db_dumps"
fi
# Developers için geliştirme ortamı
if id -nG "$USER" | grep -qw "developers"; then
export APP_ENV="development"
export LOG_LEVEL="debug"
export DEV_HOME="/srv/projects/app"
fi
# DevOps için yönetim araçları
if id -nG "$USER" | grep -qw "devops"; then
export ANSIBLE_HOSTS="/etc/ansible/hosts"
export TERRAFORM_DIR="/srv/terraform"
fi
Audit ile Grup Erişimlerini İzlemek
Güvenlik için sadece erişim vermek yetmez, kimlerin ne zaman neye eriştiğini de izlemelisiniz:
# auditd yükle
sudo apt install auditd
# Kritik dizine erişimi izle
sudo auditctl -w /srv/projects/config -p rwxa -k config-access
sudo auditctl -w /srv/projects/db_dumps -p rwxa -k db-access
# Grup değişikliklerini izle
sudo auditctl -w /etc/group -p wa -k group-changes
sudo auditctl -w /etc/sudoers -p wa -k sudoers-changes
# Logları incele
sudo ausearch -k config-access | tail -20
sudo ausearch -k group-changes
Bu kuralları kalıcı yapmak için /etc/audit/rules.d/team-access.rules dosyasına ekleyin.
Sonuç
Grup tabanlı erişim kontrolü, Linux’un en güçlü ve en az kullanılan özelliklerinden biri. Çoğu sysadmin iş yoğunluğu nedeniyle “şimdilik sudo ver, sonra düzeltiriz” yolunu seçiyor. Bu yazıda gördüğünüz yapıyı baştan doğru kurarsanız, ilerleyen dönemlerde ciddi zaman ve baş ağrısından kurtulursunuz.
Özetlemek gerekirse: Gruplarınızı iş gereksinimlerine göre planlayın, SetGID bitini unutmayın, ACL’yi standart izinlerin yetersiz kaldığı yerlerde kullanın, sudo yetkilerini kullanıcı bazlı değil grup bazlı verin ve periyodik denetim yapın. Bu dört ilkeyi uygulayan bir sistem, hem güvenli hem de yönetimi kolay olacak.
Son bir not: Sisteminizi kurduktan sonra mutlaka test edin. Gerçek bir developer kullanıcısıyla giriş yapın, izinlerin beklediğiniz gibi çalıştığını doğrulayın. Kağıt üzerinde doğru görünen pek çok yapılandırma, gerçek kullanımda beklenmedik davranışlar sergileyebilir.