【悪用厳禁】EC2 にSSHキー、パスワード無しでログイン


このIAMポリシーをユーザーにアタッチすることで、**EC2 Instance Connect をサポートする様々なLinuxディストリビューション**において、SSHキーやパスワードなしでEC2インスタンスにセキュアにログインできるようになります。

**この方法は、EC2 Instance Connect が利用可能な幅広いLinux OS で共通して利用できます。特定のOS に限定されるものではありません**ので、ご自身の環境に合わせて柔軟に活用ください。

## OS 互換性
EC2 Instance Connect は、以下の主要なLinuxディストリビューションを含む、多くのOS で利用可能です。

*   Amazon Linux (2023, 2, 以降)
*   Ubuntu (16.04 LTS 以降、推奨は 18.04 LTS 以降)
*   CentOS (7 以降)
*   Red Hat Enterprise Linux (RHEL) (7.4 以降)
*   Debian (9 以降)
*   SUSE Linux Enterprise Server (SLES) (12 SP3 以降)
*   Fedora (30 以降)
*   openSUSE Leap (42.3 以降)
*   Oracle Linux (7.4 以降)

## 前提条件
EC2 Instance Connect を利用するためには、インスタンスとユーザー側で以下の前提条件を満たす必要があります。

### インスタンス側の前提条件
*   **サポートされている AMI:**  [サポート対象OS一覧](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html#ec2-instance-connect-prerequisites) を参照してください。
*   **EC2 Instance Connect エージェント:** インスタンスに `ec2-instance-connect` パッケージがインストールされ、実行されている必要があります。(最近の公式 AMI には通常プリインストールされています)
*   **サブネットのインターネットアクセス:** インスタンスがパブリックIPアドレスを持つ場合はインターネットゲートウェイ、プライベートサブネットの場合はNATゲートウェイ経由でのインターネットアクセスが必要です。
*   **セキュリティグループの設定:** インスタンスに適用されているセキュリティグループで、**アウトバウンドトラフィック** を許可する必要があります。具体的な設定例:
    *   **最も簡単な設定 (セキュリティリスク注意):** **すべてのOutboundトラフィックを許可**
        *   **タイプ:** `すべてのOutboundトラフィック` または `すべてのトラフィック`
        *   **プロトコル:** `すべて`
        *   **ポート範囲:** `すべて`
        *   **送信先:** `0.0.0.0/0`

    **セキュリティグループ設定手順 (AWSコンソール):**
    1.  **EC2コンソール**を開き、左メニューから「**セキュリティグループ**」を選択します。
    2.  インスタンスに適用しているセキュリティグループを選択します。
    3.  「**アウトバウンドのルール**」タブを開き、「**アウトバウンドルールを編集**」をクリックします。
    4.  「**ルールを追加**」ボタンをクリックし、上記の設定例を参考にルールを追加します。
    5.  「**ルールを保存**」をクリックします。

### ユーザー側の前提条件
*   **IAM 権限:**  接続を試みる IAM ユーザーまたはロールに、上記の **IAMポリシー (JSON)** がアタッチされている必要があります。
*   **IAMポリシーアタッチ権限 (管理者向け):**  ユーザーにIAMポリシーをアタッチするためには、IAMポリシーを管理する権限が必要です。ポリシーアタッチ作業は通常、管理者権限を持つユーザーが行います。

## IAMポリシー (JSON)
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2-instance-connect:SendSSHPublicKey",
                "ec2-instance-connect:OpenTunnel"
            ],
            "Resource": "arn:aws:ec2:リージョン:アカウントID:instance/*"
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeInstances",
            "Resource": "*"
        }
    ]
}
```

### ポリシーの説明
*   **`Version: "2012-10-17"`**: IAMポリシーのバージョン指定です。
*   **`Statement`**: ポリシーのステートメント（権限定義）の配列です。
    *   **1つ目のステートメント:**
        *   **`Effect: "Allow"`**:  許可する設定です。
        *   **`Action`**: 許可するアクションをリストで指定します。
            *   **`ec2-instance-connect:SendSSHPublicKey`**:  EC2 Instance Connect でインスタンスに一時的なSSH公開鍵を送信することを許可します。
            *   **`ec2-instance-connect:OpenTunnel`**:  EC2 Instance Connect でインスタンスへのトンネルを開くことを許可します。
        *   **`Resource: "arn:aws:ec2:リージョン:アカウントID:instance/*"`**:  このポリシーが適用されるリソースを指定します。
            *   **`arn:aws:ec2:リージョン:アカウントID:instance/*`**:  特定リージョン (`リージョン`) の特定アカウント (`アカウントID`) 内の **すべてのEC2インスタンス** を対象とします。
                *   **`リージョン`** と **`アカウントID`** は、実際にご利用のAWSリージョンとアカウントIDに置き換えてください。
                *   特定インスタンスのみに許可したい場合は、 `arn:aws:ec2:リージョン:アカウントID:instance/インスタンスID` のようにインスタンスIDを指定します。
    *   **2つ目のステートメント:**
        *   **`Effect: "Allow"`**: 許可する設定です。
        *   **`Action: "ec2:DescribeInstances"`**: EC2インスタンスの詳細情報を取得する `ec2:DescribeInstances` アクションを許可します。EC2 Instance Connect のコンソール画面でインスタンス一覧を表示するために必要です。
        *   **`Resource: "*"`**:  リソースは `*` (すべてのリソース) を指定しています。 `ec2:DescribeInstances` はリソースレベルのアクセス制御が細かくないため、`*` で問題ありませんが、セキュリティポリシーに応じて調整してください。

## IAMポリシーアタッチの手順
1.  **IAMコンソールを開きます。**
    *   AWSマネジメントコンソールにログインし、IAMサービスを開きます。
2.  **ユーザーを選択します。**
    *   左側のナビゲーションメニューから「ユーザー」を選択し、ポリシーをアタッチしたいユーザー名をクリックします。
3.  **「許可を追加」をクリックします。**
    *   ユーザーの概要ページで、「許可」タブを開き、「許可を追加」ボタンをクリックします。
4.  **「ポリシーを直接アタッチ」を選択します。**
    *   「ポリシーを直接アタッチ」を選択します。
5.  **「ポリシーの作成」をクリックします。（または既存のポリシーを検索）**
    *   新しいポリシーを作成する場合は、「ポリシーの作成」ボタンをクリックします。
    *   既存のポリシーを再利用する場合は、検索ボックスにポリシー名を入力して検索し、該当するポリシーを選択してスキップしてください。
6.  **ポリシー定義を入力します。**
    *   「JSON」タブを選択し、上記のJSON形式のIAMポリシーをコピー＆ペーストします。
    *   **必ず `arn:aws:ec2:リージョン:アカウントID:instance/*` の部分を、ご自身の環境に合わせて修正してください。**
7.  **「次へ：タグ」をクリックします。（オプション）**
    *   必要に応じてタグを設定します。
8.  **「次へ：確認」をクリックします。**
    *   ポリシーの概要を確認し、ポリシー名を入力します (例: `EC2InstanceConnect-Allow-AllInstances`)。
9.  **「ポリシーの作成」をクリックします。**
10. **作成したポリシーをユーザーにアタッチします。**
    *   ポリシー一覧から作成したポリシーを検索し、チェックボックスをオンにします。
    *   「ポリシーのアタッチ」ボタンをクリックします。
    *   **注:** IAMポリシーをユーザーにアタッチするには、ユーザー自身にIAMポリシーを管理する権限（例: `iam:AttachUserPolicy`、`iam:AttachRolePolicy` など）が必要です。通常は管理者権限を持つユーザーがこれらの操作を行います。

## EC2 Instance Connect でのログイン方法
1.  **EC2コンソールを開きます。**
    *   AWSマネジメントコンソールにログインし、EC2サービスを開きます。
2.  **インスタンスを選択します。**
    *   左側のナビゲーションメニューから「インスタンス」を選択し、ログインしたいLinuxインスタンスを選択します。
3.  **「接続」ボタンをクリックします。**
    *   インスタンスの詳細画面上部にある「接続」ボタンをクリックします。
4.  **「EC2 Instance Connect」タブを選択します。**
5.  **ユーザー名を選択します。（OSのデフォルトユーザー名）**
    *   OSのデフォルトユーザー名 (例: Ubuntuの場合は `ubuntu`、Amazon Linuxの場合は `ec2-user`、CentOSの場合は `centos` など) が選択されていることを確認します。
6.  **「接続」ボタンをクリックします。**
    *   新しいブラウザウィンドウが開き、インスタンスへのターミナル接続が確立されます。

## 注意点
*   **セキュリティ:** このポリシーは、特定リージョン、特定アカウント内のすべてのEC2インスタンスへのEC2 Instance Connectアクセスを許可する広範な権限を持つポリシーです。本番環境などでは、セキュリティを考慮し、必要最小限の権限となるように、リソースを特定インスタンスに限定する、または条件キーを使用するなど、より厳格なポリシーにすることを強く推奨します。
*   **前提条件の確認:** EC2 Instance Connect を利用する前に、インスタンスとユーザー側で上記の前提条件を必ず満たしていることを確認してください。詳細については、[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html) をご確認ください。