IAMアクセスキーを90日以内にローテーションされている状態を維持するまでの道のり

こんにちは。かわばたです。冬の寒さも本番を迎え、12月下旬という時期的に身も心も冷え冷えとしておりますが皆様いかがお過ごしでしょうか。私が所属しているチームでは、AWSセキュリティガードレールの実装と運用を担当しています。今回はセキュリティガードレールの IAMアクセスキーが90日以内にローテーションされている状態 を維持するため、予防的ガードレールを設置したときの取り組みについての内容となります。

※本記事のIAMアクセスキーとはユーザー個人が所有するIAMアクセスキーとなります(システム側で使用される IAMアクセスキーではありません)

AWSセキュリティガードレールについて

セキュリティガードレールの構成

アドウェイズではAWS Security Hubで提供されているセキュリティ標準であるAWS基礎セキュリティベストプラクティスを有効にして、検出された項目に対して修復するアクションを行うセキュリティガードレールの運用を行ってます。弊社で導入しているセキュリティガードレールの構成はこちらをご参照下さい。

AWS基礎セキュリティベストプラクティスのIAM.3について

AWS基礎セキュリティベストプラクティス[IAM.3] IAM ユーザーのアクセスキーは 90 日以内にローテーションする必要があります (以下、 IAM.3)というコントロールがあります。このコントロールを健全な状態に保つためには、90日より古いIAMアクセスキーをすべて置き換える必要があります。

セキュリティガードレールの種類

予防的ガードレール

  • あらかじめ危険な操作をできなくしたり、ポリシーなどで特定の操作を禁止してしまうガードレール
  • 禁止されている設定変更を行った直後、自動的に設定変更前の状態に戻す仕組みも含まれる(自動修復)

    発見的ガードレール

  • 事後で検出したセキュリティリスクを、通知、修復するガードレール。(手動修復)

セキュリティガードレール敷設の道のり

IAM.3 の検出数を0件にするために半年間で色々、試行錯誤をしました。改善策毎に紹介します。

運用開始時(3月上旬)

はじめは発見的ガードレールとして 作成後90日経過したIAMアクセスキーを検知してSlackに通知する というセキュリティガードレールの運用を開始しました。 IAM.3 に違反したIAMアクセスキーについて、専用のSlackチャンネルにアラートが通知される仕組みとなります。

通知のサンプル

改善策1:全体周知(3月中旬〜下旬)

Slackに通知するだけでは対応してくれるわけもなく、全体周知することにしました。

内容

  • IAM.3 に違反したIAMアクセスキーについて、専用のSlackチャンネルにアラートが通知されるよう設定(運用開始時から継続)
  • 専用のSlackチャンネルを確認の上、所有しているユーザーがIAMアクセスキーを更新して下さい とSlackの全体チャンネルで周知
  • IAMアクセスキーを自動更新するスクリプトを配布

セキュリティガードレールの種類

  • 専用のSlackチャネルに検出結果を通知する 発見的ガードレール

結果

  • ガードレール運用開始時の3月上旬の検出数は67件
  • 3月下旬には検出数は48件
  • 今回の対応で検出数が19件ほど減少

対応してくれるユーザーはいるものの、運用開始時のみの周知だけでは効果が薄く、専用のSlackチャネルだと自分のアクセスキーだと気がついてくれないことも。。。

改善策2:個別通知(4月上旬〜10月上旬)

IAMアクセスキーを所有ユーザーに気がついてもらえるよう、所有ユーザーのSlackのDMに通知してみることにしました。

内容

  • IAM.3 で検出されたIAMアクセスキーについて、所有するユーザーにSlackのDMにIAMアクセスキーのローテーションを促すメッセージを通知するように仕様を変更
  • 自動化スクリプトをスケジュール登録し、毎週1回違反しているIAMアクセスキーを所有しているユーザーに通知

通知のサンプル

90日以上経過したIAMアクセスキーを所有しているユーザーへの通知メッセージ

セキュリティガードレールの種類

  • IAMアクセスキーを所有しているユーザーに対して個別通知する 発見的ガードレール

結果

  • 4月上旬から運用開始し、段階的に検出数が減少
  • 6月以降の検出数は平均10件程度

検出数は減少したものの、対応してくれないユーザーがある一定数いるような状況となりました。

改善策3:自動無効化(10月中旬〜)

90日経過した時点でIAMアクセスキーを無効化してみることにしました。ただいきなり無効化するのではなく、10日前から毎日SlackのDM宛に通知して、IAMアクセスキーのローテーションをします。あとさすがに無効化された状態のアクセスキーが60日ぐらい残っていたら使われていないだろうという判断から、150日経過した時点でIAMアクセスキーを削除することにしました。

内容

  • 自動化スクリプトの内容を以下の内容に修正
    • IAMアクセスキーの一覧を取得して、生成されてから80日以上経過しているIAMアクセスキーを所有するユーザーに、IAMアクセスキーのローテーションを促すメッセージをDMで送信
    • 90日以上経過しているIAMアクセスキーについては無効化(UpdateAccessKey を使用)
    • 150日以上経過したIAMアクセスキーは削除(DeleteAccessKey を使用)
  • 毎日1回違反しているIAMアクセスキーを所有しているユーザーに通知

通知のサンプル

80日以上経過したIAMアクセスキーを所有しているユーザーへの通知メッセージ

90日以上経過したIAMアクセスキーを所有しているユーザーへの通知メッセージ

150日以上経過したIAMアクセスキーを所有しているユーザーへの通知メッセージ

セキュリティガードレールの種類

  • 80日以上経過したIAMアクセスキーを所有しているユーザーに対して個別通知する 発見的ガードレール
  • 90日以上経過したIAMアクセスキーを自動的に無効化する 予防的ガードレール

結果

  • 10月中旬から運用開始し、検出数0件の状態を維持

90日まで対応しない人がいれば、一時的に検出数はカウントされるものの、その日のうちに無効化されるので0件の状態を維持できるようになりました。

まとめ

今回は最終的な対応として IAMアクセスキーを自動的に無効化する予防的ガードレール となりました。利用する側にとっては不便になりそうな取り組みと思いましたが、今のところクレームなどは頂いておらず、エンジニアの皆様にご協力頂けているといった状況です。セキュリティを導入する立場としては大変ありがたいことです。引き続きAWSセキュリティガードレールの改善に取り組んで行きたいと思います。