Evident.ioでカスタムシグネチャを使って東京リージョン以外でのEC2インスタンス作成をチェックしてみた

Evident.ioには多数のビルトインシグネチャが存在しますが、ユーザーでルールを定義するカスタムシグネチャを作成することもできます。カスタムシグネチャを利用することで組織または環境固有のチェックルールを作成することができます。今回は東京リージョン以外でのEC2インスタンス作成をチェックするカスタムシグネチャを作成してみました。
2018.08.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは佐伯です。最近暑すぎてリモートワーク頻度が高くなっています。夏の関東こんなに暑かったっけ...?

はじめに

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で考えるべきクラウドセキュリティとは? に登壇させて頂きます。もし興味があればご参加頂ければと思います!