IAMユーザーのMFA(多要素認証)は有効になっていますか?現状を確認→是正→適切な状態を維持するまでの流れを整理してみた
中山(順)です
AWSアカウントのIAMユーザーではMFA(多要素認証)を利用できますが、ちゃんと有効化していますか?
AWSのコンソールにログインできるということは、そのユーザーに付与されている権限によってはシステムの構成やデータを閲覧・変更・削除ができたりします。 そのようなケースにおいて、ユーザー認証がパスワード(knowledge factor)だけでいいのでしょうか?
AWSが示すIAM Best Practicesにおいても、特権ユーザーに対してはMFAを有効化することが推奨されています。
Enable MFA for Privileged Users
この記事では、以下の流れでIAM Userの現状確認から適切な状態を維持するまでの流れを整理してみました。
- 現状確認
- 必要に応じて権限の再設計
- 展開(MFAの有効化)
- 監視(適切な状態であることを維持)
現状確認
まず、IAM UserがMFAを利用しているかを確認する方法を説明します。
一番簡単な方法として、IAMのコンソールでIAM UserがMFAを利用しているかを確認できます。
また、Credential Reportをダウンロードして確認することも可能です。
Credential Reportに含まれる項目はドキュメントで確認できます。 "mfa_active"の項目から、IAM UserでMFAが有効化されていることを確認できます。
Getting Credential Reports for Your AWS Account
必要に応じて権限の再設計
ここでMFAの設定を展開してもいいのですが、必要に応じて権限付与の再設計を検討しましょう。 具体的には、以下の点を検討頂くといいのではないかと思います。
- MFAを利用しないと特権を利用できないようにする
- IAMの管理権限を必要最小限のメンバーに付与する
- 新しいポリシーへの移行
MFAを利用しないと特権を利用できないようにする
ここでは特権を任意のリソースを作成・変更・削除できる権限と定義します。
特権で実行可能なアクションを誤って/悪意を持って実行された場合、不要なコストの発生やシステム障害/データの破損発生が起こりえます。 そのため、第三者による不正を防ぐためにMFAによる認証をしないと特権を利用した操作ができないようにしたいと考えると思います。
そこで、IAM Roleです。 IAM Roleを利用することで、"AssumeRole"(マネージメントコンソール上においては「スイッチロール」)を実行できるようになります。 AssumeRoleによりIAM Roleの持つ権限を引き受けることができます。
IAM UserにはAssumeRoleを実行する権限(+必要に応じて各種設定の読み取り権限)を付与することで必要な時だけAssumeRoleすることができます。
また、IAM Role側の設定でIAM UserがMFAで認証していない場合には権限を引き渡せないように制御することができます。 以下のように、IAM Roleを作成する際にMFAでの認証を必須とすることができます。
上記の設定を行うと、IAM Roleには以下の信頼ポリシーが設定されます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::XXXXXXXXXXXX:root" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } ] }
この機能を利用することで、例えば以下のような設計が可能になります。
- IAM User
- 一人ずつにIAM Userを発行
- 権限を直接付与しない
- IAM Group
- IAM Userをメンバーとして追加(IAM Groupに付与された権限がIAM Userに付与される)
- MFAを自己管理する権限を付与(後述)
- 特権が付与されたIAM Roleに対してAssumeRoleできる権限を付与
- (任意)リソースの読み取り権限を付与
- IAM Role
- IAM Userが存在するAWSアカウント(もしくはIAM User)を信頼
- IAM Roleから権限を引き受ける条件として、MFAで認証していることを必須とする
- 必要な権限(特権を含む)を付与
こうすることで、IAM UserにIAM RoleへのAssumeRole権限を付与しつつ、MFAで認証しないとAssumeRoleできないようにすることができます。
ちなみに、IAM User / IAM Groupに付与するポリシーにおいて、Condition要素でaws:MultiFactorAuthPresentキーを利用することによりMFAによる認証をしていないと各種操作を実行できないようにすることができます。 しかし、ポリシー設計が面倒なので、IMA Roleを利用するのが賢明だと思います。
Keys Available for All Services
IAMの管理権限を誰に付与するか
ところで、IAMの管理権限は誰に付与していますか?
誰にでもIAMの権限を与えてしまうと、上記のような構成を簡単に破壊できます。 そのため、IAMの管理権限は信頼できる少数のメンバーに付与するのが望ましいでしょう。 また、必要に応じてIAMの管理権限を持ったメンバーを監査できるようにしましょう。
新しいポリシーへの移行
AWSを新規導入する場合には検討はここまででいいのですが、すでにIAM Userを運用している場合にはどうするといいでしょうか?
個人的には既存ポリシーの変更の影響を評価するのが面倒なので、新たにIAM User / Policy / Group / Roleを作成して移行するとよいのではないかと思います。 ただし、この場合でもリソースポリシー(S3のバケットポリシーなど)にIAM UserのARNを記述していると移行時に問題が起こるかもしれませんので注意しましょう。
展開(MFAの有効化)
MFAを有効化してないユーザーに対して有効化する場合、管理者は何をすればいいでしょうか?
もしかすると、管理者が一人一人のところに巡回して設定させるようなことを想像した方もいるかもしれませんが、そのような必要はありません。 ユーザー自身に有効化してもらうことができます。
そのためには、以下のポリシー(MFAを自己管理するポリシー)をアタッチすればOKです。
IAM: Allows IAM Users to Self-Manage an MFA Device
この権限を付与した後に、ユーザー自身でMFAを有効化してもらうようアナウンスすればよいかと思います。
MFAデバイスは以下の3種類が提供されています。
- Virtual MFA devices
- U2F security key
- Hardware MFA device
Virtual MFA devicesはスマホを持っていれば利用できますので、コスト的な負担は抑えることができるでしょう。 MFAのアプリとしては以下のようなものが挙げられます。
U2F security keyおよびHardware MFA deviceは別途購入する必要がありますので、予算を確保したり経費精算できるよう組織内で調整しましょう。
- SafeNet IDProve 100 6-digit OTP Token for Use with Amazon Web Services Only
- Yubico セキュリティキー - U2F / FIDO2, USB-A, 2段階認証
また、U2F security keyおよびHardware MFA deviceを利用する場合には故障時の対応フローも検討しておきましょう。
What If an MFA Device Is Lost or Stops Working?
監視(適切な状態であることを維持)
ある時点で全てのIAM UserでMFAを有効化してもらったとします。 AWSアカウントの管理者はその状態が維持されていることを監視する必要があるでしょう。
先ほど紹介したCredential reportを定期的に参照して確認することが最も簡単な方法ですが、定期的に実行する必要がありめんどくさいです。 MFAが無効になっているユーザーを検知するためにはConfig Rulesを利用するといいでしょう。 デフォルトで、以下のルールが提供されています。
mfa-enabled-for-iam-console-access
複数のアカウントを管理している場合には、サードパーティーのサービスを利用するといいでしょう。
Insightwatchでは、IAM Best Practiceに基づいてMFAが有効になっていない特権ユーザーを検出できます。
IBP 08 特権ユーザーに対してMFAを有効化する
- アラート基準:IAMユーザーにMFAが設定されていない場合
- IAMユーザーのMulti-Factor Authentication (MFA)を有効化し、ログイン時のセキュリティを強化します
- MFAを有効化してください
- 対応手順はこちら
Dome9の場合、「認証情報レポート」の機能でアカウント横断で確認が可能です。 以下の画面は、「MFAが無効」かつ「コンソールへのログインパスワードが有効」の条件で絞り込んだ結果です。 CSVで出力することもできます。
まとめ
AWSを利用する際に複数の認証要素で認証させることは非常に重要です。
パスワードは扱いを間違うと簡単に漏洩したり推測されてしまったりします。 パスワードポリシーを厳しくしたり、パスワードマネージャーを利用してサービス毎に重複しない複雑なパスワードを設定するなどすることである程度リスクを緩和できますが、限界もあります。
AWSのIAM Userで利用できるMFAを利用することは、(組織の規模にもよりますが)そこまで手間もコストもかかりません。 その割にリスクは大幅に緩和することができるかと思います。
利用していないようであれば、是非有効化しましょう。