Slide 1

Slide 1 text

RHEL 8 Red Hat Insights Tech Seminar Insights Tips OSSセキュリティ技術の会 面 和毅

Slide 2

Slide 2 text

じゃあ、結局Insightsって何者よ? 登場人物 ・Insights-Client ・Insights-Engine ・Plugins ・Insights Customer Interface

Slide 3

Slide 3 text

Insightsの構成要素(All Python) (注:「フレームワーク」は OSSです。。。

Slide 4

Slide 4 text

Insights Client

Slide 5

Slide 5 text

Insights Client 中身を知るにはインストールしてみませう 2つ必要、なんで? https://github.com/RedHatInsights/insights-client https://github.com/RedHatInsights/insights-core 2つから出来ている ・Wrapper ・Egg

Slide 6

Slide 6 text

Insights Client (Wrapper) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ 直接動くのはこの人たち https://github.com/RedHatInsights/insights-client

Slide 7

Slide 7 text

Insights Client (Egg) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ 実際の”Core”はこの人たち https://github.com/RedHatInsights/insights-core/insights/client /etc/insights-client/rpm.egg ./EGG-INFO/dependency_links.txt ./EGG-INFO/entry_points.txt ./EGG-INFO/PKG-INFO ./EGG-INFO/requires.txt ./EGG-INFO/SOURCES.txt ./EGG-INFO/top_level.txt ./insights/client/archive.py ./insights/client/auto_config.py ./insights/client/cert_auth.py ./insights/client/client.py ./insights/client/collection_rules.py ./insights/client/compressed_file.py ./insights/client/config.py ./insights/client/connection.py ./insights/client/constants.py ・・・・・など

Slide 8

Slide 8 text

Insights Client (動作のPhase) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ 各Phaseに分けて動作 ・pre_update ----> 接続前の設定確認・疎通確認、 etc. ・update -----> Insightsサーバと接続 ・post_update ---> 事後処理(登録情報・offline確認等) ・collect_and_output ---> 実際の情報収集行為 /etc/insights-client/rpm.egg

Slide 9

Slide 9 text

Insights Client (pre_update) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ 各Phaseに分けて動作 ・pre_update ----> 接続前の設定確認・疎通確認、 etc. /etc/insights-client/rpm.egg --- if config.validate: if validate_remove_file(config.remove_file): --- if config.test_connection: logger.info("Running Connection Tests...") rc = client.test_connection() /etc/insights-client/insights-client.conf ---略--- # Timeout for HTTP calls, in seconds #http_timeout=10 疎通確認(”http_timeout値”タイムアウト)

Slide 10

Slide 10 text

Insights Client (動作のPhase) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ 各Phaseに分けて動作 ・pre_update ----> 接続前の設定確認・疎通確認、 etc. ・update -----> Insightsサーバと接続 ・post_update ---> 事後処理(登録情報・offline確認等) ・collect_and_output ---> 実際の情報収集行為 /etc/insights-client/rpm.egg

Slide 11

Slide 11 text

Insights Client (update) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/rpm.egg Uploader.jsonに更新があればダウンロード { "commands": [ { "command": "python -m insights.tools.cat --no-header aws_instance_type", "pattern": [], "symbolic_name": "aws_instance_type" }, { "command": "python -m insights.tools.cat --no-header azure_instance_type", "pattern": [], "symbolic_name": "azure_instance_type" }, ・・・etc. Uploader.jsonの更新を確認

Slide 12

Slide 12 text

Insights Client (参考) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ remove.conf /etc/insights-client/rpm.egg Uploader.jsonをダウンロードして実行 (中身を見れば、どの情報が取られるかわかる) { "commands": [ { "command": "python -m insights.tools.cat --no-header aws_instance_type", "pattern": [], "symbolic_name": "aws_instance_type" }, { "command": "python -m insights.tools.cat --no-header azure_instance_type", "pattern": [], "symbolic_name": "azure_instance_type" }, ・・・etc. 収集されたくない情報を指定 (処理自体はpre-update時)

Slide 13

Slide 13 text

Insights Client (動作のPhase) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ 各Phaseに分けて動作 ・pre_update ----> 接続前の設定確認・疎通確認、 etc. ・update -----> Insightsサーバと接続 ・post_update ---> 事後処理(登録情報・offline確認等) ・collect_and_output ---> 実際の情報収集行為 /etc/insights-client/rpm.egg

Slide 14

Slide 14 text

Insights Client (post_update) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/rpm.egg 登録情報を確認 表示名を確認 モード(offline)を確認

Slide 15

Slide 15 text

Insights Client (動作のPhase) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ 各Phaseに分けて動作 ・pre_update ----> 接続前の設定確認・疎通確認、 etc. ・update -----> Insightsサーバと接続 ・post_update ---> 事後処理(登録情報・offline確認等) ・collect_and_output ---> 実際の情報収集行為 /etc/insights-client/rpm.egg

Slide 16

Slide 16 text

Insights Client (collect_and_output) /usr/bin/insights-client /usr/bin/insights-client-run /etc/insights-client/ /etc/insights-client/rpm.egg HTTPS アップロード (PUT) insights-core/insights/client/connection.py ------------------------ """ Module handling HTTP Requests and Connection Diagnostics """ from __future__ import print_function from __future__ import absolute_import import requests import os -------------- Do an HTTPS upload of the archive ''' file_name = os.path.basename(data_collected) try: from insights.contrib import magic m = magic.open(magic.MAGIC_MIME) m.load() mime_type = m.file(data_collected) except ImportError: magic = None logger.debug('python-magic not installed, using backup function...') from .utilities import magic_plan_b mime_type = magic_plan_b(data_collected) files = { 'file': (file_name, open(data_collected, 'rb'), mime_type)} if self.config.analyze_container: logger.debug('Uploading container, image, mountpoint or tarfile.') upload_url = self.upload_url else: logger.debug('Uploading a host.') upload_url = self.upload_url + '/' + generate_machine_id() logger.debug("Uploading %s to %s", data_collected, upload_url) headers = {'x-rh-collection-time': str(duration)} net_logger.info("POST %s", upload_url)

Slide 17

Slide 17 text

Insights Client (何を送っているか) [root@fc30 ~]# insights-client --offline Starting to collect Insights data for fc30.localdomain Archive saved at /var/tmp/qybk6le2/insights-fc30.localdomain-20190812050718.tar.gz [root@fc30 insights-fc30.localdomain-20190812050718]# ls -F boot/ display_name insights_commands/ run/ usr/ branch_info etc/ proc/ sys/ version_info オフラインモードでinsights-clientを動作させる(--offline)

Slide 18

Slide 18 text

Insights Client (pyreverse)

Slide 19

Slide 19 text

Insights Engine (core)

Slide 20

Slide 20 text

Insightsの構成要素(All Python) (注:「フレームワーク」は OSSです。。。

Slide 21

Slide 21 text

Insights Engine(Core) は何をやってるの? Insights Engine(Core) Plugin達 真中にいてハブの役割をしています 解析 収集 表示

Slide 22

Slide 22 text

Insights Plugins (core)

Slide 23

Slide 23 text

Insightsの構成要素(All Python)

Slide 24

Slide 24 text

Insightsの構成要素(All Python) Pluginには3種類 ・Parser ・Combiner ・Rule

Slide 25

Slide 25 text

Insights Plugins (Parser) Rawデータ Parser ファイル ファイル ファイル ファイル コマンド出力 コマンド出力 コマンド出力 コマンド出力 一定の形(Object) 一定の形(Object) 一定の形(Object) 一定の形(Object) 一定の形(Object) 一定の形(Object) 一定の形(Object) 一定の形(Object) 種々のParserを使って、様々なファイル/出力形式を変換します。

Slide 26

Slide 26 text

Insights Plugins (Parser) Rawデータ Mount Entries

Slide 27

Slide 27 text

Insights Plugins (Parser) Rawデータ Fstab-files

Slide 28

Slide 28 text

Insights Plugins (Combiner) Combiner /etc/redhat-release uname -a メジャーリリース番号 同様の情報を持つものから、条件に従い情報を統合します。 マイナーリリース番号 一定の条件に従い 情報を比較して統合する

Slide 29

Slide 29 text

Insights Plugins (Rule) Combinedされた情報 集まった情報から分析を行います(ココがキモ)。 一定の形(Object) 一定の形(Object) 一定の形(Object) 一定の形(Object) Combinedされた情報 Combinedされた情報 Combinedされた情報 結果のレポート 解決方法 一つのRule 様々なRule

Slide 30

Slide 30 text

Insights Plugins (Rule) OS情報(RHEL7.1) 例:OS情報からsshdの脆弱性を踏んでないかを解析 sshdのバージョン sshd_config設定 結果のレポート 解決方法 結果のレポート

Slide 31

Slide 31 text

Insights Plugins (Rule) Ruleってどのくらいあるの? 996あるらしい

Slide 32

Slide 32 text

Insights Plugins (Rule) Ruleの作り方を学びたいなー https://insights-core-tutorials.readthedocs.io/en/latest/ insights-coreのチュートリアルがあります。 FC30で簡単にセットアップ可能

Slide 33

Slide 33 text

Insights Customer Interface

Slide 34

Slide 34 text

Insightsの構成要素(All Python)

Slide 35

Slide 35 text

Insights Customer Interface

Slide 36

Slide 36 text

まとめ

Slide 37

Slide 37 text

Insightsの中身を知ると意外に面白い ・ Pythonで書いてるのでわかりやすい ・ githubで公開されてるから追いかけやすい ・ RHELだけじゃなくFedoraでも(多分CentOSにも)動きを知るには十分 とは言っても ・完全なOSSじゃない(Red Hat内にcore部分とか色々あるし) 「フレームワークは」公開ということ。 ・Ruleは知見によるし、公開されていない ・やっぱりその辺はRedHatのノウハウなんだなーと。

Slide 38

Slide 38 text

Q&A