こんにちは、かつコーチです。
サーバーを複数人で運用したり、アプリごとに専用ユーザーを分けたりする場面では、ユーザー・グループ管理の知識が欠かせません。
この記事では、Ubuntu 26.04 LTSでの実例を交えながら、useradd・usermodを中心にユーザー・グループ管理の基本を解説します。
ユーザー・グループ管理とは?
ユーザーとグループの定義
Linuxのユーザーとは、システムを利用する主体(人や、アプリを動かす専用アカウント)を識別する単位です。
グループとは、複数のユーザーをまとめて権限管理しやすくするための単位です。
前回・前々回の記事で解説した「所有者」「所有グループ」は、このユーザー・グループの仕組みの上に成り立っています。
なぜユーザー・グループ管理が必要なのか
1台のサーバーを複数人で使う、あるいはアプリごとに実行ユーザーを分けるといった運用では、以下のような理由からユーザー・グループの適切な設計が重要になります。
- 個人ごとにアカウントを分けることで、誰がいつ何をしたか追跡できる(監査性)
- アプリ専用ユーザーを用意することで、万一アプリが乗っ取られても被害範囲を限定できる
- グループ単位で権限をまとめて管理することで、chmod・chownの設定がシンプルになる
「rootユーザーだけで全部やる」運用は、便利に見えて事故が起きたときの被害が大きくなりがちです。
基本の書き方:useradd・usermodの使い方
手順1:useraddで新規ユーザーを作成する
新しいユーザーを作るにはuseraddコマンドを使います。
$ sudo useradd -m -s /bin/bash deploy
-m:ホームディレクトリ(/home/deploy)を自動作成する-s /bin/bash:ログインシェルをbashに指定する
-mを付け忘れると、ホームディレクトリが作られないまま進んでしまうので注意してください。
手順2:passwdでパスワードを設定する
useraddだけではパスワードが設定されないため、passwdコマンドで設定します。
$ sudo passwd deploy
新しいパスワード:
新しいパスワードを再入力してください:
passwd: パスワードは正常に更新されました
パスワードを設定しないままだと、そのアカウントではパスワードログインができない状態になります(SSH鍵認証のみで使う運用の場合は、意図的に設定しないこともあります)。
手順3:usermodで既存ユーザーの設定を変更する
すでにあるユーザーの設定を変更するときはusermodを使います。
$ sudo usermod -aG www-data deploy
$ sudo usermod -s /usr/sbin/nologin batch-user
1つ目はdeployユーザーをwww-dataグループに追加する例、2つ目はログインを禁止するシェルに変更する例です。-aGのa(append)を忘れると、既存の所属グループがすべて上書きされてしまうため、必ずセットで使ってください。
つまずきやすい設定・注意点
グループへの追加は-aG、確認はgroupsコマンドで行うのが基本の流れです。
$ groups deploy
deploy : deploy www-data docker
追加したはずのグループが反映されない場合、後述するログインセッションの問題を疑いましょう。
よくあるつまずきポイント・エラー対処
usermod -aGを忘れて所属グループが消えた
私が実際にサーバーで作業したとき、-aを付け忘れて痛い目を見たことがあります。
❌Before:-aを付けずに-Gだけでグループを追加する
$ sudo usermod -G docker deploy
このコマンドを実行した結果、groups deployを確認すると、それまで所属していたwww-dataグループが消え、dockerしか表示されなくなっていました。-Gだけを指定すると「所属グループをこのグループだけに上書きする」動作になるため、既存の所属グループがすべて消えてしまったのです。
✅After:既存のグループを維持したまま追加したい場合は-aGをセットで使う
$ sudo usermod -aG docker deploy
$ groups deploy
deploy : deploy www-data docker
-a(append)を付けることで「既存のグループに追加する」動作になります。
グループを追加するときは、常に-aGとセットで覚えておくと事故を防げます。
グループに追加したのに権限が反映されない
グループ追加コマンド自体は成功しているのに、SSHでログイン中の端末では反映されないというつまずきもよくあります。
$ sudo usermod -aG docker deploy
$ docker ps
permission denied while trying to connect to the Docker daemon socket
❌Before:グループを追加したのに反映されないと、コマンドが間違っていると思い込む
✅After:グループの反映にはログインセッションの再取得が必要だと理解し、再ログインする
$ exit
$ ssh deploy@server
$ groups
deploy www-data docker
グループ情報はログイン時にセッションへ読み込まれるため、既存のSSHセッションのままusermodを実行しても、そのセッション内には反映されません。
一度ログアウトして再ログインするか、newgrp dockerコマンドで一時的にグループを切り替えることで解決します。
応用・一歩先の使い方
グループの作成と削除(groupadd・groupdel)
ユーザー用のコマンドと対になる形で、グループにも専用コマンドがあります。
$ sudo groupadd developers
$ sudo groupdel old-team
アプリ単位・チーム単位でグループを新設し、chmod・chownの対象として使うと権限設計がシンプルになります。
ユーザーの削除(userdel)とホームディレクトリの扱い
不要になったユーザーはuserdelで削除できますが、-rオプションの有無で挙動が変わります。
$ sudo userdel taro
$ sudo userdel -r taro
-rを付けないとホームディレクトリが残り続けるため、ディスク容量やセキュリティの観点から、原則-rを付けて削除するのがおすすめです。
ただし、退職者のデータをバックアップしてから削除したい場合など、意図的に-rを付けないケースもあるため、削除前に必ず用途を確認しましょう。
まとめ
この記事のポイント
- ユーザーは利用主体、グループは複数ユーザーをまとめる単位
useradd -m -s /bin/bash ユーザー名でホームディレクトリ付きのユーザーを作成するusermod -aG グループ名 ユーザー名でグループに追加する(-aを忘れると既存グループが消える)- グループの変更はログインセッションに反映されないため、再ログインまたは
newgrpが必要 groupadd・userdel -rなど、周辺コマンドも合わせて覚えると運用がスムーズになる
次に読むべき記事
ユーザー・グループの管理ができるようになったら、管理者権限を安全に使うための「sudoの仕組みと安全な使い方」に進んでみてください。
今回作成したdeployユーザーに、必要な権限だけを与える方法が分かります。
タグ: Linux, 中級者向け, 権限管理