sudoの入り口


# 0.本稿について
- 対象：サーバ用Linuxについて学習している初学者。
- 目標：AlmaLinuxでsudoができるようになる。sudoの基本概念を理解する。
- 想定：ユーザ、グループの概念について理解している人を想定。

:::note warn 
#### 正確さの省略について
本稿では概念をわかりやすくするために、簡略化した表現を使用し、一部専門的な詳細を省略している事があります。
:::

御託はいいからAlmaLinuxでsudoできるようにしたいという人はrootユーザで

```bash
usermod -aG wheel ユーザ名
```

を実行してください。

:::note info
debian系(ubuntuとか)の場合はこっちです。
```bash
usermod -aG sudo ユーザ名
```
:::


sudoしたいユーザで再ログインするとsudoできるようになります。

# 1.一般ユーザで特定のコマンドが実行できない

Linuxを触り始めると、rootユーザだと実行できるのに一般ユーザだと以下のようなメッセージが出てきてコマンド実行ができない事があります。

```bash
$ dnf update
Error: This command has to be run with superuser privileges (under the root user on most systems).
```

### 日本語の場合
```bash
エラー: このコマンドはスーパーユーザー特権(大概のシステムではrootユーザー)で実行しなければいけません。
```

これはコマンドを実行した一般ユーザが、管理者権限を持っていないためです。

# 2.コマンド実行権限
Linuxには、システムの設定を簡単に変更できないように、システムに致命的な変更を与えるコマンドには権限が必要にする仕組みがあります。

rootユーザの場合は実行できるが、一般ユーザだと実行できないのはこの仕組みのためです。

rootユーザはすべてのコマンドを実行する強力な権限を持ち、一般ユーザは管理者が付与しない限りこの権限を持っていません。そのため一部コマンドを実行できません。

これは一般ユーザの理解不足・typoによる誤操作や、侵入者による破壊行為によるシステム設定変更を防ぐためにあります。

しかし一般ユーザにもこの権限を一時的に付与し、すべてのコマンド実行を可能にする事ができます。
それがsudoです。


王様の持ってる各種権限を一時的に借りるようなものです。

# 3.sudo
sudoは別のユーザとしてコマンドを実行するコマンドです。

:::note info
`sudo`コマンドは、オプションを指定しなければ、デフォルトでは`root`ユーザとして実行します。`-u`オプションを付けると別のユーザとして実行できますが、今回はその説明は割愛します。
:::

## sudoの使い方
sudoは、

```bash
$sudo dnf update
```
のように実行したいコマンドの先頭に`sudo`とつけるだけです。

`sudo`を付けたけどなんか色々出てきて実行できないんだけど！というあなた。話はまだ終わってません。
`sudo`をつけて実行したら今度は次のように表示されたはずです。

```bash
[yoyo@AL ~]$ sudo dnf update
    nbvc[\/l,ik8jn b  fd
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 yoyo:
```
これはsudoを実行(=管理者権限でコマンド実行)するにあたっての注意点と、あなたが使用しているユーザのパスワード入力を求められています。　`大いなる力には大いなる責任が伴う`と書いてありますね。
そしてパスワードを入力すると次のように表示されます。

```bash
yoyo is not in the sudoers file.  This incident will be reported.
#「yoyo(ユーザ)はsudoersファイルにないよ。これは報告しますからね！」という意味。
```

このメッセージにあるように、sudoを実行できるようにするにはユーザの情報をsudoersファイルに登録(sudoの設定)をしなければなりません。

## sudoersの設定
sudoの設定をするには`root`ユーザで`sudoers`ファイルを編集します。
`sudoers`ファイルは`/etc/sudoers`にあります。これを編集すればいいのですが、このファイルを編集する場合は`visudo`コマンドで編集します。`vi /etc/sudoers`などで直接編集するのは推奨されません。

## 記載ルール

次のようなルールで記載することで設定できます。

```bash
user    host=(runas_user) command
```
|値|意味|
|-|-|
|user|権限を与えるユーザー名|
|host|許可するホスト名。特定のホスト名やALLを指定|
|runas_user|sudoを実行する際に指定するユーザー。省略可能で、通常はALLまたはroot|
|command|実行を許可するコマンド。複数のコマンドをカンマで区切って指定可能。ALLとすると全てのコマンドを許可|

`visudo`でsudoersを開き、100行目付近を見てみると、次のように記載されています。

```bash
95 ##      user    MACHINE=COMMANDS
96 ##
97 ## The COMMANDS section may have other options added to it.
98 ##
99 ## Allow root to run any commands anywhere
100 root    ALL=(ALL)       ALL
101 
```

これはrootユーザがすべてのホストで、すべてのユーザですべてのコマンドを実行できるという意味です。

例えば`yoyo`ユーザに同様の権限を与えたい場合は

```bash
yoyo    ALL=(ALL)       ALL
```

のように記載します。この1行を100行目の下に追加挿入すればOKです。

## グループの設定

先ほどの書き方は、特定ユーザについて設定する方法でした。
下のほうの`106`,`107`行目に以下のような記載があります。

```bash
106 ## Allows people in group wheel to run all commands
107 %wheel  ALL=(ALL)       ALL
```

これはwheelグループにrootと同じ権限を指定している記述になります。
グループを指定したい場合は、このようにグループ名の先頭に`%`記号をつけて記載します。



# 手軽にsudoできるようにしたい
AlmaLinuxでsudo実行できるように管理者権限を与えるには、wheelグループに追加するのが一番簡単です。冒頭で記載したのはこの方法になります。rootユーザでログインして以下コマンドを実行し、bash再読み込みで反映されます。bash再読み込みをさせるには再ログインが一番簡単です。

### wheelグループへユーザ追加

```bash
usermod -aG wheel ユーザ名
```

### 実行例
```bash
usermod -aG wheel yoyo
```
:::note info aaa
なおdebian系ディストリビューションの場合は`wheel`グループに値するものとして`sudo`が存在します。debian系の場合は`wheel`の代わりに`sudo`に変えて実行すると同じ事になります。
:::

# ならwheelに登録するのがいいんじゃないの？
と思うのですが、確かに手軽に迅速にsudo権限を与えるならばそれが一番です。

しかし、利用するユーザが多くなってきたり、いろんな権限を与えるようになってくると、このユーザはこのコマンドだけ実行できるように制限したいなとなってきます。

そういった場合はsudoersに登録する手法の方が良いです。

このように、どちらの手法を利用すべきかは利用・提供する環境によって変わってくるので、TPOにあわせて選択して設定を行いましょう。