【何となく使っている？】sudoコマンドの役割について

# はじめに
Linux系のOSを使っている人たちなら親の顔よりも見たことがあるsudoコマンド。例えば以下のようなコマンドはほとんどのLinuxユーザが実行したことであろう。

```bash
sudo apt update
sudo apt install vim
```
しかしこのsudoコマンドの意味を理解していないまま、おまじないのように使っているという人は、結構多いのではないだろうか。

そこで本記事では、sudoコマンドが持つ具体的な役割について説明をしていく。

# sudoコマンドの役割
結論から言ってしまえば、sudoコマンドとは本来、「あるユーザが他のユーザ、または他のグループの権限を用いて、プログラムなどを実行できるようにする」という役割を有している。

よくある使われ方としては、一般ユーザにroot権限（Windowsでいう管理者権限のようなものを指す）を一時的に付与して、プログラムを実行させるというものである。

特にUbuntuの場合、デフォルトでは安全面の観点からrootユーザにログインすることは不可能である。そこでroot権限を使う必要があるときには、sudoコマンドを用いることになっている。

# 誰でもroot権限で実行できてしまうのでは？
上記のようにsudoコマンドさえ使えば、誰でもroot権限でコマンドが実行できてしまうので危ないのでは？と思ってしまう人も少なからずいるだろう。

しかし実際にはsudoコマンドに関する設定ファイルがLinux上には存在しており、そこでは「どのユーザはsudoコマンドを使ってどの権限で〇〇を実行できる」といったことが設定されている。これは通常、root権限を持てるシステムの管理者などが設定をしており、誰もが好き勝手編集できるわけではないので、その面では安全性は確保されている。

# sudoコマンドの設定ファイル
sudoコマンドの設定ファイルは、/etc/sudoersに書き込まれている。例えば以下のように設定されている。

```bash
root    ALL=(ALL:ALL) ALL
```

この設定の場合、rootユーザは全てのホストにおいて、任意のユーザとして任意のコマンドを実行できるという意味を表している。

この書式を一般化したものが以下のものである。

```bash
だれが    どのホストで=(どのユーザとして:どのグループとして) 何ができる
```

この設定ファイルには、あらかじめいくつかの設定内容が書き込まれている。それによって我々一般ユーザが個人のPCでUbuntuを使っているときに、sudoコマンドによってroot権限で任意のコマンドを実行できるようになっている。企業などのシステムで使う場合は、システム管理者などが設定ファイルに適切な内容を書き込んでいるケースがほとんどだろう。

## 設定の例

```bash
%admin ALL=(ALL) ALL
```

全てのホストにおいて、adminグループに所属している任意のユーザとして、任意のコマンドを実行できる設定。

"%"をつけることでグループ名を指定できる。また等号の右辺にある括弧内が"ALL"のように省略されている場合は、rootユーザを含めて、任意のユーザに成り代わることを意味している（root権限を付与していることと同等）。ただし今回の場合、"（ALL:ALL）"の":ALL"を省略している形になっているため、成り代わるグループは無いという設定になっている。

```bash
user1 ALL=(user2) /bin/ls, /bin/cat
```

全てのホストにおいて、user1はuser2としてlsコマンドとcatコマンド（いわゆる閲覧コマンド）を実行できる設定。

上記のように","で区切ることで、複数のコマンドを設定することができる。

# 設定ファイルの編集方法
一般的にsudoコマンドの設定ファイルであるsudoersファイルを編集する方法としては、visudoコマンドを使うことが推奨されている。これによって書式のチェックを自動で行ってくれるため、極めて安全に編集することができる（sudoersファイルはとても重要なファイルであるため、より慎重に編集する必要がある）。

## visudoコマンドの使い方


|オプション |内容 |
|---|---|
|-c  |書式チェックのみ  |
|-f sudoersファイルへのパス  |sudoersファイルの指定  |
| -q | エラーを表示しない |
| -s | 厳密な書式チェック |

オプションをしない場合は、sudoersファイルの編集画面になる。

# 実際の設定の流れ

ここではUbuntu上にて、新しいユーザ"user1"を作成する。

```bash
#新しいユーザuser1を作成
sudo adduser user1
```
次に作成したuser1にアカウントを切り替える。

```bash
#user1に切り替え
su user1
```

user1に切り替えた後、以下のようにsudoコマンドを用いてパッケージ更新を試みる。

```bash
#user1でsudoコマンドの実行を試みる
sudo apt update
```

するとこの段階ではまだsudoersファイルにuser1は設定されていないため、sudoコマンドが使えず以下のようなエラーが出る。

```bash
user1 は sudoers ファイル内にありません。この事象は記録・報告されます。
```

Ubuntuの場合、上記のエラーの通り、user1がsudoコマンドの使用を試みたことは、下記のように/var/log/auth.logに記録される。

```bash
Feb 15 22:37:14 <使用した端末名> sudo:    user1 : user NOT in sudoers ; TTY=pts/0 ; PWD=/home/user ; USER=root ; COMMAND=/usr/bin/apt update
```

そこでsudoコマンドを使ってvisodoコマンドを実行できるユーザが、visudoコマンドを使ってsudoersファイルにuser1がroot権限でaptコマンドを実行できるように設定する。

```bash
#visudoコマンドでsudoersファイルの編集を開始
sudo visudo
```

```bash
#sudoersファイルに以下の内容を追加する
user1 ALL=(ALL) /bin/apt
```
```bash
#書式チェック
sudo visudo -c
```

書式チェックが正常に完了すると、以下のようなメッセージが出てくる。

```bash
/etc/sudoers: 正しく構文解析されました
/etc/sudoers.d/README: 正しく構文解析されました
```

以上のような手順を踏むことで、user1はsudoコマンドによって、任意のホスト上でroot権限を用いてaptコマンドを実行することができるようになった。

# 終わりに
本記事ではsudoコマンドの役割についての説明とその設定方法、さらには実際の使用例の紹介をした。

個人の範囲内でかつ、自分一人でUbuntuを使う場合であれば、sudoコマンドの意味をきちんと理解できていなくても、ほとんどの場合困ることはないだろう。しかし企業などで、複数のユーザで使うことが前提のシステムを運用していく上では、安全面を考慮するとユーザごとに権限や実行できるコマンドなどの制御する必要がある。そういった場合には、本記事で解説したsudoコマンドの意味や設定方法を知っておく必要があるのは明らかなことだろう。

# 余談
sudoコマンドのsudoの公式の読み方は「須藤」ではなく、「スードュー」だそうです。

# 参考文献
- 本当は怖いsudoコマンド．“NECセキュリティブログ”. 2020.10.23．https://jpn.nec.com/cybersecurity/blog/201023/index.html, （参照2024-02-15）
- visudo．“Linuxコマンド虎の巻”. https://linux.command-ref.com/command-visudo.html, （参照2024-02-15）