Linux'ta Gruplar: Kullanıcıları Gruplara Ekleme ve Çıkarma
- Murat Akpınar
- Linux öğrenme yolculuğu
- 9 Ağustos 2026
İçindekiler
Bir önceki yazıda tek bir kullanıcının bilgilerini ve parolasını yönettik. Ama gerçek sistemlerde izinler tek tek kullanıcılara verilmez — gruplara verilir.
Sebebi basit: on kişilik bir ekibe bir dizine erişim vereceksiniz. Tek tek kullanıcı yazarsanız on kayıt tutarsınız ve ekibe biri katıldığında hepsini gözden geçirmeniz gerekir. Bir grup açıp izni gruba verirseniz tek kayıt tutarsınız; yeni gelen kişiyi gruba eklemek yeter.
Bu yazıda grup yapısının nasıl çalıştığını, üyelik değiştirmenin doğru yolunu ve tek bir harfi unuttuğunuzda kendinizi sistemden nasıl kilitleyebileceğinizi göreceğiz.
Aşağıdaki çıktılar Debian tabanlı bir test makinesinden alınmış örnek değerlerdir; UID, GID ve kullanıcı adları sizin sisteminizde farklı olacaktır. Komutlar ve kurallar gerçektir.
Birincil Grup ve Ek Gruplar
Linux’ta bir kullanıcının tek bir birincil grubu (primary group) ve istediği kadar ek grubu (supplementary group) olur. Bu ayrım, grup yönetiminin tamamının üstüne kurulduğu temeldir.
En kritik nokta şudur: bu iki üyelik türü farklı dosyalarda tutulur.
flowchart TB
U["murat<br/>uid=1001"]
P["birincil grup<br/>murat · gid=1001"]
A["proje<br/>gid=1500"]
B["sudo<br/>gid=27"]
PW["/etc/passwd<br/>satırın 4. alanında GID olarak"]
GR["/etc/group<br/>grubun üye listesinde adıyla"]
U --> P
U --> A
U --> B
P -.-> PW
A -.-> GR
B -.-> GR
linkStyle 0 stroke:#16a34a,stroke-width:2.5px
linkStyle 1,2 stroke:#2563eb,stroke-width:2.5px
linkStyle 3,4,5 stroke:#94a3b8,stroke-width:1.5px,stroke-dasharray:4 3
classDef usr fill:#f1f5f9,stroke:#64748b,color:#0f172a
classDef bir fill:#dcfce7,stroke:#16a34a,color:#14532d
classDef ek fill:#dbeafe,stroke:#2563eb,color:#1e3a8a
classDef dosya fill:#fef3c7,stroke:#d97706,color:#78350f
class U usr
class P bir
class A,B ek
class PW,GR dosya
| Birincil grup | Ek gruplar | |
|---|---|---|
| Kaç tane olur? | Tam olarak bir tane | Sıfır veya daha fazla |
| Nerede yazılı? | /etc/passwd — kullanıcı satırının GID alanı |
/etc/group — grubun üye listesi |
| Ne işe yarar? | Kullanıcının oluşturduğu dosyalar bu grubu alır | Yalnızca erişim verir |
| Nasıl değişir? | usermod -g |
usermod -aG / gpasswd |
Dördüncü satır günlük hayatta en çok hissedilen farktır: murat kullanıcısı bir dosya oluşturduğunda o dosyanın grup sahibi, murat‘ın birincil grubudur. Ek gruplarda olmanız dosyalarınızın grubunu değiştirmez.
Neden herkesin kendi adında bir grubu var?
Debian ve Ubuntu’da adduser ile kullanıcı açtığınızda, aynı adda bir grup da oluştuğunu fark etmişsinizdir. Kullanıcı oluşturma yazısındaki çıktıda tam olarak bunu görüyoruz: Adding new group 'lehisa' (1002).
Buna UPG (User Private Group — kullanıcıya özel grup) denir. Amacı güvenliktir: eğer bütün kullanıcıların birincil grubu ortak bir users grubu olsaydı, herkesin oluşturduğu dosya o ortak grubu alırdı ve varsayılan izinlerle birbirinin dosyalarını okuyabilirlerdi. Herkese kendi grubunu vermek bu sızıntıyı baştan kapatır.
Mevcut Durumu Görüntüleme
Değişiklik yapmadan önce ne olduğunu bilin. Üç komut yeterli.
id — bir kullanıcının bütün üyeliklerini gösterir:
root@debian:~# id murat
uid=1001(murat) gid=1001(murat) groups=1001(murat),27(sudo)
Okunuşu: uid kullanıcı kimliği, gid birincil grup, groups ise birincil grup dâhil tüm gruplar. Yani murat burada iki grupta: kendi UPG’si ve sudo.
groups — aynı bilginin kısa hâli:
root@debian:~# groups murat
murat : murat sudo
getent group — bir grubun kayıtta nasıl durduğunu gösterir:
root@debian:~# getent group sudo
sudo:x:27:murat
Dört alan sırasıyla: grup adı, parola alanı (x, gerçek değer /etc/gshadow dosyasındadır), GID ve üye listesi.
Burada bir tuzak var. Üye listesi yalnızca ek üyeleri içerir. Birincil grubu o grup olan kullanıcılar bu listede görünmez. Bakın:
root@debian:~# getent group murat murat:x:1001:Liste boş, ama
muratkullanıcısının birincil grubu tam olarak bu grup. “Grubun içinde kimse yok” diye düşünüp grubu silmeye kalkmayın.
Neden getent de cat /etc/group değil? Çünkü getent sistemin kullandığı bütün kaynaklara bakar. Makine bir LDAP veya Active Directory sunucusuna bağlıysa gruplar yerel dosyada değil orada durur; cat onları göremez, getent görür.
Grup Oluşturma, Silme ve Yeniden Adlandırma
root@debian:~# groupadd proje
root@debian:~# getent group proje
proje:x:1500:
groupadd başarılı olduğunda hiçbir şey yazmaz. Sessizlik iyi haberdir; kontrol etmek için getent ile bakın.
Yeniden adlandırmak ve GID değiştirmek groupmod ile olur. Bunları çalışan proje grubumuz üzerinde denemeyelim; sistemde duran eski bir arsiv grubunu kullanalım:
root@debian:~# getent group arsiv
arsiv:x:1400:
root@debian:~# groupmod -n arsiv-2025 arsiv # adını değiştirir
root@debian:~# groupmod -g 1450 arsiv-2025 # GID'sini değiştirir
root@debian:~# getent group arsiv-2025
arsiv-2025:x:1450:
GID değiştirmek sandığınızdan tehlikelidir. Dosya sistemi grup adını değil numarayı saklar. Grubun GID’sini değiştirdiğinizde o gruba ait mevcut dosyalar eski numarada kalır ve bir anda “sahipsiz” görünür. Değiştirmek zorundaysanız ardından dosyaları da taşımanız gerekir:
find / -gid 1400 -exec chgrp arsiv-2025 {} +
Silmek için groupdel:
root@debian:~# groupdel arsiv-2025
Bir grubun herhangi bir kullanıcının birincil grubu olması silinmesini engeller:
root@debian:~# groupdel murat
groupdel: cannot remove the primary group of user 'murat'
Bu bilinçli bir korumadır: birincil grubu olmayan bir kullanıcı tutarsız bir hesaptır.
Kullanıcıyı Gruba Ekleme — ve -a Tuzağı
Bu yazının en önemli bölümü burası. Ekleme komutu şudur:
root@debian:~# usermod -aG proje murat
root@debian:~# id murat
uid=1001(murat) gid=1001(murat) groups=1001(murat),27(sudo),1500(proje)
-G seçeneği kullanıcının ek grup listesini belirler. -a ise append, yani ekle demektir.
-a olmadan -G, listeyi eklemez — listenin tamamının yerine geçer.
Ne demek olduğunu görelim. Aynı kullanıcıda -a‘yı unutalım:
root@debian:~# usermod -G proje murat
root@debian:~# id murat
uid=1001(murat) gid=1001(murat) groups=1001(murat),1500(proje)
27(sudo) gitti. Kullanıcı sudo yetkisini kaybetti. Bu makinede yönetici erişimi olan tek hesap murat idiyse ve root parolası bilinmiyorsa, sisteme yönetici olarak giremezsiniz. Kurtarmak için konsol erişimi veya kurtarma modu gerekir.
Toparlamak yine tek komut, yeter ki yetkiniz kalmış olsun:
root@debian:~# usermod -aG sudo murat
root@debian:~# id murat
uid=1001(murat) gid=1001(murat) groups=1001(murat),27(sudo),1500(proje)
Bu yüzden pratik bir alışkanlık edinin: usermod ile grup eklerken -aG‘yi tek bir kalıp gibi yazın, -G‘yi tek başına yalnızca “bu kullanıcının ek grupları tam olarak şunlar olsun” demek istediğinizde kullanın.
Riski tamamen ortadan kaldırmanın yolu ise başka bir komut kullanmaktır. Ekibin ikinci üyesi elif‘i bu komutla ekleyelim:
root@debian:~# gpasswd -a elif proje
Adding user elif to group proje
gpasswd -a her zaman ekler, hiçbir şeyi silmez ve ne yaptığını yazar. Diğer üyeliklere dokunmadığı için betiklerde ve otomasyonda daha güvenlidir.
| Komut | Davranış | Ne zaman |
|---|---|---|
usermod -aG grup kullanici |
Ek gruplara ekler | Elle iş yaparken, en yaygın |
usermod -G g1,g2 kullanici |
Ek grup listesini sıfırlayıp yazar | Yalnızca tam listeyi dayatmak istiyorsanız |
gpasswd -a kullanici grup |
Ekler, asla silmez | Betik ve otomasyonda tercih edin |
usermod -g grup kullanici |
Birincil grubu değiştirir | Ayrı bir iş — aşağıya bakın |
Son satıra dikkat: -g ile -G bir harf farkla tamamen farklı iki iştir. Küçük -g birincil grubu değiştirir, büyük -G ek gruplarla ilgilenir.
Kullanıcıyı Gruptan Çıkarma
root@debian:~# gpasswd -d elif proje
Removing user elif from group proje
Debian ve Ubuntu’da aynı işi deluser de yapar:
root@debian:~# deluser elif proje
deluser her dağıtımda bulunmaz; gpasswd -d taşınabilir olduğu için betiklerde onu tercih edin.
Sonucu mutlaka doğrulayın:
root@debian:~# id elif
uid=1003(elif) gid=1003(elif) groups=1003(elif)
Birincil Grubu Değiştirme
Bunun için yedek adlı bir servis hesabını örnek alalım:
root@debian:~# id yedek
uid=1002(yedek) gid=1002(yedek) groups=1002(yedek)
root@debian:~# usermod -g proje yedek
root@debian:~# id yedek
uid=1002(yedek) gid=1500(proje) groups=1500(proje)
Çıktıyı dikkatle okuyun: uid değişmedi. usermod -g kullanıcının kimliğine dokunmaz, yalnızca gid alanını, yani birincil grubu değiştirir. Eski birincil grup olan yedek (1002) listeden düştü, çünkü kullanıcı o gruba yalnızca birincil grubu olduğu için üyeydi.
Bunu yaparken iki şeyi hesaba katın. Birincisi, kullanıcının bundan sonra oluşturacağı dosyalar yeni grubu alır — eskiden oluşturduğu dosyalar değişmez. İkincisi, eski birincil grup artık boşta kalır ve UPG düzenini kırarsınız.
Birincil grubu değiştirmek, ekip erişimi vermenin doğru yolu değildir. Ekip erişimi için ek grup kullanın. Birincil grubu yalnızca burada olduğu gibi, bir servis hesabının ürettiği dosyaların belirli bir grupta doğması gerektiğinde değiştirin.
Değişiklik Ne Zaman Etkili Olur?
Yeni eklediğiniz grup hemen çalışmıyorsa panik yapmayın. Grup üyelikleri kullanıcının kimlik bilgilerine oturum açarken yazılır. Açık olan bir oturum eski üyeliklerle çalışmaya devam eder.
Ve burada, bu blogda sık tekrarlanan bir tuzağın küçük bir örneği var: yanlış komutla doğrulama yaparsanız hiçbir şey öğrenmezsiniz.
murat@debian:~$ id murat
uid=1001(murat) gid=1001(murat) groups=1001(murat),27(sudo),1500(proje)
murat@debian:~$ id
uid=1001(murat) gid=1001(murat) groups=1001(murat),27(sudo)
İki komut aynı makinede, aynı saniyede, farklı cevap veriyor. Sebebi şu: id murat kullanıcı veritabanına bakar, orada proje yazıyor. Argümansız id ise o anki oturumun gerçek yetkilerini çekirdekten okur; o oturum proje grubu eklenmeden önce açıldığı için orada proje yok.
Yani dizine erişip erişemeyeceğinizi belirleyen şey id murat çıktısı değil, argümansız id çıktısıdır.
Çözüm oturumu tazelemektir — çıkıp yeniden girmek en temizidir. Hemen denemek isterseniz:
murat@debian:~$ newgrp proje
newgrp, belirtilen grubu birincil grup yapan yeni bir kabuk başlatır. Geçicidir; exit ile çıktığınızda eski kabuğunuza dönersiniz.
Grafik oturumlarda çıkıp girmek genelde yetmez, oturumu tamamen kapatmak gerekir. Sunucularda ise SSH bağlantısını kapatıp yeniden bağlanmak yeterlidir.
Pratik Senaryo: Ekip İçin Paylaşımlı Dizin
Bütün parçaları birleştirelim. proje ekibinin ortak çalışacağı bir dizin kuracağız. Grubu yukarıda oluşturmuş, murat‘ı da eklemiştik; elif‘i çıkarma örneğinde silmiştik, onu geri alalım:
root@debian:~# gpasswd -a elif proje
Adding user elif to group proje
root@debian:~# getent group proje
proje:x:1500:murat,elif
root@debian:~# mkdir /srv/proje
root@debian:~# chgrp proje /srv/proje
root@debian:~# chmod 2775 /srv/proje
Sonucu okuyalım:
root@debian:~# ls -ld /srv/proje
drwxrwsr-x 2 root proje 4096 Aug 9 10:12 /srv/proje
İzin dizesindeki grup bölümünde x yerine s var. Bu setgid bitidir ve chmod komutundaki baştaki 2 ile geldi. Yaptığı iş şudur: bu dizinde oluşturulan her yeni dosya, oluşturan kişinin birincil grubunu değil dizinin grubunu (proje) alır.
Setgid olmasaydı murat‘ın oluşturduğu dosya murat grubuna ait olurdu ve elif onu düzenleyemezdi — grup izni işe yaramazdı. Dosya izinleri yazısında anlatılan rwx mantığının, grup yönetimiyle birleştiği yer tam olarak burasıdır.
Doğrulayalım. murat oturumunu tazeledikten sonra:
murat@debian:/srv/proje$ touch rapor.txt
murat@debian:/srv/proje$ ls -l rapor.txt
-rw-rw-r-- 1 murat proje 0 Aug 9 10:15 rapor.txt
Dosyanın sahibi murat, grubu ise proje. elif de proje grubunda olduğu ve grup izni rw olduğu için bu dosyayı düzenleyebilir. Hedeflenen buydu.
Sistem Grupları: Üyelik Vermeden Önce Düşünün
Bazı grupların üyeliği sıradan bir erişim değil, doğrudan yetki anlamına gelir:
| Grup | Ne verir |
|---|---|
sudo (Debian/Ubuntu) · wheel (RHEL/Fedora) |
sudo ile komut çalıştırma hakkı |
docker |
Pratikte tam root yetkisi |
adm |
Sistem günlüklerini okuma |
disk |
Blok aygıtlara doğrudan erişim — dosya izinlerini tamamen atlar |
docker satırı özellikle önemli ve sıkça hafife alınır. Docker soketine erişebilen bir kullanıcı, kök dosya sistemini bağlayan bir konteyner başlatabilir; bu da o kullanıcının parola sorulmadan root olabilmesi demektir. Birine docker grubu vermek, sudo vermekle aynı ağırlıkta bir karardır — üstelik sudo‘nun aksine günlüğe düzgün düşmez.
Genel kural: bir kullanıcıya sistem grubu eklemeden önce “bu grup ne yapabiliyor?” sorusunu cevaplayın. GID’si 1000’in altındaki gruplar sistem gruplarıdır ve neredeyse hepsinin bir yetki karşılığı vardır.
Özet Komut Tablosu
| İş | Komut |
|---|---|
| Üyelikleri görme | id kullanici · groups kullanici |
| Grup kaydını görme | getent group grup |
| Grup oluşturma | groupadd grup |
| Grup adı / GID değiştirme | groupmod -n yeni grup · groupmod -g GID grup |
| Grup silme | groupdel grup |
| Ek gruba ekleme | usermod -aG grup kullanici · gpasswd -a kullanici grup |
| Ek gruptan çıkarma | gpasswd -d kullanici grup · deluser kullanici grup |
| Birincil grubu değiştirme | usermod -g grup kullanici |
| Oturumu tazelemeden denemek | newgrp grup |
Sonuç
Grup yönetiminin tamamı üç cümlede toplanır:
- Birincil grup bir tanedir ve oluşturduğunuz dosyaların grubunu belirler; ek gruplar yalnızca erişim verir. İkisi farklı dosyalarda tutulur, farklı komutlarla değişir.
usermod -G,-aolmadan mevcut üyelikleri siler. Elle çalışırken-aG‘yi tek kalıp olarak yazın, betiktegpasswd -akullanın.- Değişiklik açık oturumlara yansımaz.
id kullaniciileidfarklı şeyler söyler; erişimi belirleyen ikincisidir.
Yol haritasının bu adımıyla kullanıcı yönetimi bölümünü tamamlamış olduk. Serinin tamamına ve sıradaki konulara GNU/Linux Öğrenme Yolculuğu sayfasından ulaşabilirsiniz.