株式会社セキュアイノベーション
Menu

セキュリティコラム

  • ネットワーク

公開:2023.04.17 10:00 | 更新: 2023.04.19 02:40

AWS CLIに多要素認証(MFA)を強制する

AWS CLIに多要素認証(MFA)を強制するAWS CLIに多要素認証(MFA)を強制する

概要

昨今クラウドシフトが進み、プラットフォームをオンプレミスからパブリッククラウド等へ切り替える動きが加速していると感じます。

AWSやAzure等のパブリッククラウドが普及し、場所、時間、費用に捉われず、自由にクラウド上にインフラを構築できるようになりました。
しかしパブリッククラウドの普及に伴い、アクセスキーの取り扱いを誤り、漏洩させてしまったことが原因でアカウントへの不正侵入を受け、重大なセキュリティインシデントが多々発生しています。

セキュリティインシデントへの対策として、ここではAWSの一部の例を取り上げますが、IAMユーザの使いまわしをしない、可能な限りアクセスキーを利用しない、ルートユーザのアクセスキーをロックする多要素認証(MFA:Multi-Factor Authentication)を設定する等が挙げられます。

なお、AWSおよびMFAについては過去にもブログで取り上げていますので、合わせてご確認ください。
関連ブログ:
 AWS初心者ができるアクセスキー不正利用軽減策
 多要素認証(MFA)とは?

多要素認証(MFA:Multi-Factor Authentication)とは

近年、従来のIDとパスワードによる認証から、高いセキュリティ強度を実現できる多要素認証を必須とする流れとなってきています。
多要素認証とはPC・サーバへのアクセス時やクラウドサービスへのログイン時などに、2つ以上の要素で行う認証を指します。

認証要素は大きく分けて下記の3があります。

要素認証方法
知識要素
(その人が知っている情報)
パスワード
PINコード
秘密の質問
所有要素
(その人が持っているものに付随する情報)
携帯電話/スマートフォン
ハードウェアトークン
ICカード
生体要素
(その人の身体的な情報)
指紋
静脈
声紋

AWS CLI(Command Line Interface)における多要素認証の必要性

通常、AWS CLIからAWSへ接続する場合、アクセスキーID、シークレットアクセスキーを利用することが一般的で、デフォルトで多要素認証は設定されておりません。
先述しましたが、アクセスキーID、シークレットアクセスキーのみの運用は、誤ってアクセスキーを漏洩させてしまうと重大なセキュリティインシデントを招く可能性が高くなります。
また、AWS CLIへ登録したアクセスキーID、シークレットアクセスキーは、ローカルの設定ファイルに情報が残り、簡単に閲覧することが可能です。

このような課題の対策方法のひとつとして、AWS CLIへ多要素認証を設定することが挙げられます。
AWSマネジメントコンソールからIAMユーザの設定で多要素認証の設定が可能ですが、AWS CLIからIAMユーザを利用する場合、多要素認証の設定だけでは多要素認証を強制することができず、アクセスキーID、シークレットアクセスキーでの接続も可能となります。
AWS CLIでセキュアな認証を実現するためには、多要素認証の設定と合わせてIAMポリシーの定義が必要となります。

AWS CLIへ多要素認証の設定方法

ここからはAWS CLIで多要素認証を設定する方法を解説します。

多要素認証を設定せずにAWS CLIを実行した場合

実際にコマンドプロンプトやターミナルソフトからAWSへ接続します。
AWS CLIからAWSへはじめて接続する場合は、下記コマンドを実行します。

aws configure

その後下記内容を聞かれるので、IAMの管理画面で確認し適宜入力します。

AWS Access Key ID :[アクセスキーID]
AWS Secret Access Key :[シークレットアクセスキー]
Default region name :[利用するリージョン]
Default output format :[利用するフォーマット(今回はjson)]

上記入力した情報でAWSへ接続されます。
適当なコマンドを実行しAWSへ接続します。

aws iam get-user

上記は現在接続しているIAMユーザの情報を取得するコマンドです。
下記のように取得できたと思います。

{
 "Credentials": {
  "AccessKeyId": "AS******FB",
  "SecretAccessKey": "1o******0C",
  "SessionToken": "IQo******s=",
  "Expiration": "2023-04-03T18:36:49+00:00"
 }
}

認証時に多要素認証を取っておらず、アクセスキーID、シークレットアクセスキーで認証されていることが分かります。

多要素認証の設定

AWSマネジメントコンソールからIAMの管理画面を開き、対象ユーザに多要素認証の設定を実施します。
『ユーザー』>『AWS CLIで利用するユーザ』をクリック
※AWS CLIで利用するユーザーが無い場合、別途ユーザーを作成してください。

『セキュリティ認証情報』>『MFAデバイスの割り当て』をクリック

『適宜デバイス名を入力』>『適宜MFAデバイスを選択(今回は認証アプリケーションを選択)』>『次へ』をクリック

『任意のデバイスからQRコードを読み込む』>『適宜MFAコード1・2を入力』>『MFAを追加』をクリック

『多要素認証の設定ができたことを確認』

多要素認証の設定後、コマンドプロンプトやターミナルソフトから適当なコマンドを実行しAWSへ接続します。

aws iam get-user

上記は現在接続しているIAMユーザの情報を取得するコマンドです。
下記のように取得でき、特に多要素認証も反応しませんでした。
このことから多要素認証設定後もまだ多要素認証が取れていないことが分かります。

{
 "Credentials": {
  "AccessKeyId": "AS******FB",
  "SecretAccessKey": "1o******0C",
  "SessionToken": "IQo******s=",
  "Expiration": "2023-04-03T18:36:49+00:00"
 }
}

IAMポリシー作成

次にAWS CLIへ多要素認証を強制するため、下記IAMポリシーを定義します。

{
 "Version": "2012-10-17",
 "Statement": [
  {
   "Sid": "BlockMostAccessUnlessSignedInWithMFA",
   "Effect": "Deny",
   "NotAction": [
    "iam:CreateVirtualMFADevice",
    "iam:EnableMFADevice",
    "iam:ListMFADevices",
    "iam:ListUsers",
    "iam:ListVirtualMFADevices",
    "iam:ResyncMFADevice"
   ],
   "Resource": "*",
   "Condition": {
    "BoolIfExists": {
    "aws:MultiFactorAuthPresent": "false"
    }
   }
  }
 ]
}

上記ポリシーにより、多要素認証を行っていない認証は拒否されるようになります。
作成したIAMポリシーをユーザまたはユーザグループへアタッチすることで、対象ユーザへ多要素認証を強制することができます。

AWSマネジメントコンソールを開き『IAM』サービスを開きます。
『ポリシー』>『ポリシー作成』をクリック

『JSON』>『IAMポリシーを入力』>『次のステップ:タグ』をクリック

『任意でタグを入力』>『次のステップ:確認』をクリック

『適宜ポリシー名を入力』>『適宜説明を入力』>『ポリシーの作成』をクリック

『検索バーに作成したポリシー名を入力』>作成したIAMポリシーが表示されることを確認

コマンドプロンプトやターミナルソフトから適当なコマンドを実行しAWSへ接続します。

aws iam get-user

上記は現在接続しているIAMユーザの情報を取得するコマンドです。

下記のようなエラーが出たと思います。

An error occurred (AccessDenied) when calling the GetUser operation: User: arnmo is not authorized to perform: iam:GetUser on resource: user clmo with an explicit deny in an identity-based policy

これは多要素認証していないので拒否しますというエラーです。

多要素認証を設定しAWS CLIを実行した場合

次はコマンドプロンプトやターミナルソフトから多要素認証を実施し接続します。
下記はセッショントークンを取得するコマンドとなります。
[]の箇所をIAM管理画面やMFAデバイスから取得し適宜変更してください。

aws sts get-session-token --serial-number [多要素認証(MFA)識別子] --token-code [ワンタイムパスコード]

うまくいくと下記のように新たなアクセスキーID、シークレットアクセスキーと更に、セッショントークンが出力されます。
表示された『AccessKeyId』『SecretAccessKey』『SessionToken』をコピーして控えます。

{
 "Credentials": {
  "AccessKeyId": "AS******FB",
  "SecretAccessKey": "1o******0C",
  "SessionToken": "IQo******s=",
  "Expiration": "2023-04-03T18:36:49+00:00"
 }
}

次に下記のように環境変数を定義します。
※下記方法で定義した環境変数は、コマンドプロンプトやターミナルソフトを閉じるとリセットされます。

  • Windowsの場合
    set AWS_ACCESS_KEY_ID=[新たに取得したAccessKeyId]
    set AWS_SECRET_ACCESS_KEY=[新たに取得したSecretAccessKey]
    set AWS_SESSION_TOKEN=[取得したSessionToken]
  • Linuxの場合
    export AWS_ACCESS_KEY_ID=[新たに取得したAccessKeyId]
    export AWS_SECRET_ACCESS_KEY=[新たに取得したSecretAccessKey]
    export AWS_SESSION_TOKEN=[取得したSessionToken]

環境変数の定義後、もう一度適当なコマンドを実行しAWSへ接続します。

aws iam get-user

すると、今度は結果が返ってきます。

{
 "User": {
  "Path": "/",
  "UserName": "cl******mo",
  "UserId": "AI******QG",
  "Arn": "ar*******mo",
  "CreateDate": "2023-03-16T07:36:16+00:00"
 }
}

上記でAWS CLIから多要素認証が取れていることを確認できました。
今回は環境変数の定義を行いましたが、別の方法もありますので、ぜひいろいろ試してみてください。

最後に

今回作成したIAMポリシーをアタッチされたIAMユーザは、多要素認証を取らないと認証されなくなります。
これはAWS CLIやAWSマネジメントコンソールどちらからの認証にも多要素認証を取る必要があります。
AWS CLIで多要素認証を設定する方法を紹介しましたが、セキュリティ対策に万策はなく、多要素認証も万全ではないため、日ごろからアクセスキーID、シークレットアクセスキーの取り扱いは慎重に行う必要があります。
本件がAWS CLIの運用にお役立ていただければと幸いです。

最後に一言、AWS CLIの多要素認証はIAMポリシーが肝。

最新のコラム記事

LOADING...

セキュアイノベーション サービス一覧

ネットワーク・サーバー

Webサイトを守る