こんにちは。システム開発一部の吉田です。取引所接続の保守を担当するチームに所属していますが、最近はもっぱらAWSでの環境構築をメインでやっています。
今担当しているサービスではインフラの構成をIaC(Infrastructure as Code)で管理するようにしています。 IaCでの構築は難しいのでは?という印象を抱いていましたが、インターネットにはサンプルコードがたくさん落ちているので意外とどうにかなっています。 日々AWSの公式のサンプルテンプレートを改良するの繰り返しです。AWSのドキュメントは豊富なので助かりますね。
当たり前ことですが、ネットに落ちているコードはセキュリティの考慮が入っておらず脆弱性がある危険性があります。 拾ってきたコードをそのまま使うのではなく、ちゃんと検証してから適用することが大事です。
とはいえ、セキュリティ上の問題がないか、設定値に誤りが無いかをテンプレートの目視だけで判断するのは正直しんどいです。 テンプレートで作成された後の環境をSecurity Hubを使って解析するという手もありますが、コストが高くつきます。
成果物の品質を保証するために無料かつ自動でコードレビューを実施したいと思ったのでKICSというツールを利用して脆弱性診断を実施してみます。
KICSについて
KICSはCheckmarx社が開発したIaCの静的解析ツールです。OSSなので無料できて、以下のCISベンチマークで認定受けています。
- CIS Amazon Web Services Foundations Benchmark - Level 1
- CIS Amazon Web Services Foundations Benchmark - Level 2
今回はCloudformationのテンプレートを解析対象にしますが、Terraform、Kubernetes、Docker、Ansible、Helmなどなどにも対応しているようです。
GitHubリポジトリ github.com
ドキュメント docs.kics.io
実行
Dockerイメージを公式で用意してくれているのでそれを使ってサクッと実行していきます。
docker run -it --rm -v `pwd`:/path checkmarx/kics:latest scan -p "/path/dev" -o "/path/results" --report-formats html
上記のコマンドを実行するだけです。簡単ですね。
devディレクトリ配下のテンプレートをスキャン対象して、resultsディレクトリにhtml形式で解析結果を出力する設定で実行しています。 コンフィグファイルを読み取って実行するオプションもありますが、無駄なファイルを増やしたくないのでコマンドラインで完結させています。
オプションはいくつかあって、詳細は以下のページに記載があります。
診断結果...
そこそこの規模のテンプレートを対象にしたので大小合わせて100個程度の脆弱性を指摘されました。 中身を見ていきましょう。
htmlファイルをブラウザで開くと以下のよう形式で表示されます。
Vulnerabilities(読めない)の中で重要度がHIGHのラベルになっている指摘を見ていきます。
EC2用のセキュリティグループとEFS用のセキュリティグループでウェルノウンポートが解放されているという指摘です。
EC2の22ポートはセッションマネージャーを使って接続する場合は必要ないので閉じてしまいましょう。 EFSはポート変更できないと思うのでそのままにしておきます。
RDSのIAM認証が有効になっていないという指摘を受けました。しかし、このインスタンスはAuroraなのでIAM認証はクラスターのほうで有効になっています。実際にIAM認証でユーザーを作ってログインできることを確認しているのでこの指摘については問題なしとしました。
他にもALBがHTTPの接続を許可しているといった指摘やS3の静的ウェブサイトホスティングが有効になっているといった指摘がありました。 S3に関する脆弱性が多かったので、この部分の設計を詰めていく必要がありそうです。
重要度HIGH以外ではセキュリティグループに/32のCIDRを指定してはいけない、VPCフローログが有効になっていない、Descriptionのプロパティがないだとかのテンプレートの書き方に対する指摘もありました。 Descriptionやコメントを記載しないとテンプレートの可読性が下がるので気を付けたいですね。
まとめ
KICSのセキュリティ診断を試してみました。 検証できる項目は多いので環境作成時のチェックリストあるいは単体テストの代わりにはなるのではないでしょうか。 ただ、これ1つでセキュリティを担保!とはならないので動的に脆弱性を探知できるSecurity HubとかInspectorと組み合わせて使っていきたいですね。