ローカル端末からEC2プロキシ経由でGitHubに接続する環境をAWS Session Managerで構築してみた

ローカル端末からEC2プロキシ経由でGitHubに接続する環境をAWS Session Managerで構築してみた

Clock Icon2025.05.08

こんにちは!製造ビジネステクノロジー部の小林です。

開発環境では、セキュリティ要件から開発者が直接インターネット上のサービス(GitHubなど)にアクセスすることを制限する時があります。本記事では、AWS Session Managerを活用し、セキュリティ要件を満たしながらも、開発者がGitHubを利用できる環境の構築方法をご紹介します。

概要

この環境は下記の内容で構成されています。

  • AWS EC2インスタンス(プロキシサーバー)
  • VPCネットワーク
  • プライベートサブネット
  • Session Manager接続
  • SSHによるGitHub接続

開発者はSession Manager経由でEC2インスタンスに接続し、そこからGitHubリポジトリにアクセスします。これにより、インターネットへの直接アクセスを制限しながらも、GitHubを活用した開発が可能になります。

前提条件

  • Windows OS環境
  • AWS CLI導入済み
  • AWS CLIに必要な認証情報設定済み
  • Git Bash導入済み

Session Manager Pluginの導入

PowerShellで下記のコマンドを実行します。

# インストーラーのダウンロード
Invoke-WebRequest `
  -Uri https://s3.amazonaws.com/session-manager-downloads/plugin/latest/windows/SessionManagerPluginSetup.exe `
  -OutFile "SessionManagerPluginSetup.exe"

# インストーラーの実行。コマンド実行後ダイアログが表示されるのでinstallを選択
Start-Process -FilePath "SessionManagerPluginSetup.exe" -Wait

# 不要になったインストーラーの削除
Remove-Item "SessionManagerPluginSetup.exe"

インストール後、VS Codeのターミナルを再起動して環境変数を反映させます。
動作確認として下記のコマンドを実行します。

# バージョン確認
session-manager-plugin --version

# セッション開始テスト(インスタンスIDはご自身の環境に合わせて変更)
INSTANCE=i-xxxxxxxxxxxxxxx
aws ssm start-session --target ${INSTANCE}

# セッション終了
exit

トラブルシューティング: aws ssm start-sessionコマンドがエラーになる場合は、--no-verifyオプションを付けるか、IAM権限を確認してください。
私の環境では、下記のようなエラーが発生しました。

# エラー内容 
session-manager-plugin: error: unable to find the session manager plugin in your PATH.
Please ensure that the session manager plugin is installed and available in your PATH.

原因
session-manager-plugin がインストールされていても、シェルがその場所を認識できていませんでした。

解決方法
まず、パスを確認します。

# パス確認
which session-manager-plugin
/c/Program Files/Amazon/SessionManagerPlugin/bin/session-manager-plugin

次に、PATHにディレクトリを追加します。

export PATH=$PATH:/c/Program\ Files/Amazon/SessionManagerPlugin/bin

これで aws ssm start-session コマンドが動作するようになりました。

SSH用キーペアの準備

ローカル端末で下記のコマンドを実行し、SSH用のキーペアを生成します。

# メールアドレスは自身のものに変更
EMAIL=your_email@example.com
ssh-keygen -t ed25519 -b 4096 -C ${EMAIL}

SSHコンフィグの設定

Session Managerを通してプロキシインスタンスに接続するための設定を行います。

# インスタンスIDとユーザー名は環境に合わせて変更
INSTANCE=i-XXXXXXXXXXXX
USER=XX_XXXXXXX-XXXXXX

echo "Host github-proxy
  HostName ${INSTANCE}
  Port 22
  User ${USER}
  IdentityFile ~/.ssh/id_ed25519
  ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p" > ~/.ssh/config

VS Code拡張の設定

Remote-SSH拡張をインストールして、VS Codeからリモート環境に接続できるようにします。

code --install-extension ms-vscode-remote.remote-ssh

VS Codeのsettings.jsonに下記の設定を追加して、Remote-SSHがGit Bashを使用するようにします。

{
  "remote.SSH.path": "C:\\Program Files\\Git\\usr\\bin\\ssh.exe"
}

setting.jsonの開き方は下記画像をご参照ください。
スクリーンショット 2025-05-08 22.00.28

VS Codeから接続

VS Codeの左下の「><」アイコンをクリックし、「Remote-SSH: Connect to Host...」を選択します。設定したhost名「github-proxy」を選択して接続します。

トラブルシューティング: TargetNotConnectedエラーが発生する場合は、~/.ssh/configのIdentityFileまたはHostNameの指定が正しいか確認してください。

リモート環境でのGitHub接続設定

プロキシ環境からGitHubにアクセスするための設定を行います。

SSHキーの生成(リモート環境側)

VS Codeで接続したリモート環境で 下記のコマンドを実行します。
デフォルトの保存場所(~/.ssh/id_ed25519)を使用します。

ssh-keygen -t ed25519 -b 4096 -C your_email@example.com

公開鍵の確認と登録

生成した公開鍵の内容を確認します。

cat ~/.ssh/id_ed25519.pub

この公開鍵をGitHubアカウントに登録します。

GitHubへの公開鍵の登録

GitHubにログインし、右上のプロフィール写真から「Settings」を選択します。
その後、サイドバーの「SSH and GPG keys」 → 「New SSH key」ボタンを選択します。
スクリーンショット 2025-05-08 20.51.53

タイトルを入力し、公開鍵の内容を貼り付けたら「Add SSH key」を選択して保存します。
スクリーンショット 2025-05-08 20.54.29

https://docs.github.com/ja/enterprise-cloud@latest/authentication/authenticating-with-saml-single-sign-on/authorizing-an-ssh-key-for-use-with-saml-single-sign-on#authorizing-an-ssh-key

リポジトリの操作

プライベートリポジトリにアクセスするにはSSH URLを使用してクローンを作成します。

git clone git@github.com:your-organization/your-repo.git

SSH URLは下記画像部分にあります。
スクリーンショット 2025-05-08 22.07.30

インフラ管理者によるGitHub プロキシサーバー管理手順

プロキシサーバーの設定と管理は、インフラ管理者の重要な役割です。ここでは、EC2インスタンスの初期設定から開発者ユーザーの管理まで、必要な手順を解説します。

必要なパッケージをインストール

ローカル端末で、Session Managerで接続し、必要なパッケージをインストールします。

# Session Managerによるインスタンスとのセッションを開始
INSTANCE=i-xxxxxxxxxxxxxxx
aws ssm start-session --target ${INSTANCE}

リモート端末で下記を実行します。

# パッケージリストを最新に更新
sudo yum update -y

# Git のインストール
sudo yum install git -y

# セッションを切断
exit

開発者ユーザーの追加

ローカル端末で下記を実行します。

# Session Managerによるインスタンスとのセッションを開始
INSTANCE=i-xxxxxxxxxxxxxxx
aws ssm start-session --target ${INSTANCE}

リモート端末で下記を実行します。

# 作成済みのユーザー一覧確認
cat /etc/passwd | grep /bin/bash

# ユーザーの新規追加(<所属>_<姓>-<名>形式)
USER=XX_XXXXXXX-XXXXXX
sudo adduser ${USER}

開発ユーザーから公開鍵(~/.ssh/id_ed25519.pub)を受領する

# SSH 用ディレクトリの作成、権限設定
sudo mkdir /home/${USER}/.ssh
sudo chown ${USER}:${USER} /home/${USER}/.ssh
sudo chmod 700 /home/${USER}/.ssh

# 開発者ユーザーの公開鍵を登録
PUBLIC_KEY='ssh-ed25519 XXXXX...'
echo ${PUBLIC_KEY} | sudo tee /home/${USER}/.ssh/authorized_keys > /dev/null
sudo chown ${USER}:${USER} /home/${USER}/.ssh/authorized_keys
sudo chmod 600 /home/${USER}/.ssh/authorized_keys

# セッションを切断する
exit

開発者ユーザーの削除

ローカル端末で下記を実行します。

# Session Manager によるインスタンスとのセッションを開始
INSTANCE=i-XXXXXXXXXXXX
aws ssm start-session --target ${INSTANCE}

リモート端末で以下を実行します。

# 削除対象ユーザー一覧確認
cat /etc/passwd | grep /bin/bash

# ユーザーが現在実行中のプロセスを確認
ps -u ${USER}

# ユーザーのすべてのプロセスを終了
sudo kill -9 $(ps -u ${USER} -o pid=)

# ユーザーの削除
sudo userdel -r ${USER}

# 削除対象ユーザーが削除されたことを確認
cat /etc/passwd | grep /bin/bash

まとめ

今回は、AWS Session ManagerとSSHを組み合わせた、セキュアなGitHub接続環境の構築方法をご紹介しました。
この方法では、ローカル端末からEC2プロキシサーバーを経由してGitHubにアクセスすることで、直接的なインターネット接続を避けながらも、開発作業が可能になります。AWS環境とGitHubを組み合わせた開発ワークフローの構築に活用いただければ幸いです!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.