AWSアクセスキーをローテーションするルールと仕組みを考えてみた

ひとつの例として、参考になると思います。
2022.06.30

AWSアクセスキーは、90日以内のローテーションが推奨されています。AWS Security Hubでもローテーションのルールがあります。

忘れずにローテーションできるような方法を考えてみました。

おすすめの方

  • AWSアクセスキーのローテーションを忘れないようにしたい方
  • AWSアクセスキーをローテーションするルールを参考にしたい方
  • Slackで定期リマインドするコマンドを知りたい方

AWSアクセスキーをローテーションするルールと仕組み

ローテーション時期に気づくための仕掛け

AWSアクセスキーのローテーションに気づくことが重要です。気づくためにはいくつかの方法があります。

  • 人間が頑張って覚えておく
  • Security Hubから通知がくる
  • 何らかの方法でリマインドする
  • など

本記事では、「何らかの方法でリマインドする」を採用し、その手段としてSlackのリマインドを利用します。

※Security Hubの通知でも良いですが、そもそも「通知が来ないようにすること」が大事だと考えています。他の通知があった場合にも紛らわしいですし(個人の感想です)。

ローテーション期間を決める

ローテーション期間を決めるにあたって、次の点を考慮します。

  • 90日よりも短い期間でローテーションしたい
  • ローテーションしたあとに「古いAWSアクセスキーが使われていないこと」を確認したい
  • 決まった曜日が嬉しいので、7の倍数にしたい

よって、ローテーション期間を77日とします。 実際にアクセスキーを削除するのは、84日(77+7)です。

ルールを決める

次のルールを決めました。

  1. 新しいアクセスキーを生成する
  2. 新しいアクセスキーを使うように変更する
  3. 7日待つ
  4. 古いアクセスキーが使われていないことを確認する
  5. 古いアクセスキーを削除する
  6. 77日待つ

Slackでリマインダーを設定する

リマインド用の専用チャンネルを作ります。

  • #notify_rotate_aws_accesskey

2つのリマインドを設定します。@developersは、メンション先です。

/remind #notify_rotate_aws_accesskey "@developers 【開発環境】 新しいAWSアクセスキーを生成して使いましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 10th
/remind #notify_rotate_aws_accesskey "@developers 【開発環境】 古いAWSアクセスキーの未使用を確認して、削除しましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 17th

それぞれ、次の動作になります。日付などは適宜変更してください。

  • every 11 weeks on 10th
    • 次の10日から、11週(77日毎)にリマインドする
  • every 11 weeks on 17th
    • 次の17日から、11週(77日毎)にリマインドする

複数の環境(開発環境・ステージング環境・本番環境など)がある場合は、それぞれでリマインド作成すると作業状況が分かりやすくなったり、対応漏れが減ると思います。

アクセスキーが使われていないことを確認する

AWSマネジメントコンソールにログインして確認しても良いですし、AWS CLIで確認しても良いです。 AWS CLIを使う場合は、次のコマンドで確認できます。

$ aws iam list-access-keys --user-name  xxx

{
    "AccessKeyMetadata": [
        {
            "UserName": "xxx",
            "AccessKeyId": "hoge",
            "Status": "Active",
            "CreateDate": "2022-05-10T03:24:02+00:00"
        }
    ]
}

Wiki等にルールを残す

これまでに決めたルールをGitHub等のWikiに記載します。たとえば次のような内容です。 Slackのチャンネルからリンクしたり、リマインド本文にリンクを入れたりすると、よりGoodになると思います。

## はじめに

本ページでは、AWSアクセスキーのローテーションルールについて記載します。

## 対象となるAWSアカウント

- xxx
- yyy

## 対象となるAWSアクセスキー

| IAMユーザ名 | 用途 | 開発環境 | ステージング環境 | 本番環境 |
| --- | --- | :---: | :---: | :---: |
| aaa | bbb | o | o | o |
| xxx | yyy | o | x | x |

## アクセスキーのローテーション方法

### 概要

1. 新しいアクセスキーを生成する
2. 新しいアクセスキーを使うように変更する
3. 7日待つ
4. 古いアクセスキーが使われていないことを確認する
5. 古いアクセスキーを削除する
6. 77日待つ

### Slackリマインダーのコマンド

#### 新しいアクセスキーを生成する

```
/remind #notify_rotate_aws_accesskey "@developers 【開発環境】 新しいAWSアクセスキーを生成して使いましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 10th
```

```
/remind #notify_rotate_aws_accesskey "@developers 【ステージング管境】 新しいAWSアクセスキーを生成して使いましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 10th
```

```
/remind #notify_rotate_aws_accesskey "@developers 【本番環境】 新しいAWSアクセスキーを生成して使いましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 10th
```


#### 古いアクセスキーが使われていないことを確認し、古いアクセスキーを削除する

```
/remind #notify_rotate_aws_accesskey "@developers 【開発環境】 古いAWSアクセスキーの未使用を確認して、削除しましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 17th
```

```
/remind #notify_rotate_aws_accesskey "@developers 【ステージング環境】 古いAWSアクセスキーの未使用を確認して、削除しましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 17th
```

```
/remind #notify_rotate_aws_accesskey "@developers 【本番環境】 古いAWSアクセスキーの未使用を確認して、削除しましょう!
作業完了後、このスレッドに「作業完了」と書いてください(リアクションでもOK)。" at 9:00 every 11 weeks on 17th
```

さいごに

AWSアクセスキーをローテーションするルールと仕組みを考えてみました。 この内容は、ひとつの例であり参考です。 各プロジェクトによってルール等は異なると思いますが、参考になる部分があれば幸いです。

参考