はじめに
この記事はQiita Engineer Festa 2022 「Snykを使って開発者セキュリティに関する記事を投稿しよう!」というテーマに沿って投稿しています。
突然ですが、みなさんはインフラのセキュリティをどう管理していますか?インフラ監視ツールを使ったり、クラウドのセキュリティツールを使ってますか?
実際のインフラに対してこのようなモニタリング・セキュリティを実施するのもいいですが、実インフラへのスキャンはどれも時間がかかるものが多いです。しかしながら、Infrastructure as Code(IaC)でインフラ定義を行っている場合、もっといい方法があります。
それは静的にインフラ定義ファイルをセキュリティスキャンする方法です。これによって、コードをスキャンするのと同じ時間で、インフラをデプロイする前に問題が分かります。また、新しい脆弱性についてもすぐに判明するため、修正・デプロイのし直しを行うことができます。
そこで、今回はIaCとSnykのあわせ技でインフラを静的スキャンでセキュアにする方法をご紹介します。また、よろしければSnykによるコンテナセキュリティについて書いた私の過去記事についてもご覧いただければ嬉しいです。
Infrastructure as Codeとは
その名の通り、Infrastructure as Codeとは、コードでインフラを定義すること、それによって実際にITインフラをコントロールすることです。
クラウドを使ったとしても、インフラの管理は非常に面倒な作業で、人の手で一個一個作ってしまうと、どの設定で何を作ったのか、どう管理するべきなのかという情報が抜け落ちてしまい、なかなかスケールしづらいものになってしまいます。
この一方で、IaCツールを使うと、インフラの管理が自動化ができ、その設定をコードで見ることができるため、再現性があるインフラを少ないコストで作ることができます。
その便利さの反面で、、誤った設定をIaCのコードで書いてしまうと、脆弱なインフラを作ってしまう事になってしまいます。何が難しいかというと、こういった誤った設定のコードはバグではないため、簡単には検出ができないということです。
実際にIaCのツールとしては、各クラウドベンダーがリリースしているCloud Formationなどがあるのですが、クラウドベンダーに関わらずに設定ができるTerraformというデファクトスタンダードとなるツールが存在し、本記事ではこのTerraformを使ったIaCをご紹介します。
Terraformとは
HashiCorp社が提供するTerraformでは、様々なインフラ・クラウドベンダーに対応したモジュールを提供しており、IaCにおけるデファクトスタンダードのツールになりつつあります。
.tfという拡張子でコードを書き、その記述通りのインフラを作り、管理することができます。
また、オープンソースでGo言語で書かれているため、ベンダーロックインされるリスクがないことも魅力的です。
このTerraformを使用して、わざと脆弱なインフラを作成し、それをSnykで検知できるのかどうかを検証してみましょう。
SnykでTerraformをセキュリティスキャン
Terraformの脆弱性についての一覧のスキャンリストはこちらのリンクから見ることができます。かなり多くの脆弱性がカバーされていることがわかるかと思います。
特にクラウドベンダーにデプロイする場合には、該当のサービスの部分だけでも見ると参考になると思います。
Githubとつなげて自動スキャンを行う
今回、わざと脆弱にしたIaCファイルとして、以下のTerraformファイルをGitHubにアップロードし、スキャンさせてみます。
resource "aws_lb_listener" "app" {
load_balancer_arn = aws_lb.app.arn
port = "80"
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.blue.arn
}
}
このファイルのprotocol="HTTP"
の部分がSNYK-CC-TF-47に違反しており、HTTPによる通信を許可してしまうという、Mediumレベルの脆弱性があります。
そのため、Snykによるスキャンで引っかかるはずです。早速このファイルをスキャンするように設定してみましょう。
ウェブUIでIaCスキャン設定
Terraformファイルをスキャンするには、設定からInfrastructure as codeの設定をオンにしている必要があります。まずはSnykの設定ギアアイコンをクリックして、「Infrastructure as code」設定を確認しましょう。
プロジェクトを追加する
- SnykのGUIにて、GitHubを接続します。こちらのステップは、私の以前の記事にて詳細に解説しています。
- Terraformを含むレポジトリを「Add Project」から追加します。
これでスキャン設定は完了です。レポジトリにPushがされるたびにスキャンが自動で走るようになります。
注意点として、無料で使用する場合には、レポジトリはPublicなものでないといけません。
スキャン結果
それでは、レポジトリにコードをPushして、スキャン結果を見てみましょう。
実際に行った結果、10秒ほどで以下のような画面になりました。
しっかりとSNYK-CC-TF-47が検出できていました!該当コードまで分析できていることがわかります。
このように、Terraformによる設定不備についてしっかりとSnykでスキャン・検出ができることがわかります。また、どう修正すればいいかも指定してくれているので、かなり容易にIaCのコードをセキュアにすることができます。
最後に
インフラの設定不備というのは、なかなか分析・検出がしにくい、時間がかかる中、TerraformでIaC化されていれば非常に簡単に検出できるというのは、やはりいいですね!
IaCをどんどん進めようというモチベーションにもなりますし、修正も簡単なので導入コストもかなり低いので、開発者としてセキュリティに対する体験が劇的に変わっています。
ちなみに、今回はTerraformで行いましたが、AWSのCloud Formation等他のIaCツールにも対応しているため、幅広いツールに使えるようです。