Slide 1

Slide 1 text

2020年2月7日(金) 株式会社リクルートテクノロジーズ 日比野 恒 Open Distro for Elasticsearchとのおいしい関係 (Amazon Elasticsearch Service & Open Distro for Elasticsearch Meetup)

Slide 2

Slide 2 text

2 自己紹介 名前: 日比野 恒 (ひびの ひさし) 所属: 株式会社リクルートテクノロジーズ サイバーセキュリティ部 セキュリティアーキテクト (CISSP、CISA、IPA安全確保支援士) モチベ: クラウドセキュリティのデザインパターン設計 セキュリティログ分析基盤活用入門(@IT) https://www.atmarkit.co.jp/ait/series/16525/ クラウド環境のログをどう活かす?先駆者の知見から学ぶ https://ascii.jp/elem/000/001/697/1697672/ 後日スライド公開予定

Slide 3

Slide 3 text

本日お伝えしたいこと ✓ Open Distro for Elasticsearchとは何者なのか ✓ Amazon Elasticsearch Serviceとの使い分け ※ お話しないこと: Elasticsearchの全文検索に関する話 × 3

Slide 4

Slide 4 text

1. Amazon Elasticsearch Serviceとは

Slide 5

Slide 5 text

5 そもそも、Elastic社とは 本社はオランダ、カルフォルニアのマウンテンビューに拠点を持つ、Elasticsearchを手掛けるソフトウェア企業 【参考】Elasticのストーリー https://www.elastic.co/jp/about/history-of-elasticsearch

Slide 6

Slide 6 text

6 Elastic Stackとは 全文検索エンジンである「Elasticsearch」を中心としたオープンソースプロダクト群 SaaS Self Managed Standalone Deployment Ingest Store/Search/Analyze Visualize/Manage Solutions Application Search Metrics Site Search APM Enterprise Search Business Analytics Logging Security Analytics Feature Elastic Stack

Slide 7

Slide 7 text

7 Elasticsearchとは Elastic社が提供する「Lucene」ベースのオープンソース全文検索エンジンです。 【参考】Elasticsearch (Elastic Stackのハート) https://www.elastic.co/jp/products/elasticsearch 【コンセプト】 ✓ ユーザの欲しいものを簡単に検索出来るようにすること 【優位性】 ✓ 分析の柔軟性と検索のリアルタイム性 【特徴】 ✓ 大規模分散 ✓ リアルタイム性 ✓ ドキュメント志向 ✓ スキーマフリー ✓ RESTful API

Slide 8

Slide 8 text

8 Kibanaとは Elasticsearchに取り込まれたデータを可視化するWebブラウザベースのユーザインターフェースです。 【参考】Kibana (Elastic Stackへの開かれた窓) https://www.elastic.co/jp/products/kibana

Slide 9

Slide 9 text

9 Amazon Elasticsearch Serviceとは 完全マネージド型の安全かつスケーラブルなElasticsearch+Kibanaのサービスです。 ※LogstashやBeatsは含まれていないよ!(公式サイトにLogstashが含まれているように書かれている...) 【参考】Amazon Elasticsearch Service https://aws.amazon.com/jp/elasticsearch-service/

Slide 10

Slide 10 text

10 これまでの歴史 2015年10月にElasticsearch1.5として、Amazon Elasticsearch Service(以下、AmazonES) がローンチ! (ELK StackからElastic Stackになった2017年以降、バージョンアップや機能拡張が活発化) 【参考】Amazon Elasticsearch Service のドキュメント履歴 https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/release-notes.html 1.5 2.3 5.1 5.3 5.5 5.6 6.0 6.2 6.3 6.4 6.5 6.7 6.8 2015 2016 2017 2018 2019 VPCサポート Cognito認証 アラート通知 SQLアクセス 蓄積データ暗号化 3つのAZサポート ESバージョンアップに 追従していなかった (暗黒期) 主だった機能拡張 クラスタ間暗号化 7.1 UltraWarmストレージ

Slide 11

Slide 11 text

11 Elasticsearchノードの役割 いくつかの役割があるが、大事な役割は「Master/Master-eligible」と「Data」の2つ! ※1ノードの中でMasterとDataの役割を兼務することも可能 【参考】 Nodeの役割 https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html cluster Master 1 cluster_state ★ Master 2 cluster_state ☆ Master 3 cluster_state ☆ Data 1 Primary 1 【Masterノード】 ・Master-eligibleノードから選出 ・clusterに1台のみ ・cluster_stateの管理を行う 【Master-eligibleノード】 ・Masterが障害時にMaster昇格 ・Masterと合わせて最低3ノード必要 ・クォーラムを維持できるように構成 【Dataノード】 ・shard(Primary、Replica)を保持 ・CRUD、searchなど実行 Data 2 Replica 1 Primary 2 Replica 2 Replica 3 Primary 3 大事なポイント

Slide 12

Slide 12 text

12 【参考】AmazonESデプロイ時の設定画面 専用マスターインスタンスを有効化すると、MasterとDataが別のインスタンスで起動する。 ※専用マスターは3もしくは5ノード (専用マスタの目安はクラスタ内のノードが10台を超えるあたり)

Slide 13

Slide 13 text

13 東京リージョンにAZが2個しかない時代は... 2018年1月に登場した東京リージョンのAZ1dのおかげでAmazonESの可用性は向上した。 【参考】 Configuring a Multi-AZ Domain https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-managedomains.html#es-managedomains-multiaz cluster_state ★ cluster_state ☆ node3 cluster_state ☆ AZ1 (apne-az1) node2 node1 AZ2 (apne-az2) AZ4 (apne-az4) cluster_state ★ cluster_state ☆ node3 cluster_state ☆ AZ1 (apne-az1) node2 node1 AZ2 (apne-az2) AZ障害時にクラスタ維持に必要な2ノードが確保できなかった。 計算式:N(=3)÷2+1=2(NはMasterノード数) AZを3つ作成出来ることで、各AZにそれぞれMasterを配置可。 (Hadoop等の並列分散アーキテクチャが展開し易くなった)

Slide 14

Slide 14 text

14 完全マネージド型だと何が嬉しいのか ということで、AmazonESの「うれしみ」を具体的に上げてみた! (「運用性」と「信頼性」が特に喜ばれるポイントだと思っている) セキュリティ VPCサポート 通信暗号化 データ暗号化 Kibana認証 可用性 MultiAZ構成 データ冗長化 信頼性 スケールアウト 運用性 クラスタ管理 バージョンアップ バックアップ

Slide 15

Slide 15 text

15 Amazon ESが選ばれるポイント AWSに請求一元化出来ること、AmazonESにVPCプライベート接続出来ることが選択する上でポイントになる! (AWS上にシステム構築している場合は、①と②が嬉しいはず...) 【参考】Amazon Elasticsearch ServiceドメインのVPCサポート https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-vpc.html AWS Cloud On-Premise ②VPCアクセス ①請求一元化 AWS Direct Connect Amazon VPC Amazon GuardDuty AWS WAF Amazon S3 ELB Amazon CloudWatchLogs AWS CloudTrail Amazon RDS Amazon Aurora Amazon EC2 Amazon Elasticsearch Service VPC

Slide 16

Slide 16 text

16 【参考】Kinesis Data Firehose経由だと... KDF経由でログデータをAmazon ESに格納しようとするとパブリック接続になってしまうので、ご注意を! (VPCエンドポイントは、VPCからパブリックサービスに出るときには通過するか、逆の経路では利用できない) AWS Cloud Amazon Elasticsearch Service (パブリックアクセス) VPC Amazon Kinesis Data Firehose Amazon Elasticsearch Service (VPCアクセス) Amazon CloudWatchLogs Amazon VPC ELB Amazon RDS Amazon Aurora Amazon EC2 ログ送信元 VPC Endpoint

Slide 17

Slide 17 text

17 代表的なユースケース 機能追加に伴い、ユースケースは増えているものの、AmazonESの多くは「全文検索」で利用されている。 全文検索 ログ分析 セキュリティ分析 クリックストリーム 分析 リアルタイム APM オレンジ字: 全文検索 青字: 時系列データ

Slide 18

Slide 18 text

18 【参考】全文検索と時系列データの違い(1/2) 「読み取り」と「書き込み」の性質の違いが顕著であり、Cacheの使い方が大きく異なる。 Index (=Table) ディスク 【全文検索】 【時系列データ】 メモリ メモリ いわゆる マスターデータ document Index (=Table) いわゆる 履歴データ document Query Read (=Search) Write (=Indexing) 1 2 document document document Read Cache Write Cache 3 1 document 2 3 document 4 5 6 document document よくSearchされるデータ(document)を メモリ上のOS File Cacheに乗せたままに 出来るようにIndex設計するのがポイント 常にデータがIndexingされているため メモリ上のOS File CacheはWrite Cache で埋め尽くされ、SearchしたデータのRead Cacheが効きにくい Query

Slide 19

Slide 19 text

ストレージ メモリ 19 【参考】全文検索と時系列データの違い(2/2) クラスタ拡張時のシチュエーション(性能不足のポイント)もユースケースによって異なってくる。 【全文検索】 【時系列データ】 Index FileCache JVMHeap Index 1 2 3 ストレージ メモリ Index FileCache JVMHeap Index 1 2 3 4 検索性能を上げるためにFileCache領域の 拡張が必要となり、クラスタにノードを追加 蓄積データ増加に伴いストレージとJVMHeapの 拡張が必要となり、クラスタにノードを追加

Slide 20

Slide 20 text

20 LogstashからAmazonESへの出力設定 output { elasticsearch { hosts => ["https://search-test-hoge.ap-northeast-1.es.amazonaws.com:443"] index => "%{type}-%{+YYYY.MM.dd}" } } output { amazon_es { hosts => ["search-test-hoge.ap-northeast-1.es.amazonaws.com"] region => "ap-northeast-1" index => "%{type}-%{+YYYY.MM.dd}" } } Elastic社純正のプラグインでもAmazonES専用のプラグインでもLogstashからログ出力は可能です! logstash-output-amazon_esプラグインの場合 logstash-output-elasticsearchプラグインの場合

Slide 21

Slide 21 text

21 次期メジャーバージョンの8系から気をつけて... [2020-02- 04T03:42:38,051][WARN ][logstash.outputs.elasticsearch][X XX] DEPRECATION WARNING: Connecting to an OSS distribution of Elasticsearch using the default distribution of Logstash will stop working in Logstash 8.0.0. Please upgrade to the default distribution of Elasticsearch, or use the OSS distribution of Logstash {:url=>"https:// search-test-hoge.ap- northeast-1.es.amazonaws.com:443/"} AmazonESはOSS版Elasticsearchで構成されているため、LogstashもOSS版にしないと出力できなくなる。

Slide 22

Slide 22 text

2. Open Distro for Elasticsearchとは

Slide 23

Slide 23 text

23 Open Distro for Elasticsearchとは 2019年3月に突如AWSがGitHub公開した別ディストリビューションのElasticsearchです! 【参考】新登場 – Open Distro for Elasticsearch https://aws.amazon.com/jp/blogs/news/new-open-distro-for-elasticsearch/ じゃないよ!

Slide 24

Slide 24 text

24 ご存知の方 ぜひ、挙手をお願いします!!

Slide 25

Slide 25 text

25 一体何を提供してくれるのか 「Elasticsearch+Kibana」にセキュリティ、アラート通知、SQL接続、性能管理、Index管理が追加された。 (インストールパッケージを見ると、OSS版Elasticsearchをベースにプラグインの形を取っていることが分かる) # 機能名 説明 パッケージ名 1 Elasticsearch データストア(スキーマレス)と全文検索エンジン elasticsearch-oss 2 Kibana Elasticsearchに蓄積されたデータの可視化 opendistroforelasticsearch-kibana 3 Security クラスターの認証とアクセス制御 opendistro-security 4 Alerting データが特定条件を満たしたときのアラート通知 opendistro-alerting 5 SQL SQLを使用したデータ照会 opendistro-sql 6 Performance Analyzer Elasticsearchクラスタの性能監視と最適化 opendistro-performance-analyzer 7 Index State Management ElasticsearchのIndex管理 opendistro-index-management 【参考】Open Distro for Elasticsearch https://opendistro.github.io/for-elasticsearch/

Slide 26

Slide 26 text

26 Elastic社の有償サブスクリプションでいうと... 商用機能である「Security」、「Alerting」、「ElasticsearchSQL」がOSSとして無償利用出来る感じ。 (旧X-Packを購入する企業は、エンタープライズ機能の「Security」、「Alerting」が欲しくて買っているケースが多いのではないか...)

Slide 27

Slide 27 text

27 なぜ、Open Distroは誕生したのか Elastic社の商用機能のコードが公開されたタイミングでGitHubのソースにOSS以外のコードも含まれてしまった。 【参考】Keeping Open Source Open – Open Distro for Elasticsearch https://aws.amazon.com/jp/blogs/opensource/keeping-open-source-open-open-distro-for-elasticsearch/

Slide 28

Slide 28 text

28 Security機能 暗号化、認証、アクセス制御、監査ログ、テナント分離等、多くのエンタープライズ向けのセキュリティ機能を提供。 【参考】Security機能 https://opendistro.github.io/for-elasticsearch-docs/docs/security-configuration/ # Security機能名 説明 1 ノード間暗号化 Elasticsearchクラスター内のノード間のトラフィックを暗号化 2 HTTPベーシック認証 Kibana、Elasticsearchへのユーザ名/パスワードによる認証 3 ログイン認証連携 AD、LDAP、Kerberos、SAML、OpenID Connectを用いた認証連携 4 役割ベースアクセス制御 ユーザ操作(読み取り/書き込み/変更等)をロール(役割)ベースで制御 5 Index&Fieldレベルセキュリティ Index、Index内の特定ドキュメント、ドキュメント内の特定Fieldへのアクセス制御 6 監査ログ ElasticsearchへのAPI操作の監査ログ記録 7 Kibana マルチテナント Kibanaオブジェクトをユーザ専用もしくは共有スペースとして分離

Slide 29

Slide 29 text

29 Alerting機能 Elasticsearch内のデータを検索し、特定条件をトリガーにWebhook(Slack等)でのアラート通知が可能。 【参考】Alerting機能 https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/

Slide 30

Slide 30 text

30 SQL機能 Elasticsearch内のドキュメントに対するSQLクエリ、アプリケーション用のJDBCドライバを提供。 【参考】SQL機能 https://opendistro.github.io/for-elasticsearch-docs/docs/sql/

Slide 31

Slide 31 text

31 Performance Analyzer機能 PerfTopコマンドを用いて、Elasticsearchに関する性能情報をグラフ表示させることが可能。 (Perftopコマンドで、TCP9600ポートとダッシュボード名を指定してElasticsearchに接続) 【参考】Performance Analyzer機能 https://opendistro.github.io/for-elasticsearch-docs/docs/pa/ macOS/Linux用のダウンロードや npmでのインストールも可能

Slide 32

Slide 32 text

32 Index State Management機能 Elasticsearchに格納されているIndexのライフサイクル管理やセグメント統合、ロールオーバなどを自動化。 【参考】Index State Management機能 https://opendistro.github.io/for-elasticsearch-docs/docs/ism/

Slide 33

Slide 33 text

33 インストール方法 インストール方法はこれまでのOSS版Elastic Stackと大きく変わらないが、リポジトリを2つ登録する必要がある。 (設定ファイルであるymlファイルの内容は異なる) 【参考】Open Distro for Elasticsearchを作ってみた! https://qiita.com/hssh2_bin/items/4024a830db6676ad74d1 ①Javaインストール (JDK8 or JDK11) ②リポジトリ登録 (Elastic + OpenDistro) ③Elasticsearch インストール ④Elasticsearch設定 ⑤Kibanaインストール ⑥Kibana設定

Slide 34

Slide 34 text

34 Amazon ESに機能追加されていくはず! この年表に戻りまして、3月11日のローンチ直後からAmazon ESでは大きく3つの機能が追加されている。 1.5 2.3 5.1 5.3 5.5 5.6 6.0 6.2 6.3 6.4 6.5 6.7 6.8 2015 2016 2017 2018 2019 VPCサポート Cognito認証 アラート通知 (2019/3/25) SQLアクセス (2019/3/15) 蓄積データ暗号化 3つのAZサポート 主だった機能拡張 クラスタ間暗号化 Open Distro for Elasticsearch (2019/3/11) 7.1 UltraWarmストレージ (2019/12/3)

Slide 35

Slide 35 text

35 Security機能の追加はされるのか? Amazon ESのKibana認証は、Amazon Cognitoによる認証がスタンダードであるが... (Elasticsearch5.1以降のAmazon ESで利用可能な認証方式であるが、あくまで認証機能のみ) 【参考】KibanaのAmazon Cognito認証 https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/es-cognito-auth.html 役割ベース アクセス制御 Index&Fieldレベル セキュリティ 監査ログ Kibana マルチテナント 【Kibana Amazon Cognito認証】 ? ×

Slide 36

Slide 36 text

36 さらに今後追加される予定の機能には... 機械学習のような高度な分析機能や異常検知のようなセキュリティ機能のリリースが予定されている。 【参考】New Features Coming Soon https://opendistro.github.io/for-elasticsearch/features/comingsoon.html SQL Kibanaプラグイン アラートとのセキュリティ統合 K-NN検索 異常検知(alpha)

Slide 37

Slide 37 text

37 Elastic Journey 要件や方向性に応じて、自分にあったElastic環境を選択するのが良い! (こんなに色々な選択肢があるなんて、、意外と知られていない) 分岐1 分岐2 1. Elastic Cloud 2. Elastic Stack (with Features) 3. Amazon ES 4. Open Distro (本日のテーマ) Start 分岐1: 先々利用したいエンタープライズ機能 分岐2: マネージド型にしたい(インフラ運用を楽したい) 機械学習による 異常検知 アラート通知や セキュリティ機能 YES NO YES NO 分岐2 Elastic Official AWS Original

Slide 38

Slide 38 text

3. アラート通知機能の活用事例

Slide 39

Slide 39 text

39 Alertingを試してみたよ! 【参考】Amazon Elasticsearch ServiceのAlertingを使ってAWS ConsoleLoginを監視してみた https://qiita.com/hssh2_bin/items/06550d437ceb095a139c Open Distro for ElasticsearchのAlertingを使って、AWS管理コンソールの不正ログインを見張る。 (許可されていない送信元IPアドレスからのログインをSlack通知させる) AWS Cloud Users Internet ⑧Kibana Login ③Audit Logging ⑥Alerting ⑦Notification Logstash (EC2) Slack Slack ①AWS Management Console Login OpenDistro (EC2) ④Log Input ⑤Log Output ②AwsConsoleSignIn ALB Amazon CloudWatchLogs AWS CloudTrail

Slide 40

Slide 40 text

40 GuardDutyの脅威リストを用いた不正検知 GuardDutyでも検知させることは出来るが、リージョン単位の設定となるため、新規リージョン追加がツラみ。 (CloudFormationのStackSetで一括設定は出来るけど…) 【参考】脅威リストを使ったGuardDutyの検出テスト https://dev.classmethod.jp/etc/guardduty-generate-findings-test/ 【参考】一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った https://dev.classmethod.jp/cloud/aws/set-guardduty-all-region/

Slide 41

Slide 41 text

41 AWS管理コンソールのログインリージョン AWS管理コンソールへのログインは、どこのリージョンにログインしたかが記録される。 (ゆえにGuardDutyで全てのリージョン漏れなく設定する必要がある)

Slide 42

Slide 42 text

42 CloudTrailのAPI監査ログの分析ポイント AWS管理コンソールへのログイン成功時のCloudTrail監査ログの送信元IPアドレスをトリガーに利用する。 eventType AwsAPICall AwsConsoleSignIn userIdentity.type eventName IAMUser Root AWSService AssumeRole AwsAccount Console Login CheckMfa SwitchRole Field Name Value 【凡例】 eventName Additional EventData.MFAUserd responseElements.ConsoleLogin responseElements.CheckMfa responseElements.SwitchRole Yes No Success Failure Success Failure Success Failure eventTime sourceIPAddress userIdentity.type API名 userIdentity.username

Slide 43

Slide 43 text

43 大まかな設定の流れ Alertingは、Destination設定、Monitor設定、Trigger設定の3つのステップで設定を行う。 (今回は事前処理として、CloudWatchLogsやCloudTrail、Logstashを設定) ①CloudWatchLogs ロググループ作成 ②CloudTrail 証跡作成 ③Logstash ETL処理作成 ④Alerting設定 (Destination) ⑤Alerting設定 (Monitor) ⑥Alerting設定 (Trigger) 【参考】CloudTrailをElasticsearchに取り込んでみた https://qiita.com/hssh2_bin/items/e808674b4d08b2eb4756

Slide 44

Slide 44 text

44 Logstashでログの下ごしらえ(1/3) Logstashのinput句には作成したCloudWatchLogsのロググループ名を指定する。 input { cloudwatch_logs { region => "us-east-1" log_group => [ "AWS_CloudTrailLogs" ] sincedb_path => "/var/lib/logstash/sincedb_cloudtrail" } }

Slide 45

Slide 45 text

45 Logstashでログの下ごしらえ(2/3) 不正検知対象外としたいIPアドレスリストをtranslate filterで辞書登録する。 (trusted_ipがfalseとなっているイベントを検知対象とする) filter { json { source => "message" } date { match => [ "eventTime", "ISO8601" ] target => "@timestamp" } ruby { code => "event.set('[@metadata][local_time]',event.get('[@timestamp]').time.localtime.strftime('%Y-%m-%d'))" } translate { field => "sourceIPAddress" destination => “trusted_ip" dictionary => { "<対象外としたいIP①>" => "true" "<対象外としたいIP②>" => "true" } fallback => "false" } }

Slide 46

Slide 46 text

46 Logstashでログの下ごしらえ(3/3) Output句には、Open Distroを指定するが、Security機能が有効の場合は以下のように設定する。 output { elasticsearch { hosts => [ "https://:9200" ] user => "admin" password => "PW" ssl_certificate_verification => false index => "cloudtrail-%{[@metadata][local_time]}" } }

Slide 47

Slide 47 text

47 Alerting設定方法(1/6) [Alerting] > [Destinations]で「Add destination」でSlack通知先設定を追加する。

Slide 48

Slide 48 text

48 Alerting設定方法(2/6) [Monitor]で「Create monitor」で監視間隔や監視対象データ等のモニタリング設定をする。

Slide 49

Slide 49 text

49 Alerting設定方法(3/6) 監視対象データをクエリベースで指定する場合は、[Define using extraction query]を利用する。 { "size": 0, "query": { "bool": { "must": [ { "match_all": { "boost": 1 } }, { "match_phrase": { “trusted_ip": { "query": "false", "slop": 0, "zero_terms_query": "NONE", "boost": 1 } } }, { "match_phrase": { "eventType": { "query": "AwsConsoleSignIn", "slop": 0, "zero_terms_query": "NONE", "boost": 1 } } }, { "range": { "cloudwatch_logs.ingestion_time": { "from": "now-5m", "to": "now", "include_lower": true, "include_upper": true, "format": "epoch_millis", "boost": 1 } } } ], "adjust_pure_negative": true, "boost": 1 } } }

Slide 50

Slide 50 text

50 Alerting設定方法(4/6) 監視トリガーを設定する。 (今回は監視対象データが0件より多い場合に通知)

Slide 51

Slide 51 text

51 Alerting設定方法(5/6) 最後に作成したSlack通知先を指定してモニタリング設定は完了です!

Slide 52

Slide 52 text

52 Alerting設定方法(6/6) 該当イベントが発生した時に、通知が指定したSlackチャネルに届けばOKです! (CloudTrail→CloudWatchLogs→Open Distro→Alert通知まで15分くらい掛かる)

Slide 53

Slide 53 text

53 まとめ Open Distroを通じて、Amazon ESのうれしみをお伝えしてきました ✓ 完全マネージド型サービスの良さやVPCサポート等のセキュリティ機能の充実度 ✓ Open Distroで新機能を遊び尽くし、Amazon ESでローンチしたら本番導入 ✓ AWS環境の各種サービスのログを使ってAWSログ監視システムを構築可能

Slide 54

Slide 54 text

No content