PythonOVAL®コンテンツ作成ツールを実装する

ご挨拶、同僚! 画像

以前記事の 1つで書いたOVAL言語とSCAPスキャナーの概念を研究する過程で、かなり深刻な問題、つまりOVAL言語でコンテンツを作成するための便利なツールの不足に遭遇しました いいえ、絶対に何もないと言っているのではありません。 公式ウェブサイトには、 ユーティリティの小さなセットが提示されています。 それらのほとんどは有料ですが、残りは非常に便利なソリューションではなく、 XML-Notepadに最もよく似ています 。 その結果、Pythonを言語として使用して、自分で作業するために必要な小さなツールを作成することにしました。







この選択は、Python言語が「迅速な開発言語」であるという評判と、サードパーティライブラリの豊富なパレットの存在によるものです。 言語のドキュメントを用意して、 MITREのアイデアを現実に再現しようとしました。 私自身の究極の目標は、OVAL言語のオブジェクトの実装と、それらのストレージとインデックス作成のためのシステムを設定することです。



主な問題は、収集した情報の保存方法の選択でした。 最初の(そして失敗した)ソリューションはSQLite 3でした。 私はこの悲しい経験を特に長引きしませんが、実践が示しているように、リレーショナルデータベースに予測不可能なツリーを格納することは私にとって非常に難しい作業です。 したがって、私はNoSQLデータベースに注目しました。 データベースの排他的使用に制限することを計画していたので、私の選択はZoDBに落ちました。 もちろん、この決定も急いでいた。 しかし、 MongoDBのリメイクはすでに手遅れでした。 したがって、さらに計算するために、 PersistentMapping()は実際には通常のdict()であることに注意したいと思います。 データベースによるハッシュマップの認識の不確実性を考慮して、私はハッシュマップと同じクラスのキーを使用しました。 PersistentList()list()と同等です。 この置換は、そのような構造をZoDBに保存するために必要です。 これは、データベースの内部ロジックが原因です。 データベースにクラスを保存するには、クラスがpersistent.Persistentクラスの子孫である必要があります。



さらに、変数、メソッド、クラスの非定型的な命名、および可能な「斜視」については、事前にご容赦ください。私は魔術師ではありません。ただ学習しています。 そして、喜んで、知識のある同僚からの修正やコメントを受け付けます。



不必要に大きなコードを引用しないように、すぐにソースcode.google.comへのリンクを提供します。



一般に、OVAL言語の構造を分析するとき、その主な機能は拡張性であることに注意しました。 独自の構造を入力する必要がある場合は、名前空間を定義するXSDに記述してください。 ほとんどの構造は典型的なデータセットを表しているため、各言語オブジェクト専用のクラスを作成することにしました。 この実装の主な目標は、データベースに便利に保存される情報のコンテナを作成することです。 したがって、 OBJECT要素はベースオブジェクトとして機能します。



#ユニバーサルオーバルオブジェクト

クラス oval_object 永続的。 永続的

def __init__ self

自己id = str

自己タグ = "オブジェクト"

自己名前空間 = str

自己楕円 = str

自己バージョン = 0

自己vHash = 0

自己非推奨 = False

自己変数 = PersistentList

自己notes = PersistentList

自己コメント = str

自己署名 = str



def assign_id self 、UniqId

自己id = "oval:" + self oval + ":obj:" + str UniqId



def hash self

summ_hash = 0

summ_hash + = hash self。tag

summ_hash + = hash self。namespace

summ_hash + = hash self。comment

var for selfの場合変数

isinstance var、variable )の場合

summ_hash + = var。 ハッシュミー

その他

例外を発生させます 「オブジェクト変数のエラー入力パラメーター」

summ_hashを返す



def hashme self

自己vHash = self ハッシュ

自己を 返すvHash



def clearme self

ハッシュマップ= PersistentMapping

var for selfの場合変数

var。 クリアーム

var_hash = var。 ハッシュミー

var_hash ハッシュマップにない 場合キー

ハッシュマップ[ var_hash ] = なし

その他

自己変数 削除 var





このクラスは、 OVALのすべての基本要素のベースです。 DefinitionTestState、およびOval_variableは、このクラスの子孫になります。 要素を比較する可能性を実現するために、 hash()メソッド(すべてに共通)およびhashme() (子孫により再定義)が作成されました。

変数名からわかるように、すべての基本構造は静的に定義されています。 構造がわからない可能性のある子孫は動的です。 そのような「子孫」を実装するために、 Variableクラスを作成し、多くの点でElementTreeの Elementイデオロギーを繰り返しました。



クラス変数 persistent。Persistent

def __init__ self 、tag = str 、body = str 、attributes = None 、variables = None

属性でない 場合

自己属性 = PersistentMapping

変数でない場合:

自己変数 = PersistentList

isinstance はない属性 attributes、PersistentMapping )の場合

属性= PersistentMapping 属性

isinstance はない変数 variables、PersistentList )の場合

変数= PersistentList 変数

自己タグ =タグ

自己body = body

属性の場合

自己属性 =属性

変数の場合:

自己変数 =変数

自己vHash = 0



def clearme self

ハッシュマップ= PersistentMapping

var for selfの場合変数

var。 クリアーム

var_hash = var。 ハッシュミー

var_hash ハッシュマップにない 場合キー

ハッシュマップ[ var_hash ] = なし

その他

自己変数 削除 var



def hashme self

summ_hash = 0

summ_hash + = hash self。tag

summ_hash + = hash self。body

自己の 場合属性

selfの属性属性キー

summ_hash + = hash 属性 + hash self。attributes [属性]

自己の 場合変数

var for selfの場合変数

isinstance var、variable )の場合

if var = 自己

summ_hash + = var。 ハッシュミー

その他

例外を発生させます 「変数の入力パラメータにエラーがあります。自己追加しますか?」

自己vHash = summ_hash

自己を 返すvHash




OBJECTと同様に、ハッシュ計算機能が必要でした。 クラスの構造は、XML形式のデータベースの将来のアンロードを簡素化するために、 ElementTree.Elementに最大限に適合されます。



一般に、塗りつぶしに便利なオブジェクトのセットを取得しました。 ただし、それらを埋めるだけでは十分ではありません。独自のオブジェクトを作成する場合、新しいDefinitionsを埋めて保存するためのレギュレーター(この場合はMITER )の要件を満たす必要があります。 したがって、定義バージョンの変更を索引付けおよび制御するシステムが必要でした。 これを行うために、 oval_suite()クラスが作成されました。 メソッドの基本セット( putgetdeletesearchimport_xmlexport_xml )を実装します。これにより、コンテンツの処理が容易になり、上記の問題に悩まされることなくなります。



oval_suite()の作成中に発生した特定の問題の1つは、大量のデータ(約100MB)を一度にXML形式にエクスポートしようとしたときにメモリが不足することでした。 したがって、この関数を実装するには、最終ファイルを段階的に作成し、 StackOverflowから借用した要素削除関数ElementTree.Elementを使用する必要がありました。



def _garbager self 、root

リスト 内の要素 root )の場合

self ._garbager 要素

クリア

デルルート




一般に、PythonでOVALを操作するためのツールの概要があります。これは、セキュリティコンテンツを構築および作成するときに役立ちます。 このモジュールにより、セキュリティコンテンツをアセンブルし、バージョン管理と識別子の一意性を備えたデータベースに「パック」できます。



ご清聴ありがとうございました! 誰かがOVALのテーマに興味を持ち、これらの開発が彼に役立つことを願っています。



All Articles