XCCDFはその他のXML情報を含むことができます。
metadataとして<xccdf:metadata>〜</xccdf:metadata>で囲んで、titleやcreator、publisherなどの情報を含めることができます(図7)。
<ns0:metadata> <dc:publisher>JSOSS-SIG for Testing XCCDF</dc:publisher> <dc:creator>JSOSS-SIG</dc:creator> <dc:contributor>Kazuki Omo</dc:contributor> </ns0:metadata>
<xccdf:platform>で指定し、スキャン対象のプラットフォームデータとしてCPE(Common Platform Enumeration:共通プラットフォーム一覧)名を与えています。
example-xccdf.xml(図1)では、下記のようにCentOS 7のCPE情報を与えています。
<ns0:platform idref="cpe:/o:centos:centos:7" />
<xccdf:status>〜</xccdf:status>で囲み、XCCDFドキュメントのステータス(状態)を記述するのに使用します。
example-xccdf.xml(図1)では下記のように、「draft」としてあります。
<ns0:status date="2019-10-14">draft</ns0:status>
<xccdf:reference>〜</xccdf:reference>で囲み、何らかの参考情報を加えたい際に使用します。example-xccdf.xml(図1)ではSSHDで「Empty Password="yes"」を指定した際に発生する問題についてのレファレンスを下記のようにして加えてあります。
<ns0:reference href="https://www.niap-ccevs.org/Profile/PP.cfm">FIA_AFL.1</ns0:reference>
<xccdf:Benchmark>を用いて、ベンチマークで使用されるチェックアイテムを定義します。
Benchmarkで使用できる子要素の代表的なものを表1にまとめています。
Property | Type | 数 | 詳細 |
---|---|---|---|
Status(element) | 特殊 | 1〜n | ベンチマークのステータス(必須)と日付(オプション)。StatusはBenchmarkに必須 |
dc-status(element) | 特殊 | 0〜n | ダブリンコアフォーマット(https://www.dublincore.org/specifications/dublin-core/dces/)によるステータスの記述 |
title(element) | 文字列 | 0〜n | ベンチマークのタイトル。ベンチマークはタイトルを持たなくてはならない |
description(element) | HTML | 0〜n | ベンチマークの詳細説明。ベンチマークはdescriptionを持たなくてはならない |
notice(element) | HTML | 0〜n | ライセンスやコピーライトなどの法的な注意 |
front-matter(element) | HTML | 0〜n | ベンチマークドキュメントの冒頭の紹介事項。ドキュメント生成時のみ使用される |
rear-matter(element) | HTML | 0〜n | ベンチマークドキュメントの結末の紹介事項。ドキュメント生成時のみ使用される |
reference(element) | 特殊 | 0〜n | ベンチマークドキュメントのサポート参照 |
plain-text(element) | 文字列 | 0〜n | ユニークな識別子込みで定義されるテキストブロック |
cpe2:platform(element) | 特殊 | 0〜1 | CPE2で記述された検査対象プラットフォーム |
platform(element) | 文字列 | 0〜n | このベンチマークを適用可能なプラットフォーム |
version(element) | 文字列 | 1 | ベンチマークのバージョン |
metadata(element) | 特殊 | 0〜n | ベンチマークのXMLメタデータ(authorship、publisher、supportなど) |
model(element) | URI | 0〜n | このベンチマークのスコアを計算するときに使用される推奨スコアリングモデルのURI |
Profile(element) | 特殊 | 0〜n | Profileの項参照 |
Value(element) | 特殊 | 0〜n | Valueの項参照 |
Group(element) | 特殊 | 0〜n | Groupの項参照 |
Rule(element) | 特殊 | 0〜n | Ruleの項参照 |
TestResult(element) | 特殊 | 0〜n | TestResultの項参照 |
signature(element) | 特殊 | 0〜n | 著者のデジタル署名。ベンチマークの整合性のために使用される |
id(attribute) | 特殊 | 1 | ベンチマークのユニークなID |
style(attribute) | 文字列 | 0〜1 | ベンチマークのスタイル。「SCAP 1.2」などが入る |
style-href(attribute) | URI | 0〜1 | ベンチマークのスタイル(SCAP 1.2など)のURI |
xml:lang(attribute) | 特殊 | 0〜1 | 言語 |
<xccdf:Group>を用いて、Groupを定義します。
Groupで使用できる子要素(Rule、Valueと共通)で代表的なものを表2にまとめています。
Property | Type | 数 | 詳細 |
---|---|---|---|
Status(element) | 特殊 | 0〜n | itemのステータス(必須)と日付(オプション)。Statusはbenchmarkに必須 |
dc-status(element) | 特殊 | 0〜n | ダブリンコアフォーマットによるステータスの記述 |
version(element) | 文字列 | 0〜1 | itemのバージョン |
title(element) | 文字列 | 0〜n | itemのタイトル。itemはタイトルを持たなくてはならない |
description(element) | HTML | 0〜n | itemの詳細説明 |
warning(element) | HTML | 0〜n | ベンチマークユーザーに重要な注意情報を伝えることを目的としたアイテムに関するメモまたは警告(例えば「このルールに従うと、システムは全てのIPパケットを拒否します」) |
quesion(element) | 文字列 | 0〜n | ユーザーに提示する疑問文 |
reference(element) | 特殊 | 0〜n | ユーザーがそのitemについてより理解するための参照文 |
metadata(element) | 特殊 | 0〜n | itemのXMLメタデータ(source、特殊な情報など) |
hidden(attribute) | ブール値 | 0〜1 | Draftのベンチマークなどで、作成途中で隠したい(実行しない)もの |
prohibitChanges(attribute) | ブール値 | 0〜1 | エンドユーザーが変更できないようにするitemに対して使用する |
xml:lang(attribute) | 特殊 | 0〜1 | itemの言語 |
(注)itemはGroup、Rule、Value |
GroupとRule共通で使用できる子要素のうち、代表的なものを表3にまとめています。
Property | Type | 数 | 詳細 |
---|---|---|---|
rational(element) | HTML | 0〜n | このGroupやRuleの理由(ターゲットプラットフォームのセキュリティにとって重要である理由)を説明するテキスト |
platform(element) | 特殊 | 0〜n | GroupやRuleを適用するプラットフォーム |
requires(element) | 特殊 | 0〜n | このGroupやRuleを評価する際に選択されていなければならない別のGroup/RuleのID |
conflicts(element) | id | 0〜n | このGroupやRuleを評価する際に選択されていてはいけない別のGroup/RuleのID |
selected(attribute) | ブール値 | 0〜1 | 1(=True)になっていた場合、GroupやRuleはベンチマーク上で選択されていることになる |
weight(attribute) | 10進数 | 0〜1 | スコアを計算するためのこのGroupやRuleの相対的なスコアリングの重み。正の実数(0.0以上、最大3桁、デフォルトは1.0)で表される |
(注)itemはGroup、Rule、Value |
その他にGroupで使用できる子要素としては、Group(子Group)、Rule、Valueなどがあります。
Ruleで使用できる子要素(Group、Valueと共通)で代表的なものは表2/表3を参照してください。
さらにRuleを構成する代表的なものとして、表4のような複数の子要素があります。
Property | Type | 数 | 詳細 |
---|---|---|---|
ident(element) | 文字列 | 0〜n | このRuleのグローバルに意味のある識別子 |
impact-metric(element) | 文字列 | 0〜1 | CVSS 2.0で記述される、セキュリティ上のインパクトのポテンシャル |
profile-note(element) | HTML | 0〜n | 1つ以上のプロファイルに関連するRuleの特別な説明 |
fixtext(element) | 特殊 | 0〜n | このRuleにターゲットシステムを準拠させる方法の説明 |
fix(element) | 特殊 | 0〜n | コマンド文字列、スクリプト、または他のシステム変更ステートメント |
check(element) | 特殊 | (1〜n check インスタンス) XOR (1 complex-check インスタンス) | このRuleへの準拠をテストするためのシステムチェックの定義または参照 |
complex-check(element) | 特殊 | (1〜n check インスタンス) XOR (1 complex-check インスタンス) | 演算子(and、or、not)および個々のチェックで構成されるブール式 |
signature(element) | 特殊 | 0〜1 | Ruleの整合性を検証するための作成者の電子署名 |
role(attribute) | 文字列 | 0〜1 | スコアリング/レポーティングする際のRuleのRole。「full」「unscored」「unchecked」がある |
id(attribute) | 特殊 | 1 | ユニークなID。他の要素がこの要素を参照する際に用いられる |
severity(attribute) | 文字列 | 0〜1 | Severity(重要性)レベル。「unknown」「info」「low」「medium」「high」がある |
幾つかの代表的なものを以下で説明します。
・ident
<xccfg:ident> 要素でident(識別子)を定義します。定義できるIDは表5にまとめています。
URI | 説明 |
---|---|
http://cce.mitre.org | CCE(Common Configuration Enumeration)中の番号(例:CCE-80151-4はtmpをマウントする際にnosuidオプションが付加されている) |
http://cpe.mitre.org | CPE 2.0/2.3 |
http://cve.mitre.org | CVE-ID |
http://www.cert.org | Cert Advisory ID(例:CA-2004-02は大量に電子メールを配信するワーム) |
http://www.kb.cert.org | Cert KB データベースID |
http://www.us-cert.gov/cas/techalerts | US-Cert Tech-Alert ID |
例えば「U.S. Government Commercial Cloud Services(C2S)」準拠の設定ということで参照されている「/tmpをマウントする際にはnosuidオプションを使用していること」というチェック項目に関しては、図8のように検索の際に「CCE-80151-4」(CCEで「/tmpをマウントする際にはnosuidオプションを使用する」の番号として定義されている)をidentとして使用しています(図8)。
・check/complex-check
<xccdf:check>や<xccdf:complex-check>で定義されます。check内で使用できる要素の代表的なものを表6に示します。
Property | Type | 数 | 詳細 |
---|---|---|---|
check-import(element) | 特殊 | 0〜n | ターゲットシステムのテスト中にチェックシステムから取得する値を識別する |
check-export(element) | 特殊 | 0〜n | <xccdf:Value>要素から、チェックシステムで使用する外部名またはIDへのマッピングになる |
check-content-ref(element) | 特殊 | 0〜n | <xccdf:check>要素の@system属性で指定された分離チェックのコードを指す。「@href」属性はコードの場所を識別し、「OPTIONAL @name」属性はコードの特定の部分、要素、またはコンポーネントを参照する |
check-content(element) | 特殊 | 0〜1 | <xccdf:check>要素の「@system」属性で指定された言語またはシステムで、チェックのコードを保持する |
system(attribute) | URI | 1 | チェックするシステムのURI |
negate(attribute) | ブール値 | 0〜1 | これがTrueにセットされている場合には、チェックの最終的な結果は否定される(デフォルトではFalse) |
id(attribute) | 識別子 | 0〜1 | この要素でのユニークなID |
selector(attribute) | 文字列 | 0〜1 | プロファイルから参照される文字列 |
xml:base(attribute) | 特殊 | 0〜1 | チェックに関連する全てのURI |
complex-checkはcheckの評価をANDやORで組み合わせて評価できるものです。一般的な「Scap-Security-Guide」に含まれているXCCDFファイルでは使用されていないため、ここでは<xccdf:check>だけを見てみましょう。
ここで、example-xccdf.xml(図1)でのcheckを見てみます。<ns0:check>〜</ns0:check>で囲まれている箇所を図9として抜き出してあります。
最初の「system=」の箇所に、チェックするシステムのURIが記載されています。通常OVAL(Open Vulnerability and Assessment Language:セキュリティ検査言語)を使用する際には、こちらの「http://oval.mitre.org/XMLSchema/oval-definitions-5」を選択します。
次に「check-export」を用いて、Value(「sshd_required」変数)を指定します。sshd_required変数には設定した値で、ssg-rhel7-oval.xmlでSSHの設定を参照する際に確認されます(設定していないとエラーとなり評価ができない)。値は、それぞれ下記を意味します。
ここでは0を設定し、特にOpenSSHパッケージの有無に関しては気にしないことにしています。
次に、「check-content-ref」を用いて外部のXMLファイル(OVALファイル)を参照します。ここでは、ssg-rhel7-oval.xmlを指定して、そのファイル内の「ssg-sshd_disable_empty_passwords:def:1」を評価することになります。
ssg-rhel7-oval.xml内でのssg-sshd_disable_empty_passwords:def:1の定義を見てみると、「oval:ssg-test_sshd_permitemptypasswords_no:tst:1」テストを参照しており、「oval:ssg-test_sshd_permitemptypasswords_no:tst:1」テストを見てみると「oval:ssg-obj_sshd_permitemptypasswords_no:obj:1」オブジェクトを見て、/etc/ssh/sshd_configの「PermitEmptyPasswords」設定を正規表現で評価していることが分かります(図10)。
この戻り値(TrueまたはFalse)がoscapコマンド実行中に表示されます。
oscapコマンドを用いてexample-xccdf.xml(図1)の「Profile:Test_Profile」をスキャンした結果を図11に示します。
/etc/ssh/sshd_configファイルで「PermitEmptyPasswords yes」を指定してからパスワードを許可していると、下記コマンドで「fail」が表示されます。
"oscap xccdf eval --profile test_profile --report test-1.html example-xccdf.xml"
結果は図12のようになります。
今回の記事までで、SCAPで必要なコンポーネントの説明は終わりました。次回は、RHEL 8の登場で、さらに新しくなったバージョンのOpenSCAPを説明します。
略歴:OSSのセキュリティ専門家として20年近くの経験があり、主にOS系のセキュリティに関しての執筆や講演を行う。大手ベンダーや外資系、ユーザー企業などでさまざまな立場を経験。2015年からサイオステクノロジーのOSS/セキュリティエバンジェリストとして活躍し、同社でSIOSセキュリティブログ、Red Hatブログを連載中。
CISSP:#366942
近著:『Linuxセキュリティ標準教科書』(LPI-Japan)」
Copyright © ITmedia, Inc. All Rights Reserved.