モチベーション
現在、Amazon Elastic Kubernetes Service (Amazon EKS)を使った開発をやっています。EKSクラスターにアクセスする際には乗っ取りを防ぐためにMFA(多要素認証:Multi-Factor Authentication)を使っています。
毎日CLIから接続設定を打ち込むのが面倒なので、Shellスクリプトを作成して、なるべく自動化したいと思います。
前提条件
以下を満たしていることを仮定します
- AWSのアカウントがあり、EKSクラスターが作成済み
- AWS CLI、kubectl、eksctl がインストール済み
実施手順
- MFAアプリのインストールとAWS IAMと紐付け
- shスクリプトの作成
- 動作確認
MFAアプリのインストールとAWS IAMとの紐付け
MFAの設定は以下を参考にさせていただきました。
私が導入したのは、Microsoft Authenticatorです。
Google Authenticatorでも機能・設定方法に大差ないと思います。
iphoneの方は、Apple Storeからダウロードしてください。
shスクリプトの作成
mfa_auth.sh
#!/bin/bash
# MFA認証用スクリプト
# エラーハンドリングと使用方法の表示
usage() {
echo "使用方法: source $0 <MFAコード> <クラスター名> <リージョン>"
exit 1
}
# 引数チェック
if [ $# -ne 3 ]; then
usage
fi
# 引数から変数に代入
MFA_CODE=$1
CLUSTER_NAME=$2
REGION=$3
echo "MFA_CODE: $MFA_CODE"
echo "CLUSTER_NAME: $CLUSTER_NAME"
echo "REGION: $REGION"
# 固定のシリアルナンバー
SERIAL_NUMBER="{MFA認証の識別子に置き換え※後述}"
# セッショントークンの取得
# duration-secondsで一時的なセッション継続時間を最大36時間まで設定可能。単位は秒
SESSION_TOKEN=$(aws sts get-session-token \
--duration-seconds 129600 \
--serial-number "$SERIAL_NUMBER" \
--token-code "$MFA_CODE")
# 環境変数の設定
export AWS_ACCESS_KEY_ID=$(echo "$SESSION_TOKEN" | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo "$SESSION_TOKEN" | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo "$SESSION_TOKEN" | jq -r '.Credentials.SessionToken')
echo "AWS_ACCESS_KEY_ID: $AWS_ACCESS_KEY_ID"
echo "AWS_SECRET_ACCESS_KEY: $AWS_SECRET_ACCESS_KEY"
echo "AWS_SESSION_TOKEN: $AWS_SESSION_TOKEN"
# 有効期限を日本時間に変換
EXPIRATION_UTC=$(echo "$SESSION_TOKEN" | jq -r '.Credentials.Expiration')
EXPIRATION_JST=$(date -d "$EXPIRATION_UTC" '+%Y-%m-%d %H:%M:%S %Z')
CURRENT_TIME=$(date '+%Y-%m-%d %H:%M:%S %Z')
# 有効期限の確認
if [[ "$(date -d "$EXPIRATION_UTC" +%s)" -le "$(date +%s)" ]]; then
echo "❌ 認証情報の有効期限が切れています。"
echo "現在時刻: $CURRENT_TIME"
echo "有効期限: $EXPIRATION_JST"
return 1
fi
# 成功メッセージ
echo "✅ MFA認証が成功しました。一時的な認証情報を設定しました。"
echo "現在時刻: $CURRENT_TIME"
echo "有効期限: $EXPIRATION_JST"
# EKSクラスタの認証情報を更新
aws eks update-kubeconfig --name "$CLUSTER_NAME" --region "$REGION"
# kubectlの設定を確認
echo "✅ EKSクラスタの認証情報を更新しました。"
kubectl config current-context
echo "✅ EKSクラスタの情報"
kubectl cluster-info
SERIAL_NUMBER には以下の識別子を設定してください
動作確認
Ubuntuから実施する場合
source mfa_auth.sh{MFA認証コード(6桁)}{EKSクラスター名}{EKSクラスターのリージョン}
MFA認証コード(6桁) にはMFAアプリで表示されている6桁の数字を入れてください。同一コードは30秒しか保持されません。
以下の様に、MFA認証が成功したこととEKSクラスタの情報が表示されればOKです。
Windowsから実施する場合
wsl -d Ubuntu bash mfa_auth.sh {MFA認証コード(6桁)} "{EKSクラスター名}" "{EKSクラスターのリージョン}"
としてください。