はじめに
久しぶりのQiita記事、今回はElasticsearchの2022年アドベントカレンダーのために書きます。(カレンダー作ってくれた吉岡洋さんに感謝!)
色々Elasticの製品で触ってみたことを書いていこうかと思いますが、
今回は脅威インテリジェンス(Threat Intelligence)のための脅威情報の取り込みとそれを使って脅威を検知するところを試していきます。
脅威インテリジェンスとは? 自分も今までセキュリティの分野は本格的にやってこなかったので、何回か説明聞いてもイマイチわかりませんでした。インテリジェンスって言葉を使うところがややこしい。方法論やプラットフォームを指している時もあれば、脅威情報そのものを言うこともあります。TIフィードと言ったりも。今回試す脅威検知は脅威インテリジェンスの一部かもしれませんが、検知の部分は触って理解していくと割とシンプルだったりもすると感じました。
Elastic Stackで用意されたインテグレーション機能を使えば比較的簡単にサードパーティの脅威データベース情報を取り込んで、BeatsやElastic Agentで集めたFWログやプロキシログ、PCのログなどに含まれる脅威情報を検知させることができます。(マルウェアのダウンロードサイトに誰かがアクセスしてしまった、など)
Elastic Stack (Elasticsearch)の環境としてはクラウド版のElastic Cloudを使っていきますが、ご自分でインストールしたオンプレでもほぼ同じ手順でできると思います。(ただし、Beatsではなく、Beatsの後継であるElastic Agentを使うので、そのためのElasticsearch側のFleetサーバーというElastic Agentを集中管理するためのものが必要であり、自分でインストールする場合はそれのセットアップが少し手間取るかもしれません。)
なお、今回はElasticのv8.5.2で試していますが、異なるバージョンでは違うところが出てくるかと思います。ご了承ください。
手順
Elastic Cloudを使ってElastic Stack環境をデプロイ
Elastic Cloudは以下のURLから使うことができます。初めての場合フリートライアルがあります。
https://www.elastic.co/jp/cloud/
その他、AWS,Azure,GCPからもこのElastic Cloudを使うことができます。自分は今回AWSマーケットプレイスからのを使って見ました。(いきつくところは同じなんですが、BillingはAWSです)
ここでは全てデフォルト値で進めました。バージョンはv8.5.2でした。5分くらいで完了します。
Threat Intelligence系のIntegrationの選択とElastic Agentのインストール
デプロイが完了したらそのままコンソールにログインできるので、そこでIntegrationsのメニューをクリックします。Integrationsにて、Elastic Stackにデータを集めるための連携機能(プラグインのようなもの)を選択できます。
左のカテゴリからThreat Intelligenceをクリックして絞り込みすると、サポートされているThreat Intelligenceの連携機能の一覧が確認できます。Betaとタグされたやつもあるように、時間経過とともにラインアップは増えていくと期待しています。
今回はAbuseCHを使います。その他のは、Threat Intelligenceプロバイダ側のユーザーアカウントを事前に用意しないとAPIアクセスさせてもらえないのですが、AbuseCHは何もしなくてもデータ取得させてくれます。よって今回はこれを使用します。
初めて使うときは、最初にElastic Agentを何処かのPCかサーバーにインストールしておく必要があるので、Install Elastic Agentというボタンが表示されます。
インストール先に応じて表示されたコマンドのコピペでインストールできます。
自分はコンテナ上で動かしたいので、以下のdocker-compose.ymlを使ってインストールしました。FLEET_URLの文字列とFLEET_ENROLLMENT_TOKENの文字列は上記web画面のコマンドに表示されていますので、コピーしてください。
version: "3"
services:
# Env variables reference: https://www.elastic.co/guide/en/fleet/current/agent-environment-variables.html
elastic-agent:
image: docker.elastic.co/beats/elastic-agent:8.5.2
container_name: elastic-agent
hostname: qiita-threat-intel
restart: always
environment:
- FLEET_ENROLLMENT_TOKEN=xxxxxxxxx
- FLEET_ENROLL=1
- FLEET_URL=https://xxxxxx.fleet.us-east-2.aws.elastic-cloud.com:443
さっさとやりたい場合はこのまま右下のSave and Continueでも良いのですが、一旦詳細チェックします。
詳細を確認すると、このAbuseCHのIntegration機能では4つの脅威情報データベースのAPIから情報を取得することがわかります。
AbuseCH Malware ... https://urlhaus-api.abuse.ch/v1/payloads/recent/
AbuseCH MalwareBazaar ... https://mb-api.abuse.ch/api/v1/
AbuseCH Threat Fox ... https://threatfox-api.abuse.ch/api/v1/
AbuseCH URL ... https://urlhaus-api.abuse.ch/v1/urls/recent/
確認が終わったらSave and Continueのボタンを押し、進めましょう。これでElastic Agentが上記APIにアクセスしてデータ収集を開始し始めます。
左メニューを開き、そこからDiscoverを開きましょう。開くと下のような画面が表示されます。
下の操作にて、Elastic Agentが集めたAbuseCHのURLの脅威情報を確認します。
そして個々の脅威情報をこのように確認します。(中に含まれるURLには直接アクセスしないようにしてください)
本家abuse.chサイトの以下のデータベースからこの脅威URL文字列を検索すると同じ情報を確認できます。Elasticに取り込まれたデータと見比べてくて見てください。
https://urlhaus.abuse.ch/browse/
Elastic Securityのアラート設定
左メニューからSecurityカテゴリのAlertsを開き、中のManage rulesボタンをクリックします。
初めての場合、製品で用意されている検知ルールをまずロードします。
たくさんの検知ルールがロードされましたね。
なお、これらをドキュメントで手軽に確認したい場合はここで見ることができます。
https://www.elastic.co/guide/en/security/8.5/prebuilt-rules.html
今回のAbuseCHの脅威情報を使って脅威検知するためのルールは、Threat Intel Indicator Matchというルールです。これを有効化します。
ルール名のリンクをクリックして、どんなルールとなっているのかを見てみます。
ログに対して脅威検知させる
本当はプロキシログやWebサーバーログなどを別途Elastic Agentで収集して、そのログに脅威情報が含まれるかを検知させるのですが、今回は簡易的にCLIで擬似的なログデータを送信して反応を試します。
左メニューからDevToolsを開き、以下のリクエストを実行します。擬似的なログデータをElasticsearchに投入しています。logs-qiita-testというインデックスに格納しています。インデックスパターンがlogs-*であるものが検知ルールでのスキャン対象ですので、インデックス名がlogs-で始まるようにしておくことがポイントです。
POST /logs-qiita-test/_doc
{
"@timestamp": "2022-12-01T21:30:38+09:00",
"url.full": "http://xxxx/xxx.xx"
}
GET /logs-qiita-test/_search
試すときは、上のタイムスタンプも実際の時間に近いものにしてください。また危ないURLを直接載せたくないので、上記ではURLはマスクしています。試す際はお着替えください。検知ルールは1時間ごとに実行され、直近の1時間のログを見るようになっています。
長くて1時間待つ必要がありますが(間隔は変更可能)、その後再度左メニューのSecurity配下のAlertsを開くと、このようにアラートが表示されているはずです。
検知された脅威の情報をこのように確認をすることができます。脅威データベースへのリンクを開くと良いです。
終わりに
Elasticで色々な脅威情報を取ってきて集約して、ログなどに対する脅威検知の自動化に使えることが確認できました。次に検知後のアクションをどうしていくかが重要となってきますが、それについては別の機会にまた試していきたいと思います。