Open Distro for Elasticsearchとのおいしい関係

Open Distro for Elasticsearchとのおいしい関係

2020/2/7 Amazon Elasticsearch Service & Open Distro for Elasticsearch Meetupでの、日比野の講演資料になります

Eea9a05e6e222a3d50c73f54a49fadf4?s=128

Recruit Technologies

February 07, 2020
Tweet

Transcript

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

    Service & Open Distro for Elasticsearch Meetup)
  2. 2 自己紹介 名前: 日比野 恒 (ひびの ひさし) 所属: 株式会社リクルートテクノロジーズ サイバーセキュリティ部

    セキュリティアーキテクト (CISSP、CISA、IPA安全確保支援士) モチベ: クラウドセキュリティのデザインパターン設計 セキュリティログ分析基盤活用入門(@IT) https://www.atmarkit.co.jp/ait/series/16525/ クラウド環境のログをどう活かす?先駆者の知見から学ぶ https://ascii.jp/elem/000/001/697/1697672/ 後日スライド公開予定
  3. 本日お伝えしたいこと ✓ Open Distro for Elasticsearchとは何者なのか ✓ Amazon Elasticsearch Serviceとの使い分け

    ※ お話しないこと: Elasticsearchの全文検索に関する話 × 3
  4. 1. Amazon Elasticsearch Serviceとは

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

  6. 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
  7. 7 Elasticsearchとは Elastic社が提供する「Lucene」ベースのオープンソース全文検索エンジンです。 【参考】Elasticsearch (Elastic Stackのハート) https://www.elastic.co/jp/products/elasticsearch 【コンセプト】 ✓ ユーザの欲しいものを簡単に検索出来るようにすること

    【優位性】 ✓ 分析の柔軟性と検索のリアルタイム性 【特徴】 ✓ 大規模分散 ✓ リアルタイム性 ✓ ドキュメント志向 ✓ スキーマフリー ✓ RESTful API
  8. 8 Kibanaとは Elasticsearchに取り込まれたデータを可視化するWebブラウザベースのユーザインターフェースです。 【参考】Kibana (Elastic Stackへの開かれた窓) https://www.elastic.co/jp/products/kibana

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

  10. 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ストレージ
  11. 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 大事なポイント
  12. 12 【参考】AmazonESデプロイ時の設定画面 専用マスターインスタンスを有効化すると、MasterとDataが別のインスタンスで起動する。 ※専用マスターは3もしくは5ノード (専用マスタの目安はクラスタ内のノードが10台を超えるあたり)

  13. 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等の並列分散アーキテクチャが展開し易くなった)
  14. 14 完全マネージド型だと何が嬉しいのか ということで、AmazonESの「うれしみ」を具体的に上げてみた! (「運用性」と「信頼性」が特に喜ばれるポイントだと思っている) セキュリティ VPCサポート 通信暗号化 データ暗号化 Kibana認証 可用性

    MultiAZ構成 データ冗長化 信頼性 スケールアウト 運用性 クラスタ管理 バージョンアップ バックアップ
  15. 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
  16. 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
  17. 17 代表的なユースケース 機能追加に伴い、ユースケースは増えているものの、AmazonESの多くは「全文検索」で利用されている。 全文検索 ログ分析 セキュリティ分析 クリックストリーム 分析 リアルタイム APM

    オレンジ字: 全文検索 青字: 時系列データ
  18. 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
  19. ストレージ メモリ 19 【参考】全文検索と時系列データの違い(2/2) クラスタ拡張時のシチュエーション(性能不足のポイント)もユースケースによって異なってくる。 【全文検索】 【時系列データ】 Index FileCache JVMHeap

    Index 1 2 3 ストレージ メモリ Index FileCache JVMHeap Index 1 2 3 4 検索性能を上げるためにFileCache領域の 拡張が必要となり、クラスタにノードを追加 蓄積データ増加に伴いストレージとJVMHeapの 拡張が必要となり、クラスタにノードを追加
  20. 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プラグインの場合
  21. 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版にしないと出力できなくなる。
  22. 2. Open Distro for Elasticsearchとは

  23. 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/ じゃないよ!
  24. 24 ご存知の方 ぜひ、挙手をお願いします!!

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

  27. 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/
  28. 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オブジェクトをユーザ専用もしくは共有スペースとして分離
  29. 29 Alerting機能 Elasticsearch内のデータを検索し、特定条件をトリガーにWebhook(Slack等)でのアラート通知が可能。 【参考】Alerting機能 https://opendistro.github.io/for-elasticsearch-docs/docs/alerting/

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

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

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

  33. 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設定
  34. 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)
  35. 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認証】 ? ×
  36. 36 さらに今後追加される予定の機能には... 機械学習のような高度な分析機能や異常検知のようなセキュリティ機能のリリースが予定されている。 【参考】New Features Coming Soon https://opendistro.github.io/for-elasticsearch/features/comingsoon.html SQL Kibanaプラグイン

    アラートとのセキュリティ統合 K-NN検索 異常検知(alpha)
  37. 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
  38. 3. アラート通知機能の活用事例

  39. 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
  40. 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/

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

  42. 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
  43. 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
  44. 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" } }
  45. 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" } }
  46. 46 Logstashでログの下ごしらえ(3/3) Output句には、Open Distroを指定するが、Security機能が有効の場合は以下のように設定する。 output { elasticsearch { hosts =>

    [ "https://<ElasticsearchのIP>:9200" ] user => "admin" password => "PW" ssl_certificate_verification => false index => "cloudtrail-%{[@metadata][local_time]}" } }
  47. 47 Alerting設定方法(1/6) [Alerting] > [Destinations]で「Add destination」でSlack通知先設定を追加する。

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

  49. 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 } } }
  50. 50 Alerting設定方法(4/6) 監視トリガーを設定する。 (今回は監視対象データが0件より多い場合に通知)

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

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

  53. 53 まとめ Open Distroを通じて、Amazon ESのうれしみをお伝えしてきました ✓ 完全マネージド型サービスの良さやVPCサポート等のセキュリティ機能の充実度 ✓ Open Distroで新機能を遊び尽くし、Amazon

    ESでローンチしたら本番導入 ✓ AWS環境の各種サービスのログを使ってAWSログ監視システムを構築可能
  54. None