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. 2.

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

    セキュリティアーキテクト (CISSP、CISA、IPA安全確保支援士) モチベ: クラウドセキュリティのデザインパターン設計 セキュリティログ分析基盤活用入門(@IT) https://www.atmarkit.co.jp/ait/series/16525/ クラウド環境のログをどう活かす?先駆者の知見から学ぶ https://ascii.jp/elem/000/001/697/1697672/ 後日スライド公開予定
  2. 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
  3. 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ストレージ
  4. 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 大事なポイント
  5. 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等の並列分散アーキテクチャが展開し易くなった)
  6. 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
  7. 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
  8. 19.

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

    Index 1 2 3 ストレージ メモリ Index FileCache JVMHeap Index 1 2 3 4 検索性能を上げるためにFileCache領域の 拡張が必要となり、クラスタにノードを追加 蓄積データ増加に伴いストレージとJVMHeapの 拡張が必要となり、クラスタにノードを追加
  9. 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プラグインの場合
  10. 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版にしないと出力できなくなる。
  11. 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/
  12. 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オブジェクトをユーザ専用もしくは共有スペースとして分離
  13. 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)
  14. 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
  15. 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
  16. 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
  17. 43.
  18. 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" } }
  19. 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]}" } }
  20. 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 } } }
  21. 54.