[OCI] "困った！インスタンスにSSH接続できなくなってしまった" の復旧をやってみた

コンピュート(仮想マシン)・インスタンスのSSHキーペアを新しいものに置き換えようとして、いろいろとやっているうちに何かの手違いでインスタンスにSSH接続できなくなってしまった。これはたいへん(汗) コンピュートの環境再構築は時間も手間もかかるので、地道に復旧の道を選択することにします。

いろいろと調べているうちに巻末のトラブルシュートのチュートリアルにたどり着いたので、シリアル・コンソールを使って復旧できるか試してみました。
# 実行環境

### ローカル環境

- Windows10 ラップトップPC で Windows Power Shell コンソールから SSH接続していたが、接続できなくなってしまった。

### クラウド環境

- 接続先はOracle Cloud(OCI)のパブリック・サブネットのコンピュート(仮想サーバ)
![image-20210621102454671.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/27c04ff8-a3de-2ca3-20a3-066931acedfa.png)

# 復旧の手順
巻末のドキュメントによると、SSH接続できなくなった場合の復旧手順はおおまかに以下のとおり。他のユースケースや条件については参照URLをご覧ください。

1. ローカル環境の準備

2. OCI インスタンスのシリアル・コンソール接続の作成

3. シリアル・コンソールを使いローカルからインスタンスに接続

4. SSH公開鍵の再作成

5. 復旧確認

# ローカル環境の準備

ローカル環境が Windows OSの場合は追加で PuTTY(plink.exe) または OpenSSH をインストールする必要があります。ドキュメントに従い、Windows に Git for Windows をインストールし、そこに含まれる Git Bash シェルとOpenSSHを利用します。

## 1. Git for Windows のインストール

ここから↓ Git for Windows をインストール

https://git-scm.com/download/win 

すべてデフォルト値で進めて、**"Use  OpenSSH"** が選択されていることを確認
![image-20210621104659231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/b93d96e7-b919-7e05-1dcc-114c3af564c1.png)
インストール後、Windows スタートメニューに登録されたので、こちらから **Git Bash** を起動
![image-20210621105002813.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/847acb53-d790-8ed2-c661-d6a947c8d8c6.png)
**Git Bash** が起動され、**ssh** コマンドを入力するとヘルプが表示され有効であることが確認できました。
![image-20210621105524227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/a1b4fb7f-e3c4-95dd-ff94-1379c97af714.png)

## 2. 秘密鍵の配置

SSH接続ではローカル環境に秘密鍵が必要なので、ローカルのWindows 10に秘密鍵を配備します。鍵のペアは既に取得していることを前提としています。
![image-20210622111618881.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/29ab79c7-2ee9-d5d2-ce7c-057d29881f7d.png)
鍵ペアの作成、およびSSH接続の概要については以下もご参考にしてみてください。
[[OCI] 踏み台サーバーからSSHでプライベート・サブネットのインスタンスへの接続と、NATゲートウェイを試してみる](https://qiita.com/cocotaro0202/items/7b115b108bb9f03b90a6)

以上でローカル環境での準備は完了です。

# OCI インスタンスのシリアル・コンソール接続の作成
## コンソール接続の作成

左上のナビゲーションメニューから[コンピュート]-[インスタンス]を選択。選択したインスタンスの左下[リソース]から**コンソール接続**をクリックします。
![image-20210628091918332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0aaf46de-8239-ab02-1975-4547624318b6.png)
表示された[コンソール接続の作成]をクリックし、**コンソール接続の作成**を始めます。
![image-20210628091956708.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/9996f147-8f50-2824-8c4d-ed91adef6308.png)
**[公開キー・ファイル(pub)のアップロード]** 既にキーペアは持っているのでこちらを選択。

選択された公開キー(pub)が表示されてます。

[コンソール接続の作成]をクリックし、接続がアクティブになることを確認します。
![image-20210628092034483.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/61a51816-776a-af6a-49a3-946dcb26e62e.png)
右端のメニュー(３つのドット)をクリックすると、いくつかの接続が表示されるので、"Linux/Macのシリアル・コンソール接続のコピー"を選択し、文字列をコピーしておきます。

**注意）Open SSH を利用する場合、Windows OS からアクセスをする場合でも"Linux/Macのシリアル・コンソール接続のコピー"  を選択します。**
![image-20210628092108571.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/ea12905c-6e70-40a8-ed80-77ed07c36462.png)
コピーした文字列は、Open SSHの接続コマンドのようです。

```
ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.ap-tokyo-1.anxhiljrssl65iqcsvzlivx4z2wudgigubw7jjrugymp654vyx7kkk3oyvta@instance-console.ap-tokyo-1.oraclecloud.com' ocid1.instance.oc1.ap-tokyo-1.anxhiljrssl65iqcvljfajo5a5swcfoclyxd6u6s2wyv3vapkgrsf3wgmyqq
```

# シリアル・コンソールを使いローカルからインスタンスに接続
取得した文字列を使い、インスタンスのシリアル・コンソールに接続します。

**Git Bash** に取得した文字列をペーストして実行します。"Are you sure you want to continue connecting?" と聞かれるので、Yes を入力し進めます。
![image-20210628092144972.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/da28d35c-48d3-2bfb-e085-74615e8897cc.png)
再度 Yes/No を聞かれるので、ここも Yes で進めます。
![image-20210628092337609.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0aec1735-cfa0-e1e6-b709-ff4ba62073bc.png)
コンソールアクセスが成功し、ログインプロンプトが表示されました。
![image-20210628092411810.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/7f462d40-61b2-af7a-c6b6-47057ecab4e6.png)
# メンテナンス・モードでブートする

SSH鍵を再設定するために、メンテナンス・モードでブートします。インスタンスのコンソール・メニューから**再起動**を実行します。再起動を実行すると、**Git Bash**の画面も連動して自動で動き出すので、PCの画面に**Git Bash**を表示しておきます。
![image-20210628092447831.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/85b24fe6-ae82-78bd-b373-1253ce415b7a.png)
インスタンスの再起動により**Git Bash**で**停止**が始まります。次の**起動**が始まる前に、キーボードの「↓ (PGUP)」、「↑ (PGDN)」キーを押し続け自動起動を停止させます。

タイミングがあわないとメンテナンス・モードに切り替わらずに再びログインプロンプトが表示されてしまいます。この場合は再び **再起動** を実行して同じ操作を繰り返します。
![image-20210628092518896.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0d32a237-29ca-4f88-81e8-46204b4df66d.png)
メンテナンス・モードへの切り替えが成功すると、ブートしたいカーネルが選択可能となるので選択し、画面下に表示されている案内に従い、'e' とタイプして編集モードに入ります。
![image-20210628092550695.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/4738ef27-ea9d-62e8-1d7e-ca9df51f22be.png)
編集モードにて、カーソルを下に移動して **linuxefi** で始まる行を探し、行の末尾に以下文字列を追加します。

```
init=/bin/bash
```

![image-20210628092647192.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/a24b4f29-9a86-d71e-38f5-b3a7e1b53adf.png)
続いて、画面下に表示されている案内に従い、'Ctrl + x' とタイプしてインスタンスを再度ブートします。
![image-20210628092756417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/1579ec75-6203-e487-8af2-f07bed862cc0.png)
bashコンソールのプロンプトが表示され、インスタンスにアクセスできるようになりました。

# SSH公開鍵を再登録する

巻末のドキュメントに従い、次の手順によりSSH公開鍵を再登録します。

### 1. SELinuxのポリシーをロード

```
/usr/sbin/load_policy -i
```

### 2. rootパーティションへの書き込み権限を取得

```
/bin/mount -o remount, rw /
```

### 3. SSH鍵を再登録するために、SSHのディレクトリに移動

```
cd ~opc/.ssh
```

### 4. 既存の認証済み鍵ファイルをリネーム

```
mv authorized_keys authorized_keys.old
```

### 5. 新たなSSH公開鍵を登録

```
echo '<再登録したい公開鍵の文字列>' >> authorized_keys
```

操作ログ例）
![image-20210628093048251.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/fef2e9a9-8932-d7f1-c0e8-ac591691fab3.png)
### 6. SSH公開鍵のパーミッションを確認

この時点では、authorized_keys ファイルはrootユーザーで、ファイル権限が誰からもrw可となってました。

```
-rw-rw-rw-. 1 root root 398 Jun 14 00:21 authorized_keys
```

※ この状態でリブートしSSH接続確認した際に、**Permission denied** のエラーが表示されSSH接続に失敗しました。これを回避するには、オーナーやファイル権限を変更(chown/chgrp, chmodコマンド使用)して、ファイルのオーナー opc のみ r/w 可能とします。 

```
-rw-------. 1 opc opc  398 Nov 20  2020 authorized_keys 
```

### 7. リブート

リブートします。

```
/usersbin/reboot -f
```



# SSH接続の復旧確認

リブート後、ローカルの windows10 PCでPowerShell を起動し、SSHの接続を試みます。
新たなSSH公開鍵への接続に成功し、無事にSSH接続を復旧させることができました！ 
![image-20210705111501785.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/4eb46760-bf2e-4fe8-ddc2-ad66095d7b62.png)
# 参考URL
[シリアル・コンソールでsshできないインスタンスのトラブルシュートをする](https://oracle-japan.github.io/ocitutorials/intermediates/accessing-serial-console/)