Linuxのユーザー・グループ管理|追加・削除・権限設定の基本操作ガイド

kento_morota 16分で読めます
社内のAI・IT活用、技術がわかる相手に無料相談。 相談 →
目次

Linuxサーバーを複数人で利用する場合、適切なユーザー・グループ管理はセキュリティの根幹をなす重要な作業です。「誰がどのファイルにアクセスできるのか」「誰がsudo権限を持つのか」を正しく管理しなければ、情報漏洩や誤操作による障害のリスクが高まります。

本記事では、Linuxにおけるユーザーとグループの仕組みから、追加・削除・権限変更の具体的な操作手順までを実例付きで解説します。Linuxの基礎知識がある方を対象に、サーバー運用の実務で必要な管理スキルを体系的に紹介します。

Linuxのユーザー管理の仕組みを理解する

Linuxはマルチユーザーシステムであり、1台のサーバー上で複数のユーザーが同時に作業できます。各ユーザーはそれぞれ独立したアカウントを持ち、アクセス権限によって操作範囲が制限されます。

ユーザーの種類

Linuxには大きく分けて3種類のユーザーが存在します。

種類 説明 UID範囲(一般的)
rootユーザー すべての権限を持つ管理者アカウント 0
システムユーザー サービスやデーモンが使用するアカウント 1〜999
一般ユーザー 人間が使用する通常のアカウント 1000〜65534

rootユーザーはシステム上のあらゆる操作を実行できるため、日常的な作業でrootを使うことは避けるべきです。代わりに、一般ユーザーアカウントで作業し、管理者権限が必要な場合のみsudoを使用するのがベストプラクティスです。

ユーザー情報の管理ファイル

ユーザーの情報は主に以下のファイルで管理されています。

ファイル 内容
/etc/passwd ユーザーアカウント情報(ユーザー名、UID、GID、ホームディレクトリ、シェル)
/etc/shadow 暗号化されたパスワードとパスワードポリシー情報
/etc/group グループ情報
/etc/gshadow グループのパスワード情報

/etc/passwdの各行は、コロン区切りで以下の情報を含みます。

username:x:1001:1001:Full Name,,,:/home/username:/bin/bash
   │     │  │    │      │              │            │
   │     │  │    │      │              │            └─ ログインシェル
   │     │  │    │      │              └─ ホームディレクトリ
   │     │  │    │      └─ コメント(GECOS)
   │     │  │    └─ プライマリGID
   │     │  └─ UID
   │     └─ パスワード(xは/etc/shadowを参照)
   └─ ユーザー名

これらのファイルの詳細な構造については、Linuxのディレクトリ構造ガイドで/etcディレクトリの役割と合わせて解説しています。

ユーザーの追加・変更・削除

ユーザーアカウントの管理は、サーバー運用で最も頻繁に発生する作業の一つです。ここでは基本的な操作手順を紹介します。

useraddでユーザーを追加する

# 基本的なユーザー追加(ホームディレクトリ自動作成)
$ sudo useradd -m tanaka

# パスワードの設定
$ sudo passwd tanaka
New password:
Retype new password:
passwd: password updated successfully

# 詳細なオプション指定でユーザー追加
$ sudo useradd -m \
  -d /home/tanaka \
  -s /bin/bash \
  -c "Tanaka Taro - Development Team" \
  -G sudo,developers \
  tanaka

useraddの主要なオプションは以下のとおりです。

オプション 説明
-m ホームディレクトリを作成する
-d ホームディレクトリのパスを指定
-s ログインシェルを指定
-c コメント(ユーザーの説明)を設定
-G 所属するサブグループを指定(カンマ区切り)
-g プライマリグループを指定
-e アカウントの有効期限を設定(YYYY-MM-DD)
-u UIDを指定

なお、Ubuntu/Debianではadduserという対話式のコマンドも利用できます。adduserはuseraddのラッパーで、パスワード設定やホームディレクトリの作成を自動で行ってくれるため、手動操作では便利です。

usermodでユーザー情報を変更する

# ログインシェルを変更
$ sudo usermod -s /bin/zsh tanaka

# コメントを変更
$ sudo usermod -c "Tanaka Taro - Infrastructure Team" tanaka

# サブグループに追加(-aオプションが重要)
$ sudo usermod -aG docker tanaka

# アカウントをロック(ログイン不可にする)
$ sudo usermod -L tanaka

# アカウントのロックを解除
$ sudo usermod -U tanaka

# ユーザー名を変更
$ sudo usermod -l new_tanaka tanaka

特に注意すべき点は、サブグループ追加時の-aオプションです。-aを付けずに-Gだけを指定すると、指定したグループ以外のサブグループからすべて外れてしまいます。既存のグループ所属を維持したまま新しいグループを追加するには、必ず-aGを使いましょう。

userdelでユーザーを削除する

# ユーザーアカウントのみ削除(ホームディレクトリは残る)
$ sudo userdel tanaka

# ホームディレクトリとメールスプールも削除
$ sudo userdel -r tanaka

削除前に、そのユーザーが所有するファイルやプロセスを確認しておくことを推奨します。

# ユーザーが所有するファイルを検索
$ sudo find / -user tanaka 2>/dev/null

# ユーザーが実行中のプロセスを確認
$ ps -u tanaka

プロセスの確認方法については、プロセス管理の基本を参照してください。

グループの管理

グループは、複数のユーザーに対して一括で権限を設定する仕組みです。プロジェクトチーム単位や役割単位でグループを作成し、ファイルのパーミッションをグループに対して設定することで、効率的なアクセス管理を実現できます。

プライマリグループとサブグループ

Linuxのユーザーは必ず1つのプライマリグループに所属し、さらに複数のサブグループ(補助グループ)に所属できます。

  • プライマリグループ:ユーザーがファイルを作成した際にデフォルトで設定されるグループ。通常はユーザー名と同名のグループ
  • サブグループ:追加で所属するグループ。sudo権限の付与やプロジェクト別のアクセス制御に使用
# 自分のグループ所属を確認
$ groups
tanaka sudo developers docker

# 特定ユーザーのグループ所属を確認
$ groups tanaka

# より詳細な情報(UID、GID含む)
$ id tanaka
uid=1001(tanaka) gid=1001(tanaka) groups=1001(tanaka),27(sudo),1002(developers),998(docker)

グループの追加・変更・削除

# グループの作成
$ sudo groupadd developers

# GIDを指定してグループを作成
$ sudo groupadd -g 2000 project-a

# グループ名の変更
$ sudo groupmod -n new-developers developers

# グループの削除
$ sudo groupdel project-a

# グループに所属するユーザーの確認
$ getent group developers
developers:x:1002:tanaka,suzuki,yamada

グループを活用したアクセス制御の実践例

開発チームが共有で使うプロジェクトディレクトリを設定する例を紹介します。

# 開発チーム用グループの作成
$ sudo groupadd dev-team

# メンバーをグループに追加
$ sudo usermod -aG dev-team tanaka
$ sudo usermod -aG dev-team suzuki
$ sudo usermod -aG dev-team yamada

# 共有ディレクトリの作成
$ sudo mkdir -p /opt/projects/app

# ディレクトリの所有グループを設定
$ sudo chown root:dev-team /opt/projects/app

# グループメンバーに読み書き権限を付与
$ sudo chmod 2775 /opt/projects/app

ここで使用しているchmod 2775の先頭の2SGID(Set Group ID)ビットです。SGIDが設定されたディレクトリ内に新しいファイルやサブディレクトリを作成すると、自動的に親ディレクトリのグループが継承されます。これにより、チームメンバーが作成したファイルが自動的にdev-teamグループに所属し、他のメンバーもアクセスできるようになります。

sudo権限の管理

一般ユーザーが管理者権限を必要とするコマンドを実行するためには、sudoが使われます。sudoの設定は/etc/sudoersファイルで管理されますが、このファイルの編集は必ずvisudoコマンドを使ってください。

sudoの基本設定

# sudoersファイルを安全に編集
$ sudo visudo

visudoは編集内容の文法チェックを行い、構文エラーがある場合は保存をブロックします。vinanoで直接/etc/sudoersを編集すると、構文ミスによってsudo自体が使えなくなるリスクがあります。エディタの操作に慣れていない方は、Vimの基本操作ガイドも参考にしてください。

sudoersの設定例

# 特定ユーザーにすべてのsudo権限を付与
tanaka ALL=(ALL:ALL) ALL

# 特定グループにすべてのsudo権限を付与
%admin ALL=(ALL:ALL) ALL

# パスワード入力なしでsudoを実行可能にする
tanaka ALL=(ALL) NOPASSWD: ALL

# 特定コマンドだけsudo実行を許可
operator ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl restart mysql

セキュリティの観点からは、NOPASSWD設定はできる限り避け、必要なコマンドだけに限定してsudo権限を付与する方針が望ましいです。

sudoers.dディレクトリを活用した管理

/etc/sudoersファイルを直接編集する代わりに、/etc/sudoers.d/ディレクトリにファイルを配置する方法が推奨されています。この方法なら、ユーザーやグループごとに設定ファイルを分離でき、管理が容易になります。

# ユーザー別のsudo設定ファイルを作成
$ sudo visudo -f /etc/sudoers.d/tanaka

# ファイルの中身の例
tanaka ALL=(ALL:ALL) ALL

パスワードポリシーの設定

セキュリティを強化するためには、パスワードの有効期限や複雑さのルールを設定することが重要です。

chageでパスワードの有効期限を管理する

# パスワードの有効期限情報を表示
$ sudo chage -l tanaka
Last password change                    : Mar 15, 2026
Password expires                        : Jun 13, 2026
Password inactive                       : never
Account expires                         : never
Minimum number of days between password change  : 1
Maximum number of days between password change  : 90
Number of days of warning before password expires : 7

# パスワードの最大有効日数を90日に設定
$ sudo chage -M 90 tanaka

# パスワード変更の最小間隔を1日に設定
$ sudo chage -m 1 tanaka

# 有効期限の7日前から警告を表示
$ sudo chage -W 7 tanaka

# 次回ログイン時にパスワード変更を強制
$ sudo chage -d 0 tanaka

# アカウントの有効期限を設定
$ sudo chage -E 2026-12-31 tanaka

デフォルトのパスワードポリシーを設定する

新規ユーザー作成時に適用されるデフォルトのパスワードポリシーは/etc/login.defsで設定します。

# /etc/login.defs の主要なパスワード関連設定
PASS_MAX_DAYS   90    # パスワードの最大有効日数
PASS_MIN_DAYS   1     # パスワード変更の最小間隔
PASS_WARN_AGE   7     # 有効期限前の警告日数
PASS_MIN_LEN    12    # パスワードの最小文字数

これらの設定はLinuxセキュリティ強化の一環として、サーバー構築時に適切な値を設定しておきましょう。

ユーザー情報の確認と監査

運用中のサーバーで「現在どのようなユーザーが存在するか」「不審なアカウントがないか」を定期的に確認することは、セキュリティ監査の基本です。

ユーザー情報を確認するコマンド

# 現在ログイン中のユーザーを確認
$ who
tanaka   pts/0        2026-03-22 09:15 (192.168.1.100)
suzuki   pts/1        2026-03-22 10:30 (192.168.1.101)

# より詳細なログイン情報
$ w
 14:30:15 up 45 days,  3:22,  2 users,  load average: 0.52, 0.48, 0.41
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
tanaka   pts/0    192.168.1.100    09:15    0.00s  0.12s  0.00s w
suzuki   pts/1    192.168.1.101    10:30    3:45   0.08s  0.02s vim

# 最近のログイン履歴
$ last | head -20

# ログインに失敗した記録
$ sudo lastb | head -20

# 全ユーザー一覧(一般ユーザーのみ抽出)
$ awk -F: '$3 >= 1000 && $3 < 65534 {print $1, $3, $6}' /etc/passwd

# シェルが設定されているユーザー(ログイン可能なユーザー)を抽出
$ grep -v '/nologin\|/false' /etc/passwd

不要なアカウントの棚卸し

退職者のアカウントや、テスト用に作成した一時アカウントが残っていないかを定期的に確認しましょう。以下のスクリプトで、長期間ログインのないアカウントを検出できます。

#!/bin/bash
# 90日以上ログインのないアカウントを検出
echo "=== 90日以上ログインのないアカウント ==="
while IFS=: read -r user _ uid _ _ home shell; do
    if [ "$uid" -ge 1000 ] && [ "$uid" -lt 65534 ]; then
        last_login=$(lastlog -u "$user" 2>/dev/null | tail -1 | awk '{print $4, $5, $6, $9}')
        if echo "$last_login" | grep -q "Never logged in"; then
            echo "  $user: ログイン実績なし"
        fi
    fi
done < /etc/passwd

このような監査はcronによる定期実行で自動化し、ログ管理の一環として結果を記録しておくことを推奨します。

実務でのユーザー管理ベストプラクティス

最後に、実務でユーザー・グループ管理を行う際のベストプラクティスをまとめます。

セキュリティを重視した管理方針

  • rootでの直接ログインを禁止する:SSH設定でPermitRootLogin noを設定し、一般ユーザー + sudoの運用を徹底する(詳細はSSH接続ガイドを参照)
  • 最小権限の原則を適用する:ユーザーには業務に必要な最小限の権限のみを付与する
  • 共有アカウントを使わない:個人ごとにアカウントを作成し、操作の追跡を可能にする
  • 不要なアカウントは速やかに無効化する:退職・異動時にアカウントをロックまたは削除する
  • パスワードポリシーを適用する:有効期限と複雑さの要件を設定する

運用効率を高めるTips

  • ユーザー作成をスクリプト化するシェルスクリプトで標準化されたユーザー作成手順を自動化する
  • グループベースのアクセス制御を活用する:個々のユーザーではなくグループに対して権限を設定する
  • sudoers.dディレクトリを活用する:用途別にsudo設定を分離して管理する
  • 構成管理ツールの導入を検討する:サーバー台数が増えた場合はAnsibleなどのツールでユーザー管理を一元化する

まとめ:適切なユーザー管理がサーバーセキュリティの第一歩

本記事では、Linuxにおけるユーザー・グループ管理の基本操作を解説しました。主要なポイントを振り返ります。

  • useradd / usermod / userdelでユーザーの作成・変更・削除を行う
  • groupadd / groupmod / groupdelでグループを管理する
  • usermod -aGでグループ追加時は-aオプションを忘れない
  • visudoでsudo権限を安全に設定する
  • chageでパスワードポリシーを管理する
  • 定期的な監査で不要アカウントを検出・削除する

ユーザー管理の知識は、ファイルパーミッションの理解と密接に結びついています。合わせて学ぶことで、Linuxのアクセス制御の全体像が見えてきます。さらにファイアウォールとセキュリティを学ぶことで、サーバー防御の体制を包括的に強化できるでしょう。

#Linux#ユーザー管理#セキュリティ
ManageAI 先行モニター企業 募集中|先着5社・2026年11月末まで

生成AIの利用費、「誰が・何のために・いくら」まで見えていますか?

株式会社カイダンと共同開発したAI利用ガバナンスSaaS「ManageAI」は、OpenAI・Azure OpenAI・Claude・AWS Bedrock・Google Vertex AIの費用と利用状況を、部署・利用者・プロジェクト別に可視化します。導入は読み取り専用キーの登録だけ。初期費用0円・月額5万円(税別)で先行モニター企業を募集しています。

ニュースリリースを読む
共有:
無料メルマガ

週1回、最新の技術記事をお届け

AI・クラウド・開発の最新記事を毎週月曜にメールでお届けします。登録は無料、いつでも解除できます。

プライバシーポリシーに基づき管理します

関連記事

Related / 9 articles

  1. プログラミング

    DDoS攻撃の仕組みと対策入門|レイヤー別の防御とCDN・クラウドの活用

    DDoS攻撃をボリューム型・プロトコル型・アプリ層に分けて仕組みを解説し、自前サーバーで防げない理由、CloudflareやAWS Shieldの標準防御、オリジンIPの隠し方、レートリミットとBot対策、攻撃を受けたときの初動、費用が跳ね上がるDenial of Walletへの備えまでわかります。

  2. プログラミング

    WAFとは?仕組み・導入パターン・誤検知対策|Webアプリを攻撃から守る実践ガイド

    WAFがファイアウォールやIDSと何が違うのか、シグネチャとマネージドルールの仕組み、Cloudflare WAF・AWS WAF・ModSecurityの比較、フォーム送信がブロックされる誤検知の調査と例外設定、ログ監視、WAFが代替できないことまで実践的に解説します。

  3. プログラミング

    セキュリティヘッダー入門|CSP・HSTS・X-Frame-Optionsの設定と効果を実践解説

    CSP・HSTS・X-Frame-Options・X-Content-Type-Optionsなど主要セキュリティヘッダーが防ぐ攻撃と、CSPのReport-Onlyからの段階導入、nonce/hash、HSTS preloadの不可逆リスク、Nginx・Next.js・Astroでの設定例、確認方法を解説します。

  4. プログラミング

    クラウドの通信費(Egress)入門|データ転送量課金の仕組みと転送コストを抑える設計

    クラウドの「受信無料・送信有料」の原則、AZ間・リージョン間・インターネット向けの単価差、NATゲートウェイ処理料の罠、CDNで転送量を減らす方法、バックアップやログ転送の見落とし、請求書で転送料を特定する手順を解説。想定外の請求を防げます。

  5. プログラミング

    秘密情報をGitに入れない仕組み|.gitignore・git-secrets・履歴から漏れた鍵の削除

    APIキーや.envをGitにコミットしてしまう典型経路と、.gitignore・.env.exampleの運用、pre-commitでのgitleaks検知、GitHub secret scanningの活用、漏れた鍵の無効化と履歴書き換え(git filter-repo)の手順を解説。仕組みで再発を防げます。

  6. プログラミング

    開発・ステージング・本番環境の分離設計|環境差分をなくす構成とアクセス制御

    開発・ステージング・本番それぞれの目的と、構成をコードで揃える方法、環境別の設定注入、本番データを使わないテストデータ戦略、ステージングの保護(Basic認証・IP制限・noindex)、コストを抑える運用までを解説。環境差分による本番障害を防げます。

  7. プログラミング

    ngrok・Cloudflare Tunnelでローカルを公開|Webhook開発とデモ環境の作り方

    NAT内のローカル環境にStripeやLINEのWebhookを届けるトンネリングの仕組みを解説。ngrok・Cloudflare Tunnel・localtunnelの比較、固定ドメインと認証、リクエスト検査、公開時のセキュリティ、自宅サーバー公開への応用までわかります。

  8. プログラミング

    ローカル開発環境のHTTPS化|mkcert・hostsファイル・自己署名証明書の正しい使い方

    ローカル開発をHTTPS前提にすべき理由(Secure Cookie・Service Worker・OAuth)と、mkcertでローカルCAを作りhostsで独自ドメインを割り当ててVite・Next.js・Dockerで使う手順を解説。証明書警告を無視する癖の危険も理解できます。

  9. プログラミング

    localhost・0.0.0.0・127.0.0.1の違い|ポートとUnixソケットを理解して「つながらない」を解決

    localhost・127.0.0.1・0.0.0.0の意味の違い、Dockerで外から接続できない原因、host.docker.internal、ポート競合の調べ方、Unixソケットの利点と権限、1024未満ポートの制約を解説。「つながらない」を仕組みから解決できます。

ManageAI

先行モニター企業 募集中

生成AIのコストを「部署別」に、請求書より先に。

先着5社限定・2026年11月末まで。初期費用0円・月額5万円(税別)で、正式版と同等の機能に加え、開発者と伴走者による導入支援を追加費用なしで提供します。プロンプト原文は一切取得しません。

株式会社カイダン × Harmonic Society株式会社の共同事業|読み取り専用キーの登録だけで導入できます