【Linux】間違ってrootユーザーで作業した後、ユーザーを切り替えた話

## はじめに
Linuxでは基本的にrootユーザーを開発時などで使う事はしない（理由については[【完全初心者向け】Linuxのrootユーザとは？](https://eng-entrance.com/linux-root)など色々な所に書かれているのでそちらを参照）。

なのに、しばらくrootユーザーでうっかり勉強のための開発を進めてしまったので、新規でユーザーを作成した後、それらの所有者・グループの変更までやってみたのでその備忘録を残す。

やった事としては、以下の2つ。

1. ユーザーの新規作成
1. rootユーザーで作業した＝rootユーザーが所有するディレクトリ・ファイルの所有者を新規作成したユーザーに変更

## ユーザーを作成する
[useradd](https://atmarkit.itmedia.co.jp/ait/articles/1811/02/news035.html)コマンドと[passwd](https://atmarkit.itmedia.co.jp/ait/articles/1612/05/news021.html)コマンドでできる。実際に作成すると以下のようになる（各コマンドのオプションについては参考に示しているものや、各リンクを参照）。

```console
[root@localhost home]# sudo useradd -c "study user" -d /home/study -s /bin/bash study

[root@localhost home]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
...
study:x:1001:1001:study user:/home/study:/bin/bash

[root@localhost home]# sudo passwd study
ユーザー study のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。

[root@localhost home]# ls
study
```

あとは、一度仮想マシンを落として作成したユーザー（今回だと`study`）でログインすれば、そのユーザーが使えるようになる。

- 参考：[CentOS7 ユーザーを追加する](https://qiita.com/Zen-GoTo-May/items/3aab7b6c76e8a857e717)

## 後の事を考えてstudyでもSSHでログインできるようにする
詳細は[ssh接続を公開鍵・暗号鍵方式に変更する](https://qiita.com/yuta-katayama-23/items/6baf167464eca3376ea0#ssh%E6%8E%A5%E7%B6%9A%E3%82%92%E5%85%AC%E9%96%8B%E9%8D%B5%E6%9A%97%E5%8F%B7%E9%8D%B5%E6%96%B9%E5%BC%8F%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)を参照。

## rootの方で行った環境構築の内、条件によっては新しく作成したユーザーでもやる必要がある
`/usr/bin`以下にバイナリがあるものはユーザーが切り替わっても実行できる（dockerのようにsudoが必要になるものもあるが）。gitやdockerはそれに該当する。しかし、筆者はnodeについてはnodebrewでインストールしたため、`$HOME`以下に`~/.nodebrew`がありnodeもその中で使えるような設定をしていたので、新しく作成したユーザーでもインストールをする必要があった。

というわけでnodeを新規で作成したユーザーでもインストールするが、その作業内容についてはここでは割愛する（実際の手順を参照したい方は[Node/npm/yarn](https://qiita.com/yuta-katayama-23/items/6baf167464eca3376ea0#nodenpmyarn)などを参照）。

※ちなみに、実際に`/usr/bin`以下にgitやdockerがある事を確認してみると、確かに存在する事が分かる

```console
[study@localhost bin]$ ls | grep git
git
git-receive-pack
git-shell
git-upload-archive
git-upload-pack

[study@localhost bin]$ ls | grep docker
docker
docker-compose
docker-init
docker-proxy
dockerd
dockerd-rootless-setuptool.sh
dockerd-rootless.sh
rootlesskit-docker-proxy
```

※Linuxの`/bin`や`/usr/bin`については[各ディレクトリの役割を知ろう（サブディレクトリ編）](https://atmarkit.itmedia.co.jp/ait/articles/0109/07/news002_2.html)などを参照。

※実際のインストール手順のようなものは[CentOSに開発に必要そうなものを一式インストールする
](https://qiita.com/yuta-katayama-23/items/6baf167464eca3376ea0#centos%E3%81%AB%E9%96%8B%E7%99%BA%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%9D%E3%81%86%E3%81%AA%E3%82%82%E3%81%AE%E3%82%92%E4%B8%80%E5%BC%8F%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)を参照。

## 既存のファイルの所有者・グループを変更する
今回はしばらくrootユーザーで色々作業してしまった場合に、そのファイルの所有者・グループを変える方法を見ていく。

やる事としては、

1. 既存のroot以下のディレクトリ・ファイルを`home/{user_name}/`以下にコピーする
1. 所有者・グループを書き換える

の2つのみ。

```console
[root@localhost ~]# cp -r ./workspace/ /home/study/
```
```console
[study@localhost workspace]$ ls -al
...
drwxr-xr-x. 10 root  root  4096  4月 28 08:55 node-express

[study@localhost workspace]$ sudo chown -R study:study ./node-express/

[study@localhost workspace]$ ls -al
...
drwxr-xr-x. 10 study study 4096  4月 28 08:55 node-express
```

※この時、dockerによって作成されたディレクトリ（MySQLサーバーをdocker-composeで立ち上げた際に、volumeで指定したディレクトリ）はどうなるのか？だが、所有者がrootではなく`polkitd`だったため、特に所有者・グループが変わる事はなかった。

```console
[study@localhost node-express]$ tree . -I node_modules
.
...
├── data
│   └── mysql
...
[study@localhost data]$ ls -al
...
drwxr-xr-x.  6 polkitd root  4096  4月 28 08:56 mysql
```

- 参考：[chownコマンドについてまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-chown)
- 参考：[chown - ファイルの所有者やグループを変更 - Linuxコマンド](https://webkaru.net/linux/chown-command/)

## まとめ
今回は間違えてrootユーザーで色々作業をしちゃった後に、新規でユーザーを作成して、そのユーザーで作業ができるようになるまでをやってみた。最初からrootユーザーで作業しないようにするのが一番なので気をつけたい。。。

## おまけ
### トラブルシューティング
#### {user_name} is not in the sudoers file（{user_name} は sudoers ファイル内にありません。）
ユーザーを単に作成しただけでは`sudo`を付けたコマンドは実行できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1372684/b59ec6e3-4cea-abf7-1d18-d2d460b53077.png)

これは指摘の通り、sudoersという設定ファイル（`/etc/sudoers.tmp`）にsudoを実行しようとしたユーザーが登録されていないのでエラーになっている。やる事としてはrootユーザーで`visudo`コマンドを実行してファイルを書き換えればいい。

```console
[study@localhost .ssh]$ su -
パスワード:
最終ログイン: 2022/04/27 (水) 09:10:29 JST日時 pts/2

[root@localhost ~]# visudo

[root@localhost ~]# exit
ログアウト
```
```tmp:/etc/sudoers.tmp
...
## Allows people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
study  ALL=(ALL)       ALL ## <- ここに追記

## Same thing without a password
...
```

こうするとsudoを実行できるようになる。

```console
[study@localhost .ssh]$ sudo pwd
[sudo] study のパスワード:
/home/study/.ssh
```

※ちなみに、毎回パスワードを入力するのが面倒であれば、
```
study  ALL=(ALL)       NOPASSWD: ALL
```
のように`NOPASSWD`オプションを付ければいい。

- 参考：[Fix user is not in the sudoers file in Linux](https://nudesystems.com/fix-user-is-not-in-the-sudoers-file-in-linux/#method-2-using-the-sudoers-file)
- 参考：[【CeontOS】「sudoers ファイル内にありません。この事象は記録・報告されます」というメッセージが出た時の対処](https://notepad-blog.com/content/112/)