「プライマリグループとセカンダリグループって何が違うの?」
Linuxでファイルのアクセス権やサービスの実行権限を正しく管理するには、ユーザーがどのグループに所属しているかを正確に把握する必要があります。
この記事では、id・groups・getentコマンドを使ってグループを確認する方法から、/etc/passwd・/etc/groupファイルの読み方、プライマリグループとセカンダリグループの違い、さらにはグループの追加・変更手順まで、現場で必要な知識を網羅的に解説します。
プライマリグループとセカンダリグループの違い
Linuxのユーザーは、必ず1つの「プライマリグループ(主グループ)」に所属しています。ユーザーがファイルやディレクトリを作成すると、そのファイルのグループ所有者はプライマリグループになります。一方、「セカンダリグループ(補助グループ)」は、追加で所属できるグループです。1人のユーザーが複数のセカンダリグループに所属できます。
・プライマリグループ:ユーザーに必ず1つ割り当てられるグループ。ファイル作成時のグループ所有者になる
・セカンダリグループ:追加で所属できるグループ。共有ディレクトリへのアクセス制御などに使う
たとえば、開発チーム用の共有ディレクトリに複数のユーザーがアクセスできるようにしたい場合、セカンダリグループとして「developers」を作り、そこに各ユーザーを追加する、という使い方をします。
idコマンドでグループを確認する(最も使う方法)
現場でグループを確認するとき、最もよく使うのがidコマンドです。UID(ユーザーID)、GID(プライマリグループID)、所属グループの一覧をまとめて表示してくれます。1. 特定ユーザーのグループを確認する
idコマンドの引数にユーザー名を指定します。$ id user1 uid=1002(user1) gid=1003(user1) groups=1003(user1),10(wheel),1010(developers)
・uid=1002(user1):ユーザーIDが1002、ユーザー名がuser1
・gid=1003(user1):プライマリグループIDが1003、グループ名がuser1
・groups=1003(user1),10(wheel),1010(developers):所属グループの一覧(プライマリ+セカンダリ)
2. 自分自身のグループを確認する
引数なしでidコマンドを実行すると、現在ログイン中のユーザー自身の情報が表示されます。$ id uid=1002(user1) gid=1003(user1) groups=1003(user1),10(wheel),1010(developers)
3. グループ名だけを表示する(-Gnオプション)
グループ名の一覧だけを取得したい場合は、-Gnオプションを使います。$ id -Gn user1 user1 wheel developers
4. プライマリグループだけを表示する(-gnオプション)
プライマリグループの名前だけを確認したい場合は、-gnオプションを使います。$ id -gn user1 user1
groupsコマンドでグループを確認する
groupsコマンドは、ユーザーが所属しているグループ名をシンプルに表示します。idコマンドよりも出力がコンパクトで、グループ名だけをすばやく確認したいときに使います。$ groups user1 user1 : user1 wheel developers
$ groups user1 wheel developers
/etc/passwdと/etc/groupファイルから確認する
idコマンドやgroupsコマンドが使えない環境や、GID(グループID番号)を直接確認したい場合は、設定ファイルを直接参照します。1. /etc/passwdでプライマリグループのGIDを確認する
/etc/passwdファイルの4番目のフィールドがプライマリグループのGIDです。$ grep user1 /etc/passwd user1:x:1002:1003::/home/user1:/bin/bash
・user1:ユーザー名
・x:パスワード(/etc/shadowに格納)
・1002:UID(ユーザーID)
・1003:GID(プライマリグループID)
・/home/user1:ホームディレクトリ
・/bin/bash:ログインシェル
2. /etc/groupでグループ名とメンバーを確認する
/etc/groupファイルを参照すると、グループに所属しているメンバー一覧がわかります。$ grep user1 /etc/group user1:x:1003: wheel:x:10:user1 developers:x:1010:user1,user2,user3
・1番目:グループ名
・2番目:パスワード(通常はx)
・3番目:GID(グループID)
・4番目:メンバー一覧(カンマ区切り)
※プライマリグループとして所属しているユーザーは、4番目のメンバー一覧には表示されません。これはよくある混乱ポイントです。
getentコマンドでグループを確認する
getentコマンドは、/etc/groupだけでなくLDAPやNISなどの外部認証データベースも含めてグループ情報を検索できます。ActiveDirectoryと連携している環境では、getentを使わないとグループが表示されない場合があります。1. 特定のグループの情報を表示する
$ getent group developers developers:x:1010:user1,user2,user3
2. グループの全一覧を表示する
$ getent group root:x:0: bin:x:1: daemon:x:2: wheel:x:10:user1 developers:x:1010:user1,user2,user3 ~省略~
3. 特定ユーザーが所属するグループをgetentで検索する
getentの出力をgrepで絞り込めば、特定ユーザーがセカンダリグループとして所属しているグループを一覧できます。$ getent group | grep user1 user1:x:1003: wheel:x:10:user1 developers:x:1010:user1,user2,user3
id・groups・getentの使い分け
3つのコマンドにはそれぞれ得意な場面があります。・id:UID・GID・所属グループをまとめて確認したいとき。最も情報量が多く、現場で一番使う
・groups:グループ名だけをすばやく確認したいとき。出力がシンプル
・getent:LDAP/NIS/ActiveDirectory連携環境でグループを確認するとき。外部認証も含めて検索できる
迷ったらまずidコマンドを使ってください。idコマンドだけで、ほとんどの場面は対応できます。
グループの追加・変更方法
グループの確認ができたら、次はグループの追加や変更の操作も押さえておきましょう。1. ユーザーをセカンダリグループに追加する(usermod -aG)
既存ユーザーにセカンダリグループを追加するには、usermod -aGコマンドを使います。# usermod -aG developers user1
【重要】-aオプションを忘れると既存グループが消える
-aオプション(append)を付けないと、そのユーザーのセカンダリグループが指定したグループだけに「上書き」されます。これは現場で本当に起きるミスです。# 危険な例(-aなし) - 既存のセカンダリグループが全て消える # usermod -G developers user1 # 正しい例(-aGで追加) # usermod -aG developers user1
2. 新しいグループを作成する(groupadd)
# グループ名を指定して作成 # groupadd developers # GID(グループID)を指定して作成 # groupadd -g 2000 developers
3. プライマリグループを変更する(usermod -g)
# user1のプライマリグループをdevelopersに変更 # usermod -g developers user1 # 変更結果を確認 $ id user1 uid=1002(user1) gid=1010(developers) groups=1010(developers),10(wheel)
トラブルシュート:よくあるグループ関連のエラーと対処法
「Permission denied」でファイルにアクセスできない
ファイルやディレクトリにアクセスできない場合、まずそのファイルのグループ所有者と自分の所属グループを確認します。# ファイルのグループ所有者を確認 $ ls -l /var/www/html/index.html -rw-rw-r-- 1 apache webadmin 1024 Mar 1 10:00 /var/www/html/index.html # 自分の所属グループを確認 $ id uid=1002(user1) gid=1003(user1) groups=1003(user1),10(wheel)
# user1をwebadminグループに追加 # usermod -aG webadmin user1
usermod -aGしたのにグループが反映されない
usermod -aGでグループを追加しても、対象ユーザーがログイン中の場合は即座に反映されません。以下の方法で対処してください。・方法1:対象ユーザーがログアウトして再ログインする
・方法2:newgrpコマンドで一時的にグループを切り替える
# 一時的にdevelopersグループに切り替える $ newgrp developers # 反映されたか確認 $ id
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| UID・GID・所属グループをまとめて確認 | id ユーザー名 |
| グループ名だけ表示 | id -Gn ユーザー名 |
| プライマリグループだけ表示 | id -gn ユーザー名 |
| 所属グループをシンプルに表示 | groups ユーザー名 |
| LDAP/NIS環境も含めてグループ検索 | getent group グループ名 |
| グループの全一覧を表示 | getent group |
| セカンダリグループに追加 | usermod -aG グループ名 ユーザー名 |
| GID指定でグループ作成 | groupadd -g GID グループ名 |
| プライマリグループを変更 | usermod -g グループ名 ユーザー名 |
ユーザー・グループ管理をもっと体系的に学びたいですか?
Linuxのユーザー管理は、権限設定やセキュリティの土台になる重要な分野です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
<<関連記事>>
・グループパスワードを削除する
・グループからメンバーを外す
・グループにメンバーを追加する
・グループに管理者を設定する
・グループにパスワードを設定する
