Linux標準教科書(Ver.3.0.0)のまとめ ~第7章~

# 第７章 管理者の仕事

## はじめに

システムの管理を行う際に使用されるコマンドが紹介されています。
紹介されているコマンドの内容は以下のようになります。

- ユーザの作成・変更・削除
- グループの作成・変更・削除
- パスワードの設定


## グループとユーザ

Linuxを使用するにはユーザアカウントが必要です。ユーザアカウントはLinuxシステムの利用権限を持っているため、ログインすればLinuxを利用できる。またグループを使えば、複数のユーザを束ねることもできます。

グループとユーザを適切に設定することで、特定のユーザにだけ権限を与えることができるようになります。

グループやユーザの作成・変更・削除はroot権限をもつユーザ(以下システム管理者という)でしか実行できません。


### ユーザ

システム管理者はユーザを定義できます。ユーザの定義は `/etc/passwd` ファイルに記述します。Linuxでは　`/etc/passwd` にエディタで直接編集しなくても、コマンドで操作できます。

#### useraddコマンド(ユーザの作成)

新しくユーザを作成するには `useradd` コマンドを使います。ユーザには数字であるユーザIDを割り振り、どこかのグループに所属させます。

```:書式
useradd ユーザ名
```

練習として、以下のコマンドを実行して、ユーザが作成されることを確かめます。

```console:実行コマンド
# useradd owl
# ls /home/
=> owl
(ユーザ owl のディレクトリが作成されていることを確認)
```

`useradd` コマンドを実行したことで、 ユーザ owl が作成されました。
ユーザが作成されると `home` ディレクトリ直下にユーザ名のディレクトリが作成され、 `/etc/passwd` ファイルにユーザ情報が登録されます。

次は、ユーザIDと所属グループを指定して、ユーザを作成します。

```console:実行コマンド
# grep 1001 /etc/passwd
(ユーザIDが1001のユーザが登録されていないかの確認)
(何も表示されなかった場合、ユーザIDが1001のユーザは未登録)

# useradd -g users -u 1001 penguins
(所属グループとユーザIDを指定して、ユーザを作成)

# grep 1001 /etc/passwd
=> penguin:x:1001:100::/home/penguin:/bin/bash
(ユーザIDが1001のユーザ penguin が登録されていることを確認)
```

|オプション|説明|
|:--:|:--|
|-g グループ名|プライマリグループ名を指定します。グループ名は /etc/group ファイルで定義したグループ名です。|
|-u ユーザID番号|ユーザID番号を指定します。|

#### usermodコマンド(ユーザ情報の変更)

ユーザアカウントの情報を変更するには usermod コマンドを実行します。

```:書式
usermod ユーザ名
```

練習として、以下のコマンドを実行して、ユーザのアカウント情報が変更されるか確認します。

```console:実行コマンド
# grep penguin /etc/passwd
=> penguin:x:1001:100::/home/penguin:/bin/bash
(ユーザ penguin のアカウント情報を表示)

# usermod -c "LPI-Japan Certification" penguin
(ユーザ penguin にコメントを追加)

# grep penguin /etc/passwd
=> penguin:x:1001:100:LPI-Japan Certification:/home/penguin:/bin/bash
(ユーザ penguin のアカウント情報を表示し、変更内容を確認)
```

|オプション|説明|
|:--:|:--|
|-c コメント|コメント(文字列)を変更します。|

#### userdelコマンド(ユーザの削除)

ユーザを削除するには userdel コマンドを使います。

```:書式
userdel ユーザ名
```

練習として、以下のコマンドを実行して、ユーザが削除されるか確認します。

```console:実行コマンド
# grep penguin /etc/passwd
=> penguin:x:1001:100:LPI-Japan Certification:/home/penguin:/bin/bash
(ユーザ penguin が登録されていることを確認)

# userdel penguin
(ユーザ penguin を削除)

# grep penguin /etc/passwd
(ユーザ penguin は削除されているので、コマンドを実行しても何も表示されない)
```

※ `-r` オプションをつけずに `userdel` コマンドを実行してしまうと、 `/home/` と `/var/spool/mail/`直下にユーザのディレクトリが残ってしまいます。


### グループ

グループを使用すれば、複数のユーザの権限をまとめて扱うことができます。ユーザは必ず1つ以上のグループに所属する必要があり、主に所属するグループをプライマリグループと呼びます。

システム管理者はグループを定義できます。グループの定義は `/etc/group` ファイルに記述します。Linuxでは　`/etc/group` にエディタで直接編集しなくても、コマンドで操作できます。

#### groupaddコマンド(グループの作成)

新しくグループを作成するには groupadd コマンドを使います。グループには数字であるグループIDを割り振ります。

```:書式
groupadd グループ名
```

練習として、以下のコマンドを実行し、グループが作成されるかを確認します。

```console:実行コマンド
# grep 1001 /etc/group
(グループIDが 1001 のグループが登録されていないことを確認)

# groupadd -g 1001 linuc
(新しく linuc というグループを作成する)

# grep linuc /etc/group
=> linuc:x:1001:
(グループ linuc が作成されたことを確認する)
```

|オプション|説明|
|:--:|:--|
|-g グループID番号|グループID番号を指定します。|

#### groupmodコマンド(グループの登録情報の変更)

グループの定義を変更するには groupmod コマンドを使います。

```:書式
groupmod [-g gid] [-n new-group-name] グループ名
```

練習として、以下のコマンドを実行して、グループの登録情報が変更されるか確認します。

```console:実行コマンド
# grep 1001 /etc/group
=> linuc:x:1001:
(グループIDが 1001 のグループ linuc の登録情報を表示する)

# groupmod -n linux linuc
(グループ lunuc の名前を linux に変更する)

# grep 1001 /etc/group
=> linux:x:1001:
(グループ名が linuc から linux に変更したことを確認する)
```

|オプション|説明|
|:--:|:--|
|-n グループ名|既存のグループ名を変更する場合に指定します。|

#### groupdelコマンド (グループの削除)

グループを削除するには groupdel コマンドを使います。

```:書式
groupdel グループ名
```

練習として、以下のコマンドを実行して、グループが削除されることを確認します。

```console:実行コマンド
# grep linux /etc/group
=> linux:x:1001:
(グループIDが 1001 のグループが登録されているか確認)

# groupdel linux
(グループ linux を削除する)

# grep linux /etc/group
(グループ linux が削除されていれば、何も表示されない)
(グループが削除されたことを確認)
```

## パスワードとパスワードファイル

### パスワードファイル( `/etc/passwd` )

ユーザの情報は `/etc/passwd` ファイルに以下のフォーマットで保存されます。

```:パスワードファイルのフォーマット
account:password:UID:GID:GECOS:directory:shell
```

**パスワードファイルの内容**

|項目|内容|
|:--|:--|
|account|そのシステムのユーザ名。大文字を含まないように。|
|password|以前は暗号化されたパスワード。現在はxです。|
|UID|ユーザID番号|
|GID|ユーザが属するプライマリグループID番号|
|GECOS|ユーザの名前またはコメントのフィールド|
|directory|ユーザのホームディレクトリ|
|shell|ログイン時に起動されるコマンドインタプリタ|

※ 従来はパスワードファイルに暗号化されたパスワードを記述していましたが、セキュリティ面を考慮してシャドウファイルにパスワードを記述するようになった。

※ パスワードファイルはエディタで直接編集せずに、useraddコマンドなどを使用して操作することが推奨されています。

### グループファイル( `/etc/group` )

グループの情報は `/etc/group` ファイルに以下のフォーマットで保存されます。

```:グループファイルの
group_name:password:GID:user_list
```

**グループファイルの内容**

|項目|内容|
|:--|:--|
|group_name|グループの名前|
|password|以前は暗号化されたパスワード。不要なら空欄|
|GID|グループID番号|
|user_list|グループに所属するユーザのリスト。カンマで区切られる。|

* グループファイルはエディタで直接編集せずに、groupaddコマンドなどを使用して操作することが推奨されています。

### passwdコマンド(パスワードの登録・変更)

作成ユーザにパスワードを登録することでログインできるようになります。 `passwd` コマンドを使用してパスワードを登録・変更できます。また、パスワードの登録にはパスワードが必要なので、初めてパスワードを設定するには root ユーザを使用するする必要があります。

```:書式
passwd [ユーザ]
```

練習として、以下のコマンドを実行して、パスワードが設定されることを確認します。

```console:実行コマンド
# useradd penguin
(ユーザを作成する)

# passwd penguin
Changing password for user penguin.
New password: ******
Retype new password: ******
passwd: all authentication tokens updated successfully.
(ユーザ penguin のパスワードを変更する)

# login penguin
Password: ******
Last login: Sun Apr  8 13:45:14 on pts/0
(ユーザ penguin でログインする)
```

### シャドウファイル( `/etc/shadow` )

ユーザのパスワードはパスワードファイルではなく、シャドウファイルに以下のフォーマットで保存されます。

```:シャドウファイルのフォーマット
account:password:last_changed:may_be_changed:must_be_changed:warned:expires:disabled:reserved
```

**シャドウファイルの内容**

|項目|内容|
|:--|:--|
|account|ユーザの名前|
|password|暗号化されたパスワード|
|last_changed|1970年1月1日から、最後にパスワードが更新された日までの日数|
|may_be_changed|パスワードが変更可能となるまでの日数|
|must_be_changed|パスワードを変更しなくてはならなくなるまでの日数|
|warned|パスワードの有効期限が来る前に、ユーザが警告を受ける日数|
|expires|パスワードが有効期限を過ぎ、アカウントが使用不能になるまでの日数|
|disabled|1970年1月1日からアカウントが使用不可になるまでの日数|
|reserved|予約フィールド|


## 用意されているユーザとグループ

Linuxはインストールしてすぐにシステムを利用できるよう、ユーザとグループが用意されています。

### 一般のユーザとグループ

Linuxを利用するにあたり、最初のアカウントを作成すると、ユーザ名と同様の名前のグループが作成され、ユーザはそのユーザグループに所属しているとシステムに登録されます。

### root ユーザ

rootユーザはシステム設定の変更や、プログラムのインストールや削除、ユーザを作成・変更・削除できる、利用に制限のないユーザです。またアクセス権に関係なく、すべてのユーザのディレクトリへアクセス、コンテンツの読み書きが行えるなど、全ての操作が可能なのでアカウントを厳格に管理する必要があります。

### su コマンド

suコマンドはすでに別のユーザでログインしているしているユーザが、一時的に他のユーザになるためのコマンドです。オプションとしてユーザを指定しない場合、rootユーザでシェルを起動することになります。

オプションをつけずにsuコマンドを実行した場合、カレントディレクトリを変更せずにrootユーザでログインします。
また、 `su -` もしくは `su - root` と実行すると、カレントディレクトリをrootのホームディレクトリに変更した上で、rootユーザでログインすることになります。

```:書式
su [- ユーザ]
```

練習として、以下のコマンドを実行して、一般ユーザからrootユーザに変更されることを確認します。

```console:実行コマンド
# login penguin
Password: ******
Last login: Sun Apr  8 13:45:14 on pts/0
(ユーザ penguin でログインする)

# cat /etc/shadow
cat: /etc/shadow: Permission denied
(ユーザ penguin の権限では見れないファイルの内容を表示できないことを確認)

# su -
Password: ******
Last login: Sun Apr  8 13:46:20 UTC 2018 on pts/0
(rootユーザとしてログインする)

# cat /etc/shadow
--- 内容が表示される ---
(rootユーザでログインしたことを確認)
(root権限でしか操作できないファイルだから)
```

### sudoコマンド

※ sudoファイルが存在しない場合は、 `yum -y install sudo` コマンドを実行して、インストールしてください。

sudoコマンドを使用すれば、スーパーユーザ権限でコマンドを実行できます。suコマンドを使って、rootユーザにログインしなくても、root権限でプログラムを実行できます。

`-u` オプションをつけることで、任意のユーザでコマンドを実行することができます。オプションをつけない場合は、root権限でコマンドを実行することになります。

```:書式
sudo コマンド
```

CentOSでは初期設定のままではsudoコマンドを実行できません。ユーザをwheelグループというスーパーユーザ特権を持つグループに登録する必要があります。また、 `/etc/sudoers` ファイルを編集する必要もあるので、以下のコマンドを実行してみます。

```console:実行コマンド
# login penguin
Password: ******
Last login: Mon Apr  9 01:14:59 on pts/0
(ユーザ penguin でログインする)

# visudo
visudo: /etc/sudoers: Permission denied
(ユーザ penguin では権限がないので編集できない)

# su -
Password: ******
Last login: Mon Apr  9 01:34:39 UTC 2018 on pts/0
(rootユーザでログインする)

# usermod -G wheel penguin
(ユーザ penguin をグループ wheel に追加する)

# grep wheel /etc/group
wheel:x:10:penguin
(グループ wheel にユーザ penguin が追加されたことを確認)

# visudo
--- コードを修正する ---
Defaults   !visiblepw
↓
Defaults   visiblepw

--- コードを修正する ---
# %wheel        ALL=(ALL)       ALL
↓
  %wheel        ALL=(ALL)       ALL
(グループ wheel を有効に設定)

# su - penguin
(ユーザ penguin としてログイン)

# sudo visudo
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for penguin: ******
(ユーザ pengin でも sudoコマンドを使用してvisudoコマンドを使用できることを確認する)
```