sudoをパスワード付きで実行する意味について

## sudoで実行しようとするとパスワードをきかれる

```
$ sudo systemctl vsftpd start

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.

For security reasons, the password you type will not be visible.

[sudo] password for <your_username>
```

### パスワードを使用せずsudoすることは何がダメなのか
> Using sudo without a password
For many situations (such as for real servers) this would be considered too much of a security risk. However, for developers running a RHEL VM on their laptop, this is a reasonable thing to do since access to their laptops is probably already protected by a password.
> 多くの場面では（本番サーバーなど）パスワードなしでsudoを使用することはセキュリティ上のリスクが非常に高いでしょう。しかしながら、ラップトップPC上の仮想マシンでRedHat Enterprise Linuxを起動している開発者にとってはこれは合理的な（理屈だけの）推奨事項です。なぜなら、おそらくラップトップはすでにパスワードで保護されているからです。


[ How to enable sudo on Red Hat Enterprise Linux ](https://developers.redhat.com/blog/2018/08/15/how-to-enable-sudo-on-rhel)

### AWSのEC2の場合
EC2(Elastic Compute Cloud)はローカルの仮想化環境ではなくクラウド上で起動しているので（たとえ公開鍵認証方式でSSH接続していても）、パスワードによるsudoは、RHELの公式見解に照らし合わせて考えると開発者にとっては満たすべき推奨事項と考えていいようです。
<br>Linuxインスタンスには、個人的に、たいていはとりあえずパスワードを設定せずにユーザーだけを作成することが多いです（とりあえずインスタンスを起動した後、SSHの公開鍵を配置するユーザーディレクトリをデフォルトのec2-user以外にも作成する必要があるため）。
<br>本記事では、この新しく作成したユーザー（sudo を行わせるユーザー）にパスワードを設定します。
### 実運用を想定する場合の前提
#### SSH接続とシステム管理者について
先ほども書いた通り、個人のアカウント（デフォルトのec2-userではなく新しく作成したシステム管理者ユーザーのアカウント）で公開鍵認証方式でSSH接続します。そのシステム管理者ユーザーがsudoでコマンドを実行する時にきかれるパスワードを設定します。<br>
加えて、AWSのEC2ではパスワード認証によるSSHがデフォルトで無効化されています。

> ・各サーバーへのSSH接続は個人毎のアカウントを作成して公開鍵認証方式のみとする。<br>
・個人アカウントのパスワードは設定するが、主な目的はsudoコマンド実行時に聞かれるパスワードであり、パスワード認証によるSSH接続は禁止する<br>
・システム管理者のみwheelグループをサブグループとして追加する<br>
・SSH接続からsudoでuseradd,usermod,userdelがパスワード無し(:NOPASSWORD)で実行できる
#### Wheelグループについて
>・wheel：Redhat系におけるsudoでrootコマンドを実行できるようにするグループ（管理者権限オプションが指定されたユーザのサブグループに指定する）

#### 参考
https://qiita.com/satodoc/items/c2d3b4d72b56ee3c425d

## 本記事の想定環境
個人のブログをEC2のLinuxインスタンス上でホストする。実運用の想定要件は上記の内容を基準に、以下のように定義する。<br>
* ローカルコンピュータから公開鍵認証方式でSSH接続を行う。<br>
* SSH接続し、passwdがパスワード無しで実行できるようにする。<br>

なお、システム管理者に対してwheelグループをサブグループとして追加は行いません。これは私がグループについての知見がまだなく、今回の記事が扱う範囲外とするためです。また、パスワードの設定にパスワードが必要だと設定ができないため、passwdをパスワード無しで実行する設定とします。他のコマンドはsudoで実行する際にパスワードで認証することとします。

## 必要なこと
### SSHのポートに接続できるIPアドレスを制限する
まず、サーバーじたいに接続する時点で安全でなければ、いくらsudoがパスワードで守られているからといえ、前提としてダメだと思うので。（ただし、本記事では範囲外とし、IPアドレスは制限せずに進めます。）
* 自宅のWi-Fiを、DHCPではなくルーターがゲートウェイで固定IPアドレスでグローバルIPに変換するようにする。（毎回違うIPアドレスではEC2のセキュリティグループでいちいち設定するのはめんどう&放置すると他者が接続できるIPが増えて危険なため。）
* 自宅の固定IPのみにたいして、SSH接続を許可するようにEC2のセキュリティグループでインバウンドルールを設定する。

### sudo を行わせるユーザーにパスワードを設定する
これが本記事の趣旨。

#### システム管理者ユーザーにパスワードを設定する前にデフォルトユーザーがパスワード設定なしでsudoを実行し、ユーザーにパスワードを設定できるようにする
1. デフォルトユーザー（ec2-user）のパスワードを設定する。（まだ設定していない場合）
1. visudoを使ってsudoersファイルを編集し、デフォルトユーザーがパスワードなしでsudoを実行できるようにする。

```
# システム管理者のパスワードを設定
$ sudo passwd ec2-user
Changing password for user ec2-user.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

# sudoersファイルを編集
$ sudo visudo
```

3\. sudoersファイルで下記の箇所（コメント行の文言等はAmazon Linux 2023の場合）を修正する。

```
# Allow people in group wheel to run all commands
%wheel  ALL=(ALL)       ALL
ec2-user	ALL=NOPASSWD: /sbin/passwd
```

#### sudo を行わせるユーザーにsudo passwdでパスワードを設定する
ec2-user（デフォルトユーザー）でログインして、システム管理者のユーザーにパスワードを設定する。

```
ec2-user@XX-xx-xx-xx-xx:~$ passwd <your_username>
```

#### 参考サイト
[EC2初期設定 よく使うコマンド （ec2-user パスワード追加）](https://qiita.com/ceg-qiita/items/e3cf1fa5e4c42b89a2ee)
[sudo のパスワードを入力なしで使うには](https://qiita.com/RyodoTanaka/items/e9b15d579d17651650b7)