【AWS】Former2を安全に使うための3つの工夫
概要
既存AWSリソースをスキャンしてCloudFormationテンプレート(以降 CFnテンプレート)を生成するOSSツールである”Former2”をより安全に使うための情報を紹介します。
“Former2”はAWS クラウドサービス活用資料集(ブラックベルト)(※)でも紹介されている非常に強力なCFnテンプレート自動生成サービスで、私も頻繁に利用しています。しかし、自アカウントのAWSリソースをスキャンするためにクレデンシャルの登録が必要であり、本当に安全に扱われているのか?という点が心配でした。
本投稿では、上記の懸念について調査した結果を記載しています。
記載内容
- Former2とは
- クレデンシャルの安全性に関するAWSブログ上の記載
- 安全に使うための工夫1:AssumeRoleを使用する
- 安全に使うための工夫2:Former2をdockerでホストする
- 安全に使うための工夫3:閲覧データとログ削除
- まとめ
Former2とは
- 既存AWSリソースをスキャンし、CloudFormationテンプレートを生成するOSS。
- APIコールにはAWS JavaScript SDKを使用。CloudFormationの他、Terraform, CDK等をサポート。
- Webサービスとしても提供されており、いつでもすぐに利用可能。
- 料金は無料。(リソーススキャン時にAPIコールした分のAWS利用料は発生)
○GitHub:https://github.com/iann0036/former2
○Webアプリ:https://former2.com/
使い方
基本的には、2ステップです。可読性の高いきれいなコードが生成されます。
- AWSアカウントのIAMキーペア(アクセスキーID/シークレットアクセスキー)を入力し、ブラウザ右上の緑の"Scan Account"を押下します。
- スキャンが終わったら、左側のペインから各サービスの画面を参照します。スキャンされたAWSリソースが一覧化されているので、選択してブラウザ左上のGenerateを押せばCloudFormationテンプレートの自動生成は完了です。
補足事項:
- CORS(Cross-Origin Resource Sharing)が必要なリソース(S3, IAM等)の場合、ブラウザ拡張機能のインストールが必要です。
- 一部未対応なサービスやリソースがあります。例えば各リソースに付与したTagがリソースタイプによっては生成されません。また、極一部生成されないパラメータもあります。生成後は必ずパラメータシートと突合してください。
クレデンシャルの安全性に関するAWSブログ上の記載
上述の説明で、非常に便利なサービスであることは理解いただけたと思います。
しかし、IAMキーペアを登録しても大丈夫だろうか?と心配になった方もいると思います。
これに関して、AWSのブログには下記の記載があります。
引用:Accelerate infrastructure as code development with open source Former2 | AWS Open Source Blog
安全に使うための工夫1:AssumeRoleを使用する
上述のAWSブログの記載はあるものの、やはり永続的なキーペアを外部サイトに登録したくないという方は多いと思います。また、IAMユーザが作成できない事情(SAML認証を必須としている環境等)がある方もいると思います。そのような方はIAMロールを作成し、AssumeRoleする事を検討してください。
<実行例>
$ aws sts assume-role --role-arn [ロールのARN] --role-session-name [任意の名前]
Tips:assume-roleコマンドの実行時、「--duration-seconds」オプションを指定することで一時的な認証情報の有効期限をデフォルトの1時間から15分(900秒)まで短くすることができる。
コマンド実行結果を以下の様に入力してスキャンします。
安全に使うための工夫2:Former2をdockerでホストする
プロジェクトのセキュリティポリシー上、一時クレデンシャルでもIAMキーペアを外部サイトに入力することが許容されないケースもあると思います。
そういった方は、Former2をdockerでホストする事をご検討ください。
github.com
※Former2をdockerでホストする方法については、検索すると別の方が既にブログとして記事にしているので割愛します。
Former2をdockerでホストすることは、サービス継続性の観点でもメリットがあります。Webアプリとして公開されているFormer2はSLAがあるわけではありません。いつサービス終了するかもわかりません。Former2をdockerでホストすることは、使いたいときにいつでも使えるという点でもメリットがあります。
dockerでホストする際のTips1
詳細は割愛しますが、私の環境ではFormer2のコンテナイメージをECRに保存し、Fargate上で稼働させています。
ちなみに、GitHubで配布されているdocker-compose.ymlで定義されているnginx:1.17.8-alpineやDockerfileで定義されているnginx:1.15については、ECRで脆弱性スキャンしたところ脆弱性が検出されました。
そのため、1.21.6-alpineにバージョンアップして使っていますが、今のところ問題なく稼働しています。
dockerでホストする際のTips2
Former2のスキャンは、Former2から直接AWSアカウントをスキャンするのではなく、手元の端末を経由します。そのため、手元の端末からAWSアカウントへの通信経路が必要です。
安全に使うための工夫3:閲覧データとログ削除
Former2をローカルにホストし、IAMキーペアに一時クレデンシャルを使っているのでもう安心と思った方、油断は禁物です。ブラウザおよびブラウザのログに保存されているクレデンシャルは都度削除してください。
GitHubのソースコードを確認すると、クレデンシャルはLocalStorageというクラスに格納されることがわかります。
引用:https://github.com/iann0036/former2/blob/master/js/app.js
ブラウザの検証機能を覗いてみると確かにLocalStorage保存されています。※これにより、一度ブラウザを閉じても、再度Former2にアクセスすると再度クレデンシャルを入力することなくスキャンが可能です。
IAMキーペアの漏洩の可能性があるため、閲覧データの削除をしましょう。
さらに、GoogleChromeのログを見ると入力したクレデンシャルがログに出力されています。こちらも削除しましょう。
私の手元の環境で複数ブラウザで確認しましたが、GoogleChromeとMicrosoftEdgeの場合はログファイルにもクレデンシャルが平文で出力されていました。FireFoxではそのようなログファイルは見当たりませんでした。C:\Users\ユーザ名\AppData\Local\Google\Chrome\User Data\Default\Local Storage\leveldb
まとめ
- Former2は非常に強力なツールです。マネコンなどで作成した既存リソースを複製する時などに非常に役立ちます。
- 新規リソース作成時にも便利です。CloudFormationテンプレートの作成時に面倒だと思う事の一つとして、マネジメントコンソールでリソース作成する際、バックエンド側でよしなに作成してくれるIAM等のリソースを、全部定義しなければならない点が挙げられます。Former2を使えば、一度マネジメントコンソールで作成した後、自動でテンプレートを作成するといった手法で、この点を効率化することができます。
- 現時点ではFormer2は全てのパラメータに対応してないようです。作成したリソースについては、必ずパラメータシートと突合しましょう。