仮想環境のLinuxサーバーでrootパスワードを忘れた場合のリカバリー手順

## はじめに
個人の検証環境で、重要なLinuxサーバーのrootパスワードを紛失してしまう事態が発生しました。

さらに、sudoersファイルに構文エラーが生じ、sudoコマンドが使用できないという厳しい条件下での解決が求められました。
## 前提条件
:::note info
今回の前提条件は、以下となります。
・Amazon EC2: Red Hat Enterprise Linux (RHEL8)
・特権権限の「rootユーザ」のパスワード紛失: rootユーザでのログイン不可
・一般ユーザ: ssm-userでログインし管理者権限以外の操作は可能
・sudoersファイルに構文エラー: sudoコマンドが使えない
・sudoersファイルの編集: visudoコマンドなど管理者権限が必要
:::

## やりたいこと

:::note info
今回発生した事象について、解決のためにやりたいことは以下の順序で作業を実施していきます。

1.リカバリー用のEC2を起動
2.パスワードを紛失したEC2のEBSを二次ボリュームとしてアタッチし、マウント
3.sudoersファイルの構文エラーを解消し、ssm-userでsudoコマンドを使用できるように修正
4.リカバリー用のEC2から二次ボリュームをデタッチし、元のEC2に再アタッチ
5.ssm-userでsudoコマンドを使い、rootユーザのパスワードを変更
:::

## 解決策
以下、AWSのre:Postで紹介されていた手順を参考に問題を解決しました。

https://repost.aws/ja/knowledge-center/ec2-sudoers-syntax-errors-sudo

:::note warn
※sudoersファイルの修正はご自身の環境に合わせて実施してください。
:::

## 手順の流れ
**・同じVPC内にリカバリー用のEC2を作成し、起動**
→パスワード紛失したEC2インスタンスと同じ環境で構築するのが望ましい
 
**・パスワード紛失したEC2インスタンスを停止**
→EC2のサービス画面からインスタンスの状態を「停止」にする
 
**・パスワード紛失したEC2のルートボリュームをデタッチ**
→EBSのサービス画面からデタッチする
 参考画面
 ![スクリーンショット 2024-09-07 7.14.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/6e18cd8d-e3c9-e133-737a-ae87f10f1b5f.png)

 
**・ルートボリュームをリカバリーインスタンスに二次ボリュームとしてアタッチ**
→EBSのサービス画面からデタッチしたボリュームをリカバリー用のEC2に二次ボリュームとしてアタッチする
 参考画面
 ![スクリーンショット 2024-09-07 7.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/cec4ccb9-3034-da62-35db-925fc5e5475e.png)

 
**・アタッチされたボリュームをマウント**
→以下のコマンドを実行して、アタッチされていることの確認およびマウントを行う
 ```
 lsblk
 ```
出力結果の例：
```
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTxvda    202:0    0    8G  0 disk
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  500G  0 disk
└─xvdf1 202:81   0  500G  0 part
```
マウントするディレクトリを作成し、管理者権限でマウントを行う
Amazon Linux、Ubuntu、Debian:
```
sudo mount /dev/xvdf1 /mnt
```
Amazon Linux 2023、Amazon Linux 2、CentOS 7 または 8、SUSE Linux 12、および RHEL 7.x または 8.x:
```
sudo mount -o nouuid /dev/xvdf1 /mnt
```

**・sudoersファイルの構文修正および、ssm-userの権限変更**
subdoers ファイルを編集するには、visudo コマンドを使い実行する
```
visudo
```

:::note alert
→sudoersファイルの構文エラーについては、AMIから復元時にエラーとなることが発覚したので、AMIから復元時に都度、修正を行う運用に変更いたしました。
:::
 
 ※パスワードを紛失したEC2インスタンスのssm-userの権限変更を実施した箇所は、以下で紹介いたします。
 
**・リカバリー用のEC2インスタンスからアンマウントを行い、パスワード紛失EC2に再度アタッチ**
sudoersファイルの編集が完了後、以下のコマンドでアンマウントを実施する
```
for dir in {/dev,/dev/pts,/sys,/proc}; do umount /mnt$dir; donesudo umount /mnt
```
→マウントが解除されたことを確認し、パスワード紛失EC2にEBSをアタッチし、「ssm-user」で次のコマンドを使いパスワードをリセットする
 ```
 sudo passwd root
 ```

## まとめ
今回のトラブルは、重要なサーバーのrootパスワードの紛失とsudoersファイルの構文エラーという二重の問題が重なったものでした。

しかし、AWS EC2の特性を利用し、別のEC2インスタンスでルートボリュームをマウントすることで、問題を解決することができました。

何よりも、サーバー管理者として改めてrootパスワードの管理を徹底することが重要だと痛感しました。

## おまけ
私の環境では、/etc/sudoersファイルを以下のように変更することで解決しました。

```
# Created by cloud-init v. 23.1.1-12.el9_3 on Sun, 25 Feb 2024 02:00:44 +0000

# User rules for ec2-user
#ec2-user ALL=(ALL) NOPASSWD:ALL

# User rules for ssm-user
ssm-user ALL=(ALL) NOPASSWD:ALL
```

:::note warn
この変更により、ssm-userがパスワードなしで全ての操作を行えるようになり、システム全体における管理者権限を持って操作できることとなります。
:::

## 参考記事
https://repost.aws/ja/knowledge-center/ec2-sudoers-syntax-errors-sudo

https://jr4marine.hatenablog.com/entry/2020/11/23/232801

https://dev.classmethod.jp/articles/ec2-attach-to-another-volume/

https://aws.taf-jp.com/blog/52550

https://qiita.com/SAITO_Keita/items/909e2bdbeec04341fe32