EC2 の IAM ロールで認証できるようになりました
これまでの CloudFrontClearCaches は、IAM ユーザーのアクセスキーとシークレットアクセスキーをプラグイン設定に保存して AWS に認証していました。
v1.1.0 では、Movable Type が EC2 上で稼働している場合に、インスタンスにアタッチした IAM ロールの権限でキャッシュクリアを実行できるようになりました。アクセスキーとシークレットアクセスキーを Movable Type に保存する必要はありません。
一時的な認証情報は、キャッシュクリアの実行のたびに EC2 のインスタンスメタデータサービス(IMDS)から取得し、データベースやファイルには保存しません。IMDSv2 を必須にしたインスタンスでも利用できます。
使い方
- Movable Type が稼働している EC2 インスタンスに、
cloudfront:CreateInvalidation を許可した IAM ロールをアタッチします。 - 「システム」の「プラグイン」から CloudFrontClearCaches の設定を開き、「認証方法」で「EC2インスタンスにアタッチされたIAMロールを使用する」を選んで保存します。
- 各サイトのプラグイン設定の「認証方法」は「システムのプラグイン設定に従う」を選びます。
ディストリビューション ID とキャッシュを無効化するパスは、これまでどおり設定します。
変更内容
- プラグイン設定に「認証方法」を追加し、「AWSアクセスキーを使用する」と「EC2インスタンスにアタッチされたIAMロールを使用する」を選べるようにしました。
- IAM ロールはサーバー全体の権限のため、システムのプラグイン設定でのみ選択できます。サイトのプラグイン設定では「システムのプラグイン設定に従う」と「AWSアクセスキーを使用する」から選びます。
- IAM ロールを選んで設定を保存すると、保存済みのアクセスキーとシークレットアクセスキーは削除されます。
- 動作環境を Movable Type 8・9 に変更しました。Movable Type 7 は動作環境から外しました。
セキュリティに関する修正
- キャッシュクリアの実行を、POST かつセキュリティトークンを検証するリクエストに限定しました。これまでは、管理画面にサインインした状態で外部のページを開くと、意図せずキャッシュクリアが実行されるおそれがありました(CSRF)。
- 無効化リクエストが失敗したときに、アクセスキー ID と署名を含むリクエストの認証ヘッダーがログに記録されていました。HTTP ステータスと AWS が返すエラー内容だけを記録するようにしました。シークレットアクセスキーは記録されていません。
- キャッシュクリアのダイアログで、処理結果のメッセージを HTML として解釈しないようにしました。
その他の修正
- アクセスキー・シークレットアクセスキー・CloudFront の設定が未設定でも、AWS にリクエストを送っていた問題を修正しました。未設定の項目を示すエラーを表示します。
- 空のパスが「/」として送られ、意図しない範囲のキャッシュを無効化していた問題を修正しました。
- ディストリビューション ID が 1 件もないときに、何も表示されなかった問題を修正しました。
- 複数のディストリビューションのうち一部の無効化に失敗しても、成功と表示されることがあった問題を修正しました。
- CloudFront の設定の値が壊れていると、処理がエラーで止まっていた問題を修正しました。
- 一部のエラーメッセージが英語で表示されていた問題を修正しました。
影響範囲
- 認証方法の初期値はアクセスキーです。v1.0.0 からはプラグインのファイルを差し替えるだけで、これまでの設定のまま動作します。データベースのアップグレードは不要です。
- サイトのプラグイン設定にアクセスキーを保存しているサイトは、システムで IAM ロールを選んだあとも、そのサイトのアクセスキーを使います。
- システムの認証情報(IAM ロール、またはシステムのプラグイン設定に保存したアクセスキー)は、各サイトの管理者がサイトのプラグイン設定で指定したディストリビューションの無効化にも使われます。IAM ポリシーの
Resource で、無効化を許可するディストリビューションを限定してください。 - Movable Type が Docker コンテナ内で稼働している場合は、インスタンスメタデータのホップ制限(既定値 1)により IMDS に到達できないことがあります。その場合はホップ制限を 2 以上に設定してください。