[AWS] EC2にログインする仕組みについて

##はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、EC2へログインする仕組みについて学びましたので、備忘録としてまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##EC2へのログインに関する基礎知識

###・SSH
SSHとは、「Secure Shell」の略で、通信内容が暗号化された遠隔ログインシステムであり、ローカルコンピュータ(ユーザーのPC)とリモートコンピュータ(EC2インスタンス)の間で安全な接続を確立するために使用できるネットワークプロトコルです。
接続後、ローカルコンピュータ上のターミナルは、リモートコンピュータで実行されているかのように動作します。

**AWSでは、SSHをクラウドで実行される仮想サーバーであるEC2インスタンス(リモートコンピュータ)に接続します。**

ローカルで発行したコマンドがリモートコンピュータで実行され、リモートコンピュータからのコマンドの出力はターミナルウィンドウに表示されます。

また、ローカルコンピュータ(ユーザーのPC)を**SSHクライアント**、リモートコンピュータ(EC2インスタンス)を**SSHサーバー**といいます。

``SSHの認証方法``
EC2インスタンス(サーバー)へ安全に接続するため、SSHのサーバーへのログインが適正かどうかチェックする認証方法が複数用意されています。

代表的な認証方法として**「パスワード認証」**と**「公開鍵認証」**の2つがあり、AWSでは**公開鍵認証**が使われています。

###・公開鍵認証とは
公開鍵認証とは、例えばサーバーにログインする際にサーバーの作成者本人のみがログインできるようにする仕組みであり、Amazon EC2ではSSHログイン時に公開鍵認証を行なっています。

Amazon EC2では、公開鍵認証を実行するために、**SSH認証情報として、``キーペア``と呼ばれるインスタンスへの接続時に身分証明として使用するセキュリティ認証情報のセット**が使用されます。

``キーペアとは``
キーペアとは、**プライベートキー(秘密鍵)**と**パブリックキー(公開鍵)**で構成されており、Amazon EC2はパブリックキー(公開鍵)を保存し、ユーザーはプライベートキー(秘密鍵)を保存します。
Amazon EC2では、インスタンスに安全にアクセスするために、パスワードの代わりにプライベートキーを使用します。

EC2インスタンス作成時にキーペアを作成し、``.pemファイル``をダウンロードするのですが、この``.pemファイル``こそがプライベートキー(秘密鍵)となります。
従って、**.pemファイルを持っているユーザーのみが、インスタンスに安全にアクセスすることができます。**

``注意点``
プライベートキー(.pemファイル)を持っていると、誰でもインスタンスへ接続できるのでプライベートキー(.pemファイル)は安全な場所に保存することが重要です。

##SSHと公開鍵認証を使いEC2インスタンスにログインする流れ
EC2で、SSHログイン時に公開鍵認証を利用してどのようにサーバーへのログイン許可を行なっているのか、下の図でまとめておきます。

![スクリーンショット 2021-08-19 16.43.59 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/4337bea0-8486-3ff0-e9e1-0bbd4e91b11a.png)

###ログイン手順

大まかな流れとしては

・1.pemファイル(秘密鍵)のパーミッションを設定する

・2.ログイン対象のEC2インスタンスからパブリックIPv4アドレスを取得してターミナルでログインする

###1. .pemファイル(秘密鍵)のパーミッションを設定する
ターミナルで、.pemファイル(秘密鍵)のパーミッションを``chmod 600``とすることで、.pemファイル(秘密鍵)のパーミッション設定を、.pemファイルの所有者のみが読み書きできるように制限します。

![chmod.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/1cda6c9b-1523-b7d4-0cea-8959a609e53c.png)




###2.ログイン対象のEC2インスタンスからパブリックIPv4アドレスを取得してログインする
パーミッション設定後、AWSにログインしてSSHログイン対象であるEC2インスタンス画面に遷移し、詳細画面で``パブリックIPv4アドレス``を取得し、そのIPアドレスを使用することでターミナルからEC2インスタンスにログイン可能となります。

![スクリーンショット 2021-08-19 17.10.38 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/71da5421-c570-1fde-d33e-de8d7d07be25.png)

``ログインできない場合``
ログインに失敗した場合、下記の内容が原因でエラーが起きている場合があります。

1..pemファイル(秘密鍵)の情報が間違っている

2.chmodコマンドで権限を設定できていない

3.パブリックIPv4アドレスが間違っている

上記の項目を確認して、再度実行してもエラーが起きる場合はEC2インスタンスを作成し直してください。

##なぜSSHでログインできるのか
EC2インスタンスに対してSSHログインする仕組みについて、もう少し詳しく触れてみたいと思います。

ネットワーク接続を考える上で重要な役割を果たすのが``ポート番号``と呼ばれるものです。

###ポート番号とは
ポート番号とは、プログラムのアドレス(部屋番号のようなもの)で、同一コンピュータ内で通信を行うプログラムを識別する時に利用します。

コンピュータ内ではプログラムごとにポート番号があり、もしsshクライアントからリクエストがあればリクエスト内のポート番号と一致するプログラムと接続する仕組みになっています。

ポート番号とサーバの対応は**IANA（Internet Assigned Numbers Authority）**という組織が管理しています。

ただし、接続元(SSHクライアント)のポート番号は決まっていなくても良いとされています。
ポート番号が決まっていない場合、OSが他のポート番号と被らないようにダイナミック／プライベートポート番号の中からランダムに決めます。

###ポート番号の種類
3種類のポート番号が存在します。

``ウェルノウンポート番号``
メジャーなサービスやプロトコルのポート番号はデフォルト値が決められており、予め決められているポート番号を**ウェルノウンポート番号**といいます。
ウェルノウンポート番号は、一般的なTCP/IPアプリケーションを対象にIANAが割り当て管理している番号であり、「**0~1023**」までの範囲がウェルノウンポート番号に該当します。

SSHクライアントが接続先のポート番号を省略してリクエストをした場合、優先的にウェルノウンポート番号が使用されます。

**例**

|ポート番号|サービス名|
|:--|:--|
|80|http|
|22|ssh|

``レジスタードポート番号``
ソフトウエアベンダーが独自アプリケーション用にポート番号を申請し、IANAがその申請を受け付け管理(登録)するポート番号であり、「**1024～49151**」までの範囲がレジスタードポート番号に該当します。

``ダイナミック／プライベートポート番号``
ローカルで動的にまたはプライベートで自由に利用できるポート番号であり、「**49152~65535**」までの範囲がダイナミック／プライベートポート番号に該当します。

###EC2インスタンスのポート番号を確認する方法
ターミナルで、``lsofコマンド``を入力するとどのポート番号でどのプログラムに接続できるかを一覧で表示します。

下記の画像のように、``$ sudo lsof -i -n -P``と入力することで一覧を表示させます。

**lsofに関するオプション等の説明**
``-i:``ネットワークソケットファイルを表示するオプションで、サーバーの待機ポートとプロセスを一覧で表示します
``-n:``IPアドレスをホスト名に変換しないオプション
``-P:``ポート番号をサービス名に変換しないオプション
``(LISTEN):``他のコンピュータからの接続を待ち受けているポートを表します
``(ESTABLISHED):``接続元と通信中のポートを表します
``*:``どの接続元(IPアドレス)でも受け付けることを表しています

例えば、**sshd      3147     root    3u  IPv4  19284      0t0  TCP *:22 (LISTEN)**の場合、sshdが22番ポートでどの接続元(IPアドレス)からのリクエストも待ち受けていることを表します。


![スクリーンショット 2021-08-19 23.13.34 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/9985d5f3-8684-2e20-88e8-ec33607f9b78.png)

今回の場合だと、sshdが22番ポートでどの接続元(IPアドレス)からのリクエストも待ち受けているためsshでログインできたということになります。

以上が、SSHでEC2インスタンスに接続する仕組みとなります。

##参考文献
[Amazon EC2とは](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/concepts.html)
[AWS document SSHを使用してマスターノードConnectする](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-connect-master-node-ssh.html)
[AWS document SSH認証情報にAmazon EC2 key pairを使用する](https://docs.aws.amazon.com/ja_jp/emr/latest/ManagementGuide/emr-plan-access-ssh.html)
[AWS document Amazon EC2のキーペアとLinuxインスタンス](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html)