
ローカル端末からEC2プロキシ経由でGitHubに接続する環境をAWS Session Managerで構築してみた
こんにちは!製造ビジネステクノロジー部の小林です。
開発環境では、セキュリティ要件から開発者が直接インターネット上のサービス(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の開き方は下記画像をご参照ください。
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」ボタンを選択します。
タイトルを入力し、公開鍵の内容を貼り付けたら「Add SSH key」を選択して保存します。
リポジトリの操作
プライベートリポジトリにアクセスするにはSSH URLを使用してクローンを作成します。
git clone git@github.com:your-organization/your-repo.git
SSH URLは下記画像部分にあります。
インフラ管理者による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を組み合わせた開発ワークフローの構築に活用いただければ幸いです!