【OCI】秘密鍵をなくしてコンピュート・インスタンスにSSH接続できなくなった際に、コンソール接続を利用して新しい鍵を再設定する方法

## はじめに
Oracle Cloud Infrastructure（OCI）のコンピュート・インスタンスにログインする際、「SSH接続用の秘密鍵をなくしてしまった」 or 「パスワードを忘れてしまった」ということもあるかと思います。
そのような場合に、コンソール接続を利用して新しい鍵を再設定する方法をご紹介します。

## OCIの実行環境
* パブリック・サブネット上にOracle Linux 8でコンピュート・インスタンスを作成

## 公開鍵の再設定手順
### 1. Cloud Shell接続の起動
OCIコンソールで、SSH接続でログインしたいインスタンスの詳細画面を開きます。
「リソース」タブからコンソール接続を選択し、「Cloud Shell接続の起動」をクリックします。
今回は、ローカル接続ではなくCloud Shellによる接続でコンソール接続をしていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/6e49f651-4282-49d8-2abb-660a7bdc275d.png)
下記のように、ログインの待機状態になるまで待ちます。
※ログインの待機状態にならない際は、Enterを何回か押してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/319e0823-d314-762a-9d03-320193cc80f9.png)

### 2. コンピュート・インスタンスの再起動
別タブで対象インスタンスの画面を開いてから、「再起動」のボタンを押し、出てきたウインドウの「インスタンスの再起動」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/98855202-583d-0027-e63b-42709e3aeb91.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/e4255d39-e31c-b5d3-64c4-3f6e54007285.png)

### 3. Cloud Shellによるbash起動
ここからが**タイミング的**に難しいところになってきます。
別タブのCloud Shellがインスタンスの再起動に伴い、ログが流れていきます。
下記の「reboot: Power down」という文言で、ログが一旦ストップするので、「Esc」キーを**適度に連打**します (0.5秒に1回くらい)。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/f5f21e3e-1d15-82f2-5e1f-6205500ebf38.png)
上手くいくと、以下のようなブートメニューの画面に切り替わりますので、一番上の項目を選択し「e」をキーボードで押します。
※タイミングが合わないと、この画面に切り替わらないため、再度ログインの待機画面が表示されます。なので成功するまで「再起動」を繰り返す必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/7d1544ba-e960-d187-70d5-9d6de5c90bfd.png)

「Esc」ボタンを押し、この画面に切り変わってしまう場合は、「Boot Manager」を選択して「Enter」を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/1c284bb1-7093-0aef-c2f6-cbf2d2a86253.png)

その後、以下のような画面に切り替わるので、「UEFI ORACLE BlockVolume」を選択して「Enter」を押し、すぐに「Esc」を連打し、上記のブートメニューの画面に遷移するか試してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/8b0e4b4e-0dec-16c5-dad3-123dd31b44e0.png)

### 4. ブートエントリーへの追記とインスタンスへの接続
下記のようにブートエントリが表示されるので、「linux」で始まる行の最後に「init=/bin/bash」と追記し、「ctrl」キー + 「x」キーを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/100a6a99-2fc0-a03e-47e3-76e16cb3c369.png)
ログインの待機状態ではなく、bashが起動しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3072173/e5a75646-9489-f09c-34bf-6ea7d0ca84eb.png)

### 5. SSH公開鍵の再登録
SELInuxが有効な環境では、SELinuxの設定を変更し、rootパーティションへの書込権限を取得する必要があります。

まずは以下のコマンドを実行して、SElinuxポリシーをロードし、変更するファイルのコンテクストを維持します。
~~~
 /usr/sbin/load_policy -i
~~~
次に以下のコマンドを実行して、rootパーティションへの読み取り/書き込み権限を取得します。
~~~
 /bin/mount -o remount, rw /
~~~
既存の公開鍵ファイルをリネームします。
~~~
 mv authorized_keys authorized_keys.old
~~~
新しいSSH公開鍵を登録します。
~~~
echo '<再登録したい公開鍵の文字列>' >> authorized_keys
~~~
最後に以下のコマンドでリブートをかけます。
~~~
 /usrsbin/reboot -f
~~~


### おまけ（opcユーザーのパスワード変更）
以下のコマンドで、SElinuxポリシーをロードし、rootパーティションへの読み取り/書き込み権限を取得した後に、
~~~
 /usr/sbin/load_policy -i
 /bin/mount -o remount, rw /
~~~
以下のコマンドで、opcユーザーのパスワードを変更できます。
~~~
sudo passwd opc
~~~
## おわりに
OCIの利用時に、秘密鍵をなくしてコンピュート・インスタンスへSSH接続できなくなった際に、コンソール接続を利用して新しい鍵を再設定する方法について紹介しました。

:::note info
**公開鍵の再設定手順**
**1. Cloud Shell接続の起動**
**2. コンピュート・インスタンスの再起動**
**3. Cloud Shellによるbash起動**
**4. ブートエントリーへの追記とインスタンスへの接続**
**5. SSH公開鍵の再登録**
:::