エントリー

ISメーリングリストを購読したことがある人なら誰でも知っているように、1日に発見される脆弱性の数は、その人がそれらを解析する能力を超えることがよくあります。 特にサーバーが多数ある場合、特にOSとバージョンの動物園がある場合。
このトピックでは、この問題をどのように解決したかについて説明します。 そして、はい、Perl
*は生きています:)
目標と目的
システムを設計する際、
mkhlystun **と私は 2つの並行問題
を解決しました。
- システム上のパッケージバージョン情報の収集
- システムの現在の脆弱性に関する情報の収集
これらのアクティビティは両方とも共通の目標を追求しました:更新を正しく優先順位付けし、保証されたダウンタイムでこれらの更新を実行することです。
作業スキーム

- 1時間に1回、各ホストは現在のパケットに関する情報を収集し、そのキューを送信します
- メッセージはキューから削除され、データベースに配置されます
- 3時間に1回、ロボットがデータベースにアクセスし、監査サービスを介してパケットを実行します
- 1日の結果に応じて、関心のあるすべての人に送信されるレポートが生成されます
基本スキーム
pkgs.sqlCREATE TABLE hosts ( hostname character varying(255) NOT NULL PRIMARY KEY, os character varying(255), pkg_id integer[] ); CREATE INDEX hosts_pkg_id_idx ON hosts USING gin (pkg_id); CREATE TABLE pkg ( id SERIAL NOT NULL PRIMARY KEY, name character varying(255) NOT NULL ); CREATE UNIQUE INDEX pkg_name_idx ON pkg USING btree (name); CREATE TABLE vulners ( id character varying(255) NOT NULL PRIMARY KEY, cvss_score double precision DEFAULT 0.0 NOT NULL, cvss_vector character varying(255), description text, cvelist text ); CREATE TABLE v2p ( pkg_id integer NOT NULL REFERENCES pkg(id), vuln_id character varying(255) NOT NULL REFERENCES vulners(id) );
ホストの情報は
ホストテーブルに入力され(1ホスト= 1レコード)、
pkgの情報は情報の重複を避けるために並行して入力されます(1パケット
-1レコード)。 アレイは歴史的に選択されたものであり、それと共に生きることは非常に可能です。
同時に、パッケージの現在の脆弱性に関する情報が脆弱性テーブルに入力され、
v2p通信
テーブルは多
対多のバインディングを許可します。
パケット情報収集
Perlを知らない人のために:
ホスト名-f 、
lsb_release -aおよび
rpm -aq | dpkg-query -Wコマンドは単純に連続して実行され、これらはすべてJSONにパッケージ化され、メッセージキューに出力されます。
JSONをベースに変換する
このスクリプトは、キューから受信したjsonを受信し、次の3つの段階でデータベースに分解します。
-最初にパッケージを配置し、その一意性を確認します
-次に、ホストを配置し、必要に応じてバージョンを更新します
-次に、アレイを介してホストとパケットをバインドします
監査
パッケージを聞く方法を探していたとき、ある種の会議で
vulnersと呼ばれる名刺を見るまで、長い間オプションを並べ替えていました。 これは
isoxと
vidensが行う脆弱性アグリゲーター
です 。 私は彼らに連絡し、助けを求めました。 その結果が
Audit APIでした。
監査API脆弱性に関する情報を取得するには、jsonでパッケージblobを収集して
/ api / v3 / audit / audit /に送信するだけで十分です。
POST /api/v3/audit/audit/ HTTP/1.0 Host: vulners.com Content-Type: application/json Content-Length: 377 { "os":"CentOS", "version":"7", "package":["kernel-3.10.0-229.el7.x86_64"]}
応答として、サーバーは現在の脆弱性のリストを次の形式でjsonに返します。
{ "result": "OK", "data": { "packages": { "kernel-3.10.0-229.el7.x86_64": { "CESA-2015:2152": [ { "package": "kernel-3.10.0-229.el7.x86_64", "providedVersion": "0:3.10.0-229.el7", "bulletinVersion": "3.10.0-327.el7", "providedPackage": "kernel-3.10.0-229.el7.x86_64", "bulletinPackage": "kernel-3.10.0-327.el7.x86_64.rpm", "operator": "lt", "bulletinID": "CESA-2015:2152" } ], "CESA-2015:1978": [ { "package": "kernel-3.10.0-229.el7.x86_64", "providedVersion": "0:3.10.0-229.el7", "bulletinVersion": "3.10.0-229.20.1.el7", "providedPackage": "kernel-3.10.0-229.el7.x86_64", "bulletinPackage": "kernel-3.10.0-229.20.1.el7.src.rpm", "operator": "lt", "bulletinID": "CESA-2015:1978" }, // skipped ], "CESA-2016:0064": [ { "package": "kernel-3.10.0-229.el7.x86_64", "providedVersion": "0:3.10.0-229.el7", "bulletinVersion": "3.10.0-327.4.5.el7", "providedPackage": "kernel-3.10.0-229.el7.x86_64", "bulletinPackage": "kernel-3.10.0-327.4.5.el7.src.rpm", "operator": "lt", "bulletinID": "CESA-2016:0064" }, // skipped ], // skipped ], // skipped "cvss": { "score": 10.0, "vector": "AV:NETWORK/AC:LOW/Au:NONE/C:COMPLETE/I:COMPLETE/A:COMPLETE/" }, "cvelist": [ "CVE-2014-9644", "CVE-2016-2384", // skipped ], "id": "F777" } }
APIを実行した後、OSによってパッケージのリストをプッシュし、それに応じて脆弱性のリストを受け取ってデータベースに入れるコードが作成されました。
アルゴリズム:
-ホストテーブルからOSのリストを取得します
-各OSについて、パッケージのリストを取得します
-監査APIにパケットを送信し、脆弱性のリスト(ID)を取得します
-Api IDで脆弱性を送信し、各メタデータで受信します
-テーブル脆弱性の脆弱性メタデータのデータベースに書き込みます
-v2pテーブルの通信パッケージと脆弱性のデータベースに書き込みます
報告書
私たちの主な目標は優先度の高いアップデートのホストのリストを取得することだったので、最初に作成したレポートは「CVSSスコアの合計
***に基づいて選択された「アップデートする上位10ホスト」」でした。
このコードは単純に上位10個のホストを取得し、それぞれが上位10個のパケットを合計速度で取得します。 その後、タスクを作成して更新できます。
使用年の結果
1年以上にわたって、Vulnersからデータを送信しています。 現在、彼らは30,000以上のユニークなパッケージを常に監査しています。 嬉しいことに、見つかったすべてのバグはすぐに修正され、各1,000の処理速度は30秒から400ミリ秒に増加しました。 このトピックが「...登録とSMSなしで」と呼ばれるのは彼らのおかげです)
ビジネス目標に関しては、このシステムの導入によって初めて、絶え間ない更新のプロセスが現れ始めました。 すべてを更新することは、勤務中のエンジニアにとって非常に大きな作業であり、最初の10個を更新することは非常に現実的です。 年間を通して、合計cvssスコアが2回以上低下しました。
脚注と説明
* -それは歴史的に起こり、Perlで自動化の記述を始めましたが、だれも私を止められませんでした。
** -ミシャはHabrのあまりアクティブなユーザーではありませんが、エンジニアとしては不可欠です:)
*** -1.0(スコアリング可能)から10.0(重大な脆弱性)のデジタル脆弱性ハザードメトリック
**** -すべてのコードはここで見つけることができます:
github.com/annmuor/freeauditPSそしてそれにもかかわらず-Perlは生きています!