Cookie の設定を選択する

当社は、当社のサイトおよびサービスを提供するために必要な必須 Cookie および類似のツールを使用しています。当社は、パフォーマンス Cookie を使用して匿名の統計情報を収集することで、お客様が当社のサイトをどのように利用しているかを把握し、改善に役立てています。必須 Cookie は無効化できませんが、[カスタマイズ] または [拒否] をクリックしてパフォーマンス Cookie を拒否することはできます。

お客様が同意した場合、AWS および承認された第三者は、Cookie を使用して便利なサイト機能を提供したり、お客様の選択を記憶したり、関連する広告を含む関連コンテンツを表示したりします。すべての必須ではない Cookie を受け入れるか拒否するには、[受け入れる] または [拒否] をクリックしてください。より詳細な選択を行うには、[カスタマイズ] をクリックしてください。

Session Manager と Amazon EC2 Instance Connect により踏み台ホストにアクセス - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Session Manager と Amazon EC2 Instance Connect により踏み台ホストにアクセス

作成者:Piotr Chotkowski (AWS) と Witold Kowalik (AWS)

概要

踏み台ホストは、ジャンプボックスと呼ばれることもありますが、外部ネットワークからプライベートネットワークにあるリソースへの単一アクセスポイントを提供するサーバーです。インターネットなどの外部のパブリックネットワークに公開されているサーバーは、不正アクセスによる潜在的なセキュリティリスクをもたらします。これらのサーバーへのアクセスを保護し、制御することは重要です。

このパターンは、「Session Manager」と「Amazon EC2 Instance Connect」により、AWS アカウントにデプロイされた Amazon Elastic Compute Cloud (Amazon EC2) 踏み台に安全に接続する方法を示しています。ステートマネージャーは AWS Systems Manager の機能です。このパターンには次のようなメリットがあります。

  • デプロイされた踏み台ホストには、パブリックインターネットに公開されているオープンなインバウンドポートはありません。これにより、潜在的なアタックサーフェスが減少します。

  • 長期間のSecure Shell (SSH) キーを AWS アカウントに保存して管理する必要はありません。代わりに、各ユーザーは 踏み台ホストに接続するたびに新しい SSH キーペアを生成します。AWS Identity and Access Management (IAM) ポリシーにより、踏み台ホストへのアクセスを制御するユーザーに AWS 認証情報が添付されています。

対象者

このパターンは、Amazon EC2、Amazon Virtual Private Cloud (VPC) および Hashicorp Terraform の基本知識がある読者を対象としています。

前提条件と制限

前提条件

  • アクティブな AWS アカウント

  • インストールされ」、「設定されている」AWS コマンドラインインターフェイス (AWS CLI) バージョン 2

  • AWS CLI 用のセッションマネージャープラグイン、「インストール済み

  • インストール済み」のテラフォーム CLI

  • Amazon Simple Storage Service (Amazon S3) バケットやAmazon DynamoDB テーブルなどTerraform ステータスを格納するリモートバックエンドとしてのTerraform「ステータス」の格納 Terraform ステータスにリモートバックエンドを使用する方法の詳細については、「S3 バックエンド」(Terraform のドキュメント)」を参照してください。S3 バックエンドでリモートステート管理をセットアップするコードサンプルについては、「remote-state-s3-backend」 (Terraform レジストリ) を参照してください。次の要件に注意してください。

    • DB インスタンスと S3 バケットが同じ AWS リージョンに存在する必要があります。

    • DynamoDB テーブルを作成する場合、パーティションキーは LockID (大文字と小文字を区別)、パーティションキータイプは String である必要があります。他の設定はすべてデフォルト値のままにしておきます。詳細については、「DynamoDB のドキュメント」の「プライマリキーについて」と「テーブルの作成」を参照してください。

  • SSH クライアント、インストール済み

制約事項

  • このパターンは、概念実証 (PoC) として、または今後の開発の基礎となることを目的としています。本稼働環境では、現行の形式を使用しないでください。デプロイする前に、要件とユースケースに合うようにリポジトリ内のサンプルコードを見直してください。

  • このパターンは、ターゲットの踏み台ホストがオペレーティングシステムとして Amazon Linux 2 を使用していることを前提としています。他の Amazon マシンイメージ (AMI) を使用することもできますが、他のオペレーティングシステムはこのパターンの対象外です。

    注記

    Amazon Linux 2 のサポートは間もなく終了します。詳細については、「Amazon Linux 2 のFAQs」を参照してください。

  • このパターンでは、踏み台ホストは NAT ゲートウェイとインターネットゲートウェイのないプライベートサブネットに配置されます。EC2 Identity and Access Management (IAM) でインスタンスに接続します。インターネットと通信できるようにする特定のネットワーク設定を追加できます。詳細については、「Amazon VPC のドキュメント」の「仮想プライベートクラウド (VPC) を他のネットワークに接続」を参照してください。同様に、「最小特権原則」に従い、明示的に権限を付与しない限り、踏み台ホストは AWS アカウント内の他のリソースにアクセスできません。詳細については、IAM ドキュメントの「リソースベースのポリシー」を参照してください

製品バージョン

  • AWS CLI バージョン 2

  • Terraform バージョン 1.3.9

アーキテクチャ

ターゲットテクノロジースタック

  • シングルパブリックサブネットを持つ VPC

  • 以下の「インターフェイス VPC エンドポイント」:

    • amazonaws.<region>.ssm — Systems Manager サービスのエンドポイント。

    • amazonaws.<region>.ec2messages — Systems Manager は、このエンドポイントを使用して、SSM Agent から Systems Manager サービスへの呼び出しを行います。

    • amazonaws.<region>.ssmmessages — Session Manager はこのエンドポイントで、安全なデータチャネルを介して EC2 インスタンスに接続します。

  • Amazon Linux 2 を実行する t3.nano EC2 インスタンスを起動します。

  • IAM ロールとインスタンス プロファイル

  • エンドポイントと EC2 インスタンスの Amazon VPC セキュリティグループとセキュリティグループルール

ターゲットアーキテクチャ

Session Manager により、踏み台ホストにアクセスするアーキテクチャ図。

図に示す内容は以下のとおりです。

  1. ユーザーが割り当てられている IAM ロールには、次の操作を実行する権限があります。

    • EC2 インスタンスの認証、認可と接続

    • Session Management (IAM) でセッションを開始

  2. ユーザーは Session Manager から SSH セッションを開始します。

  3. Session Manager はユーザーを認証し、関連する IAM ポリシーの権限を検証し、設定を確認し、SSM エージェントにメッセージを送信して双方向接続を開きます。

  4. ユーザーは Amazon EC2 メタデータを介して SSH パブリックキーを踏み台ホストにプッシュします。これは各接続の前に行う必要があります。SSH 公開鍵は 60 秒間使用可能です。

  5. 踏み台ホストは、Systems Manager と Amazon EC2 のインターフェイス VPC エンドポイントと通信します。

  6. ユーザーは TLS 1.2 で暗号化された双方向通信チャネルにより、Session Manager を通じて踏み台ホストにアクセスします。

自動化とスケール

このアーキテクチャを自動的にデプロイしまたは拡張するには、次のオプションを使用します。

  • 継続的な統合および継続的な提供 (CI/CD) パイプラインで、アーキテクチャをデプロイできます。

  • コードを変更して、踏み台ホストのインスタンスタイプを変更できます。

  • コードを変更して複数の踏み台ホストをデプロイできます。bastion-host/main.tf ファイルの aws_instance リソースブロックに、count メタ引数を追加します。詳細については、「Terraform のドキュメント」を参照してください。

ツール

AWS サービス

  • AWS コマンドラインインターフェイス (AWS CLI)」は、オープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

  • Amazon Elastic Compute Cloud (Amazon EC2)」は、AWS クラウドでスケーラブルなコンピューティング容量を提供します。必要な数の仮想サーバーを起動することができ、迅速にスケールアップまたはスケールダウンができます。

  • AWS Identity and Access Management (IAM)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。

  • AWS Systems Manager」は、AWS クラウドで実行されるアプリケーションとインフラストラクチャの管理に役立ちます。アプリケーションとリソースの管理が簡略化され、オペレーション上の問題の検出と解決時間が短縮され、AWS リソースを大規模かつセキュアに管理できるようになります。このパターンは、Systems Manager の機能の一つである「Session Manger」を使用します。

  • Amazon Virtual Private Cloud (Amazon VPC) を使用すると、定義した仮想ネットワーク内で AWS リソースを起動できます。この仮想ネットワークは、お客様自身のデータセンターで運用されていた従来のネットワークに似ていますが、AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。

その他のツール

  • HashiCorp Terraform」は、コードでクラウドインフラストラクチャとリソースをプロビジョニングおよび管理するのに役立つオープンソースのコードとしての Infrastructure as Code (IaC) ツールです。このパターンは「Terraform CLI」を使用しています。

コードリポジトリ

このパターンのコードは、GitHub·内の「Session Manager と Amazon EC2 Instance Connectを使用して踏み台ホストにアクセスする」リポジトリで利用できます。

ベストプラクティス

  • コードのセキュリティと品質を向上させるために、自動コードスキャンツールの使用をお勧めします。このパターンは、IaC 用の静的コード分析ツールである「Checkov」を使用してスキャンされました。最低でも、terraform validateterraform fmt -check -recursive Terraform コマンドを使用して基本的な検証とフォーマットのチェックを行うことをお勧めします。

  • IaC の自動テストを追加することは良い習慣です。Terraform コードをテストするさまざまな方法の詳細については、「HashiCorp Terraform のテスト」(Terraform ブログ記事) を参照してください。

  • デプロイ中、新しいバージョンの「Amazon Linux 2 AMI」が検出されるたびに、Terraformは置換 EC2 インスタンスを使用します。これにより、パッチやアップグレードを含む新しいバージョンのオペレーティングシステムがデプロイされます。デプロイスケジュールの頻度が低い場合、インスタンスに最新のパッチが適用されないため、セキュリティ上のリスクが生じる可能性があります。デプロイされた EC2 インスタンスには、セキュリティパッチを頻繁に更新して適用することが重要です。詳細については、「Amazon EC2 での更新管理」を参照してください。

  • このパターンは概念実証であるため、AmazonSSMManagedInstanceCore などの AWS マネージドポリシーを使用します。AWS マネージドポリシーは、一般的なユースケースを対象としていますが、最小特権のアクセス権限は付与しません。ユースケースに応じて、このアーキテクチャにデプロイされたリソースに最小特権のアクセス権限を付与するカスタムポリシーを作成することをお勧めします。詳細については、「AWS マネージドポリシーの使用を開始し、最小特権のアクセス許可に移行する」を参照してください。

  • SSH キーへのアクセスを保護し、キーを安全な場所に保存するにはパスワードを使用してください。

  • 踏み台ホストのロギングとモニタリングを設定します。記録とモニタリングは、運用面とセキュリティ面の両方の観点から、システムを保守する上で重要な部分です。踏み台ホストの接続とアクティビティをモニタリングする方法は複数あります。詳細については、Systems Manager ドキュメントの次のトピックを参照してください。

エピック

タスク説明必要なスキル

コードリポジトリを複製します。

  1. コマンドラインインターフェースで、作業ディレクトリをサンプルファイルを保存する場所に変更します。

  2. 次のコマンドを入力します。

    git clone https://github.com/aws-samples/secured-bastion-host-terraform.git

DevOps エンジニア、開発者

ディレクトリから Terraform を開始します。

このステップは最初のデプロイにのみ必要です。このパターンをレデプロイする場合、次の手順に進んでください。

クローンしたリポジトリのルートディレクトリに、以下のコマンドを入力します。

  • $S3_STATE_BUCKET は Terraform ステートを含む S3 バケットの名前です。

  • $PATH_TO_STATE_FILEinfra/bastion-host/tetfstate など Terraform ステートファイルのキーです。

  • $AWS_REGION は S3バケットがデプロイされているリージョンです

terraform init \ -backend-config="bucket=$S3_STATE_BUCKET" \ -backend-config="key=$PATH_TO_STATE_FILE" \ -backend-config="region=$AWS_REGION
注記

または、config.tf ファイルを開き、 terraformセクションでこれらの値を手動で指定することもできます。

DevOps エンジニア、開発者、Terraform

リソースのデプロイ

  1. クローン作成したリポジトリのルート ディレクトリで、次のコマンドを入力します。

    terraform apply -var-file="dev.tfvars"
  2. AWS アカウントに適用されるすべての変更のリストを確認し、デプロイを確認します。

  3. すべてのリソースがデプロイされるまでお待ちください。

DevOps エンジニア、開発者、Terraform

リソースのデプロイ

タスク説明必要なスキル

コードリポジトリを複製します。

  1. コマンドラインインターフェースで、作業ディレクトリをサンプルファイルを保存する場所に変更します。

  2. 次のコマンドを入力します。

    git clone https://github.com/aws-samples/secured-bastion-host-terraform.git

DevOps エンジニア、開発者

ディレクトリから Terraform を開始します。

このステップは最初のデプロイにのみ必要です。このパターンをレデプロイする場合、次の手順に進んでください。

クローンしたリポジトリのルートディレクトリに、以下のコマンドを入力します。

  • $S3_STATE_BUCKET は Terraform ステートを含む S3 バケットの名前です。

  • $PATH_TO_STATE_FILEinfra/bastion-host/tetfstate など Terraform ステートファイルのキーです。

  • $AWS_REGION は S3バケットがデプロイされているリージョンです

terraform init \ -backend-config="bucket=$S3_STATE_BUCKET" \ -backend-config="key=$PATH_TO_STATE_FILE" \ -backend-config="region=$AWS_REGION
注記

または、config.tf ファイルを開き、 terraformセクションでこれらの値を手動で指定することもできます。

DevOps エンジニア、開発者、Terraform

リソースのデプロイ

  1. クローン作成したリポジトリのルート ディレクトリで、次のコマンドを入力します。

    terraform apply -var-file="dev.tfvars"
  2. AWS アカウントに適用されるすべての変更のリストを確認し、デプロイを確認します。

  3. すべてのリソースがデプロイされるまでお待ちください。

DevOps エンジニア、開発者、Terraform
タスク説明必要なスキル

SSH 接続を設定します。

SSH 設定を更新して、Session Manager を介して SSH 接続を有効にします。手順については、「Session Manager の SSH 接続を許可」を参照してください。これにより、許可されたユーザーは、プロキシコマンドを入力し、Session Manager セッションを開始し、双方向接続を介してすべてのデータを転送することができます。

DevOps エンジニア

SSH キーを生成します。

次のコマンドを入力して、ローカルで非公開と公開 SSH キーペアを生成します。このキーペアで踏み台ホストに接続します。

ssh-keygen -t rsa -f my_key
DevOps エンジニア、開発者

ローカル環境の設定

タスク説明必要なスキル

SSH 接続を設定します。

SSH 設定を更新して、Session Manager を介して SSH 接続を有効にします。手順については、「Session Manager の SSH 接続を許可」を参照してください。これにより、許可されたユーザーは、プロキシコマンドを入力し、Session Manager セッションを開始し、双方向接続を介してすべてのデータを転送することができます。

DevOps エンジニア

SSH キーを生成します。

次のコマンドを入力して、ローカルで非公開と公開 SSH キーペアを生成します。このキーペアで踏み台ホストに接続します。

ssh-keygen -t rsa -f my_key
DevOps エンジニア、開発者
タスク説明必要なスキル

インスタンスの ID を取得します。

  1. デプロイされた踏み台ホストに接続するには、EC2 インスタンスの ID が必要です。ID を検索するには、次のいずれかの操作を行います

    • Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。ナビゲーションペインで、[インスタンス] を選択します。踏み台ホストのインスタンスを見つける

    • AWS CLI で以下のコマンドを入力します。

      aws ec2 describe-instances

      結果をフィルタリングするには、次のコマンドを入力します。ここで $BASTION_HOST_TAG は踏み台ホストに割り当てたタグです。このタグのデフォルト値は sandbox-dev-bastion-host です。

      aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$BASTION_HOST_TAG" \ --output text \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text
  2. EC2 インスタンスの ID をコピーします。この値は後で使用します。

AWS 全般

SSH パブリックキーを送信します。

注記

このセクションでは、踏み台ホストのインスタンスメタデータにパブリックキーをアップロードします。キーがアップロードされたら、60 秒以内に踏み台ホストとの接続を開始してください。60 秒後、パブリックキーは削除されます。詳細については、このパターンの「トラブルシューティング」セクションを参照してください。踏み台ホストに接続する前にキーが削除されないように、次の手順をすぐに実行してください。

  1. EC2 Instance Connect を使用して SSH キーを踏み台ホストに送信します。次のコマンドを入力します。

    • $INSTANCE_ID は EC2 インスタンスの ID

    • $PUBLIC_KEY_FILE は、my_key.pub などのパブリックキーファイルへのパスです。

      重要

      プライベートキーではなく、パブリックキーを使用してください。

    aws ec2-instance-connect send-ssh-public-key \ --instance-id $INSTANCE_ID \ --instance-os-user ec2-user \ --ssh-public-key file://$PUBLIC_KEY_FILE
  2. キーが正常にアップロードされたことを示すメッセージが表示されるまでお待ちください。直ちに次のステップに進んでください。

AWS 全般

踏み台ホストに接続します。

  1. 次のコマンドを入力して、Session Manager経由で踏み台ホストに接続します。

    • $PRIVATE_KEY_FILEmy_key などプライベートキーへのパスです。

    • $INSTANCE_ID は EC2 インスタンスの ID

    ssh -i $PRIVATE_KEY_FILE ec2-user@$INSTANCE_ID
  2. yes を入力して接続を確認します。Session Managerを使用して SSH 接続が開きます。

注記

踏み台ホストとの SSH 接続を開く方法は他にもあります。詳細については、このパターンの「追加情報」セクションの「踏み台ホストとの SSH 接続を確立するための代替方法」を参照してください。

AWS 全般

Session Manager で踏み台ホストに接続

タスク説明必要なスキル

インスタンスの ID を取得します。

  1. デプロイされた踏み台ホストに接続するには、EC2 インスタンスの ID が必要です。ID を検索するには、次のいずれかの操作を行います

    • Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。ナビゲーションペインで、[インスタンス] を選択します。踏み台ホストのインスタンスを見つける

    • AWS CLI で以下のコマンドを入力します。

      aws ec2 describe-instances

      結果をフィルタリングするには、次のコマンドを入力します。ここで $BASTION_HOST_TAG は踏み台ホストに割り当てたタグです。このタグのデフォルト値は sandbox-dev-bastion-host です。

      aws ec2 describe-instances \ --filters "Name=tag:Name,Values=$BASTION_HOST_TAG" \ --output text \ --query 'Reservations[*].Instances[*].InstanceId' \ --output text
  2. EC2 インスタンスの ID をコピーします。この値は後で使用します。

AWS 全般

SSH パブリックキーを送信します。

注記

このセクションでは、踏み台ホストのインスタンスメタデータにパブリックキーをアップロードします。キーがアップロードされたら、60 秒以内に踏み台ホストとの接続を開始してください。60 秒後、パブリックキーは削除されます。詳細については、このパターンの「トラブルシューティング」セクションを参照してください。踏み台ホストに接続する前にキーが削除されないように、次の手順をすぐに実行してください。

  1. EC2 Instance Connect を使用して SSH キーを踏み台ホストに送信します。次のコマンドを入力します。

    • $INSTANCE_ID は EC2 インスタンスの ID

    • $PUBLIC_KEY_FILE は、my_key.pub などのパブリックキーファイルへのパスです。

      重要

      プライベートキーではなく、パブリックキーを使用してください。

    aws ec2-instance-connect send-ssh-public-key \ --instance-id $INSTANCE_ID \ --instance-os-user ec2-user \ --ssh-public-key file://$PUBLIC_KEY_FILE
  2. キーが正常にアップロードされたことを示すメッセージが表示されるまでお待ちください。直ちに次のステップに進んでください。

AWS 全般

踏み台ホストに接続します。

  1. 次のコマンドを入力して、Session Manager経由で踏み台ホストに接続します。

    • $PRIVATE_KEY_FILEmy_key などプライベートキーへのパスです。

    • $INSTANCE_ID は EC2 インスタンスの ID

    ssh -i $PRIVATE_KEY_FILE ec2-user@$INSTANCE_ID
  2. yes を入力して接続を確認します。Session Managerを使用して SSH 接続が開きます。

注記

踏み台ホストとの SSH 接続を開く方法は他にもあります。詳細については、このパターンの「追加情報」セクションの「踏み台ホストとの SSH 接続を確立するための代替方法」を参照してください。

AWS 全般
タスク説明必要なスキル

デプロイされたリソースを削除します。

  1. デプロイされたすべてのリソースを削除するには、クローンされたリポジトリのルートディレクトリから次のコマンドを実行します。

    terraform destroy -var-file="dev.tfvars"
  2. リソースの削除を確認します。

DevOps エンジニア、開発者、Terraform

(オプション) クリーンアップする

タスク説明必要なスキル

デプロイされたリソースを削除します。

  1. デプロイされたすべてのリソースを削除するには、クローンされたリポジトリのルートディレクトリから次のコマンドを実行します。

    terraform destroy -var-file="dev.tfvars"
  2. リソースの削除を確認します。

DevOps エンジニア、開発者、Terraform

トラブルシューティング

問題ソリューション

踏み台ホストに接続しようと試みる時の TargetNotConnected エラー

  1. 「Amazon EC2 のドキュメント」の「インスタンスの再起動」の手順に従って、踏み台ホストを再起動します。

  2. インスタンスが正常に再起動したら、パブリックキーを踏み台ホストに再送信し、接続を再試行します。

踏み台ホストに接続しようと試みる時の Permission denied エラー

パブリックキーが踏み台ホストにアップロードされたら、60 秒以内に接続を開始してください。60 秒が経過すると、そのキーは自動的に削除され、そのキーを使用してインスタンスに接続できなくなります。その場合は、手順を繰り返してそのキーをインスタンスに再送信できます。

関連リソース

AWS ドキュメント

その他のリソース

追加情報

踏み台ホストとの SSH 接続を確立するための代替方法

ポート転送

この -D 8888 オプションを使用して、動的ポートフォワーディングで SSH 接続を開くことができます。詳細については、「explainshell.com」で「以下の手順」を参照してください。以下は、ポート転送を使用して SSH 接続を開くコマンドの例です。

ssh -i $PRIVATE_KEY_FILE -D 8888 ec2-user@$INSTANCE_ID

この接続は、ローカルブラウザからのトラフィックを踏み台ホスト経由で転送できる SOCKS プロキシを開くようなものです。Linux または MacOS をご使用の場合、すべてのオプションを表示するには、man ssh を入力します。SSH リファレンスマニュアルが表示されます。

提供されたスクリプトを使用

エピック」セクションで、Session Manager で踏み台ホストに接続に説明されている手順を手動で実行する代わりに、コードリポジトリに含まれている connect.sh スクリプトを使用することができます。このスクリプトは SSH キーペアを生成し、パブリックキーを EC2 インスタンスにプッシュして、踏み台ホストとの接続を開始します。コマンドを実行すると、タグとキー名を引数として渡します。以下はスクリプトを実行するコマンドの例です。

./connect.sh sandbox-dev-bastion-host my_key
プライバシーサイト規約Cookie の設定
© 2025, Amazon Web Services, Inc. or its affiliates.All rights reserved.