【adduser/userdel】安全にユーザをLinux(仮)サーバに追加(管理)する手順[Linux]

#**はじめに**
`Apache`をインストールし、OSが`CentOS`(Linuxディストリビューション)であるサーバを一時期、運用していました。
その間に新しい仲間にサーバへのアクセス権限を与える必要がありましたが、権限に制限を設けるなど、いくらか手順を踏まなければいけなかったので、その際とった手順をまとめていきます。

#**手順**
まずはじめに、前提として下記3点があります。

###**登場ユーザ**
|        |     ユーザ |    ユーザの種類    |
|:-----------------|:-----------------:|:------------------:|
| 1             |              root |  スーパーユーザ(私)       |
| 2           |            furukawa |      管理者権限を持つユーザ(私)       |
| 3             |              takuyanin |      追加ユーザ        |

###**流れ**
1. rootユーザ(私)でfurukawa(私)を作成
2. furukawa(私)がtakuyanin(仲間)を作成

###**プロンプトの表記**
コマンドコンソールだと入力を受け付けるプロンプトが、**一般ユーザはシェルによってことなりますが、「$」もしくは「%」です**。rootをスーパーユーザと呼びますが、**スーパーユーザは「#」となります。**

##**1. rootユーザ(私)でfurukawa(私)を作成**
rootユーザは全ての操作を行うことができる一番強い権限を保持しているので、重大な問題を引き起こさないためにも極力利用しない方がいいです。
ですので、管理者の私もfurukawaというユーザを作成して操作を行うとします。

###**鍵を生成**
```
$ ssh-keygen -t rsa -f id_rsa_furukawa
```

###**公開鍵をリモートサーバに送信**
```
$ scp id_rsa_furukawa.pub root@153.122.203.7:~
```

###**リモートサーバにsshログイン**
```
$ ssh -i ~/.ssh/id_rsa root@153.122.203.7
```

###**ユーザを追加**
```
# adduser furukawa
```

###**ユーザが作成されたか確認**
```
# ls -l /home
total 12
drwx------ 2 furukawa furukawa 4096 Jan  8 04:25 furukawa
```

###**作成したユーザにパスワードを設定**
```
# passwd furukawa
New password:
```

###**作成したユーザにsudo権限を付与**
sudo権限は安易にそのほかのユーザに与えてはいけません。
ここでは、furukawaが管理者（私）であるため、sudo権限を与えるとします。

下二つのコマンドどちらでも設定することができますが、**visudo は文法チェックが働くので、基本は`visudo`で設定したほうが良いでしょう。。**
####**1. `visudo`**

```
# visudo
furukawa ALL=(ALL)    ALL
```
####**2. `vi /etc/sudoers`**

```
# vi /etc/sudoers
furukawa ALL=(ALL)    ALL
```
###**ローカルから送られた鍵を作成したユーザディレクトリに配置**

```
.sshディレクトリを作成
# mkdir /home/furukawa/.ssh

root配下の鍵をfurukawa配下へ移動
# mv ~/id_rsa_furukawa.pub /home/furukawa/.ssh

ディレクトリを移動
# cd /home/furukawa

鍵の中身を移す（ここではファイル名変更）
# mv .ssh/id_rsa_furukawa.pub .ssh/authorized_keys
```

###**公開鍵の所有者を変更**
公開鍵(authorized_keys)の所有者をrootからfurukawaに変更

```
所有者を確認、現段階はroot
# ls -la .ssh/authorized_keys
-rw-r--r-- 1 root     root 426 Jan  8 04:24 .ssh/authorized_keys

所有者をfurukawaへ変更
# chown furukawa .ssh/authorized_keys

所有者を確認、所有者はfurukawa
# ls -la .ssh/authorized_keys
-rw-r--r-- 1 furukawa root 426 Jan  8 04:25 .ssh/authorized_keys
```

###**公開鍵のグループを変更**
所有者を変更するときと流れは全く同じなので、最低限必要な`chgrp`コマンドのみを下記では実行しています。（確認作業は省略）

```
グループをfurukawaへ変更
# chgrp furukawa .ssh/authorized_keys
```

###.sshディレクトリ（鍵保管庫）の所有者、グループを変更
公開鍵ファイルのときと何ら変わりない作業なので、実行する必要のあるコマンドのみを下記に記しています。

```
# chown furukawa .ssh
# chgrp furukawa .ssh
```

###**鍵ファイル、.sshディレクトリの権限を変更**

```
# chmod 600 .ssh/authorized_keys
# chmod 700 .ssh
```
権限を変更する`chmod`コマンドについてはこちらの記事にまとめています。
[permission deniedで悩まされたので勉強してみた](https://qiita.com/takuyanin/items/18590600d077df707923)

また、「なぜ`.ssh`ディレクトリには700の権限で、authorized_keysファイルには600の権限を与えているのか」という点に関しては、下記記事に記しています。
[SSH通信でリモートサーバに接続する流れ(公開鍵認証)[Linux]](https://qiita.com/takuyanin/items/8c9a25957dd127463da6)

###**作成したユーザに切り替えるため、ログアウト**
```
# exit
logout
Connectin to 153.122.203.7 closed
```

##**2. furukawa(私)がtakuyanin(仲間)を作成**
###**作成したユーザでログイン**

```
$ ssh furukawa@153.122.203.7
furukawa@153.122.203.7's password:
```
###**sudoで仲間ユーザ(とパスワード)作成**

```
こちらのコマンドは実行してもしなくても構いません（ここでは確認のため）
$ adduser takuyanin
-bash: /usr/sbin/adduser: Permission denied

上のコマンドはPermissionで弾かれますが、sudoコマンドで通りま
す。
$ sudo adduser takuyanin
$ sudo passwd takuyanin
```
`sudo`コマンドに必要なパスワードは「**あなたのパスワード**」です。
コマンド単位で「誰にどのコマンドをrootで実行させることを許可するか」を指定できます。こうすることで**rootパスワードを知られることなく**、必要なコマンドをroot権限で実行できるようになります。

###**仲間にユーザ名とパスワードを知らせる**
今回の場合であれば、仲間に、
・ユーザ名：takuyanin
・パスワード: #######
を知らせ、ssh接続を試みてもらいます。

この作業に関しては、仲間に[こちらの記事](https://qiita.com/takuyanin/items/8c9a25957dd127463da6)にしたがって、作業を進めてもらいます。

以上で安全にユーザを迎え入れることができました。

#**補足**
###**ユーザを削除する**
ユーザが組織から離れる時など既存ユーザを削除する必要があるときは、`rオプション`つきの`userdel`コマンドで削除することができます。
`rオプション`をつけることでユーザに紐づいたホームディレクトリも同時に削除することができます。

```
$ sudo userdel -r takuyanin
```
###**削除できたか確認**
```
$ cat /etc/passwd
```
ユーザが削除されていれば成功です。

###**仲間に、rootユーザのみ許可されているコマンドの実行権限を与えるとき**
```
$ visudo
.
.
takuyanin localhost=/sbin/shutdown -h now
.
```
上記のようにすれば、コマンド毎に実行権限を与えることができ安全です。

#**さいごに**
きちんとユーザ管理をすることで、システム（サーバ）を安全に運用していきたいですね。

こちらの記事が役に立ったという方は、いいね、よろしくお願いします(^^)
また、[takuyaninのマイページ](https://qiita.com/takuyanin)にlinuxコマンドなどに関していくつか記事をまとめてますので、よければご参考ください。