OSがCentOS 7かどうかを判定するサンプルで、SCAPの構成要素XCCDFとOVALの構造を理解するOpenSCAPで脆弱性対策はどう変わる?(5)(2/2 ページ)

» 2019年10月01日 05時00分 公開
[面和毅OSSセキュリティ技術の会]
前のページへ 1|2       

テスト方法の定義の説明

 テスト以下の書き方は、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」でも動作します)。

テスト(Tests)

 まず、テスト部分では、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)になります。

オブジェクト(Objects)

 図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」のようなコマンドを実行しています。

ステート(States)

 ステートのところで、Objectsで指定したものの評価を行います。今回は、「rpminfo_state」を使用するので、OVAL Element Dictionaryを参照してみると、ステートとして取れるものとして下記があります。

  • name:名前
  • arch:アーキテクチャ
  • epoch:RPMのエポック番号
  • release:ビルドしたリリース番号
  • version:バージョン番号
  • evr:「EPOCH:VERSION-RELEASE」を1つのまとまりとして扱う
  • signature_keyid:RPMのシグネチャ(PGPキー)
  • extended_name:「NAME-EPOCH:VERSION-RELEASE.ARCHITECTURE」を1つのまとまりとして扱う
  • filepath:ファイルパス

 図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のCentOS7への適用結果

 図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のようになります。

図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>
図6

 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のようにレジストリ値を見ることもできます。

図7 Windowsでレジストリ値を確認することもできる

次回予告

 次回は、引き続きXCCDFの詳細を説明します。

 また、2019年5月7日にRed Hat Enterprise Linux 8がリリースされ、OpenSCAPも新しいバージョンが出てきました。次回以降では、新しいバージョンのOpenSCAPについても説明します。

筆者紹介

面和毅

略歴:OSSのセキュリティ専門家として20年近くの経験があり、主にOS系のセキュリティに関しての執筆や講演を行う。大手ベンダーや外資系、ユーザー企業などでさまざまな立場を経験。2015年からサイオステクノロジーのOSS/セキュリティエバンジェリストとして活躍し、同社でSIOSセキュリティブログを連載中。

CISSP:#366942

近著:『Linuxセキュリティ標準教科書』(LPI-Japan)」


前のページへ 1|2       

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。