IAM Roles Anywhereのハンズオンを通して、OpenSSLとか証明書とかについて勉強できたのでメモ

AWSエバンジェリストシリーズの特別編でIAM Roles Anywhereのハンズオンに参加したときに、OpenSSLやら証明書やら使用したので非常に勉強になりました。

https://awsbasics.connpass.com/event/254836/?utm_campaign=event_message_to_selected_participant&utm_source=notifications&utm_medium=email&utm_content=title_link

ハンズオンの後に色々調べてみたので、個人的なメモとして残しておきます。

# IAM Roles Anywhereとは
本筋とは外れるので詳細は調べていただくとして、IAM Roles Anywhereについてザクっと説明しておきます

- オンプレ機器からAWSのサービスを使う時に、IAMロールによるアクセス制御ができるサービス

- IAM Roles Anywhereは主に、以下の2つのコンポーネントから成り立つ
    - 信頼アンカー：オンプレとAWSの間の信頼関係
        - 認証局の証明書を登録する
    - プロファイル：オンプレ機器に与える権限設定
        - IAMロール、管理ポリシー、インラインポリシーなどを使うことでAWSサービスへのアクセス制御を実施

- 公開鍵基盤（PKI）をベースとし、証明書を発行する認証局（CA）とAWSの間で信頼関係を確立する
- 以下のようなユースケースに最適（ブログ記事から抜粋）
    - オンプレミスのデータを Amazon Simple Storage Service (Amazon S3) にバックアップする
    - オンプレミスの Kubernetes ワークロードに対して、Amazon DynamoDB や Amazon Simple Queue Service (Amazon SQS) などのネイティブ AWS サービスへのアクセスを提供する
    - AWS Secrets Manager に保存されているシークレットに対して AWS 外部のワークロードからアクセスする
    - オンプレミスのソースから AWS Security Hub にセキュリティ検出結果を送信する
    - ハイブリッドワークロードが段階的にマイグレーションしていく過程で AWS サービスにアクセスできるようにする

https://aws.amazon.com/jp/blogs/news/extend-aws-iam-roles-to-workloads-outside-of-aws-with-iam-roles-anywhere/

# ハンズオン記事の紹介と前準備

今回のAWSエバンジェリストシリーズで使用したハンズオンの題材は[のんぴさん](https://twitter.com/non____97?s=20&t=NJo46Rj27bfrByVUXwqmfQ)の記事です

https://dev.classmethod.jp/articles/iam-roles-anywhere-with-a-self-signed-certificate-created-with-openssl/

このハンズオンの流れはザクっと以下のような感じです

1. EC2インスタンス（cloud9）をオンプレ機器に見立てて、OpenSSLを使って自己証明書を作成
1. 作成した証明書を使って、IAM Roles Anywhereと信頼関係を結ぶ
1. IAM Roles Anywhereで設定したIAMロールの権限を、インスタンスが使えるようになっているか確認

## ハンズオンを始める前にやること
cloud9を使う前提で、ハンズオンを始める前にやっておくべき準備を書いておきます

- cloud9を起動
OSはAmazon Linux 2がいいでしょう

- 以下のコマンドを実行
cloud9ではルートディレクトリを直接表示することができないため、シンボリックリンクを作成しておく必要があります

```
$ cd ~
$ ln -s / root
```

↓関係ないコマンドが混ざっていますが、イメージです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1471959/e9b7c4a6-d5b3-3a7e-41db-08bf1fb20af3.png)

https://atmarkit.itmedia.co.jp/ait/articles/1605/30/news022.html

- ホームディレクトリを表示させる
`~/environment`のディレクトリしか表示されない場合は、以下のように「Show Home in Favorites」にチェックを入れます
チェックを入れると`/home/ec2-user`（ホームディレクトリ）が表示されます
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1471959/5d02f73d-d150-3ac9-05dc-671d377b00cf.png)

# 関連する技術要素についての勉強メモ
ハンズオンを進めるうえで、自分なりによくわからない技術要素について調べてみたのでまとめておきます

※ビギナーな技術領域なので誤りがあるかもしれません。もし誤りに気づいたらご指摘いただけると幸いです。

## OpenSSLとは
- TLS通信を確立させるために必要な作業ができるようになるOSS
    - Windows、Linux、その他アプライアンス製品で利用可能

- 秘密鍵やCSR、証明書を作成したり、暗号化・複合化をしたりする

https://milestone-of-se.nesuke.com/nw-basic/tls/openssl-summary/

## 認証局
- TLS通信ではサーバー証明書とクライアント証明書を使用することで認証を行う

    - サーバー証明書、クライアント証明書あわせて「電子証明書」という
    
https://milestone-of-se.nesuke.com/nw-basic/tls/tls-ssl/

- 電子証明書を発行する機関のことを認証局という

- パブリック認証局、プライベート認証局の2種類がある
    - パブリック認証局は厳しい審査を受けて認定を受けることができ、信頼性の高い証明書を発行できる
    - プライベート認証局は、誰でも簡単に証明書を作成できる代わりに信頼性が低い

### パブリック認証局
- 厳しい審査に合格した事業者によって運営されている認証局

    - 例えば以下のような機関や事業者がいる

        - 電子認証登記所

        - 日本電子認証
        - 公的個人認証サービス都道府県認証局
        - 帝国データバンク

### プライベート認証局
- 別名「プライベートCA」、「オレオレ認証局」

- 第三者機関による認証を受けずに、自由＆安価に開設できる認証局
- 一部端末の認証をするだけなど、限定的な証明に限って使われる
- ハンズオンでは、まずプライベート認証局の構築を行い、その後認証局を使用してサーバー証明書を発行する手順になっている	

https://hcm-jinjer.com/blog/e-sign/private-certificate-authority/#:~:text=%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E8%AA%8D%E8%A8%BC%E5%B1%80%E3%81%A8%E3%81%AF%E3%80%81%E5%80%8B%E4%BA%BA%E3%82%84%E6%B3%95%E4%BA%BA%E3%81%8C%E9%96%8B%E8%A8%AD,%E3%81%AB%E5%88%A9%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

## CSR（Certificate Signing Request）
- 公開鍵証明書を作成するために必要なメッセージのこと

    - 中身は証明書発行に必要なメタデータ的なもの（以下に一部例を記載）
        - 申請する団体（会社）の公開鍵

        - 組織名
        - 所在地
        - URL(サーバのアドレス)
- 認証局にCSRを渡し、認証局がCSRに署名をすることでサーバー証明書を発行できる
    - CSRがないと証明書は発行できない

https://comodo.jp/beginner/csr.html

# 感想
SSL証明書の作成などのインフラ周りは知らなくても十分開発ができる世界になっていますが、個人的には知っておいて損はないと思っています
ハンズオンの時も「インフラの知識は汎用性が高いからコスパがいい」という話が出ましたが、まさにその通りだと思います

モダンな開発なんて目じゃないです
（でも憧れはあるし勉強したい）