Goal
- オペレーションミスによりEC2でsudoが使えなくなった問題を解消する
- ちなみに、以下の条件でsudoのデッドロック状態が起こる
- rootパスワードが分からない
- /etc/sudoersまたは/etc/sudoers.d以下のファイルがシンタックスエラーになっている
- /etc/sudoersまたは/etc/sudoers.d以下のファイルの編集権限がrootユーザのみ
- sudoがエラーになるため、rootユーザになることができない
- sudoers設定を変更しようにも、問題のファイルを変更も削除もできない
常識とは思いますが、この問題を避けるためにvisudo
または、visudo -f /etc/sudoers.d/{sudo設定ファイル名}
を使うべきです.
今回はプロビジョニング作業のため設定操作が手続き処理なので、visudo使うのが比較的難易度高いため/etc/sudoers.d以下にファイルを直接配置してしまってました.
(visudoのコマンドを使って、ChefできればItamaeでコマンド実行できるいい方法ご存知のかたいれば教えてください)
Manual
※ 対象サーバの停止が必須の手順です
※ 作業用のインスタンス1機の起動が必須です
EC2 production: sudo不可になった問題のサーバ
EC2 inspection: sudoers修正するための作業用サーバ
EBS1 : 問題のsudoersファイルを抱えたブロックストレージ
EBS2 : 作業用サーバがデフォルトでマウントしているブロックストレージ
(1), (2)EBS1をEC2 inspectionにアタッチする
- EC2 productionをShutdown
- EC2 productionからEBS1をデタッチ
- EC2管理画面のサイドバー Volumes > 対象のボリューム(EBS1)を選択 > Detach Volume
- Detach前に、サーバが認識しているブロックデバイス名を確認しておく(/dev/xvda,/dev/sda1など)
- EC2 inspectionを用意し、起動しておく
- EC2 inspectionにEBS1をアタッチ
- EC2管理画面のサイドバー Volumes > 対象のボリューム(EBS1)を選択 > Attach Volume
- アタッチされたときのブロックデバイス名を確認しておく(/dev/xvdf1など)
(3)EC2 inspectionでファイルシステムにアクセスできるようマウント
# root@EC2 inspection
ls -l /dev/xvdf1
# 新しいデバイスが認識されていることを確認
mkdir /emergency_mount
# マウント先を作成しておく
mount -t ext4 /dev/xvdf1 /emergency_mount
mount
# /emergency_mountにマウントされたことを確認
df
# /emergency_mountにマウントされたことを確認
ls -l /emergency_mount/
# ファイルツリーが見えていることを確認
(4)sudoersファイルを修正する
# root@EC2 inspection
vi /emergency_mount/etc/sudoers.d/test
# 問題のファイルを修正する
(5),(6)EC2 productionとEBS1をひもづけ直す
- EC2 inspectionからEBS1ブロックデバイスをumount
# root@EC2 inspection
umount /emergency_mount
mount
# /emergency_mountがアンマウントされたことを確認
df
# /emergency_mountがアンマウントされたことを確認
- EC2 inspectionにアタッチしていたボリュームをデタッチ
- EC2 productionに作業前と同じブロックデバイス名(/dev/xvda,/dev/sda1など)でアタッチし直す
- これが間違っているとサーバ起動できません
Reference