Evident.ioでカスタムシグネチャを使って東京リージョン以外でのEC2インスタンス作成をチェックしてみた
こんにちは佐伯です。最近暑すぎてリモートワーク頻度が高くなっています。夏の関東こんなに暑かったっけ...?
はじめに
Evident.ioには多数のビルトインシグネチャが存在しますが、ユーザーでルールを定義するカスタムシグネチャを作成することもできます。カスタムシグネチャを利用することで組織または環境固有のチェックルールを作成することができます。今回は東京リージョン以外でのEC2インスタンス作成をチェックするカスタムシグネチャを作成してみました。
サンプルコード
以下のGitHubリポジトリにサンプルコードがあります。今回はこちらのサンプルコードを使ってみたいと思います。
カスタムシグネチャはRubyとJavaScriptをサポートしています。以下にチュートリアルのドキュメントもありますので、必要に応じて参照ください。
やってみた
今回はサンプルコードの instances_nonpri_regions.rb を少し編集して、東京リージョン以外でEC2が起動されていた場合にアラートとするカスタムシグネチャを作ってみたいと思います。
カスタムシグネチャの作成
[Control Panel]->[Custom Signatures]->[New]をクリックします。
カスタムシグネチャの定義を行います。各項目任意の値でよいですが全ての外部アカウントをチェックするか、指定した外部アカウントをチェック対象とするかといった指定ができます。
[Submit]をクリックします。その後コードを入力する画面になりますので、サンプルコード instances_nonpri_regions.rb を以下の様に変更したコードを入力しました。
コード
configure do |c| c.deep_inspection = [:instance_id, :instance_state] end def perform(aws) region = aws.region if region == "ap-northeast-1" pass(message: "#{region} is priority region.") else resp = aws.ec2.describe_instances(filters:[ {name: "instance-state-name", values: ["running", "stopped"] }]).reservations resp.each do |resv| resv.instances.each do |inst| instance_id = inst.instance_id instance_state = inst.state.name set_data(instance_id: instance_id, instance_state: instance_state) fail(message: "#{instance_id} is #{instance_state} in region, #{region}.", resource_id: instance_id) end end end end
サンプルコードとの差分
c.valid_regions
の行を削除して全てのリージョンに対してチェックを行い、東京リージョン(ap-northeast-1)であればpass
、それ以外のリージョンにEC2インスタンスが存在(ステータスがrunning
or stopped
のEC2インスタンス)していればfail
という感じです。
$ git diff diff --git a/AWS/sample_codes/AWS_EC2 - instances_nonpri_regions.rb b/AWS/sample_codes/AWS_EC2 - instances_nonpri_regions.rb index 28288bc..e4ab27f 100644 --- a/AWS/sample_codes/AWS_EC2 - instances_nonpri_regions.rb +++ b/AWS/sample_codes/AWS_EC2 - instances_nonpri_regions.rb @@ -31,16 +31,15 @@ # configure do |c| - c.valid_regions = [:eu_west_1, :ap_northeast_1] c.deep_inspection = [:instance_id, :instance_state] end def perform(aws) region = aws.region - resp = aws.ec2.describe_instances(filters:[ {name: "instance-state-name", values: ["running", "stopped"] }]).reservations - if resp.empty? - pass(message: "No instances found in region, #{region}.") + if region == "ap-northeast-1" + pass(message: "#{region} is priority region.") else + resp = aws.ec2.describe_instances(filters:[ {name: "instance-state-name", values: ["running", "stopped"] }]).reservations resp.each do |resv| resv.instances.each do |inst| instance_id = inst.instance_id
[Test Code]でリージョンと外部アカウントを選択してカスタムシグネチャをテストできます。今回は東京リージョンにEC2インスタンスを作成してpass
になること、バージニアリージョンにEC2インスタンスを作成してfail
になることを確認しました。[Save]で保存後、[Active]でカスタムシグネチャを有効化します。
バージニアリージョンでEC2を起動し、作成したカスタムシグネチャでアラートとして検出できました!
なお、カスタムシグネチャはレポート生成タイミングでチェックされます。デフォルトでは1時間ごとですが、[Team]->[Report Interval]で1時間〜24時間の範囲に変更することが可能です。
ビルトインシグネチャからのカスタマイズ
ビルトインシグネチャをコピーしてカスタマイズすることも可能です。[Control Panel]->[Signatures]からコピー可能なビルトインシグネチャを検索できます。なお、全てのビルトインシグネチャがコピーできるわけではないようです。
ドキュメント
最後に
2018年8月14日にパロアルトネットワークス社と合同で開催するイベント AWSで考えるべきクラウドセキュリティとは? に登壇させて頂きます。もし興味があればご参加頂ければと思います!