MFA設定IAMユーザーでeksctl実行

MFA設定IAMユーザーでeksctl実行:


はじめに

AWS EKSが東京リージョンで公開されたタイミングと時を同じくしてEKSを触ってみるチャンスを得た。予めチュートリアルは見ていたが、「eksctl」なるものがあるよとTwitterで出回っていたので、せっかくならということでeksctlでトライした。

手元の環境がセキュリティベストプラクティスに倣いMFAを有効化してあるため、eksctlの利用には一工夫必要でした。その対応方法について記載する。


環境

作業端末:Windows10 Subsystem for Linux(Ubuntu16.04)

AWS CLI:aws-cli/1.16.81

IAMユーザー:Admin権限あり、MFA有効化


MFAトークンの利用


一時トークンの払い出し

AWSのガイドにあるように、MFA有効化したIAMユーザーアカウント権限でAWS CLIを利用するためには、一時的なセッショントークンを作成&利用する必要がある。

AWS CLI 経由で AWS リソースへのアクセスを認証するには、どのように MFA トークンを使用したらよいですか?

まず上記リンク先の方法で一時トークンを出力させる。実行例は上記リンク先参考。

$ aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token
arn-of-the-mfa-device:IAMユーザーの認証情報>MFAデバイスの割り当てを参照

なお、一時セッショントークンの有効期間はデフォルトで12時間。


一時トークンをProfileに設定

今後は--profileオプションで一時トークンの設定を呼び出しできるように先程取得した一時トークンをプロファイルに登録しておく。

”mfa”というプロファイル名で追加登録する。

.aws/config
$ cat .aws/config 
[default] 
output = json 
region = us-east-1 
 
[profile mfa] 
output = json 
region = us-east-1 
aws_access_key_id = <Access-key-as-in-returned-output> 
aws_secret_access_key = <Secret-access-key-as-in-returned-output> 
aws_session_token = <Session-Token-as-in-returned-output> 
ちなみに、当初下記のようにprofileが無いと怒られてAWS CLIが実行できなかったが、profile名の記載方法が間違っていた。単なる[mfa]ではなく[profile mfa]と設定しないと行けなかった。

profile名の頭にはprofileとつけること
$ aws ec2 describe-instances --profile mfa 
 
The config profile (mfa) could not be found 
  • profileオプションをつけて実行確認
$ aws ec2 describe-instances --profile mfa 
{ 
    "Reservations": [ 
        { 
            "Instances": [ 
                { 
                    "Monitoring": { 
                        "State": "disabled" 
                    }, 
                    "PublicDnsName": "", 
                    "StateReason": { 
                        "Message": "Client.UserInitiatedShutdown: User initiated shutdown", 
                        "Code": "Client.UserInitiatedShutdown" 
                    }, 
                    "State": { 
                        "Code": 80, 
                        "Name": "stopped" 
                    }, 
                    "EbsOptimized": false, 
                    "LaunchTime": "2018-12-21T04:33:14.000Z", 
以下省略 
→ OK。

一時トークンの有効期限が過ぎると、再度この設定をし直す必要がある。


eksctlの準備

ここはeksctlの準備の話はメインではないので、リンク情報のみ記載する。

ekscltインストール
https://github.com/weaveworks/eksctl

kubectlインストール
https://kubernetes.io/docs/tasks/tools/install-kubectl/

kubectl を Amazon EKS 用に設定
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/configure-kubectl.html


profileオプションを使用したeksctlの実行

ようやく本題のeksctlをMFAの一時トークンを使用する。

使用方法はAWS CLIの実行時と同じで--profileオプションを追加するだけ。

$ eksctl xxx --profile mfa 
クラスター構築の際はこんな感じでオプションに追加する。

$ eksctl create cluster \ 
  --name hoge \ 
  --region us-east-1 \ 
  --nodes 3 \ 
  --nodes-min 1 \ 
  --nodes-max 3 \ 
  --node-type t2.medium \ 
  --version=1.10 \ 
  --tags name=fuga \ 
  --profile mfa 
profileオプションを付けないと以下のように失敗する。

$ eksctl get cluster 
[✖]  checking AWS CloudFormation access – cannot list stacks: AccessDenied: User: arn:aws:iam::xxx:user/xxxx is not authorized to perform: cloudformation:ListStacks with an explicit deny 
        status code: 403, request id: xxxxx 


EKSクラスターを作ってみた

クラスター構築はこちらを参考。
https://qiita.com/arakawa_moriyuki/items/b01a3294f141feeaf54e

クラスター情報を参照

$ eksctl get cluster --profile mfa 
NAME                            REGION 
hoge                           us-east-1 
こちらがeksctlコマンドでクラスター作成する際に自動で作成されるkubectlのconfig情報。

.kube/config
$ cat .kube/config 
apiVersion: v1 
clusters: 
- cluster: 
    certificate-authority-data: xxx 
    server: https://xxx.us-east-1.eks.amazonaws.com 
  name: hoge.us-east-1.eksctl.io 
contexts: 
- context: 
    cluster: hoge.us-east-1.eksctl.io 
    user: xxx@hoge.us-east-1.eksctl.io 
  name: xxx@hoge.us-east-1.eksctl.io 
current-context: xxx@hoge.us-east-1.eksctl.io 
kind: Config 
preferences: {} 
users: 
- name: xxx@hoge.us-east-1.eksctl.io 
  user: 
    exec: 
      apiVersion: client.authentication.k8s.io/v1alpha1 
      args: 
      - token 
      - -i 
      - hoge 
      command: aws-iam-authenticator 
      env: 
      - name: AWS_PROFILE 
        value: mfa 
なんと、.kube/configの中にも一時トークンのprofile情報が追記されている(最下部)。

ちなみに、kubectlコマンドの実行の際はprofileオプションは不要。

$ kubectl get nodes 
NAME                             STATUS   ROLES    AGE   VERSION 
ip-192-168-27-178.ec2.internal   Ready    <none>   54m   v1.10.11 
ip-192-168-49-72.ec2.internal    Ready    <none>   53m   v1.10.11 
ip-192-168-8-92.ec2.internal     Ready    <none>   53m   v1.10.11 
ただし、MFAの一時トークンの有効期限が切れるとkubectlもエラーとなり使用できない。そのため、再度一時トークンの設定が必要になる。


まとめ

MFAを設定したIAMユーザー権限でも一時トークンをプロファイルに設定&利用することで、eksctlの使用は可能。

それにしてもeksctlはめちゃくちゃ便利!

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)