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