EC2キーペアに登録してある公開鍵を確認してみる

EC2のキーペアで生成した秘密鍵は、キー登録した際にダウンロードできるかぎりとなりますが。

公開鍵については取得する方法が用意されているので本記事ではこれらを試してみます。

[パブリックキーマテリアルを取得する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/describe-keys.html#retrieving-the-public-key)

## 今回実行する環境

- Windows 10 21H2 
- [OpenSSH_for_Windows_9.1p1, LibreSSL 3.6.1](https://github.com/PowerShell/Win32-OpenSSH)

### From the private key

ダウンロードした秘密鍵から公開鍵を取り出す。

今回、EC2キーペア画面で`qiita-rsa`を登録し取得した`qiita-rsa.pem`から公開鍵を取得してみます。

ドキュメントではLinuxとMacOSでの手順が書かれていますが。
Windowsの場合はパーミッションエラーが出た場合の調整方法が異なります。

今回はWidowsのOpenSSHで実行した所、下記のエラーが表示されたので対応します。

>Bad permissions. Try removing permissions for user: xxxxxxxxxxx on file C:/qiita/raw-key/qiita-rsa.pem.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'C:\\qiita\\raw-key\\qiita-rsa.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "C:\\qiita\\raw-key\\qiita-rsa.pem": bad permissions

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/32f74f60-a5df-95fa-3ecb-7e10ef2cfc7a.png)

今回パーミッションエラーが出たpemファイルのセキュリティタブを確認してみると、エラーメッセージにあるように、いろいろなユーザが許可されている事がわります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1693ed6f-c468-3fb6-ebe8-cb4690028f33.png)

この状態だと警告となってしまうため、`詳細設定`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/aec19c75-0589-a704-b1db-1d05ec4ad0d3.png)

`継承の無効化`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/dd5ccfde-b323-89af-e195-49c95781109f.png)

`このオブジェクトから継承されたアクセス許可をすべて削除`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a1535b1b-cc85-7545-d624-9321a83aa660.png)

`追加`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/af3158a4-26fd-8fcc-6119-0a75cbef798e.png)

`プリンシパルの選択`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/26882634-e437-5e79-13f6-e2123c5dd921.png)

選択するオブジェクトを入力して下さいの欄に、ログインしているユーザー名を入力して`名前の確認`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/da17998a-37c4-6d72-1d1e-219db4954997.png)

名前の確認が成功すると、入力したオブジェクト名に下線がつくので確認できたら

`OK`　を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a6dff1a7-86e2-92f8-68fe-4d9f914d5cdf.png)

`OK` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/88bdaad9-e490-96be-0b74-e33fc170eeac.png)

余計なユーザに権限がついてない事を確認してOKを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/9270f116-ee97-9a35-15a6-2adfd4550c55.png)

`OK` を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/09741991-78c1-bc32-d365-d2132560b6f9.png)

ファイルのセキュリティを上記のように変更した状態で、もう一度コマンドを実行すると公開鍵を取り出す事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/eef25bac-8020-86f1-9e15-ccc6678fefde.png)

### From the instance metadata

EC2でインスタンスのメタデータに公開鍵の情報を含まれているのでここで確認してみます。

今回確認するインスタンスは下記で、インスタンスメタデータサービスバージョン（IMDS）のバージョン1と2の両方を参照できるように構築しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/71257dae-b3f2-20a7-af1c-bdb69c5c0c46.png)

#### IMDS version 1の場合

```bash
curl http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/22f82fcc-a5f5-48ef-3dfa-16d11e7a792d.png)

#### IMDS Version 2の場合

```bash
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \
&& curl -H "X-aws-ec2-metadata-token: $TOKEN" –v http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a96a8d83-e79c-8d43-f132-a3e08b33844a.png)


### From the instance

EC2でLinuxインスタンスを構築すると、ssh接続のために公開鍵を`~/.ssh/authorized_keys`に配置するため、ここから確認してみます。

画像の環境については、先程`From the instance metadata`で構築したEC2インスタンスになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/9117194e-ce18-e8ce-e0cf-44c29a35c2f5.png)

### From describe-key-pairs

`aws-cli`の`ec2 describe-key-pairs`コマンドに`--include-public-key`オプションをつけると公開鍵を出力します。

CloudShellで実行すると下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5baf2200-8f86-40e2-0536-d99f14497f4b.png)

## 総評

公開鍵があとから確認できるからどうしたといった感はありますが。
（あえて言えば、EC2キーペアで生成したキーの公開鍵を他サーバーでも使いたいので取得したい時とか？）

AWSではこういう所に公開鍵が登録されていて、EC2を構築するときにいい感じに公開鍵を配置してくれてるんだなって感じです。