Linux：ユーザー・グループの管理

# この記事について

LinuC101に半年くらい前に合格したので、その時に対策でとったメモ。ユーザー・グループの管理にかかわるコマンドをまとめている。

# 関連コマンド

| コマンド | 説明 |
| --- | --- |
| passwd | ユーザのパスワードを変更 |
| chage | パスワードの有効期限を設定 |
| useradd | ユーザを新規作成 |
| userdel | ユーザを削除 |
| usermod | 既存のユーザアカウントの設定を更新 |
| groupadd | 新しいグループアカウントを追加 |
| groupdel | 既存のグループアカウントを消去 |
| groupmod | 既存のグループアカウントの設定を更新 |
| id | ユーザのUIDやGIDを出力 |
| groups | ユーザが属するグループを表示 |
| gpasswd | グループのパスワードや所属メンバーを設定 |

# ユーザ・グループ管理ファイル

## `/etc/passwd`

ユーザーアカウント情報が保存されるファイル。プレーンテキストで、各種ページャなどで閲覧可。

### **書式・フィールド**

```
{ユーザー名}:{パスワード(x)}:{ユーザーID}:{グループID}:{グループID1},{グループID2},...:{GECOS}:{ホームディレクトリ}:{ログインシェル}

# 例
newuser:x:1000:1000:,,,:/home/newuser:/bin/bash
```

|  | 項目 | 説明 |
| --- | --- | --- |
| 1 | ユーザー名 | ユーザー名 |
| 2 | パスワード | 暗号化されたパスワード（現在は利用されていない。代わりに `/etc/shadow` のシャドウパスワードが利用される・後述） |
| 3 | ユーザーID | ユーザーID |
| 4 | グループID | **メイングループ**として指定されるグループID(後述) |
| 5 | GECOS | コメント |
| 6 | ホームディレクトリ | ユーザーのホームディレクトリ(~/) |
| 7 | ログインシェル | ログインしたときにシェルとして起動するプログラム（bash, zshなど） |

:::note info
**`vipw` コマンドでｍ `/etc/passwd` , `/etc/shadow` の編集が可能**

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/8060be67-30ce-4cde-b806-d48c5da412b7.png)

`-s` オプションを付与することで、シャドウパスワードを変更可能。
:::

## `/etc/group`

グループアカウント情報が保存されるファイル。`/etc/passwd`ファイル同様各種ページャなどで閲覧可。

### **書式・フィールド**

```
{グループ名}:{パスワード(x)}:{GID}:{グループメンバー}

# 例(ユーザーqnqはsyslogグループにサブグループとして登録されている)
syslog:x:110:qnq
```

|  | 項目 | 説明 |
| --- | --- | --- |
| 1 | グループ名 | **システムで一意である必要あり** |
| 2 | パスワード | 暗号化されたパスワード（シャドウパスワード: x） |
| 3 | GID | GroupID. グループのID。 |
| 4 | グループメンバー | **サブグループ**として登録されているユーザー一覧を記載<br>→複数メンバがいる場合、 `,`で区切り |

:::note info
**プライマリグループとサブグループ**
- **プライマリグループ**：ファイル/ディレクトリを作成したときに所有グループとしてデフォルトで適用されるグループ。`/etc/passwd` に記載。
- **サブグループ**：プライマリグループ以外にユーザーが所属しているグループ。`/etc/group` に記載。
:::

## `/etc/shadow`

第二フィールドに暗号化されたパスワードが記録されている。

### **フィールド**

```bash
ユーザ名:パスワード:日数1:日数2:日数3:日数4:日数5:日数6:フラグ
# 例
qnq:xxxxxxxxxxxxxxxxxxxxxxxx:22222:0:99999:123:::
```

| **カラム名** | **説明** |
| --- | --- |
| ユーザ名 | 一意のユーザ名（/etc/passwdと同様） |
| パスワード | 暗号化されたパスワード |
| 日数1 | 1970/1/1から、パスワードが最後に更新された日までの日数 |
| 日数2 | パスワードが変更できるようになるまでの日数 |
| 日数3 | パスワードを変更しなければならなくなる日までの日数 |
| 日数4 | パスワードの有効期限が切れる前に警告をだす日数 |
| 日数5 | パスワードの有効期限切れからアカウントが使用できなくなるまでの日数 |
| 日数6 | 1970/1/1から、アカウントが使用できなくなる日までの日数 |
| フラグ | 未使用 |

# ユーザ操作コマンド

## `useradd`

### 書式

```jsx
useradd [options] {ユーザー名}
```

### オプション

| 項目 | 説明 |
| --- | --- |
| -m | ホームディレクトリを自動作成(Debian系ディストリビューション) |
| -D | デフォルトの設定値を表示・設定 |
| -c {コメント} | Comment. コメント |
| -d {パス} | Directory. ホームディレクトリのパス |
| -g {グループ名/GID} | GID. プライマリグループを指定 |
| -G {グループ名/GID} | GID. サブグループを指定 |
| -s {パス} | Shell. デフォルトシェルのパス |

### 実行例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/285c66be-ea19-45fb-afcb-cd8287a92b51.png)

:::note warn
`-m`オプションを指定しないと、ホームディレクトリが作成されない。
:::

:::note
**ホームディレクトリのデフォルトファイル**
`/etc/skel` は新規作成するホームディレクトリのテンプレートである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/16097cc6-f86c-48e4-9231-5880a2c55354.png)
:::

## `usermod`

### 書式

```bash
usermod [options] {ユーザー名}
```

### オプション

| 項目 | 説明 |
| --- | --- |
| -L | Lock. パスワードをロックして一時的に無効化 |
| -U | Unlock. パスワードのロックを解除 |
| -aG {グループ名/GID} | Append. 現在のサブグループ設定を維持しつつ追加 |
| -p {暗号化されたパスワード} | Password. 暗号化済みのパスワードを設定 |
| -c {コメント} | Comment. コメント |
| -d {パス} | Directory. ホームディレクトリのパス |
| -g {グループ名/GID} | GID. プライマリグループを指定 |
| -G {グループ名/GID} | GID. サブグループを指定 |
| -s {パス} | Shell. デフォルトシェルのパス |

### 実行例

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/8cf2a294-f63a-4b29-b94a-b4805e236a5c.png)

↓ユーザーをロックすると、 `/etc/shadow` のパスワード直前に `!` が挿入される。

```
# grep newuser /etc/shadow
newuser:$6$(...):20168:0:99999:7:::
# usermod -L newuser
# grep newuser /etc/shadow
newuser:!$6$(...):20168:0:99999:7:::
# usermod -U newuser
# grep newuser /etc/shadow
newuser:$6$(...):20168:0:99999:7:::
#
```

:::note
`/etc/shadow` `/etc/passwd` のパスワードフィールドの1文字目に `!` または `*` を追加することで、-Lと同等にロックが可能。
:::

:::note
ログインシェルのみを変更したい場合には、 `chsh` も利用可能。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/1e499ae9-cb59-4617-a522-7dac4b0cd25c.png)

:::

## `userdel`

### 書式

```bash
userdel [options] {ユーザー名}
```

### オプション

| 項目 | 説明 |
| --- | --- |
| -r | ホームディレクトリも同時に削除 |
| -f | —force | ユーザがログイン中でも強制的に削除 |

## `passwd`

パスワードを変更する。

### 書式

```bash
passwd [options] {ユーザー名}
```

### オプション

| 項目 | 説明 |
| --- | --- |
| -l | Lock. パスワードをロックして一時的に無効化 |
| -u | Unlock. パスワードのロックを解除 |

:::note
passwd では usermod と同様にロック操作ができるが、オプションは小文字である点が異なる。
:::

# グループ操作コマンド

## `gpasswd`

グループのパスワードや所属メンバーを設定

gpasswdは「/etc/group」を管理するコマンド。グループのパスワードや所属するメンバーなどを設定できる。

### 書式

```bash
gpasswd [options] {グループ}
```

### オプション

| 項目 | 説明 |
| --- | --- |
| -a {ユーザー名} | Add. 指定ユーザーをグループに所属させる |
| -d {ユーザー} | Delete. 指定ユーザーをグループメンバから除外する |
| -r | グループパスワードを削除する |

### 使用例

ユーザtestをサブグループsalesから削除する。

```bash
# gpasswd -d test sales
```

## `groupadd`

グループを追加する

### 書式

```
# グループ追加
groupadd {グループ名}
```

## `groupmod`

グループ設定を変更する

### 書式

```
# グループ変更
groupmod [options] {グループ名}
```


### **オプション**

| 項目 | 説明 |
| --- | --- |
| -g {GID} | GID. GIDの変更 |
| -n {グループ名} | Name. グループ名の変更 |

### 実行例
-nオプションを併用してグループ名を変更：

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/673fd60d-8670-4be5-9d30-788467c2f4b6.png)

## `groupdel`

グループを削除する

### 書式

```bash
# グループ削除
groupdel {グループ名}
```

## `groups`

現在のグループ名とグループ名のID値を表示。

ユーザ名と、ユーザの所属する全グループのグループ名について確認できる。

### 実行例
ユーザー`newuser`に対して新しく作成したグループ`newgroup`を差グループとして割り当てた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/da1162ee-0e83-427d-99e8-ee3a7295c521.png)


# その他ユーザー/グループ関連コマンド

## `id`

指定したユーザーまたは現在のユーザの詳細を出力。

### 書式

```
id [{options}] [{username} ...]
```

### **オプション**

| 項目 | 説明 |
| --- | --- |
| -u | UIDを表示 |
| -g | プライマリグループのGIDを表示 |
| -G | 所属するすべてのGIDを表示 |

### **出力内容**

以下の表では「表現(例)」列の太字部が「出力内容」列に一致する。

| 出力内容 | 表現(例) |
| --- | --- |
| ユーザ名 | uid=1001(__newuser__) |
| UID | uid=**1001**(newuser) |
| グループ名 | gid=1001(**newuser**) |
| GID | gid=**1001**(newuser) |
| 所属グループ(groups) | groups=**1001(newuser),1002(newgroup)** |

### **実行例**
UIDが1001の`newuser`はGIDが1001の`newuser`グループにメイングループとして所属しており、1002の`newgroup`にサブグループとして所属している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/47e0f588-a529-4966-888f-c595e246be92.png)

## `getent`

指定した対象(ユーザまたはグループ)の情報を出力。 `/etc/passwd`, `/etc/group` と同様のフォーマットで出力。

### 書式

```
getent { passwd | group }
```

### オプション

| オプション | 説明 |
| --- | --- |
| passwd | ユーザー情報の出力 |
| group | グループ情報の出力 |

### **実行例１（ユーザ情報の出力）**

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/9acc4538-6b04-4b40-b36f-32b898baa27c.png)

### **実行例２（グループ情報出力）**

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/1bc766a3-8b32-41db-9c9d-eaac4d6990cd.png)

### 実行例３（オプションなし・エラー）

オプションを指定しないとエラーになる。

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2491353/67bb324e-5a9f-4de3-94e4-e3806183f09b.png)

# 参考

- Linux教科書 LPICレベル1 Version5.0対応：中島 能和, 濱野 賢一朗
  https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version5-0%E5%AF%BE%E5%BF%9C-%E4%B8%AD%E5%B3%B6-%E8%83%BD%E5%92%8C/dp/4798160490
- Ping-t「最強WEB問題集」
  https://mondai.ping-t.com/g
- "【 id 】コマンド――ユーザーの識別情報を表示する：Linux基本コマンドTips（228）", ＠IT (2025-03-21アクセス）
  https://atmarkit.itmedia.co.jp/ait/articles/1808/02/news027.html
- "【 gpasswd 】コマンド――ユーザーが所属するグループを管理する：Linux基本コマンドTips（72）", ＠IT (2025-03-21アクセス）
  https://atmarkit.itmedia.co.jp/ait/articles/1612/12/news016.html