CircleCIの不可視のAWSクレデンシャルを削除する

正月早々にCircleCIがしでかしてくれたので、休み返上でCircleCI上のシークレットのローテーションに追われました。（対応された皆様お疲れ様です🙏）

- [CircleCI セキュリティアラート: CircleCI 内に保存されているシークレットのローテーションをお願いいたします](https://circleci.com/ja/blog/january-4-2023-security-alert/)

その際、少々はまりどころがあったので記載します。

# 問題
AWSより、CircleCIに登録されていない(ように見える)AWSクレデンシャルをローテートしろと通知が来た

# 原因
太古の昔に使われていたCircleCI プロジェクトのAWS Permissionが**UI上は廃止されたのに**生きていたため。

# 解決策
curlで以下を叩いて削除する。

`${CIRCLECI_VCS}` は `github` か `bitbucket` のどちらか
`${CIRCLECI_ORG}` はCircleCIのorganization名
`${CIRCLECI_PROJECT}` はCircleCIのproject名
`${CIRCLECI_TOKEN}` は [ここで作れるAPIトークン](https://app.circleci.com/settings/user/tokens)。

```bash
curl -X PUT -d "{\"aws\":{\"keypair\":null}}" "https://circleci.com/api/v1.1/project/${CIRCLECI_VCS}/${CIRCLECI_ORG}/${CIRCLECI_PROJECT}/settings?circle-token=${CIRCLECI_TOKEN}" -H "Content-Type:application/json"
```

# 詳細
ひとまず、すべてローテーションし終えて安心していたのですが、数日後にAWSから通知が。

```
Hello,

AWS is reaching out to you on behalf of CircleCI as a follow-up to the security issue they disclosed on January 4, 2023 [1] involving their platform. AWS infrastructure and services were not affected by this issue.

However, CircleCI believes the following AWS access keys, associated with your account, may be affected by this issue.
AKIA4**************


AWS recommends you rotate these keys immediately.
```

**意訳**
```
ハロー。
CircleCIからのお年玉だ。どでかいセキュリティーイシューが発生したぜ。AWSのせいじゃあないぜ。

あんたのCircleCIアカウントに登録されてる↓のAWSアクセスキーが漏れちまったかもな。奴らはそう言ってる。
AKIA4**************

ローテーションをオススメするぜ。今すぐにな。
```

全てローテーションをし終えた気でいたので、まさか作業に漏れがあったか？ と急いでCloudTrailで該当リソースを確認しました。
すると、このキーは年始の対応時にきっちり削除しておりました。一安心といったところです。

となると、問題はなぜこのメールが送られてきたのか？
年始の作業を思い出すと、1件だけ気になる認証情報がありました。

AWSのIAM上で1件、開発用の認証情報で、CircleCIから利用されているはずで、ごくたまに利用されているログはあるものの、CircleCIのWeb UI上では登録されていない情報があったのです。
なんだこりゃ気になるな、と思いつつ、「まあ開発用だし権限はS3特定バケットに関する貧弱なものだし、周知しておいて問題が発生してから考えれば良いか。正月だし」ということでメンバーに周知し躊躇無く削除しておきました。このキーがまさにAWSから送られてきたキーでした。

もう削除しているのでたいした問題では無いのですが気になります。

## CircleCI上で確認
該当のキーは太古の昔に作られたCircleCIプロジェクト用のものです。試しにビルドの環境変数を見てみます。
![スクリーンショット 2023-01-12 17.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50056/806dde6b-529e-1fc8-7fa6-c9193ae14fec.png)

どこからか、`AWS_ACCESS_KEY`や`AWS_SECRET_ACCESS_KEY`を引っ張ってきているようです。

**project settings か contexts から持ってきてるよ** と記載されていますが、この太古のプロジェクトでは contexts は使用しておらず project settings にはこのような値はありません。では、どこから持ってきているのか。。？ 謎です。

## 太古の仕様
有能な同僚の @keillera に相談したところ回答を得られました。

「そういえばかつて、CircleCIにはAWSシークレット専用の設定項目があったような」

あったなそういえば。

https://qiita.com/kuedasmn/items/cac2c0bd2f5092bb033f#%E6%96%B9%E6%B3%951-project%E3%81%AEaws-permission%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

↑こちらの記事の **ProjectのAWS Permissionを利用する方法** で張られているUIに確かに見覚えがあります。完全に忘れていた..

↓のページによると、 **ProjectのAWS Permissionは廃止されるがUI上見えなくなるだけで生きてるよ。消したければcurlで消してね** とのこと。
- [AWS Credentials Are Not Found](https://support.circleci.com/hc/en-us/articles/360047685892-AWS-Credentials-Are-Not-Found)

なんだその仕様、そんな馬鹿な...と思いましたが後方互換性とUI含む仕様改善の落とし所として生まれた負債、といったところでしょうね。プロジェクトが古く更新頻度も低く、かつ重要度低いクレデンシャルだったのでローテーションもさぼり、今日まで放置してしまっておりました。

古くからCircleCI使っているプロジェクトには密かに存在する罠かもしれません。

# 結論
- OIDC使いましょう。
    - https://circleci.com/ja/blog/openid-connect-identity-tokens/
- (時代はGitHub Actionsか)