本連載では、グローバルスタンダードになっている「SCAP」(セキュリティ設定共通化手順)およびそれを基にシステム構成や脆弱性の検査を行うためのOSSツール「OpenSCAP」や、その周辺の技術、用語などを紹介する。今回は、「SSHサーバの設定がパスワードなしログインを許可しているか、許可していないか」を確認するサンプルを通じて、SCAPの構成要素XCCDFの構造を理解しよう。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
OSSセキュリティ技術の会の面和毅です。本連載「OpenSCAPで脆弱(ぜいじゃく)性対策はどう変わる?」では、実質的にグローバルスタンダードの「SCAP(Security Content Automation Protocol:セキュリティ設定共通化手順)」およびそれを基にシステム構成や脆弱性の検査を行うためのOSS(オープンソースソフトウェア)ツール「OpenSCAP」や、その周辺の技術、用語などを紹介しています。
今回は前回「OSがCentOS 7かどうかを判定するサンプルで、SCAPの構成要素XCCDFとOVALの構造を理解する」の続きで、XCCDF(eXtensible Configuration Checklist Description Format:セキュリティ設定チェックリスト記述形式)ファイルについて詳しく見ていきます。
今回はテスト用として「example-xccdf.xml」ファイル(図1)を見ながら、より深く説明していきます。
<ns0:Benchmark xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:ns0="http://checklists.nist.gov/xccdf/1.1" id="RHEL-7" resolved="1" style="SCAP_1.1" xml:lang="en-US"> <ns0:status date="2019-10-14">draft</ns0:status> <ns0:title xml:lang="en-US">Exampe Security Guide of CentOS 7 for atmarkIT Test</ns0:title> <ns0:description xml:lang="en-US">This is just example for XCCDF document </ns0:description> <ns0:front-matter xml:lang="en-US">The SCAP Security Guide Project</ns0:front-matter> <ns0:platform idref="cpe:/o:centos:centos:7" /> <ns0:version update="https://github.com/OpenSCAP/scap-security-guide/releases/latest">0.1.40</ns0:version> <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> <ns0:model system="urn:xccdf:scoring:default" /> <ns0:Profile id="test_profile"> <ns0:title override="true" xml:lang="en-US">Profile for Testing XCCDF</ns0:title> <ns0:description override="true" xml:lang="en-US">XCCDF Test for atmarkIT article.</ns0:description> <ns0:select idref="sshd_disable_empty_passwords" selected="true" /> </ns0:Profile> <ns0:Group id="services"> <ns0:title xml:lang="en-US">Services</ns0:title> <ns0:description xml:lang="en-US">Test for installed Services.</ns0:description> <ns0:Value id="sshd_required" type="number"> <ns0:value>0</ns0:value> </ns0:Value> <ns0:Group id="ssh_server"> <ns0:title xml:lang="en-US">Configure OpenSSH Server if Necessary</ns0:title> <ns0:description xml:lang="en-US">OpenSSH Server configuration.</ns0:description> <ns0:platform idref="cpe:/o:centos:centos:7" /> <ns0:Rule id="sshd_disable_empty_passwords" selected="false" severity="high"> <ns0:title xml:lang="en-US">Disable SSH Access via Empty Passwords</ns0:title> <ns0:description xml:lang="en-US">Disable SSH empty Passowrds.</ns0:description> <ns0:reference href="https://www.niap-ccevs.org/Profile/PP.cfm">FIA_AFL.1</ns0:reference> <ns0:rationale xml:lang="en-US">SSH will require password</ns0:rationale> <ns0:platform idref="cpe:/o:centos:centos:7" /> <ns0:check system="http://oval.mitre.org/XMLSchema/oval-definitions-5"> <ns0:check-export export-name="oval:ssg-sshd_required:var:1" value-id="sshd_required" /> <ns0:check-content-ref name="oval:ssg-sshd_disable_empty_passwords:def:1" href="ssg-rhel7-oval.xml" /> </ns0:check> </ns0:Rule> </ns0:Group> </ns0:Group> </ns0:Benchmark>
このexample-xccdf.xmlは、SSHサーバに関する設定ファイル「/etc/ssh/sshd_config」で「Permit Empty Passwords」(パスワードなしログインの可否)の値を確認するためのファイルです。
今回は、準備として「scap-security-guide」パッケージに同梱されているXMLファイルを使用します。yumコマンドを用いて下記のようにパッケージをインストールしてください。
[root@localhost ~]# yum -y install scap-security-guide
その後、「/usr/share/xml/scap/ssg/content」以下の「ssg-rhel7-oval.xml」を適当なディレクトリ(ここでは、「/home/jsosug/work」としました)にあらかじめコピーしておいてください。
XCCDFのフォーマットなどに関しては、NIST(米国立標準技術研究所)からダウンロードできる仕様書(それぞれのバージョンで仕様が異なります。rev-4については、こちら)で確認ができます。
まずは、一通り仕様書に沿ってexample-xccdf.xml(図1)を見ながら確認してみましょう。XCCDFは以下の要素のデータタイプで構成されています。
<xccdf:Benchmark>と</xccdf:Benchmark>で囲われている要素で、こちらがメインのベンチマークテストを表したものです。<xccdf:Benchmark>は、<xccdf:Group>、<xccdf:Rule>、<xccdf:Value>、<xccdf:Profile>、<xccdf:TestResult>の要素で構成されています。
一般的なBenchmarkの構成要素を図2に示します。
Value a〜g、Rule l〜m、Group X〜Zが構成要素となってBenchmark内で定義されており、Profile AはValue a、Vaule b、Group X(子Groupも含む)を呼び出してスキャンを行います。また、Profile BはVaule c、Value d、Group Zを呼び出してスキャンを行います。
このように、複数のValueやRule、Groupをあらかじめ定義しておき、指定するProfileで組み合わせを決めてスキャンの内容を決定するようになっています。
example-xccdf.xml(図1)では、<ns0:Benchmark xmlns=...>から始まり</ns0:Benchmark>までで囲われている全体が「Benchmark」です。
<xccdf:Benchmark>を構成する要素です。
・Group(<xccdf:Group>)
RuleもしくはValueの要素を束ねてグループ化するものです。<xccdf:Group id="hogehoge">のようにID(hogehoge)を付けることができます。ベンチマークテストを実施する際にGroup単位(実際にはIDを指定)で実行を選択/非選択できるようにするものです。Groupは親子関係を作ることができ、<xccdf:Group>〜</xccdf:Group>の間に、さらに小さいGroupを構成できます。
example-xccdf.xml(図1)では、図3のようにRed Hat Enterprise Linux(RHEL) 7のサービスを規定したグループ(<ns0:Group id="services">)を親グループとして、ssh_serverサービス(<ns0:Group id="ssh_server">)が子グループとして入っている形になります。
・Rule(<xccdf:Rule>)
設定の内容をチェックしたり、改善情報などを取得したりする「ルール」が記述されます。後ほど詳しく実例を見ながら説明します。
・Value(<xccddf:Value>)
他の要素(Ruleなど)で参照できるようなパラメーターの値を設定するものです。後ほど詳しく実例を見ながら説明します。
<xccdf:Profile>〜</xccdf:Profile>で囲われている要素で、その中でItemを参照して実行します(図4)。
通常1つのBenchmark内に複数のProfileが定義されており、Profileごとに<xccdf: Profile id="pcidss">のようなユニークなidが定義されています。
example-xccdf.xml(図1)では、Profileとして「test_profile」を定義し、その内部でidが「sshd_disable_empty_passwords」となっているRuleもしくはGroupを参照して実行します。
RuleもしくはGroupは複数、実行することができます(図5)。
複数のProfileが存在しているため、oscapコマンドでスキャンする際にはidを指定する形で実行します(図6)。
<xccdf: TestResult>〜</xccdf:TestResult>で囲われた要素で、1つのターゲットシステムに対してのテストやチェックの結果を保持するものです。こちらはあまり使用されていません。
<xccdf: Tailoring>〜</xccdf: Tailoring>で囲われた要素で、ベンチマーク外のベンチマークプロファイルの定義が可能になります。こちらもあまり使用されていません。
Copyright © ITmedia, Inc. All Rights Reserved.