テスト以下の書き方は、OVALの下記ドキュメントで定義されています。
以下、これらのドキュメントを参照しながら説明します。
図1の目的は、OSがCentOS 7かどうかを確認することです。そのため今回は「centos-release-7-XXX.rpm」がインストールされているか否かを判定の基準に使います。そこで、rpm情報を取得できる「rpminfo_test」「rpminfo_object」「rpminfo_state」を使用します。
その他にも、例えばDebianでパッケージを調べる場合にはLinux Schemaの「dpkginfo_test」を使用したり、特定のファイルの状態を調べる場合にはUNIX Schemaの「file_test」を使用したりします。
これらXMLで記載された情報は、最終的にはSCAPを使用するセキュリティツールで処理されます。例えば、oscapコマンドでは、「rpminfo_XXX」の処理には、OpenSCAPから提供される「/usr/libexec/openscap/probe_rpminfo」を呼び出しています。
[jsosug@localhost work]$ ls -l /usr/libexec/openscap/probe_rpminfo -rwxr-xr-x. 1 root root 82680 10月 31 2018 /usr/libexec/openscap/probe_rpminfol
また、Tests以下では「red-def」で記載されていますが、これはSchema部分での「xmlns:red-def="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux"」から来ています。Red Hatと分かりやすいように「red-def」として定義しているもので、例えばMicrosoft Windows製品のOVALでは「win-def」になっています(実は「hogehoge」でも動作します)。
まず、テスト部分では、rpminfo_testを使用します。rpminfo_testでは、テストで使用するObjectとStateを指定します。下記の部分で、テストの定義を行っています。
<red-def:rpminfo_test check="at least one" comment="CentOS 7 is installed" id="oval:com.redhat.rhsa:tst:20140675001" version="602">
「check」属性(「check=" "」の箇所)で、続くアイテムがどのような状態を満たすかを指定します。check=" "で指定できる値としては、「all」「at least one」「none exist」「none satisfy」「only one」があります。つまり、図1のサンプルコードの意味としては、続く「object」と「state」の少なくとも1つが条件を満たせば、という意味になります。つまり、下記のようになっています
<red-def:rpminfo_test check="at least one" comment="CentOS 7 is installed" id="oval:com.redhat.rhsa:tst:20140675001" version="602"> <red-def:object object_ref="oval:com.redhat.rhsa:obj:20140675001"/> <red-def:state state_ref="oval:com.redhat.rhsa:ste:20140675002"/> </red-def:rpminfo_test> </tests>
そのため、「Object ID= oval:com.redhat.rhsa:obj:20140675001」「State ID= oval:com.redhat.rhsa:ste:20140675002」の双方を確認し、どちらか1つを満たせば正(true)になります。
図1のサンプルコードでは下記のようになっています。
<objects> <red-def:rpminfo_object id="oval:com.redhat.rhsa:obj:20140675001" version="602"> <red-def:name>centos-release</red-def:name> </red-def:rpminfo_object> </objects>
OVAL Element Dictionaryによると、「rpminfo_object」は「name」としてパッケージ名を指定します。そのため、今回CentOS 7かどうかをcentos-release-7-XX.rpmのインストールの有無で判定することから、上述のように「centos-release」をnameとして指定しています。この一連の動きで「rpm - q centos-release」のようなコマンドを実行しています。
ステートのところで、Objectsで指定したものの評価を行います。今回は、「rpminfo_state」を使用するので、OVAL Element Dictionaryを参照してみると、ステートとして取れるものとして下記があります。
図1のサンプルでは、versionを使用しており、centos-release-hogehoge.rpmのバージョン番号が幾つになるかを確認しています。
<states> <red-def:rpminfo_state id="oval:com.redhat.rhsa:ste:20140675002" version="602"> <red-def:version operation="pattern match">^7</red-def:version> </red-def:rpminfo_state> </states>
ここでは、正規表現を使用してパターンマッチを行えるので、上のようにバージョン番号が「7」になるものかどうかを確認しています。この結果により、真/偽が返るので、結果を組み合わせて使用します。
図1のサンプルコードをCentOS 7.5にoscapコマンドを用いて適用した結果がこちらです。
[jsosug@localhost work]$ oscap oval eval --report testscan.html ttt.xml Definition oval:com.redhat.rhsa:def:20140679: true Evaluation done.
スキャンレポートは図5のようになります。
図6に応用例として、CentOS 7でかつOpenSSHのパッケージバージョンが「7.4p1-16.el7」より前かどうかをチェックするサンプルファイルを記しました。
<?xml version="1.0" encoding="utf-8"?> <oval_definitions xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:red-def="http://oval.mitre.org/XMLSchema/oval-definitions-5#linux" xmlns:unix-def="http://oval.mitre.org/XMLSchema/oval-definitions-5#unix" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5 oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#unix unix-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#linux linux-definitions-schema.xsd"> <generator> <oval:product_name>Test OVAL</oval:product_name> <oval:product_version>0.1beta</oval:product_version> <oval:schema_version>5.11.1</oval:schema_version> <oval:timestamp>2019-09-20T00:11:22</oval:timestamp> <oval:content_version>1</oval:content_version> </generator> <definitions> <definition class="miscellaneous" id="oval:com.redhat.rhsa:def:20140679" version="602"> <metadata> <title>For atmarkIT test: Test Scan (Important)</title> <description>RHSA test.</description> </metadata> <criteria operator="AND"> <criterion comment="CentOS 7 is installed" test_ref="oval:com.redhat.rhsa:tst:20140675001"/> <criterion comment="openssh is earlier than 0:7.4p1-16.el7" test_ref="oval:com.redhat.rhsa:tst:20180980009"/> </criteria> </definition> </definitions> <tests> <red-def:rpminfo_test check="at least one" comment="CentOS 7 is installed" id="oval:com.redhat.rhsa:tst:20140675001" version="602"> <red-def:object object_ref="oval:com.redhat.rhsa:obj:20140675001"/> <red-def:state state_ref="oval:com.redhat.rhsa:ste:20140675002"/> </red-def:rpminfo_test> <red-def:rpminfo_test check="at least one" comment="openssh is earlier than 0:7.4p1-16.el7" id="oval:com.redhat.rhsa:tst:20180980009" version="602"> <red-def:object object_ref="oval:com.redhat.rhsa:obj:20150425005"/> <red-def:state state_ref="oval:com.redhat.rhsa:ste:20180980003"/> </red-def:rpminfo_test> </tests> <objects> <red-def:rpminfo_object id="oval:com.redhat.rhsa:obj:20140675001" version="602"> <red-def:name>centos-release</red-def:name> </red-def:rpminfo_object> <red-def:rpminfo_object id="oval:com.redhat.rhsa:obj:20150425005" version="604"> <red-def:name>openssh</red-def:name> </red-def:rpminfo_object> </objects> <states> <red-def:rpminfo_state id="oval:com.redhat.rhsa:ste:20140675002" version="602"> <red-def:version operation="pattern match">^7</red-def:version> </red-def:rpminfo_state> <red-def:rpminfo_state id="oval:com.redhat.rhsa:ste:20180980003" version="602"> <red-def:arch datatype="string" operation="pattern match">aarch64|ppc64|ppc64le|s390x|x86_64</red-def:arch> <red-def:evr datatype="evr_string" operation="less than">0:7.4p1-16.el7</red-def:evr> </red-def:rpminfo_state> </states> </oval_definitions>
CentOS 7.5にして、かつOpenSSHのパッケージを最新に上げている場合には、7.4p1-16.el7が入っているはずです。これを使用すると「偽(false)」になるはずです(7.4p1-16.el7“より前”のため)。興味がありましたら確認してください。
[jsosug@localhost work]$ oscap oval eval --report testscan.html sample_ssh.xml Definition oval:com.redhat.rhsa:def:20140679: false Evaluation done.
また、今回はCentOSでRPMのパッケージで確認しましたが、Windows上でSCAPの監査ツールを使用する場合には、図7のようにレジストリ値を見ることもできます。
次回は、引き続きXCCDFの詳細を説明します。
また、2019年5月7日にRed Hat Enterprise Linux 8がリリースされ、OpenSCAPも新しいバージョンが出てきました。次回以降では、新しいバージョンのOpenSCAPについても説明します。
略歴:OSSのセキュリティ専門家として20年近くの経験があり、主にOS系のセキュリティに関しての執筆や講演を行う。大手ベンダーや外資系、ユーザー企業などでさまざまな立場を経験。2015年からサイオステクノロジーのOSS/セキュリティエバンジェリストとして活躍し、同社でSIOSセキュリティブログを連載中。
CISSP:#366942
近著:『Linuxセキュリティ標準教科書』(LPI-Japan)」
Copyright © ITmedia, Inc. All Rights Reserved.