[Linux]権限まわりの基礎を押さえる

# はじめに

実務でcron周りを触ることがあったので、ついでに権限まわりの基礎の復習としてまとめてみました。

## 環境

* Docker version: 4.17.0
* 使用イメージ: centos:centos7

# パーミッション

https://qiita.com/shisama/items/5f4c4fa768642aad9e06

上記の記事がとてもわかりやすいです。
また、実業務で学んだことのメモを残します。

* ファイルの削除は、そのファイルを格納しているディレクトリに書き込み権限と実行権限があれば削除することができる
    * ファイル自体のパーミッションは関係なし
* umaskには、グローバルな設定とユーザごとの設定があり、ユーザごとの設定がある場合(.bash_profile)、ユーザごとの設定が優先される
* SUIDやSGIDについて
    * https://qiita.com/shunsakai/items/e2aad1375e40fb727b29
* アプリケーションからファイルの作成などを行う場合、実行ユーザは誰になるのか。
    * 例えば、LaravelアプリケーションをApacheで動作させている場合、実行ユーザはhttpd.confで設定されているユーザとなる。
    * artisanコマンドを実行した時の実行ユーザは、artisanコマンドを実行したユーザ。

# ユーザとグループ

## ユーザの作成

```
useradd username
```

グループを指定しない場合は、ユーザ名と同じ名前のグループが作成され、そのグループに所属することになります。
また、ユーザを追加した後はパスワードを設定しましょう。

```
passwd username
```

## ユーザ一覧

```
cat /etc/passwd
```

## グループの作成

```
gropuadd グループ名
```

## グループ一覧

```
cat /etc/group
```

## ユーザの所属するグループの確認

```
groups username
username: プライマリーグループ名 セカンダリグループ名 ※セカンダリグループに所属している場合
```

* プライマリーグループとは
    * ユーザーが作成されたときに自動的に設定されるグループ
* セカンダリグループとは
    * ユーザーが任意に追加できる他のグループ

### プライマリーグループの確認

```
id -gn username
```

### セカンダリグループの確認

```
id -Gn username
```

## グループに所属するユーザの確認

```
getent group groupname
```

## ユーザのグループを変更

```
# プライマリーグループの場合
usermod -g 変更後のグループ名 username
# セカンダリグループの場合
usermod -G 変更後のグループ名 username
```

# cron周り

crontabコマンドを使用することでcronの設定を操作することができる。
そして、crontabはユーザーごとに設定されています。

## ログインユーザのcrontabを確認する

```
crontab -l
```

## ログインユーザのcrontabを編集する

```
crontab -e
```

本当にある怖い話はこちら...

https://qiita.com/kawaz/items/1620300551b5b3f2eccc

## cronを設定しているユーザを確認する

```
cd /var/spool/cron && ls -l
```

設定しているユーザのユーザ名がディレクトリ名になっています。
「ユーザは存在するが、そのユーザ名であるディレクトリがない」場合は、cronを設定していないということです。

# rootにsuできるユーザを限定する

rootにsuできるユーザを限定するためには、設定ファイルである

```
/etc/pam.d/su
```

を編集します。
編集前を見てみると

```
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid
```

コメントで「suできるユーザをwheelグループに限定する方法」が書かれています。
それぞれ見てみましょう。まず、1つ目の場合は、

```
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient   pam_wheel.so trust use_uid
```

「implicitly trust」と書いてある通り、suする際にパスワードを要求しません。
反対に2つ目の場合は、

```
# Uncomment the following line to require a user to be in the "wheel" group.
#auth           required        pam_wheel.so use_uid
```

suする際にパスワードを要求します。
パスワードを要求する2つ目の方法がセキュリティ的にいいので、アンコメントする際は気をつけましょう。


# sudoできるユーザを限定する

sudoコマンドは、root以外のユーザーが管理コマンドを実行できるようにするためのコマンド。
そのためすべてのユーザがsudoできてしまうという状況は、当然セキュリティ的に良くないです。
sudoの権限管理は、

```
visudo
```

を実行し、/etc/sudoersを編集することで行います。
visudoを実行するとエディタが立ち上がるので、あとはファイル内にあるコメントの通り編集すればOKです。
下記は、ユーザとグループにsudoの権限を与える例です。

```
// ユーザの場合
username ALL=(ALL) /path/to/command

//　グループの場合
%groupname ALL=(ALL) /path/to/command 
※グループの場合は、先頭に「%」を入れる

// 許可したいコマンドが複数の場合
username ALL=(ALL) /path/to/command1,/path/to/command2...
```

「ALL」については、https://beyondjapan.com/blog/2022/05/sudoers/ がとても参考になる。


# su

## su と su - の違い

| コマンド | 説明 | 環境変数 | ホームディレクトリ | パス 
| - | - | - | - | - |
| su ユーザー名 |	指定したユーザーに切り替え | 元の環境変数を引き継ぐ | 現在のまま | 変わらない
| su - ユーザー名 | 指定したユーザーにログインシェルとして切り替え | そのユーザーの環境変数を適用 | そのユーザーのホームディレクトリに移動 | 変更される

## sudo su

```
$ su
Password:  # root のパスワードを入力
# whoami
root
```

```
$ sudo su
[sudo] password for user:  # 自分のパスワードを入力
# whoami
root
```

* 自分のパスワード（sudo 用）を入力すれば root に切り替わる
* sudo を使えるユーザー（sudo グループに属しているユーザー）なら、**rootのパスワードを知らなくても実行できる**


| コマンド | ユーザー | 適用される環境変数 |  
| - | - | - |
| sudo su |	root | 元の一般ユーザーの環境を引き継ぐ | 
| sudo su -  | root | root の環境変数が適用される |
| sudo -i | root | root の環境変数が適用される |