セキュリティーの強化
Red Hat Enterprise Linux 8 の保護
概要
オープンソースをより包摂的に
Red Hat は、コード、ドキュメント、および Web プロパティーにおける問題のある用語の修正に努めています。取り組みの開始として、マスター、スレーブ、ブラックリスト、ホワイトリストの 4 つの用語の修正に取り組みます。このため、これらの変更は今後の複数のリリースに対して段階的に実施されます。詳細は、弊社の CTO のメッセージを参照してください。
Red Hat ドキュメントへのフィードバック (英語のみ)
ご意見ご要望をお聞かせください。ドキュメントの改善点はございませんか。改善点を報告する場合は、以下のように行います。
特定の文章に簡単なコメントを記入する場合は、以下の手順を行います。
- ドキュメントの表示が Multi-page HTML 形式になっていて、ドキュメントの右上端に Feedback ボタンがあることを確認してください。
- マウスカーソルで、コメントを追加する部分を強調表示します。
- そのテキストの下に表示される Add Feedback ポップアップをクリックします。
- 表示される手順に従ってください。
より詳細なフィードバックを行う場合は、Bugzilla のチケットを作成します。
- Bugzilla の Web サイトにアクセスします。
- Component で Documentation を選択します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも記入してください。
- Submit Bug をクリックします。
第1章 RHEL におけるセキュリティーの強化の概要
ビジネスの運営や個人情報の把握ではネットワーク化された強力なコンピューターへの依存度が高まっていることから、各種業界ではネットワークとコンピューターのセキュリティーの実践に関心が向けられています。企業は、システム監査を適正に行い、ソリューションが組織の運営要件を満たすようにするために、セキュリティーの専門家の知識と技能を求めてきました。多くの組織はますます動的になってきていることから、従業員は、会社の重要な IT リソースに、ローカルまたはリモートからアクセスするようになっています。このため、セキュアなコンピューティング環境に対するニーズはより顕著になっています。
にも関わらず、多くの組織 (個々のユーザーも含む) は、機能性、生産性、便利さ、使いやすさ、および予算面の懸念事項にばかり目を向け、セキュリティーをその結果論と見なし、セキュリティーのプロセスが見過ごされています。したがって、適切なセキュリティーの確保は、無許可の侵入が発生してはじめて徹底されることも少なくありません。多くの侵入の試みを阻止する効果的な方法は、インターネットなどの信頼できないネットワークにサイトを接続する前に、適切な措置を講じることです。
1.1. コンピューターセキュリティーとは
コンピューターセキュリティーは、コンピューティングと情報処理の幅広い分野で使用される一般的な用語です。コンピューターシステムとネットワークを使用して日々の業務を行い、重要な情報へアクセスしている業界では、企業データを総体的資産の重要な部分であると見なしています。総保有コスト (Total Cost of Ownership: TCO)、投資利益率 (Return on Investment: ROI)、サービスの品質 (Quality of Service: QoS) などの用語や評価指標は日常的なビジネス用語として用いられるようになっています。各種の業界が、計画およびプロセス管理コストの一環として、これらの評価指標を用いてデータ保全性や可用性などを算出しています。電子商取引などの業界では、データの可用性と信頼性は、成功と失敗の違いを意味します。
1.2. セキュリティーの標準化
企業はどの業界でも、米国医師会 (AMA: American Medical Association)、米国電気電子学会 (IEEE: Institute of Electrical and Electronics Engineers) などの標準化推進団体が作成する規制やルールに従っています。情報セキュリティーにも同じことが言えます。多くのセキュリティーコンサルタントやベンダーが 機密性 (Confidentiality)、保全性 (Integrity)、可用性 (Availability) の頭文字をとった CIA として知られる標準セキュリティーモデルを採用しています。この 3 階層モデルは、機密情報のリスク評価やセキュリティー方針の確立において、一般的に採用されているモデルです。以下でこの CIA モデルを説明します。
- 機密性 - 機密情報は、事前に定義された個人だけが利用できるようにする必要があります。許可されていない情報の送信や使用は、制限する必要があります。たとえば、情報に機密性があれば、権限のない個人が顧客情報や財務情報を悪意のある目的 (ID 盗難やクレジット詐欺など) で入手できません。
- 保全性 - 情報は、改ざんして不完全または不正確なものにすべきではありません。承認されていないユーザーが、機密情報を変更したり破壊したりする機能を使用できないように制限する必要があります。
- 可用性 - 情報は、認証されたユーザーが必要な時にいつでもアクセスできるようにする必要があります。可用性は、合意した頻度とタイミングで情報を入手できることを保証します。これは、パーセンテージで表されることが多く、ネットワークサービスプロバイダーやその企業顧客が使用するサービスレベルアグリーメント (SLA) で正式に合意となります。
1.3. 暗号化ソフトウェアおよび認定
Red Hat Enterprise Linux は、業界のベストプラクティスに従い、FIPS 140-2、Common Criteria (CC) などのセキュリティー認証を受けています。
ナレッジベースの記事「RHEL 8 core crypto components」では、Red Hat Enterprise Linux 8 コア暗号化コンポーネントの概要 (「どのコンポーネントか選択されているか」、「どのように選択されているか」、「オペレーティングシステムにどのように統合されているかどうか」、「ハードウェアセキュリティーモジュールおよびスマートカードにどのように対応しているか」、および「暗号化認証がどのように適用されているか」) を説明します。
1.4. セキュリティーコントロール
多くの場合、コンピューターセキュリティーは、一般に コントロール
と呼ばれる以下の 3 つのマスターカテゴリーに分類されます。
- 物理的
- 技術的
- 管理的
この 3 つのカテゴリーは、セキュリティーの適切な実施における主な目的を定義するものです。このコントロールには、コントロールと、その実装方法を詳細化するサブカテゴリーがあります。
1.4.1. 物理的コントロール
物理的コントロールは、機密資料への非認証アクセスの抑止または防止のために、明確な構造でセキュリティー対策を実施します。物理的コントロールの例は以下のとおりです。
- 有線監視カメラ
- 動作または温度の感知アラームシステム
- 警備員
- 写真付き身分証明書
- 施錠された、デッドボルト付きのスチールドア
- バイオメトリクス (本人確認を行うための指紋、声、顔、虹彩、筆跡などの自動認識方法が含まれます)
1.4.2. 技術的コントロール
技術的コントロールでは、物理的な構造物やネットワークにおける機密データのアクセスや使用を制御する基盤となる技術を使用します。技術的コントロールは広範囲に及び、以下のような技術も含まれます。
- 暗号化
- スマートカード
- ネットワーク認証
- アクセス制御リスト (ACL)
- ファイルの完全性監査ソフトウェア
1.4.3. 管理的コントロール
管理的コントロールは、セキュリティーの人的要素を定義します。これは組織内のあらゆるレベルの職員や社員に関連するもので、誰がどのリソースや情報にアクセスするかを、次のような手段で決定します。
- トレーニングおよび認識の向上
- 災害準備および復旧計画
- 人員採用と分離の戦略
- 人員登録とアカウンティング
1.5. 脆弱性のアセスメント
時間やリソースがあり、その気になれば、攻撃者はほとんどすべてのシステムに侵入できます。現在利用できるセキュリティーの手順と技術をすべて駆使しても、すべてのシステムを侵入から完全に保護できる訳ではありません。ルーターは、インターネットへのセキュアなゲートウェイを提供します。ファイアウォールは、ネットワークの境界を保護します。仮想プライベートネットワーク (VPN) では、データが、暗号化されているストリームで安全に通過できます。侵入検知システムは、悪意のある活動を警告します。しかし、これらの技術が成功するかどうかは、以下のような数多くの要因によって決まります。
- 技術の設定、監視、および保守を行うスタッフの専門知識
- サービスとカーネルのパッチ、および更新を迅速かつ効率的に行う能力
- ネットワーク上での警戒を常に怠らない担当者の能力
データシステムと各種技術が動的であることを考えると、企業リソースを保護するタスクは極めて複雑になる可能性もあります。この複雑さゆえに、使用するすべてのシステムの専門家を見つけることは、多くの場合困難になります。情報セキュリティーの多くの分野によく精通している人材を確保することはできても、多くの分野を専門とするスタッフを確保することは容易ではありません。これは、情報セキュリティーの各専門分野で、継続的な注意と重点が必要となるためです。情報セキュリティーは、常に変化しています。
脆弱性アセスメントは、お使いのネットワークとシステムのセキュリティーに関する内部監査です。このアセスメントの結果により、ネットワークの機密性、完全性、および可用性の状態が明らかになります。通常、脆弱性アセスメントは、対象システムとリソースに関する重要なデータを収集する調査フェーズから開始します。その後システム準備フェーズとなります。基本的にこのフェーズでは、対象を絞り、すべての既知の脆弱性を調べます。準備フェーズが終わると報告フェーズになります。ここでは、調査結果が高中低のカテゴリーに分類され、対象のセキュリティーを向上させる (または脆弱性のリスクを軽減する) 方法が話し合われます。
たとえば、自宅の脆弱性アセスメントを実施することを想定してみましょう。まずは自宅のドアを点検し、各ドアが閉まっていて、かつ施錠されていることを確認します。また、すべての窓が完全に閉まっていて鍵が閉まっていることも確認します。これと同じ概念が、システム、ネットワーク、および電子データにも適用されます。悪意のあるユーザーはデータを盗んで、破壊します。悪意のあるユーザーが使用するツール、思考、動機に注目すると、彼らの行動にすばやく反応することが可能になります。
1.5.1. アセスメントとテストの定義
脆弱性アセスメントは、外部からの視点 と 内部からの視点 の 2 種類に分類できます。
外部からの視点で脆弱性アセスメントを実施する場合は、外部からシステムに攻撃を試みます。会社を外から見ることで、クラッカーの視点に立つことができます。一般にルーティング可能な IP アドレス、DMZ にあるシステム、ファイアウォールの外部インターフェースなど、クラッカーが目を付けるものに着目します。DMZ は「非武装地帯 (demilitarized zone)」を表し、企業のプライベート LAN などの信頼できる内部ネットワークと、公的なインターネットなどの信頼できない外部ネットワークの間にあるコンピューターまたは小さなサブネットワークに相当します。通常、DMZ には Web (HTTP) サーバー、FTP サーバー、SMTP (e-mail) サーバー、DNS サーバーなど、インターネットのトラフィックにアクセスできるデバイスが含まれます。
内部からの視点で脆弱性アセスメントを実施する場合、実行者は内部関係者であり、信頼されるステータスにあることから、有利な立場になります。内部からの視点は、実行者やその同僚がシステムにログオンした時点で得られるものです。プリントサーバー、ファイルサーバー、データベースなどのリソースを見ることができます。
これら 2 種類の脆弱性アセスメントには大きな違いがあります。社内のユーザーには、部外者が得られない多くの特権が付与されています。多くの組織では、侵入者を締め出すようにセキュリティーが構成されています。しかし、組織内の細かい部分 (部門内ファイアウォール、ユーザーレベルのアクセス制御および内部リソースに対する認証手順など) には、セキュリティー対策がほとんど行われていません。また、一般的にほとんどのシステムは社内にあるため、内部からの方がより多くのリソースを確認できます。いったん社外に移動すると、ステータスは信頼されない状態になります。通常、外部から利用できるシステムやリソースは、非常に限られたものになります。
脆弱性アセスメントと 侵入テスト の違いを考えてみましょう。脆弱性アセスメントを、侵入テストの第一歩と捉えてください。このアセスメントで得られる情報は、その後のテストで使用します。アセスメントは抜け穴や潜在的な脆弱性を検査する目的で行われるのに対し、侵入テストでは調査結果を実際に使用する試みがなされます。
ネットワークインフラストラクチャーのアセスメントは動的なプロセスです。セキュリティー (情報セキュリティーおよび物理的なセキュリティー) は動的なものです。アセスメントを実施することで概要が明らかになり、誤検出 (False positives) および検出漏れ (False negatives) が示される場合があります。誤検出は、実際には存在しない脆弱性をツールが検出することを指します。検出漏れは、実際の脆弱性が検出されないことを指します。
セキュリティー管理者の力量は、使用するツールとその管理者が有する知識で決まります。現在使用できるアセスメントツールのいずれかを選び、それらをシステムに対して実行すると、ほぼ間違いなく誤検出がいくつか見つかります。プログラム障害でもユーザーエラーでも、結果は同じです。ツールは、誤検出することもあれば、さらに悪い場合は、検出漏れをすることもあります。
脆弱性アセスメントと侵入テストの違いが定義されたところで、新たなベストプラクティスの一環として侵入テストを実施する前に、アセスメントの結果を注意深く確認し、検討してみましょう。
実稼働システムで脆弱性を悪用する試みを行わないでください。システムおよびネットワークの生産性ならびに効率に悪影響を与える可能性があります。
脆弱性アセスメントの実施には、以下のような利点があります。
- 情報セキュリティーに事前にフォーカスできる
- クラッカーが発見する前に潜在的な不正使用を発見できる
- システムを最新の状態に維持し、パッチを適用できる
- スタッフの成長と専門知識の開発を促す
- 経済的な損失や否定的な評判を減らす
1.5.2. 脆弱性評価に関する方法論の確立
脆弱性アセスメントの方法論が確立されれば、脆弱性アセスメント用のツール選択に役立ちます。現時点では、事前定義の方法論や業界で承認された方法論はありませんが、一般常識やベストプラクティスを適切なガイドとして活用できます。
「ターゲット」とは何を指していますか?1 台のサーバー、またはネットワーク全体およびネットワーク内にあるすべてのサーバーを確認しますか?会社外ですか? それとも内部ですか? この質問に対する回答は、選択したツールだけでなく、そのツールの使用方法を決定する際に重要です。
方法論の確立の詳細は、以下の Web サイトを参照してください。
- https://www.owasp.org/ — The Open Web Application Security Project
1.5.3. 脆弱性アセスメントのツール
アセスメントは、情報収集ツールを使用することから始まります。ネットワーク全体を評価する際は、最初にレイアウトを描いて、稼働しているホストを把握します。ホストの場所を確認したら、それぞれのホストを個別に検査します。各ホストにフォーカスするには別のツールセットが必要になります。どのツールを使用すべきかを知っておくことは、脆弱性の発見において最も重要なステップになる可能性があります。
以下で、利用可能なツールを一部紹介します。
-
Nmap
は、ホストシステムを見つけて、そのシステムでポートを開くことができる一般的なツールです。AppStream
リポジトリーからNmap
をインストールするには、root
でyum install nmap
コマンドを実行します。詳細はnmap(1)
の man ページを参照してください。 -
oscap
コマンドラインユーティリティー、scap-workbench
グラフィカルユーティリティーなどのOpenSCAP
スイートのツールは、完全に自動化されたコンプライアンス監査を提供します。詳細は「セキュリティーコンプライアンスおよび脆弱性スキャンの開始」を参照してください。 -
AIDE
(Advanced Intrusion Detection Environment) は、システムのファイルのデータベースを作成し、そのデータベースを使用してファイルの整合性を確保し、システムの侵入を検出します。詳細は「AIDE で整合性のチェック」を参照してください。
1.6. セキュリティーへの脅威
1.6.1. ネットワークセキュリティーへの脅威
ネットワークの以下の要素を設定する際に不適当なプラクティスが行われると、攻撃のリスクが増大します。
セキュリティーが十分ではないアーキテクチャー
間違った構成のネットワークは、未承認ユーザーの主要なエントリーポイントになります。信頼に基づいたオープンなローカルネットワークを、安全性が非常に低いインターネットに対して無防備な状態にしておくことは、犯罪の多発地区でドアを半開きにしておくようなものです。すぐに何かが起きることはないかもしれませんが、いずれ、誰かが、このチャンスを悪用するでしょう。
ブロードキャストネットワーク
システム管理者は、セキュリティー計画においてネットワーキングハードウェアの重要性を見落としがちです。ハブやルーターなどの単純なハードウェアは、ブロードキャストやノンスイッチの仕組みに基づいています。つまり、あるノードがネットワークを介して受信ノードにデータを送信するときは常に、受信ノードがデータを受信して処理するまで、ハブやルーターがデータパケットのブロードキャストを送信します。この方式は、外部侵入者やローカルホストの未認証ユーザーが仕掛けるアドレス解決プロトコル (ARP) およびメディアアクセスコントロール (MAC) アドレスの偽装に対して最も脆弱です。
集中化サーバー
ネットワーキングのもうひとつの落とし穴は、集中化されたコンピューティングの使用にあります。多くの企業では、一般的なコスト削減手段として、すべてのサービスを 1 台の強力なマシンに統合しています。集中化は、複数サーバーを設定するよりも管理が簡単で、コストを大幅に削減できるので便利です。ただし、集中化されたサーバーはネットワークにおける単一障害点となります。中央のサーバーが攻撃されると、ネットワークが完全に使用できなくなるか、データの不正操作や盗難が起きやすくなる可能性があります。このような場合は、中央サーバーがネットワーク全体へのアクセスを許可することになります。
1.6.2. サーバーセキュリティーへの脅威
サーバーには組織の重要情報が数多く含まれることが多いため、サーバーのセキュリティーは、ネットワークのセキュリティーと同様に重要です。サーバーが攻撃されると、クラッカーが意のままにすべてのコンテンツを盗んだり、不正に操作したりできるようになる可能性があります。以下のセクションでは、主要な問題の一部を詳述します。
未使用のサービスと開かれたポート
Red Hat Enterprise Linux 8 のフルインストールを行うと、アプリケーションとライブラリーのパッケージが 1000 個以上含まれます。ただし、サーバー管理者が、ディストリビューションに含まれるすべての個別パッケージをインストールすることはほとんどありません。代わりに、複数のサーバーアプリケーションを含むパッケージのベースインストールを行います。
システム管理者は、インストールに含まれるプログラムに注意を向けずにオペレーティングシステムをインストールしてしまうことがよくあります。これにより、不要なサービスがインストールされ、デフォルト設定でオンになっていることで、問題が発生する場合があります。つまり、管理者が気が付かないところで、Telnet、DHCP、DNS などの不要なサービスがサーバーやワークステーションで実行し、その結果、サーバーへの不要なトラフィックが発生したり、クラッカーがシステムのパスを悪用できてしまう可能性があります。
パッチが適用されないサービス
デフォルトのインストールに含まれるほとんどのサーバーアプリケーションは、ソフトウェアの細部まで徹底的にテストされており、堅牢な作りになっています。何年も実稼働環境で使用される中で、そのコードは入念に改良され、数多くのバグが発見されて修正されてきました。
しかし、完璧なソフトウェアというものはなく、改良の余地は常にあります。または、比較的新しいソフトウェアは、実稼働環境に導入されてから日が浅く、他のサーバーソフトウェアほど普及していないこともあるため、厳密なテストが期待通りに行われていない状況も少なくありません。
開発者やシステム管理者が、サーバーアプリケーションで悪用される可能性のあるバグを発見することも多々あり、Bugtraq メーリングリスト (http://www.securityfocus.com)、Computer Emergency Response Team (CERT) Web サイト (http://www.cert.org) などで、バグ追跡やセキュリティー関連の Web サイトに関連する情報が公開されています。このような情報発信は、コミュニティーにセキュリティーの脆弱性を警告する効果的な方法ではありますが、システムに速やかにパッチを当てるかどうかは個々のシステム管理者が決定します。クラッカーも、パッチが適用されていないシステムがあればクラッキングできるように、脆弱性トラッキングサービスにアクセスし、関連情報を利用できることを考慮すると、速やかな対応がとりわけ重要になります。優れたシステム管理を行うには、警戒を怠らず、バグ追跡を絶えず行い、適切なシステム保守を実行して、よりセキュアなコンピューティング環境を維持することが求められます。
管理における不注意
管理者がシステムにパッチを当てないことが、サーバーのセキュリティーに対する最大の脅威の 1 つになります。これは、管理者の経験の少なさだけでなく、管理者の過信やモチベーションの低さなども原因となります。
管理者が、サーバーやワークステーションにパッチを当てることを忘れたり、システムのカーネルやネットワーク通信のログメッセージを見落とす場合もあります。その他にも、よく起こるケースとして、サービスのデフォルトパスワードや鍵を変更しないまま放置しておくことが挙げられます。たとえば、データベースにはデフォルトの管理パスワードが設定されているものがありますが、ここでは、システム管理者がインストール後すぐにデフォルトパスワードを変更することを、データベース開発者は想定しています。しかし、データベース管理者がパスワードを変更することを忘れると、クラッカーの経験が浅くても、周知のデフォルトパスワードを使用してデータベースの管理者権限を得ることができます。この他に、管理者の不注意によりサーバーが危険にさらされる場合もあります。
本質的に安全ではないサービス
どんなに注意深い組織であっても、選択するネットワークサービスが本質的に安全でない限り、攻撃を受けやすくなります。たとえば、多くのサービスは、信頼できるネットワークでの使用を想定して開発されますが、このサービスが (本質的に信頼できない) インターネットで利用可能になる時点で、この仮定は成立しなくなります。
安全ではないネットワークサービスの例として、暗号化されていないユーザー名とパスワードを認証時に要求するサービスが挙げられます。具体例としては、Telnet や FTP の 2 つがあげられます。パケット盗聴ソフトウェアがリモートユーザーとこのようなサービスの間のトラフィックを監視していれば、ユーザー名とパスワードは簡単に傍受される可能性があります。
また、基本的にこのようなサービスはセキュリティー業界で 中間者 攻撃と呼ばれる攻撃の被害者になりやすくなります。この種の攻撃では、クラッカーが、ネットワーク上でクラッキングしたネームサーバーを操って、目標のサーバーではなくクラッカーのマシンを指定して、ネットワークトラフィックをリダイレクトします。誰かがサーバーへのリモートセッションを開くと、攻撃者のマシンがリモートサービスと無防備なユーザーとの間に存在する目に見えないパイプとして機能し、この間を流れる情報を取り込みます。このようにして、クラッカーはサーバーやユーザーに気付かれることなく、管理パスワードや生データを収集できるようになります。
安全ではないサービスの例としては、他にも NFS、NIS などのネットワークファイルシステムおよび情報サービスが挙げられます。このサービスは、LAN 利用を目的として開発されましたが、(リモートユーザー用の) WAN も対象に含まれるように拡張されました。NFS では、クラッカーによる NFS 共有のマウントやそこに格納されているものへのアクセスを防ぐ認証やセキュリティーの仕組みがデフォルトで設定されていません。NIS も、プレーンテキストの ASCII または DBM (ASCII から派生) データベースに、パスワードやファイルパーミッションなど、ネットワーク上の全コンピューターへの周知が必要となる重要な情報を保持しています。クラッカーがこのデータベースのアクセス権を取得すると、管理者のアカウントを含む、ネットワークのすべてのユーザーアカウントにアクセスできるようになります。
Red Hat Enterprise Linux 8 では、デフォルトでは、上記のサービスがすべて無効になっています。ただし、管理者は、このようなサービスを使用しないといけない場合があるため、注意して設定することが重要となります。
1.6.3. ワークステーションおよび家庭用 PC のセキュリティーに対する脅威
ワークステーションや家庭用 PC はネットワークやサーバーほど攻撃にさらされることはないかもしれませんが、クレジットカード情報のような機密データが含まれるため、システムクラッカーの標的になります。ワークステーションは知らぬ間に攻撃者によって選択され、一連の攻撃で「スレーブ」マシンとして使用される可能性もあります。このため、ユーザーはワークステーションの脆弱性を理解しておくと、オペレーティングシステムの再インストールや、深刻な場合はデータ盗難からの回復といった問題から免れることができます。
不適切なパスワード
攻撃者が最も簡単にシステムへのアクセスを得る方法の 1 つとして、パスワードが適切でないことが挙げられます。
脆弱なクライアントアプリケーション
管理者がサーバーに十分な安全対策を施し、パッチを当てている場合でも、リモートユーザーによるアクセスが安全であるわけではありません。たとえば、サーバーが公開ネットワーク上で Telnet や FTP のサービスを提供している場合、攻撃者はネットワークを通過するプレーンテキストのユーザー名とパスワードを取り込み、アカウント情報を使用してリモートユーザーのワークステーションにアクセスすることが可能です。
SSH などのセキュアなプロトコルを使用している場合であっても、クライアントアプリケーションを定期的に更新していないと、リモートユーザーは特定の攻撃を受けやすくなる可能性があります。たとえば、SSH プロトコルのバージョン 1 のクライアントは、悪意のある SSH サーバーからの X 転送攻撃に対して脆弱です。クライアントがサーバーに接続すると、攻撃者はネットワーク上でクライアントによるキー入力やマウス操作をひそかに収集できます。この問題は SSH プロトコルのバージョン 2 で修正されましたが、ユーザーはどのアプリケーションにこのような脆弱性があるかを追跡し、必要に応じてアプリケーションを更新する必要があります。
1.7. 一般的な不正使用と攻撃
表1.1「一般的な不正使用」では、侵入者が組織のネットワークリソースにアクセスするために使用する最も一般的な不正使用とエントリーポイントの例を挙げて詳しく説明します。この一般的な不正使用では、それがどのように実行され、管理者がその攻撃からネットワークをどのように適切に保護できるかを理解していることが重要になります。
表1.1 一般的な不正使用
不正使用 | 説明 | 備考 |
---|---|---|
空またはデフォルトのパスワード | 管理パスワードを空白のままにしたり、製品ベンダーが設定したデフォルトのパスワードをそのまま使用します。これは、ルーターやファイアウォールなどのハードウェアで最もよく見られますが、Linux で実行するサービスにはデフォルトの管理者パスワードが指定されているものがあります (ただし Red Hat Enterprise Linux 8 には含まれません)。 | 一般的に、ルーター、ファイアウォール、VPN、ネットワーク接続ストレージ (NAS) の機器など、ネットワークハードウェアに関連するものです。 多数のレガシーオペレーティングシステム、特にサービスをバンドルしたオペレーティングシステム (UNIX や Windows など) でよく見られます。 管理者が急いで特権ユーザーアカウントを作成したためにパスワードが空白のままになっていることがありますが、このような空白のパスワードは、このアカウントを発見した悪意のあるユーザーが利用できる絶好のエントリーポイントとなります。 |
デフォルトの共有鍵 | セキュアなサービスでは、開発や評価テスト向けにデフォルトのセキュリティー鍵がパッケージ化されていることがあります。この鍵を変更せずにインターネットの実稼働環境に置いた場合は、同じデフォルトの鍵を持つ すべての ユーザーがその共有鍵のリソースや、そこにあるすべての機密情報にアクセスできるようになります。 | 無線アクセスポイントや、事前設定済みでセキュアなサーバー機器に最も多く見られます。 |
IP スプーフィング | リモートマシンがローカルネットワークのノードのように動作し、サーバーに脆弱性を見つけるとバックドアプログラムまたはトロイの木馬をインストールして、ネットワークリソース全体へのコントロールを得ようとします。 | スプーフィングは、攻撃者が標的となるシステムへの接続を調整するのに、TCP/IP シーケンス番号を予測しなければならないため、かなり難しくなりますが、クラッカーの脆弱性の攻撃を支援する利用可能なツールがいくつかあります。
標的となるシステムで実行している source-based 認証技術を使用するサービス ( |
盗聴 | 2 つのノード間の接続を盗聴することにより、ネットワーク上のアクティブなノード間を行き交うデータを収集します。 | この種類の攻撃には大抵、Telnet、FTP、HTTP 転送などのプレーンテキストの転送プロトコルが使用されます。 リモートの攻撃者がこのような攻撃を仕掛けるには、LAN で、攻撃するシステムへのアクセス権が必要になります。通常、クラッカーは、LAN 上にあるシステムを危険にさらすためにアクティブ攻撃 (IP スプーフィングや中間者攻撃など) を仕掛けます。 パスワードのなりすましに対する防護策としては、暗号化鍵交換、ワンタイムパスワード、または暗号化された認証によるサービス使用が挙げられます。通信中は強力な暗号化を実施することをお勧めします。 |
サービスの脆弱性 | 攻撃者はインターネットで実行しているサービスの欠陥や抜け穴を見つけます。攻撃者がこの脆弱性を利用する場合は、システム全体と格納されているデータを攻撃するだけでなく、ネットワーク上の他のシステムも攻撃する可能性があります。 | CGI などの HTTP ベースのサービスは、リモートのコマンド実行やインタラクティブなシェルアクセスに対しても脆弱です。HTTP サービスが「nobody」などの権限のないユーザーとして実行している場合でも、設定ファイルやネットワークマップなどの情報が読み取られる可能性があります。または、攻撃者がサービス拒否攻撃を開始して、システムのリソースを浪費させたり、他のユーザーが利用できないようにする可能性もあります。 開発時およびテスト時には気が付かない脆弱性がサービスに含まれることがあります。(アプリケーションのメモリーバッファー領域をあふれさせ、任意のコマンドを実行できるようなインタラクティブなコマンドプロンプトを攻撃者に提供するように、攻撃者が任意の値を使用してサービスをクラッシュさせる バッファーオーバーフローなどの) 脆弱性は、完全な管理コントロールを攻撃者に与えるものとなる可能性があります。 管理者は、root 権限でサービスが実行されないようにし、ベンダー、または CERT、CVE などのセキュリティー組織がアプリケーション用のパッチやエラータ更新を提供していないかを常に注意する必要があります。 |
アプリケーションの脆弱性 | 攻撃者は、デスクトップやワークステーションのアプリケーション(電子メールクライアントなど)に欠陥を見つけ出し、任意のコードを実行したり、将来のシステム侵害のためにトロイの木馬を移植したり、システムを破壊したりします。攻撃を受けたワークステーションがネットワークの残りの部分に対して管理特権を持っている場合は、さらなる不正使用が起こる可能性があります。 | ワークステーションとデスクトップは、ユーザーが侵害を防いだり検知するための専門知識や経験を持たないため、不正使用の対象になりやすくなります。認証されていないソフトウェアをインストールしたり、要求していないメールの添付ファイルを開く際には、それに伴うリスクについて個々に通知することが必須です。 電子メールクライアントソフトウェアが添付ファイルを自動的に開いたり、実行したりしないようにするといった、予防手段を取ることが可能です。さらに、Red Hat Network や他のシステム管理サービスなどからワークステーションのソフトウェアを自動更新することにより、マルチシートのセキュリティーデプロイメントの負担を軽減できます。 |
サービス拒否攻撃 (DoS: Denial of Service) | 単独の攻撃者または攻撃者のグループは、目標のホスト (サーバー、ルーター、ワークステーションのいずれか) に認証されていないパケットを送り、組織のネットワークまたはサーバーのリソースに対して攻撃を仕掛けます。これにより、正当なユーザーがリソースを使用できなくなります。 | 米国で最も多く報告された DOS の問題は、2000 年に発生しました。この時、通信量が非常に多い民間および政府のサイトが一部が利用できなくなりました。ゾンビ (zombie) や、リダイレクトされたブロードキャストノードとして動作する高帯域幅接続を有し、セキュリティー侵害された複数のシステムを使用して、調整された ping フラッド攻撃が行われたためです。 通常ソースパケットは、真の攻撃元を調査するのが難しくなるよう、偽装 (または再ブロードキャスト)されています。
|
第2章 インストール時の RHEL の保護
セキュリティーへの対応は、Red Hat Enterprise Linux をインストールする前にすでに始まっています。最初からシステムのセキュリティーを設定することで、追加のセキュリティー設定を実装することがより簡単になります。
2.1. BIOS および UEFI のセキュリティー
BIOS (もしくは BIOS に相当するもの) およびブートローダーをパスワードで保護することで、システムに物理的にアクセス可能な未承認ユーザーがリムーバブルメディアを使用して起動したり、シングルユーザーモードで root 権限を取得することを防ぐことができます。このような攻撃に対するセキュリティー対策は、ワークステーションの情報の機密性とマシンの場所によって異なります。
たとえば、見本市で使用されていて機密情報を含んでいないマシンでは、このような攻撃を防ぐことが重要ではないかもしれません。しかし、同じ見本市で、企業ネットワークに対して暗号化されていない SSH 秘密鍵のある従業員のノートパソコンが、誰の監視下にもなく置かれていた場合は、重大なセキュリティー侵害につながり、その影響は企業全体に及ぶ可能性があります。
一方で、ワークステーションが権限のあるユーザーもしくは信頼できるユーザーのみがアクセスできる場所に置かれてるのであれば、BIOS もしくはブートローダーの安全確保は必要ない可能性もあります。
2.1.1. BIOS パスワード
コンピューターの BIOS をパスワードで保護する主な 2 つの理由を以下に示します。[1]オプションを追加します
- BIOS 設定の変更を防止する - 侵入者が BIOS にアクセスした場合は、CD-ROM やフラッシュドライブから起動するように設定できます。このようにすると、侵入者がレスキューモードやシングルユーザーモードに入ることが可能になり、システムで任意のプロセスを開始したり、機密性の高いデータをコピーできるようになってしまいます。
- システムの起動を防止する - BIOS の中には起動プロセスをパスワードで保護できるものもあります。これを有効にすると、攻撃者は BIOS がブートローダーを開始する前にパスワード入力を求められます。
BIOS パスワードの設定方法はコンピューターメーカーで異なるため、具体的な方法はコンピューターのマニュアルを参照してください。
BIOS パスワードを忘れた場合は、マザーボードのジャンパーでリセットするか、CMOS バッテリーを外します。このため、可能な場合はコンピューターのケースをロックすることが推奨されます。ただし、CMOS バッテリーを外す前にコンピューターもしくはマザーボードのマニュアルを参照してください。
2.1.1.1. 非 BIOS ベースシステムのセキュリティー
その他のシステムやアーキテクチャーでは、異なるプログラムを使用して x86 システムの BIOS とほぼ同等の低レベルのタスクを実行します。UEFI (Unified Extensible Firmware Interface) シェルなどがこの例になります。
BIOS のようなプログラムをパスワード保護する方法は、メーカーにお問い合わせください。
2.2. ディスクのパーティション設定
Red Hat は、/boot
、/
、/home
、/tmp
、および /var/tmp/
の各ディレクトリーに別々のパーティションを作成することを推奨します。各パーティションを作成する理由は以下のようになります。
/boot
- このパーティションは、システムの起動時にシステムが最初に読み込むパーティションです。Red Hat Enterprise Linux 8 でシステムを起動するのに使用するブートローダーとカーネルイメージはこのパーティションに保存されます。このパーティションは暗号化しないでください。このパーティションが / に含まれており、そのパーティションが暗号化されているなどの理由で利用できなくなると、システムを起動できなくなります。
/home
-
ユーザーデータ (
/home
) が別のパーティションではなく/
に保存されていると、このパーティションが満杯になり、オペレーティングシステムが不安定になる可能性があります。また、システムを、Red Hat Enterprise Linux 8 の次のバージョンにアップグレードする際に、/home
パーティションにデータを保存できると、このデータはインストール時に上書きされないため、アップグレードが非常に簡単になります。root パーティション (/
) が破損すると、データが完全に失われます。したがって、パーティションを分けることが、データ損失に対する保護につながります。また、このパーティションを、頻繁にバックアップを作成する対象にすることも可能です。 /tmp
および/var/tmp/
-
/tmp
ディレクトリーおよび/var/tmp/
ディレクトリーは、どちらも長期保存の必要がないデータを保存するために使用されます。しかし、このいずれかのディレクトリーでデータがあふれると、ストレージ領域がすべて使用されてしまう可能性があります。このディレクトリーは/
に置かれているため、こうした状態が発生すると、システムが不安定になり、クラッシュする可能性があります。そのため、このディレクトリーは個別のパーティションに移動することが推奨されます。
インストールプロセス時に、パーティションを暗号化するオプションがあります。パスフレーズを入力する必要があります。これは、パーティションのデータを保護するのに使用されるバルク暗号鍵を解除する鍵として使用されます。
2.3. インストールプロセス時のネットワーク接続の制限
Red Hat Enterprise Linux 8 をインストールする際に使用するインストールメディアは、特定のタイミングで作成されたスナップショットです。そのため、セキュリティー修正が最新のものではなく、このインストールメディアで設定するシステムが公開されてから修正された特定の問題に対して安全性に欠ける場合があります。
脆弱性が含まれる可能性のあるオペレーティングシステムをインストールする場合には、必ず、公開レベルを、必要最小限のネットワークゾーンに限定してください。最も安全な選択肢は、インストールプロセス時にマシンをネットワークから切断した状態にする「ネットワークなし」のゾーンです。インターネット接続からのリスクが最も高く、一方で LAN またはイントラネット接続で十分な場合もあります。セキュリティーのベストプラクティスに従い、ネットワークから Red Hat Enterprise Linux 8 をインストールする場合は、お使いのリポジトリーに最も近いゾーンを選択するようにしてください。
2.4. 必要なパッケージの最小限のインストール
コンピューターの各ソフトウェアには脆弱性が潜んでいる可能性があるため、実際に使用するパッケージのみをインストールすることがベストプラクティスになります。インストールを DVD から行う場合は、インストールしたいパッケージのみを選択するようにします。その他のパッケージが必要になる場合は、後でいつでもシステムに追加できます。
2.5. インストール後の手順
以下は、Red Hat Enterprise Linux 8 のインストール直後に実行する必要があるセキュリティー関連の手順です。
システムを更新します。root で以下のコマンドを実行します。
# yum update
ファイアウォールサービスの
firewalld
は、Red Hat Enterprise Linux のインストールで自動的に有効になっていますが、キックスタート設定などで明示的に無効となっている場合もあります。このような場合は、ファイアウォールを再度有効にすることが推奨されます。firewalld
を開始するには、root で次のコマンドを実行します。# systemctl start firewalld # systemctl enable firewalld
セキュリティーを強化するために、不要なサービスは無効にしてください。たとえば、使用中のコンピューターにプリンターがインストールされていなければ、以下のコマンドを使用して
cups
サービスを無効にします。# systemctl disable cups
アクティブなサービスを確認するには、次のコマンドを実行します。
$ systemctl list-units | grep service
2.6. FIPS モードが有効な RHEL 8 システムのインストール
FIPS (Federal Information Processing Standard) Publication 140-2 による暗号化モジュールの自己チェックを有効にするには、FIPS モードで RHEL 8 を操作する必要があります。そのためには、以下を行います。
- FIPS モードでのインストールの開始
- インストール後に FIPS モードにシステムを切り替えます。
デプロイ済みのシステムへの変換に関連するシステムコンプライアンスの暗号鍵資料の再生成や再評価を回避するために、Red Hat は FIPS モードでインストールを開始することを推奨します。
2.6.1. FIPS (Federal Information Processing Standard)
連邦情報処理標準 (FIPS) 140-2 は、暗号化モジュールの品質を検証する米国政府および業界の作業グループにより開発されたコンピューターセキュリティー標準です。NIST Computer Security Resource Center で公式の FIPS の刊行物を参照してください。
FIPS 140-2 標準は、暗号化ツールがアルゴリズムを正しく実装できるようにします。そのメカニズムの 1 つがランタイムのセルフチェックです。FIPS 標準の詳細とその他の仕様については、FIPS PUB 140-2 の完全な FIPS 140-2 規格を参照してください。
コンプライアンスの要件については、「Red Hat Government Standards」ページを参照してください。
2.6.2. FIPS モードが有効なシステムのインストール
FIPS (Federal Information Processing Standard) Publication 140-2 による暗号モジュールの自己チェックを有効にするには、システムのインストール時に FIPS モードを有効にします。
Red Hat は、後で FIPS モードを有効にするのではなく、FIPS モードを有効にして Red Hat Enterprise Linux 8 をインストールすることを推奨します。インストール時に FIPS モードを有効にすると、システムは FIPS で承認されるアルゴリズムと継続的な監視テストですべてのキーを生成するようになります。
手順
システムのインストール時に
fips=1
オプションをカーネルコマンドラインに追加します。ソフトウェアの選択段階で、サードパーティーのソフトウェアをインストールしないでください。
インストール後に、システムは FIPS モードで自動的に起動します。
検証手順
システムが起動したら、FIPS モードが有効になっていることを確認します。
$ fips-mode-setup --check FIPS mode is enabled.
関連情報
- 起動オプションの編集 方法は、『高度な RHEL インストールの実行』の「起動オプションの編集」セクションを参照してください。
2.6.3. 関連情報
第3章 システム全体の暗号化ポリシーの使用
暗号ポリシーは、コア暗号化サブシステムを構成するシステムコンポーネントで、TLS、IPSec、SSH、DNSSec、および Kerberos の各プロトコルに対応します。これにより、管理者が選択できる小規模セットのポリシーを提供します。
3.1. システム全体の暗号化ポリシー
システム全体のポリシーを設定すると、RHEL のアプリケーションはそのポリシーに従い、ポリシーを満たしていないアルゴリズムやプロトコルを使用するように明示的に要求されない限り、その使用を拒否します。つまり、システムが提供した設定で実行する際に、デフォルトのアプリケーションの挙動にポリシーを適用しますが、必要な場合は上書きできます。
Red Hat Enterprise Linux 8 には、以下のポリシーレベルが含まれます。
| デフォルトのシステム全体の暗号化ポリシーレベルで、現在の脅威モデルに対して安全なものです。TLS プロトコルの 1.2 と 1.3、IKEv2 プロトコル、および SSH2 プロトコルが使用できます。RSA 鍵と Diffie-Hellman パラメーターは長さが 2048 ビット以上であれば許容されます。 |
|
このポリシーは、Red Hat Enterprise Linux 5 以前のリリースとの互換性を最大化しますが、攻撃領域が大きくなるため脆弱になります。 |
| 近い将来の攻撃に耐えられると考えられている保守的なセキュリティーレベルです。このレベルは、署名アルゴリズムに SHA-1 の使用を許可しません。RSA 鍵と Diffie-Hellman パラメーターは、ビット長が 3072 以上だと許可されます。 |
|
FIPS140-2 要件に準拠するポリシールールです。これは、 |
カスタマーポータル API の証明書が使用する暗号化キーは FUTURE
のシステム全体の暗号化ポリシーが定義する要件を満たさないので、現時点で redhat-support-tool
ユーティリティーは、このポリシーレベルでは機能しません。
この問題を回避するには、カスタマーポータル API への接続中に DEFAULT
暗号化ポリシーを使用します。
ポリシーレベルで許可されていると記載されている特定のアルゴリズムと暗号は、アプリケーションがそれに対応している場合に限り使用できます。
暗号化ポリシーを管理するツール
現在のシステム全体の暗号化ポリシーを表示または変更するには、update-crypto-policies
ツールを使用します。以下に例を示します。
$ update-crypto-policies --show DEFAULT # update-crypto-policies --set FUTURE Setting system policy to FUTURE
暗号化ポリシーの変更を確実に適用するには、システムを再起動します。
安全ではない暗号スイートおよびプロトコルを削除した、強力な暗号デフォルト
以下の一覧には、RHEL 8 のコア暗号化ライブラリーから削除された暗号スイートおよびプロトコルが含まれます。このアプリケーションはソースには存在しないか、またはビルド時にサポートを無効にしているため、アプリケーションは使用できません。
- DES (RHEL 7 以降)
- すべてのエクスポートグレードの暗号化スイート (RHEL 7 以降)
- 署名内の MD5 (RHEL 7 以降)
- SSLv2 (RHEL 7 以降)
- SSLv3 (RHEL 8 以降)
- 224 ビットより小さいすべての ECC 曲線 (RHEL 6 以降)
- すべてのバイナリーフィールドの ECC 曲線 (RHEL 6 以降)
すべてのポリシーレベルで無効になっている暗号スイートおよびプロトコル
以下の暗号スイートおよびプロトコルは、すべての暗号化ポリシーレベルで無効になっています。これは、各アプリケーションで明示的に有効にした場合に限り利用可能にできます。
- パラメーターが 1024 ビットより小さい DH
- 鍵のサイズが 1024 ビットより小さい RSA
- Camellia
- ARIA
- SEED
- IDEA
- 完全性のみの暗号スイート
- SHA-384 HMAC を使用した TLS CBC モード暗号化スイート
- AES-CCM8
- TLS 1.3 と互換性がないすべての ECC 曲線 (secp256k1 を含む)
- IKEv1 (RHEL 8 以降)
暗号ポリシーレベルで有効な暗号スイートおよびプロトコル
次の表は、暗号ポリシーの各レベルで有効な暗号化スイートおよびプロトコルを示しています。
LEGACY | DEFAULT | FIPS | FUTURE | |
---|---|---|---|---|
IKEv1 | いいえ | いいえ | いいえ | いいえ |
3DES | はい | いいえ | いいえ | いいえ |
RC4 | はい | いいえ | いいえ | いいえ |
DH | 最低 1024 ビット | 最低 2048 ビット | 最低 2048 ビット | 最低 3072 ビット |
RSA | 最低 1024 ビット | 最低 2048 ビット | 最低 2048 ビット | 最低 3072 ビット |
DSA | はい | いいえ | いいえ | いいえ |
TLS v1.0 | はい | いいえ | いいえ | いいえ |
TLS v1.1 | はい | いいえ | いいえ | いいえ |
デジタル署名における SHA-1 | はい | はい | いいえ | いいえ |
CBC モード暗号 | はい | はい | はい | いいえ |
256 ビットより小さい鍵を持つ対称暗号 | はい | はい | はい | いいえ |
証明書における SHA-1 および SHA-224 の署名 | はい | はい | はい | いいえ |
関連情報
-
詳細は、
update-crypto-policies(8)
の man ページを参照してください。
3.2. システム全体の暗号化ポリシーを、以前のリリースと互換性のあるモードに切り替え
Red Hat Enterprise Linux 8 におけるデフォルトのシステム全体の暗号化ポリシーでは、現在は古くて安全ではないプロトコルは許可されません。Red Hat Enterprise Linux 5 およびそれ以前のリリースとの互換性が必要な場合には、安全でない LEGACY
ポリシーレベルを利用できます。
LEGACY
ポリシーレベルに設定すると、システムおよびアプリケーションの安全性が低下します。
手順
システム全体の暗号化ポリシーを
LEGACY
レベルに切り替えるには、root
で以下のコマンドを実行します。# update-crypto-policies --set LEGACY Setting system policy to LEGACY
関連情報
-
利用可能な暗号化ポリシーのレベルは、
update-crypto-policies(8)
の man ページを参照してください。
3.3. FIPS モードへのシステムの切り替え
システム全体の暗号化ポリシーには、連邦情報処理規格 (FIPS) 公開文書 140-2 の要件に準拠した暗号化モジュールのセルフチェックを有効にするポリシーレベルが含まれます。FIPS モードを有効または無効にする fips-mode-setup
ツールは、内部的に FIPS
のシステム全体の暗号化ポリシーレベルを使用します。
Red Hat は、後で FIPS モードを有効にするのではなく、FIPS モードを有効にして Red Hat Enterprise Linux 8 をインストールすることを推奨します。インストール時に FIPS モードを有効にすると、システムは FIPS で承認されるアルゴリズムと継続的な監視テストですべてのキーを生成するようになります。
手順
RHEL 8 で FIPS モードにシステムを切り替えるには、以下のコマンドを実行します。
# fips-mode-setup --enable Setting system policy to FIPS FIPS mode will be enabled. Please reboot the system for the setting to take effect.
システムを再起動して、カーネルを FIPS モードに切り替えます。
# reboot
検証手順
システムが再起動したら、FIPS モードの現在の状態を確認できます。
# fips-mode-setup --check FIPS mode is enabled.
関連情報
-
fips-mode-setup(8)
の man ページ - List of RHEL 8 applications using cryptography that are not compliant with FIPS 140-2
- FIPS 140-2 の詳細は、National Institute of Standards and Technology (NIST) の Web サイトの「Security Requirements for Cryptographic Modules」を参照してください。
3.4. コンテナーでの FIPS モードの有効化
コンテナー内の連邦情報処理規格 (FIPS) 140-2 の要件に従って暗号モジュールの自己チェックを有効にするには、以下を行います。
前提条件
- ホストシステムは、最初に FIPS モードで切り替える必要があります。「FIPS モードへのシステムの切り替え」を参照してください。
手順
-
ホストからコンテナーに
/etc/system-fips
ファイルをマウントします。 コンテナーで FIPS 暗号化ポリシーレベルを設定します。
$ update-crypto-policies --set FIPS
RHEL 8.2 では、FIPS モードにコンテナーを切り替える代替方法が導入されました。コンテナーでは以下のコマンドのみを使用する必要があります。
# mount --bind /usr/share/crypto-policies/back-ends/FIPS /etc/crypto-policies/back-ends
RHEL 8 では、コンテナーで fips-mode-setup
コマンドが正しく機能せず、このシナリオでこのコマンドを使用して FIPS モードを有効にしたり確認することができません。
3.5. List of RHEL applications using cryptography that is not compliant with FIPS 140-2
コア暗号化コンポーネントでは、FIPS 140-2 などの関連する暗号化証明書すべてを渡して RHEL システム全体の暗号化ポリシーにも準拠することが保証されているので、Red Hat はこのコンポーネントからライブラリーを使用することを推奨します。
RHEL 8 コア暗号化コンポーネントの概要、このコンポーネントの選択方法、オペレーティングシステムへの統合方法、ハードウェアセキュリティーモジュールおよびスマートカードのサポート方法、暗号化による認定の適用方法の概要は、「RHEL 8 コア暗号化コンポーネント」を参照してください。
以下の表に加えて、一部の RHEL 8 Z-stream リリース (例: 8.1.1) では Firefox ブラウザーパッケージが更新され、別の NSS 暗号化ライブラリーが含まれています。このように、Red Hat では、パッチリリースでこのような詳細レベルのコンポーネントをリベースするなどの混乱を回避できればと考えています。そのため、この Firefox パッケージは FIPS 140-2 検証モジュールを使用しません。
表3.1 List of RHEL 8 applications using cryptography that is not compliant with FIPS 140-2
アプリケーション | 詳細 |
---|---|
FreeRADIUS | MD5 を使用する RADIUS プロトコル |
ghostscript | ドキュメントを暗号化/復号化するための独自の暗号化 (MD5、RC4、SHA-2、AES) |
ipxe | TLS をコンパイルする暗号化スタック。ただし使用されません。 |
java-1.8.0-openjdk | 完全な暗号化スタック[a] |
libica | CPACF 命令から RSA や ECDH などのさまざまなアルゴリズムのソフトウェアフォールバック |
OVMF (UEFI ファームウェア)、Edk2、shim | 完全な暗号スタック (OpenSSL ライブラリーの埋め込みコピー) |
perl-Digest-HMAC | HMAC、HMAC-SHA1、HMAC-MD5 |
perl-Digest-SHA | SHA-1、SHA-224、… |
pidgin | DES、RC4 |
samba[b] | AES、DES、RC4 |
valgrind | AES、ハッシュ[c] |
[a]
RHEL 8.1 の java-1.8.0-openjdk では、FIPS に準拠するように追加の手動設定が必要になります。
[b]
RHEL 8.3 以降、samba は FIPS 準拠の暗号を使用します。
[c]
AES-NI などのソフトウェア/ハードウェアオフロード操作に再実装します。
|
3.6. システム全体の暗号化ポリシーに従わないようにアプリケーションを除外
アプリケーションで使用される暗号化関連の設定をカスタマイズする必要がある場合は、サポートされる暗号スイートとプロトコルをアプリケーションで直接設定することが推奨されます。
/etc/crypto-policies/back-ends
ディレクトリーからアプリケーション関連のシンボリックリンクを削除することもできます。カスタマイズした暗号化設定に置き換えることもできます。この設定により、除外されたバックエンドを使用するアプリケーションに対するシステム全体の暗号化ポリシーが使用できなくなります。この修正は、Red Hat ではサポートされていません。
3.6.1. システム全体の暗号化ポリシーを除外する例
wget
wget
ネットワークダウンローダーで使用される暗号化設定をカスタマイズするには、--secure-protocol
オプションおよび --ciphers
オプションを使用します。以下に例を示します。
$ wget --secure-protocol=TLSv1_1 --ciphers="SECURE128" https://example.com
詳細は、wget(1)
の man ページの HTTPS (SSL/TLS) Options のセクションを参照してください。
curl
curl
ツールで使用する暗号を指定するには、--ciphers
オプションを使用して、その値に、コロンで区切った暗号化のリストを指定します。以下に例を示します。
$ curl https://example.com --ciphers '@SECLEVEL=0:DES-CBC3-SHA:RSA-DES-CBC3-SHA'
詳細は、curl(1)
の man ページを参照してください。
Firefox
Web ブラウザーの Firefox
でシステム全体の暗号化ポリシーをオプトアウトできない場合でも、Firefox の設定エディターで、対応している暗号と TLS バージョンをさらに詳細に制限できます。アドレスバーに about:config
と入力し、必要に応じて security.tls.version.min
の値を変更します。たとえば、security.tls.version.min
を 1
に設定すると、最低でも TLS 1.0 が必要になり、security.tls.version.min 2
が TLS 1.1 になります。
OpenSSH
OpenSSH
サーバーに対するシステム全体の暗号化ポリシーを除外するには、/etc/sysconfig/sshd
ファイルの CRYPTO_POLICY=
変数行のコメントを除外します。この変更後、/etc/ssh/sshd_config
ファイルの Ciphers
セクション、MACs
セクション、KexAlgoritms
セクション、および GSSAPIKexAlgorithms
セクションで指定した値は上書きされません。詳細は、sshd_config(5)
の man ページを参照してください。
Libreswan
詳細は、『ネットワークのセキュリティー保護』の「システム全体の暗号化ポリシーをオプトアウトする IPsec 接続の設定」を参照してください。
関連情報
-
詳細は、
update-crypto-policies(8)
の man ページを参照してください。
3.7. ポリシー修飾子を使用したシステム全体の暗号化ポリシーのカスタマイズ
以下の手順に従って、システム全体の暗号化ポリシーレベルまたは完全なカスタムポリシーの特定アルゴリズムまたはプロトコルを調整します。
システム全体の暗号化ポリシーのカスタマイズは、RHEL 8.2 から利用できます。
手順
/etc/crypto-policies/policies/modules/
ディレクトリーをチェックアウトします。# cd /etc/crypto-policies/policies/modules/
以下のように、調整用のポリシーモジュールを作成します。
# touch MYCRYPTO1.pmod # touch NO-CAMELLIA.pmod
重要ポリシーモジュールのファイル名には大文字を使用します。
任意のテキストエディターでポリシーモジュールを開き、システム全体の暗号化ポリシーを変更するオプションを挿入します。次に例を示します。
# vi MYCRYPTO1.pmod
sha1_in_certs = 0 min_rsa_size = 3072
# vi NO-CAMELLIA.pmod
cipher = -CAMELLIA-256-GCM -CAMELLIA-256-CBC -CAMELLIA-128-GCM -CAMELLIA-128-CBC
- 変更をモジュールファイルに保存します。
ポリシーの調整を、システム全体の暗号化ポリシーレベル
DEFAULT
に適用します。# update-crypto-policies --set DEFAULT:MYCRYPTO1:NO-CAMELLIA
暗号化設定を実行中のサービスやアプリケーションで有効にするには、システムを再起動します。
# reboot
関連情報
-
詳細は、
update-crypto-policies (8)
の man ページのCustom Policies
セクションと、crypto-policies(7)
のCrypto Policy Definition Format
セクションを参照してください。 - 「How to customize crypto policies in RHEL 8.2」 の記事では、システム全体の暗号化ポリシーのカスタマイズ例を示します。
3.8. システム全体の暗号化ポリシーをカスタマイズして SHA-1 を無効化
SHA-1 ハッシュ関数は設計が本質的に弱く、暗号解析法が進化したことで、このハッシュ関数は攻撃を受けやすくなりました。デフォルトでは、RHEL 8 は SHA-1 を使用指定内にも拘らず、一部のサードパーティーアプリケーション (公開署名など) は SHA-1 を使用します。システムの署名アルゴリズムで SHA-1 の使用を無効にするには、NO-SHA1
ポリシーモジュールを使用できます。
SHA-1 を無効にするモジュールは、RHEL 8.3 で利用できます。システム全体の暗号化ポリシーのカスタマイズは、RHEL 8.2 から利用できます。
手順
ポリシーの調整を、システム全体の暗号化ポリシーレベル
DEFAULT
に適用します。# update-crypto-policies --set DEFAULT:NO-SHA1
暗号化設定を実行中のサービスやアプリケーションで有効にするには、システムを再起動します。
# reboot
関連情報
-
詳細は、
update-crypto-policies (8)
の man ページのCustom Policies
セクションと、crypto-policies(7)
のCrypto Policy Definition Format
セクションを参照してください。 - 「How to customize crypto policies in RHEL 8.2」 のブログ投稿では、システム全体の暗号化ポリシーのカスタマイズ例を示します。
3.9. システム全体のカスタム暗号化ポリシーの作成および設定
以下の手順は、完全なポリシーファイルでシステム全体の暗号化ポリシーをカスタマイズする方法を示しています。
システム全体の暗号化ポリシーのカスタマイズは、RHEL 8.2 から利用できます。
手順
カスタマイズのポリシーファイルを作成します。
# cd /etc/crypto-policies/policies/ # touch MYPOLICY.pol
または、定義されている 4 つのポリシーレベルのいずれかをコピーします。
# cp /usr/share/crypto-policies/policies/DEFAULT.pol /etc/crypto-policies/policies/MYPOLICY.pol
必要に応じて、テキストエディターでファイルを編集します。以下のようにしてカスタム暗号化ポリシーを使用します。
# vi /etc/crypto-policies/policies/MYPOLICY.pol
システム全体の暗号化ポリシーをカスタムレベルに切り替えます。
# update-crypto-policies --set MYPOLICY
暗号化設定を実行中のサービスやアプリケーションで有効にするには、システムを再起動します。
# reboot
関連情報
-
詳細は、
update-crypto-policies (8)
の man ページのCustom Policies
セクションと、crypto-policies(7)
のCrypto Policy Definition Format
セクションを参照してください。 - 「How to customize crypto policies in RHEL 8.2」 の記事では、システム全体の暗号化ポリシーのカスタマイズ例を示します。
第4章 PKCS #11 で暗号化ハードウェアを使用するようにアプリケーションを設定
スマートカードや、エンドユーザー認証用の暗号化トークン、サーバーアプリケーション用のハードウェアセキュリティーモジュール (HSM) など、専用の暗号化デバイスで秘密情報の一部を分離することで、セキュリティー層が追加されます。Red Hat Enterprise Linux 8 では、PKCS #11 API を使用した暗号化ハードウェアへの対応がアプリケーション間で統一され、暗号ハードウェアでの秘密の分離が複雑なタスクではなくなりました。
4.1. PKCS #11 による暗号化ハードウェアへの対応
PKCS #11 (Public-Key Cryptography Standard) は、暗号化情報を保持する暗号化デバイスに、アプリケーションプログラミングインターフェース (API) を定義し、暗号化機能を実行します。このデバイスはトークンと呼ばれ、ハードウェアまたはソフトウェアの形式で実装できます。
PKCS #11 トークンには、証明書、データオブジェクト、公開鍵、秘密鍵、または秘密鍵を含むさまざまなオブジェクトタイプを保存できます。このオブジェクトは、PKCS #11 の URI スキームにより一意に識別できます。
PKCS #11 の URI は、オブジェクト属性に従って、PKCS #11 モジュールで特定のオブジェクトを識別する標準的な方法です。これにより、URI の形式で、すべてのライブラリーとアプリケーションを同じ設定文字列で設定できます。
Red Hat Enterprise Linux 8 では、デフォルトでスマートカード用に OpenSC PKCS #11 ドライバーが提供されています。ただし、Red Hat Enterprise Linux では、ハードウェアトークンと HSM に独自の PKCS #11 モジュールがあります。この PKCS #11 モジュールは p11-kit
ツールで登録できます。これは、システムの登録済みスマートカードドライバーにおけるラッパーとして機能します。
システムで独自の PKCS #11 モジュールを有効にするには、新しいテキストファイルを /etc/pkcs11/modules/
ディレクトリーに追加します。
/etc/pkcs11/modules/
ディレクトリーに新しいテキストファイルを作成すると、独自の PKCS #11 モジュールをシステムに追加できます。たとえば、p11-kit
の OpenSC 設定ファイルは、以下のようになります。
$ cat /usr/share/p11-kit/modules/opensc.module
module: opensc-pkcs11.so
4.2. スマートカードに保存された SSH 鍵の使用
Red Hat Enterprise Linux 8 では、OpenSSH クライアントでスマートカードに保存されている RSA 鍵および ECDSA 鍵を使用できるようになりました。この手順に従って、パスワードの代わりにスマートカードを使用した認証を有効にします。
前提条件
-
クライアントで、
opensc
パッケージをインストールして、pcscd
サービスを実行している。
手順
PKCS #11 の URI を含む OpenSC PKCS #11 モジュールが提供する鍵の一覧を表示し、その出力を keys.pub ファイルに保存します。
$ ssh-keygen -D pkcs11: > keys.pub $ ssh-keygen -D pkcs11: ssh-rsa AAAAB3NzaC1yc2E...KKZMzcQZzx pkcs11:id=%02;object=SIGN%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so ecdsa-sha2-nistp256 AAA...J0hkYnnsM= pkcs11:id=%01;object=PIV%20AUTH%20pubkey;token=SSH%20key;manufacturer=piv_II?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so
リモートサーバー (example.com) でスマートカードを使用した認証を有効にするには、公開鍵をリモートサーバーに転送します。前の手順で作成された keys.pub で
ssh-copy-id
コマンドを使用します。$ ssh-copy-id -f -i keys.pub username@example.com
手順 1 の
ssh-keygen -D
コマンドの出力にある ECDSA 鍵を使用して example.com に接続するには、鍵を一意に参照する URI のサブセットのみを使用できます。以下に例を示します。$ ssh -i "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" example.com Enter PIN for 'SSH key': [example.com] $
~/.ssh/config
ファイルで同じ URI 文字列を使用して、設定を永続化できます。$ cat ~/.ssh/config IdentityFile "pkcs11:id=%01?module-path=/usr/lib64/pkcs11/opensc-pkcs11.so" $ ssh example.com Enter PIN for 'SSH key': [example.com] $
OpenSSH は
p11-kit-proxy
ラッパーを使用し、OpenSC PKCS #11 モジュールが PKCS#11 キットに登録されているため、以前のコマンドを簡素化できます。$ ssh -i "pkcs11:id=%01" example.com Enter PIN for 'SSH key': [example.com] $
PKCS #11 の URI の id=
の部分を飛ばすと、OpenSSH が、プロキシーモジュールで利用可能な鍵をすべて読み込みます。これにより、必要な入力の量を減らすことができます。
$ ssh -i pkcs11: example.com
Enter PIN for 'SSH key':
[example.com] $
関連情報
- Fedora 28:Better smart card support in OpenSSH
-
p11-kit(8)
の man ページ -
ssh(1)
の man ページ -
ssh-keygen(1)
の man ページ -
opensc.conf(5)
の man ページ -
pcscd(8)
の man ページ
4.3. Apache および Nginx で秘密鍵を保護する HSM の使用
HTTP サーバーの Apache
および Nginx
は、ハードウェアセキュリティーモジュール (HSM) に保存されている秘密鍵と連携できます。これにより、鍵の漏えいや中間者攻撃を防ぐことができます。通常、これを行うには、ビジーなサーバーに高パフォーマンスの HSM が必要になります。
Apache
HTTP サーバー
HTTPS プロトコルの形式でセキュアな通信を行うために、Apache
HTTP サーバー (httpd
) は OpenSSL ライブラリーを使用します。OpenSSL は、PKCS #11 にネイティブに対応しません。HSM を使用するには、エンジンインターフェースを介して PKCS #11 モジュールへのアクセスを提供する openssl-pkcs11
パッケージをインストールする必要があります。通常のファイル名ではなく PKCS #11 の URI を使用すると、/etc/httpd/conf.d/ssl.conf
設定ファイルでサーバーの鍵と証明書を指定できます。以下に例を示します。
SSLCertificateFile "pkcs11:id=%01;token=softhsm;type=cert" SSLCertificateKeyFile "pkcs11:id=%01;token=softhsm;type=private?pin-value=111111"
httpd-manual
パッケージをインストールして、TLS 設定を含む Apache
HTTP サーバーの完全ドキュメントを取得します。/etc/httpd/conf.d/ssl.conf
設定ファイルで利用可能なディレクティブの詳細は、/usr/share/httpd/manual/mod/mod_ssl.html を参照してください。
Nginx
HTTP およびプロキシーサーバー
Nginx
は暗号化操作に OpenSSL を使用するため、PKCS #11 への対応は openssl-pkcs11
エンジンを介して行う必要があります。Nginx
は現在、HSM からの秘密鍵の読み込みのみに対応します。また、証明書は通常のファイルとして個別に提供する必要があります。/etc/nginx/nginx.conf
設定ファイルの server
セクションで ssl_certificate
オプションおよび ssl_certificate_key
オプションを変更します。
ssl_certificate /path/to/cert.pem ssl_certificate_key "engine:pkcs11:pkcs11:token=softhsm;id=%01;type=private?pin-value=111111";
Nginx
設定ファイルの PKCS #11 URI にプレフィックス engine:pkcs11:
が必要なことに注意してください。これは、他の pkcs11
プレフィックスがエンジン名を参照するためです。
4.4. スマートカードから証明書を使用して認証するアプリケーションの設定
wget
ネットワークダウンローダーでは、ローカルに保存された秘密鍵へのパスの代わりに PKCS #11 の URI を指定できるため、安全に保存された秘密鍵と証明書を必要とするタスク用のスクリプトの作成が容易になります。以下に例を示します。$ wget --private-key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --certificate 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
詳細は、man ページの
wget(1)
を参照してください。curl
ツールで使用する PKCS #11 の URI は、以下のように指定します。$ curl --key 'pkcs11:token=softhsm;id=%01;type=private?pin-value=111111' --cert 'pkcs11:token=softhsm;id=%01;type=cert' https://example.com/
詳細は、
curl(1)
の man ページを参照してください。-
Web ブラウザーの
Firefox
は、p11-kit-proxy
モジュールを自動的に読み込みます。つまり、システムで対応しているすべてのスマートカードが自動的に検出されます。TLS クライアント認証を使用した場合、その他に必要な設定はありません。また、サーバーがスマートカードを要求する際に、スマートカードの鍵が自動的に使用されます。
カスタムアプリケーションで PKCS #11 の URI の使用
アプリケーションが GnuTLS
ライブラリーまたは NSS
ライブラリーを使用する場合、PKCS #11 の URI は PKCS #11 の組み込みサポートで保証されます。また、OpenSSL
ライブラリーに依存するアプリケーションは、openssl-pkcs11
エンジンが生成する暗号化ハードウェアモジュールにアクセスできます。
アプリケーションでスマートカードの秘密鍵を使用する必要があり、NSS
、GnuTLS
、または OpenSSL
は使用しない場合は、p11-kit
を使用して PKCS #11 モジュールの登録を実装します。
詳細は、p11-kit (8)
の man ページを参照してください。
第6章 設定コンプライアンスおよび脆弱性スキャンの開始
コンプライアンス監査は、指定したオブジェクトが、コンプライアンスポリシーに指定されているすべてのルールに従っているかどうかを判断するプロセスです。コンプライアンスポリシーは、コンピューティング環境で使用される必要な設定を指定するセキュリティー専門家が定義します。これは多くの場合は、チェックリストの形式を取ります。
コンプライアンスポリシーは組織により大幅に異なることがあり、同一組織内でもシステムが異なるとポリシーが異なる可能性があります。ポリシーは、各システムの目的や、組織におけるシステム重要性により異なります。カスタマイズしたソフトウェア設定や導入の特徴によっても、カスタマイズしたポリシーのチェックリストが必要になってきます。
6.1. RHEL における設定コンプライアンスツール
Red Hat Enterprise Linux は、コンプライアンス監査を完全に自動化できるツールを提供します。このツールは SCAP (Security Content Automation Protocol) 規格に基づいており、コンプライアンスポリシーの自動化に合わせるように設計されています。
-
SCAP Workbench -
scap-workbench
グラフィカルユーティリティーは、1 台のローカルシステムまたはリモートシステムで構成スキャンと脆弱性スキャンを実行するように設計されています。これらのスキャンと評価に基づくセキュリティーレポートの生成にも使用できます。 -
OpenSCAP -
OpenSCAP
ライブラリーは、付随するoscap
コマンドラインユーティリティーとともに、ローカルシステムで構成スキャンと脆弱性スキャンを実行するように設計されています。これにより、設定コンプライアンスのコンテンツを検証し、スキャンおよび評価に基づいてレポートおよびガイドを生成します。 -
SCAP Security Guide (SSG) -
scap-security-guide
パッケージは、Linux システム向けの最新のセキュリティーポリシーコレクションを提供します。このガイダンスは、セキュリティー強化に関する実践的なアドバイスのカタログから構成されます (該当する場合は、法規制要件へのリンクが含まれます)。このプロジェクトは、一般的なポリシー要件と特定の実装ガイドラインとの間にあるギャップを埋めることを目的としています。 -
Script Check Engine (SCE) - SCE は SCAP プロトコルの拡張機能であり、この機能を使用すると管理者が Bash、Python、Ruby などのスクリプト言語を使用してセキュリティーコンテンツを記述できるようになります。SCE 拡張機能は、
openscap-engine-sce
パッケージで提供されます。SCE 自体は SCAP 標準規格の一部ではありません。
複数のリモートシステムで自動コンプライアンス監査を実行する必要がある場合は、Red Hat Satellite 用の OpenSCAP ソリューションを利用できます。
関連情報
-
oscap(8)
-oscap
コマンドラインユーティリティーの man ページでは、サポートされるすべてのオプションとその使用方法が説明されます。 - Red Hat Security Demos:Creating Customized Security Policy Content to Automate Security Compliance - Red Hat Enterprise Linux に含まれるツールを使用してセキュリティーコンプライアンスを自動化し、業界標準のセキュリティーポリシーとカスタムセキュリティーポリシーの両方に準拠するためのハンズオンラボ。トレーニングや、このラボ演習へのアクセスを希望する場合は、Red Hat アカウントチームにお問い合わせください。
- Red Hat Security Demos:Defend Yourself with RHEL Security Technologies - OpenSCAP を含む Red Hat Enterprise Linux で利用可能な主要なセキュリティー技術を使用して、RHEL システムの全レベルでセキュリティーを実装する方法を学ぶためのハンズオンラボ。トレーニングや、このラボ演習へのアクセスを希望する場合は、Red Hat アカウントチームにお問い合わせください。
-
scap-workbench(8)
-SCAP Workbench
アプリケーションの man ページでは、このアプリケーションの基本情報と、SCAP コンテンツの潜在的なソースへのリンクが提供されます。 -
scap-security-guide(8)
-scap-security-guide
プロジェクトの man ページでは、利用可能な SCAP セキュリティープロファイルに関するドキュメントが提供されます。OpenSCAP ユーティリティーを使用して提供されたベンチマークの使用例も提供されてます。 - Red Hat Satellite で OpenSCAP を使用する方法は『Red Hat Satellite の管理』の「セキュリティーコンプライアンスの管理」を参照してください。
6.2. 脆弱性スキャン
6.2.1. Red Hat Security Advisories OVAL フィード
Red Hat Enterprise Linux のセキュリティー監査機能は、標準規格「セキュリティー設定共通化手順 (Security Content Automation Protocol (SCAP))」を基にしています。SCAP は、自動化された設定、脆弱性およびパッチの確認、技術的な制御コンプライアンスアクティビティー、およびセキュリティーの測定に対応している多目的な仕様のフレームワークです。
SCAP 仕様は、スキャナーまたはポリシーエディターの実装が義務付けられていなくても、セキュリティーコンテンツの形式がよく知られて標準化されているエコシステムを作成します。これにより、組織は、採用しているセキュリティーベンダーの数に関係なく、セキュリティポリシー (SCAP コンテンツ) を構築するのは一度で済みます。
セキュリティー検査言語 OVAL (Open Vulnerability Assessment Language) は、SCAP に不可欠で最も古いコンポーネントです。その他のツールやカスタマイズされたスクリプトとは異なり、OVAL は、宣言型でリソースが必要な状態を記述します。OVAL コードは、スキャナーと呼ばれる OVAL インタープリターツールを使用して直接実行されることは決してありません。OVAL が宣言型であるため、評価されるシステムの状態が偶然修正されることはありません。
他のすべての SCAP コンポーネントと同様に、OVAL は XML に基づいています。SCAP 標準規格は、いくつかのドキュメント形式を定義します。この形式にはそれぞれ異なる種類の情報が記載され、異なる目的に使用されます。
Red Hat 製品セキュリティー を使用すると、Red Hat 製品をお使いのお客様に影響を及ぼすセキュリティー問題をすべて追跡して調査します。Red Hat カスタマーポータルで簡潔なパッチやセキュリティーアドバイザリーを適時提供します。Red Hat は OVAL パッチ定義を作成してサポートし、マシンが判読可能なセキュリティーアドバイザリーを提供します。
プラットフォーム、バージョン、およびその他の要因が異なるため、Red Hat 製品セキュリティーによる脆弱性の重大度定性評価は、サードパーティーが提供する Common Vulnerability Scoring System (CHC) のベースライン評価と完全に一致しているわけではありません。したがって、サードパーティーが提供する定義ではなく、RHSA OVAL 定義を使用することが推奨されます。
各 RHSA OVAL 定義 は完全なパッケージとして利用でき、新しいセキュリティーアドバイザリーが Red Hat カスタマーポータルで利用可能になってから 1 時間以内に更新されます。
各 OVAL パッチ定義は、Red Hat セキュリティーアドバイザリー (RHSA) と 1 対 1 にマッピングしています。RHSA には複数の脆弱性に対する修正が含まれるため、各脆弱性は、共通脆弱性識別子 (Common Vulnerabilities and Exposures (CVE)) 名ごとに表示され、公開バグデータベースの該当箇所へのリンクが示されます。
RHSA OVAL 定義は、システムにインストールされている RPM パッケージで脆弱なバージョンを確認するように設計されています。この定義は拡張でき、パッケージが脆弱な設定で使用されているかどうかを見つけるなど、さらに確認できるようにすることができます。この定義は、Red Hat が提供するソフトウェアおよび更新に対応するように設計されています。サードパーティーソフトウェアのパッチ状態を検出するには、追加の定義が必要です。
コンテナーまたはコンテナーイメージのセキュリティー脆弱性をスキャンするには、「コンテナーおよびコンテナーイメージの脆弱性スキャン」を参照してください。
6.2.2. システムの脆弱性のスキャン
oscap
コマンドラインユーティリティーを使用すると、ローカルシステムのスキャン、設定コンプライアンスコンテンツの確認、ならびにスキャンおよび評価を基にしたレポートとガイドの生成が可能です。このユーティリティーは、OpenSCAP ライブラリーのフロントエンドとしてサービスを提供し、その機能を処理する SCAP コンテンツのタイプに基づいてモジュール (サブコマンド) にグループ化します。
前提条件
-
AppStream
リポジトリーが有効になっている。
手順
openscap-scanner
パッケージおよびbzip2
パッケージをインストールします。# yum install openscap-scanner bzip2
システムに最新 RHSA OVAL 定義をダウンロードします。
# wget -O - https://www.redhat.com/security/data/oval/v2/RHEL8/rhel-8.oval.xml.bz2 | bzip2 --decompress > rhel-8.oval.xml
システムの脆弱性をスキャンし、vulnerability.html ファイルに結果を保存します。
# oscap oval eval --report vulnerability.html rhel-8.oval.xml
検証手順
結果をブラウザーで確認します。以下に例を示します。
$ firefox vulnerability.html &
関連情報
-
man ページの
oscap(8)
- Red Hat OVAL definitions の一覧
6.2.3. リモートシステムの脆弱性のスキャン
SSH プロトコルで oscap-ssh
ツールを使用して、OpenSCAP スキャナーでリモートシステムの脆弱性を確認することもできます。
前提条件
-
AppStream
リポジトリーが有効になっている。 -
リモートシステムに
openscap-scanner
パッケージがインストールされている。 - リモートシステムで SSH サーバーが実行している。
手順
openscap-utils
パッケージおよびbzip2
パッケージをインストールします。# yum install openscap-utils bzip2
システムに最新 RHSA OVAL 定義をダウンロードします。
# wget -O - https://www.redhat.com/security/data/oval/v2/RHEL8/rhel-8.oval.xml.bz2 | bzip2 --decompress > rhel-8.oval.xml
脆弱性に対して、ホスト名 machine1、ポート 22 で実行する SSH、およびユーザー名 joesec でリモートシステムをスキャンし、結果を remote-vulnerability.html ファイルに保存します。
# oscap-ssh joesec@machine1 22 oval eval --report remote-vulnerability.html rhel-8.oval.xml
関連情報
-
man ページの
oscap-ssh(8)
- Red Hat OVAL definitions の一覧
6.3. 設定コンプライアンススキャン
6.3.1. RHEL 8 の設定コンプライアンス
設定コンプライアンススキャンを使用して、特定の組織で定義されているベースラインに準拠できます。たとえば、米国政府と協力している場合は、Operating System Protection Profile (OSPP) に準拠し、支払い処理業者の場合は Payment Card Industry Data Security Standard (PCI-DSS) に準拠しなければならない場合があります。設定コンプライアンススキャンを実行して、システムセキュリティーを強化することもできます。
Red Hat は、対象コンポーネント向けの Red Hat のベストプラクティスに従っているため、SCAP Security Guide パッケージで提供される Security Content Automation Protocol (SCAP) コンテンツに従うことを推奨します。
SCAP Security Guide パッケージは、SCAP 1.2 および SCAP 1.3 標準規格に準拠するコンテンツを提供します。openscap scanner
ユーティリティーは、SCAP Security Guide パッケージで提供される SCAP 1.2 および SCAP 1.3 コンテンツの両方と互換性があります。
設定コンプライアンススキャンを実行しても、システムが準拠しているとは限りません。
SCAP セキュリティーガイドスイートは、データストリームのドキュメント形式で、複数のプラットフォームのプロファイルを提供します。データストリームは、定義、ベンチマーク、プロファイル、および個々のルールが含まれるファイルです。各ルールでは、コンプライアンスの適用性と要件を指定します。RHEL 8 は、セキュリティーポリシーを扱う複数のプロファイルを提供します。Red Hat データストリームには、業界標準の他に、失敗したルールの修正に関する情報も含まれます。
コンプライアンススキャンリソースの構造
Data stream ├── xccdf | ├── benchmark | ├── profile | ├──rule | ├── xccdf | ├── oval reference ├── oval ├── ocil reference ├── ocil ├── cpe reference └── cpe └── remediation
このプロファイルは、OSPP (Operating System Protection Profile)、PCI-DSS (Payment Card Industry Data Security Standard) などのセキュリティーポリシーに基づく一連のルールです。これにより、セキュリティー標準規格に準拠するために、システムを自動で監査できます。
プロファイルを変更 (調整) して、パスワードの長さなどの特定のルールをカスタマイズできます。プロファイルの調整の詳細は「SCAP Workbench を使用したセキュリティープロファイルのカスタマイズ」を参照してください。
コンテナーまたはコンテナーイメージの設定コンプライアンスをスキャンするには「コンテナーおよびコンテナーイメージの脆弱性のスキャン」を参照してください。
6.3.2. OpenSCAP スキャン結果の例
システムのさまざまなプロパティーと、OpenSCAP スキャンに適用されるデータストリームおよびプロファイルによっては、ルールごとに固有の結果が生成されることがあります。以下は、考えられる結果のリストで、その意味を簡単に説明します。
表6.1 OpenSCAP スキャン結果の例
結果 | 説明 |
---|---|
Pass | スキャンでは、このルールとの競合が見つかりませんでした。 |
Fail | スキャンで、このルールとの競合が検出されました。 |
Not checked | OpenSCAP はこのルールの自動評価を実行しません。システムがこのルールに手動で準拠しているかどうかを確認してください。 |
Not applicable | このルールは、現在の設定には適用されません。 |
Not selected | このルールはプロファイルには含まれません。OpenSCAP はこのルールを評価せず、結果にこのようなルールは表示されません。 |
Error |
スキャンでエラーが発生しました。詳細は、 |
Unknown |
スキャンで予期しない状況が発生しました。詳細は、 |
6.3.3. 設定コンプライアンスのプロファイルの表示
スキャンまたは修復にプロファイルを使用することを決定する前に、その一覧を表示して oscap info
サブコマンドで詳しい説明を確認できます。
前提条件
-
openscap-scanner
パッケージおよびscap-security-guide
パッケージがインストールされている。
手順
SCAP Security Guide プロジェクトが提供するセキュリティーコンプライアンスプロファイルで利用可能なファイルをすべて表示します。
$ ls /usr/share/xml/scap/ssg/content/ ssg-firefox-cpe-dictionary.xml ssg-rhel6-ocil.xml ssg-firefox-cpe-oval.xml ssg-rhel6-oval.xml ... ssg-rhel6-ds-1.2.xml ssg-rhel8-oval.xml ssg-rhel8-ds.xml ssg-rhel8-xccdf.xml ...
oscap info
サブコマンドを使用して、選択したデータストリームに関する詳細情報を表示します。データストリームを含む XML ファイルは、名前に-ds
文字列で示されます。Profiles
セクションでは、利用可能なプロファイルと、その ID の一覧を確認できます。$ oscap info /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml ... Profiles: Title: PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 8 Id: xccdf_org.ssgproject.content_profile_pci-dss Title: OSPP - Protection Profile for General Purpose Operating Systems Id: xccdf_org.ssgproject.content_profile_ospp ...
データストリームファイルからプロファイルを選択し、選択したプロファイルに関する追加情報を表示します。そのためには、
oscap info
に--profile
オプションを指定した後に、直前のコマンドの出力で表示された ID の最後のセクションを指定します。たとえば、PCI-DSS プロファイルの ID はxccdf_org.ssgproject.content_profile_pci-dss
で、--profile
オプションの値はpci-dss
です。$ oscap info --profile pci-dss /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml ... Title: PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 8 Id: xccdf_org.ssgproject.content_profile_pci-dss Description: Ensures PCI-DSS v3.2.1 security configuration settings are applied. ...
関連情報
-
man ページの
scap-security-guide (8)
6.3.4. 特定のベースラインによる設定コンプライアンスの評価
システムが特定のベースラインに準拠しているかどうかを確認するには、次の手順に従います。
前提条件
-
openscap-scanner
パッケージおよびscap-security-guide
パッケージがインストールされている。 - システムが準拠する必要があるベースライン内のプロファイルの ID を知っている必要があります。ID を見つけるには、「設定コンプライアンスのプロファイルの表示」を参照してください。
手順
選択したプロファイルでそのシステムがどのように複雑であるかを評価し、スキャン内容を保存すると、以下のように HTML ファイル (report.html) に結果が表示されます。
$ sudo oscap xccdf eval --report report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
オプション:コンプライアンスに対して、ホスト名
machine1
、ポート22
で実行する SSH、およびユーザー名joesec
でリモートシステムをスキャンし、結果をremote-report.html
ファイルに保存します。$ oscap-ssh joesec@machine1 22 xccdf eval --report remote_report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
関連情報
-
scap-security-guide (8)
の man ページ -
file:///usr/share/doc/scap-security-guide/
ディレクトリーにインストールされているSCAP Security Guide
に関するドキュメント -
scap-security-guide-doc
パッケージでインストールされている「Guide to the Secure Configuration of Red Hat Enterprise Linux 8」
6.4. 特定のベースラインに合わせたシステムの修復
この手順を使用して、特定のベースラインに合わせて RHEL 8 システムを修正します。この例では、OSPP (Protection Profile for General Purpose Operating Systems) の保護プロファイルを使用します。
修正
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーを強化した修正で加えられた変更を元に戻す自動手段は提供していません。修正は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。
前提条件
-
RHEL 8 システムに、
scap-security-guide
パッケージがインストールされている。
手順
oscap
コマンドに--remediate
オプションを指定して使用します。$ sudo oscap xccdf eval --profile ospp --remediate /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
- システムを再起動します。
検証手順
システムの OSPP プロファイルへの準拠を評価し、スキャン結果を
ospp_report.html
ファイルに保存します。$ oscap xccdf eval --report ospp_report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
関連情報
-
man ページの
scap-security-guide(8)
およびoscap(8)
6.5. SSG Ansible Playbook での特定のベースラインに合わせたシステムの修正
この手順では、SCAP Security Guide プロジェクトの Ansible Playbook ファイルを使用して、特定のベースラインでシステムを修正します。この例では、OSPP (Protection Profile for General Purpose Operating Systems) の保護プロファイルを使用します。
修正
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーを強化した修正で加えられた変更を元に戻す自動手段は提供していません。修正は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。
前提条件
-
RHEL 8 システムに、
scap-security-guide
パッケージがインストールされている。 -
ansible
パッケージがインストールされている。詳細は、『Ansible インストールガイド』を参照してください。
手順
Ansible を使用して、OSPP に合わせてシステムを修正します。
# ansible-playbook -i localhost, -c local /usr/share/scap-security-guide/ansible/rhel8-playbook-ospp.yml
- システムを再起動します。
検証手順
システムの OSPP プロファイルへの準拠を評価し、スキャン結果を
ospp_report.html
ファイルに保存します。# oscap xccdf eval --profile ospp --report ospp_report.html /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
関連情報
-
man ページの
scap-security-guide(8)
およびoscap(8)
- Ansible ドキュメント
6.6. システムを特定のベースラインに合わせるための修復用 Ansible Playbook の作成
以下の手順に従って、必要な修復のみを含む Ansible Playbook を作成し、システムを特定のベースラインに合わせます。この例では、OSPP (Protection Profile for General Purpose Operating Systems) の保護プロファイルを使用します。この手順では、すでに対応済みの要件は含めずに、より小規模な Playbook を作成します。以下の手順に従うと、システムを変更せずに、後のアプリケーション用にファイルの準備を行うだけです。
前提条件
-
RHEL 8 システムに、
scap-security-guide
パッケージがインストールされている。
手順
システムをスキャンして結果を保存します。
# oscap xccdf eval --profile ospp --results ospp-results.xml /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
前の手順で生成されたファイルに基づいて Ansible Playbook を生成します。
# oscap xccdf generate fix --fix-type ansible --output ospp-remediations.yml ospp-results.xml
-
ospp-remediations.yml
ファイルには、手順 1 で実行されたスキャン中に失敗したルールの Ansible 修復が含まれています。この生成されたファイルを確認した後、ansible-playbook ospp-remediations.yml
コマンドで適用できます。
検証手順
-
お使いのテキストエディターで、手順 1 で実行したスキャンで失敗したルールが
ospp-remediations.yml
ファイルに含まれていることを確認します。
関連情報
-
man ページの
scap-security-guide(8)
およびoscap(8)
- Ansible ドキュメント
6.7. 後でアプリケーションを修復するための Bash スクリプトの作成
この手順を使用して、システムを PCI-DSS などのセキュリティープロファイルと調整する修正を含む Bash スクリプトを作成します。次の手順では、システムに変更を加えることなく、後のアプリケーション用にファイルを準備する方法を説明します。
前提条件
-
RHEL 8 システムに、
scap-security-guide
パッケージがインストールされている。
手順
oscap
コマンドを使用してシステムをスキャンし、結果を XML ファイルに保存します。以下の例では、oscap
はpci-dss
プロファイルに対してシステムを評価します。# oscap xccdf eval --profile pci-dss --results pci-dss-results.xml /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
前の手順で生成された結果ファイルに基づいて Bash スクリプトを生成します。
# oscap xccdf generate fix --profile pci-dss --fix-type bash --output pci-dss-remediations.sh pci-dss-results.xml
-
pci-dss-remediations.sh
ファイルには、手順 1 で実行されたスキャン中に失敗したルールの修復が含まれます。この生成されたファイルを確認したら、このファイルと同じディレクトリー内で./pci-dss-remediations.sh
コマンドを使用して適用できます。
検証手順
-
お使いのテキストエディターで、手順 1 で実行したスキャンで失敗したルールが
pci-dss-remediations.sh
ファイルに含まれていることを確認します。
関連情報
-
man ページの
scap-security-guide(8)
、oscap(8)
、およびbash(1)
6.8. SCAP Workbench を使用したカスタムプロファイルでシステムのスキャン
SCAP Workbench
(scap-workbench
) パッケージはグラフィカルユーティリティーで、1 台のローカルシステムまたはリモートシステムで構成スキャンと脆弱性スキャンを実行し、システムの修復を実行して、スキャン評価に基づくレポートを生成します。oscap
コマンドラインユーティリティーとの比較は、SCAP Workbench
には限定的な機能しかないことに注意してください。SCAP Workbench
は、データストリームファイル形式でセキュリティーコンテンツを処理します。
6.8.1. SCAP Workbench を使用したシステムのスキャンおよび修復
選択したセキュリティーポリシーに対してシステムを評価するには、以下の手順に従います。
前提条件
-
scap-workbench
パッケージがシステムにインストールされている。
手順
GNOME Classic
デスクトップ環境からSCAP Workbench
を実行するには、Super キーを押してアクティビティーの概要
を開き、scap-workbench
と入力して Enterを押します。または、次のコマンドを実行します。$ scap-workbench &
以下のオプションのいずれかを使用してセキュリティーポリシーを選択します。
-
開始ウィンドウの
Load Content
ボタン -
Open content from SCAP Security Guide
File
メニューのOpen Other Content
で、XCCDF、SCAP RPM、またはデータストリームファイルの各ファイルを検索します。
-
開始ウィンドウの
SCAP Workbench
は、ポリシーにより適用されるセキュリティールールに従ってシステム設定の変更を試みます。このプロセスは、システムスキャン時に失敗した関連チェックを修正する必要があります。警告修正
オプションが有効な状態でのシステム評価は、慎重に行わないとシステムが機能不全に陥る場合があります。Red Hat は、セキュリティーを強化した修正で加えられた変更を元に戻す自動手段は提供していません。修正は、デフォルト設定の RHEL システムで対応しています。インストール後にシステムが変更した場合は、修正を実行しても、必要なセキュリティープロファイルに準拠しない場合があります。-
スキャン結果を XCCDF ファイル、ARF ファイル、または HTML ファイルの形式で保存するには、
HTML Report
オプションを選択して、スキャンレポートを、人間が判読できる形式で生成します。XCCDF 形式および ARF (データストリーム) 形式は、追加の自動処理に適しています。3 つのオプションはすべて繰り返し選択できます。 コンボボックスをクリックします。 - 結果ベースの修復をファイルにエクスポートするには、ポップアップメニューの を使用します。
6.8.2. SCAP Workbench を使用したセキュリティープロファイルのカスタマイズ
セキュリティープロファイルをカスタマイズするには、特定のルール (パスワードの最小長など) のパラメーターを変更し、別の方法で対象とするルールを削除し、追加のルールを選択して内部ポリシーを実装できます。プロファイルをカスタマイズして新しいルールの定義はできません。
以下の手順では、SCAP Workbench
を使用してプロファイルをカスタマイズ (調整) します。oscap
コマンドラインユーティリティーで使用するようにカスタマイズしたプロファイルを保存することもできます。
前提条件
-
scap-workbench
パッケージがシステムにインストールされている。
手順
-
SCAP Workbench
を実行し、Open content from SCAP Security Guide
またはFile
メニューのOpen Other Content
を使用してカスタマイズするプロファイルを選択します。 選択したセキュリティープロファイルを必要に応じて調整するには、
ボタンをクリックします。これにより、元のデータストリームファイルを変更せずに現在選択されているプロファイルを変更できる新しいカスタマイズウィンドウが開きます。新しいプロファイル ID を選択します。
- 論理グループに分けられたルールを持つツリー構造を使用するか、 フィールドを使用して変更するルールを検索します。
ツリー構造のチェックボックスを使用した include ルールまたは exclude ルール、または必要に応じてルールの値を変更します。
- ボタンをクリックして変更を確認します。
変更内容を永続的に保存するには、以下のいずれかのオプションを使用します。
-
File
メニューのSave Customization Only
を使用して、カスタマイズファイルを別途保存します。 File
メニューSave All
を選択して、すべてのセキュリティーコンテンツを一度に保存します。Into a directory
オプションを選択すると、SCAP Workbench
は、データストリームファイルおよびカスタマイズファイルの両方を、指定した場所に保存します。これはバックアップソリューションとして使用できます。As RPM
オプションを選択すると、SCAP Workbench
に、データストリームファイル、ならびにカスタマイズファイルを含む RPM パッケージの作成を指示できます。これは、リモートでスキャンできないシステムにセキュリティーコンテンツを配布したり、詳細な処理のためにコンテンツを配信するのに便利です。
-
SCAP Workbench
は、カスタマイズしたプロファイル向けの結果ベースの修正に対応していないため、oscap
コマンドラインユーティリティーでエクスポートした修正を使用します。
6.9. インストール直後にセキュリティープロファイルに準拠するシステムのデプロイメント
OpenSCAP スイートを使用して、インストールプロセスの直後に、OSPP や PCI-DSS などのセキュリティープロファイルに準拠する RHEL システムをデプロイできます。このデプロイメント方法を使用すると、修正スクリプトを使用して後で適用できない特定のルール (パスワードの強度とパーティション化のルールなど) を適用できます。
6.9.1. グラフィカルインストールを使用したベースライン準拠の RHEL システムのデプロイメント
この手順を使用して、特定のベースラインに合わせた RHEL システムをデプロイします。この例では、OSPP (Protection Profile for General Purpose Operating System) を使用します。
前提条件
-
グラフィカル
インストールプログラムでシステムを起動している。OSCAP Anaconda Add-on はテキストのみのインストールをサポートしていないことに注意してください。 -
インストール概要
画面を開いている。
手順
-
インストール概要
画面で、ソフトウェアの選択
をクリックします。ソフトウェアの選択
画面が開きます。 ベース環境
ペインで、サーバー
環境を選択します。ベース環境は、1 つだけ選択できます。警告対応するシステムをデプロイする場合は、
Server with GUI
ベース環境を使用しないでください。SCAP セキュリティーガイド の一部として提供されるセキュリティープロファイルは、Server with GUI
の拡張パッケージセットと互換性がない場合があります。詳細は、BZ#1648162、BZ#1787156 または BZ#1816199 などを参照してください。-
完了
をクリックして設定を適用し、インストール概要
画面に戻ります。 -
セキュリティーポリシー
をクリックします。セキュリティーポリシー
画面が開きます。 -
システムでセキュリティーポリシーを有効にするには、
セキュリティーポリシーの適用
をON
に切り替えます。 -
プロファイルペインで
Protection Profile for General Purpose Operating Systems
プロファイルを選択します。 -
プロファイルの選択
をクリックして選択を確定します。 -
画面下部に表示される
Protection Profile for General Purpose Operating Systems
の変更を確定します。残りの手動変更を完了します。 -
OSPP には、準拠する必要がある厳密なパーティション分割要件があるため、
/boot
、/home
、/var
、/var/log
、/var/tmp
、および/var/log/audit
にそれぞれパーティションを作成します。 グラフィカルインストールプロセスを完了します。
注記グラフィカルインストールプログラムは、インストールに成功すると、対応するキックスタートファイルを自動的に作成します。
/root/anaconda-ks.cfg
ファイルを使用して、OSPP 準拠のシステムを自動的にインストールできます。
検証手順
インストール完了後にシステムの現在のステータスを確認するには、システムを再起動して新しいスキャンを開始します。
# oscap xccdf eval --profile ospp --report eval_postinstall_report.html /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
関連情報
- パーティション設定の詳細は、「グラフィカルユーザーインターフェースを使用した RHEL のインストール」を参照してください。
6.9.2. キックスタートを使用したベースライン準拠の RHEL システムのデプロイメント
この手順を使用して、特定のベースラインに合わせた RHEL システムをデプロイします。この例では、OSPP (Protection Profile for General Purpose Operating System) を使用します。
前提条件
-
RHEL 8 システムに、
scap-security-guide
パッケージがインストールされている。
手順
-
キックスタートファイル
/usr/share/scap-security-guide/kickstart/ssg-rhel8-ospp-ks.cfg
を、選択したエディターで開きます。 設定要件を満たすように、パーティション設定スキームを更新します。OSPP コンプライアンスでは、
/boot
、/home
、/var
、/var/log
、/var/tmp
、および/var/log/audit
にそれぞれ設定したパーティションを維持して、パーティションのサイズのみを変更できます。警告OSCAP Anaconda Addon
プラグインはテキストのみのインストールには対応していないため、キックスタートファイルのtext
オプションは使用しないでください。詳細は RHBZ#1674001 を参照してください。- キックスタートインストールを開始する方法は、「キックスタートインストールの開始」を参照してください。
OSPP 要件では、ハッシュ形式のパスワードは確認できません。
検証手順
インストール完了後にシステムの現在のステータスを確認するには、システムを再起動して新しいスキャンを開始します。
# oscap xccdf eval --profile ospp --report eval_postinstall_report.html /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
関連情報
- 詳細は、OSCAP Anaconda Addon プロジェクトページを参照してください。
6.10. コンテナーおよびコンテナーイメージの脆弱性スキャン
以下の手順を使用して、コンテナーまたはコンテナーイメージのセキュリティー脆弱性を検索します。
oscap-podman
コマンドは、RHEL 8.2 で利用できます。RHEL 8.1 および 8.0 の場合は、ナレッジベースの記事「Using OpenSCAP for scanning containers in RHEL 8」で説明されている回避策を利用します。
前提条件
-
Openscap-utils
パッケージがインストールされている。
手順
システムに最新 RHSA OVAL 定義をダウンロードします。
# wget -O - https://www.redhat.com/security/data/oval/v2/RHEL8/rhel-8.oval.xml.bz2 | bzip2 --decompress > rhel-8.oval.xml
コンテナーまたはコンテナーイメージの ID を取得します。以下に例を示します。
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi8/ubi latest 096cae65a207 7 weeks ago 239 MB
コンテナーまたはコンテナーイメージで脆弱性をスキャンし、結果を vulnerability.html ファイルに保存します。
# oscap-podman 096cae65a207 oval eval --report vulnerability.html rhel-8.oval.xml
oscap-podman
コマンドには root 権限が必要で、コンテナーの ID は最初の引数であることに注意してください。
検証手順
結果をブラウザーで確認します。以下に例を示します。
$ firefox vulnerability.html &
関連情報
-
詳細は、man ページの
oscap-podman(8)
およびoscap(8)
を参照してください。
6.11. 特定のベースラインを使用したコンテナーまたはコンテナーイメージのセキュリティーコンプライアンスの評価
以下の手順に従い、OSPP (Operating System Protection Profile) や PCI-DSS (Payment Card Industry Data Security Standard) などの特定のセキュリティーベースラインのあるコンテナーまたはコンテナーイメージのコンプライアンスを評価します。
oscap-podman
コマンドは、RHEL 8.2 で利用できます。RHEL 8.1 および 8.0 の場合は、ナレッジベースの記事「Using OpenSCAP for scanning containers in RHEL 8」で説明されている回避策を利用します。
前提条件
-
openscap-utils
パッケージおよびscap-security-guide
パッケージがインストールされている。
手順
コンテナーまたはコンテナーイメージの ID を取得します。以下に例を示します。
# podman images REPOSITORY TAG IMAGE ID CREATED SIZE registry.access.redhat.com/ubi8/ubi latest 096cae65a207 7 weeks ago 239 MB
OSPP プロファイルでコンテナーイメージのコンプライアンスを評価し、スキャン結果を report.html ファイルに保存します。
# oscap-podman 096cae65a207 xccdf eval --report report.html --profile ospp /usr/share/xml/scap/ssg/content/ssg-rhel8-ds.xml
PCI-DSS ベースラインでセキュリティーコンプライアンスを評価する場合は、096cae65a207 をコンテナーイメージの ID に置き換え、ospp の値を pci-dss に置き換えます。
oscap-podman
コマンドには、root 権限が必要なことに注意してください。
検証手順
結果をブラウザーで確認します。以下に例を示します。
$ firefox report.html &
notapplicable が付いているルールは、コンテナー化されたシステムには適用されないルールです。これらのルールは、ベアメタルおよび仮想化システムにのみ適用されます。
関連情報
-
詳細は、man ページの
oscap-podman(8)
およびscap-security-guide(8)
を参照してください。 -
file:///usr/share/doc/scap-security-guide/
ディレクトリーにインストールされているSCAP Security Guide
に関するドキュメント
6.12. RHEL の SCAP セキュリティーガイドで対応しているバージョン
RHEL に関連するマイナーリリースまたは RHEL に関連するバッチ更新で提供されるバージョンが、SCAP セキュリティーガイドで正式にサポートされています。
表6.2 RHEL の SCAP セキュリティーガイドで対応しているバージョン
Red Hat Enterprise Linux のバージョン | SCAP セキュリティーガイドのバージョン |
---|---|
RHEL 6.6 | scap-security-guide-0.1.18-3.el6 |
RHEL 6.9 | scap-security-guide-0.1.28-3.el6 |
RHEL 6.10 | scap-security-guide-0.1.28-4.el6 |
RHEL 7.2 AUS | scap-security-guide-0.1.25-3.el7 |
RHEL 7.3 AUS | scap-security-guide-0.1.30-5.el7_3 |
RHEL 7.4 AUS, E4S | scap-security-guide-0.1.33-6.el7_4 |
RHEL 7.5 (バッチ更新) | scap-security-guide-0.1.36-10.el7_5 |
RHEL 7.6 EUS | scap-security-guide-0.1.40-13.el7_6 |
RHEL 7.7 EUS | scap-security-guide-0.1.43-13.el7 |
RHEL 7.8 (バッチ更新) | scap-security-guide-0.1.46-11.el7 |
RHEL 7.9 | scap-security-guide-0.1.52-2.el7_9 |
RHEL 8.0 SAP | scap-security-guide-0.1.42-11.el8 |
RHEL 8.1 EUS | scap-security-guide-0.1.47-8.el8_1 |
RHEL 8.2 (バッチ更新) | scap-security-guide-0.1.48-10.el8_2 |
RHEL 8.3 | scap-security-guide-0.1.50-16.el8_3 |
6.13. RHEL 8 で対応している SCAP セキュリティーガイドプロファイル
RHEL の特定のマイナーリリースで提供される SCAP コンテンツのみを使用します。これは、ハードニングに参加するコンポーネントが新機能で更新されるためです。SCAP コンテンツは、この更新を反映するように変更されますが、常に後方互換性があるわけではありません。
以下の表では、RHEL の各マイナーバージョンで提供されるプロファイルと、プロファイルが適合するポリシーのバージョンを紹介しています。
表6.3 RHEL 8.3 で SCAP セキュリティーガイドプロファイル
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
CIS Red Hat Enterprise Linux 8 Benchmark |
| 1.0.0 |
Unclassified Information in Non-federal Information Systems and Organizations (NIST 800-171) |
| r1 |
Australian Cyber Security Centre (ACSC) Essential Eight |
| バージョン付けなし |
Health Insurance Portability and Accountability Act (HIPAA) |
| バージョン付けなし |
Protection Profile for General Purpose Operating Systems |
| 4.2.1 |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 8 |
| 3.2.1 |
[DRAFT] The Defense Information Systems Agency Security Technical Implementation Guide (DISA STIG) for Red Hat Enterprise Linux 8 |
| ドラフト |
表6.4 RHEL 8.2 で SCAP セキュリティーガイドプロファイル
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
Australian Cyber Security Centre (ACSC) Essential Eight |
| バージョン付けなし |
Protection Profile for General Purpose Operating Systems |
| 4.2.1 |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 8 |
| 3.2.1 |
[DRAFT] DISA STIG for Red Hat Enterprise Linux 8 |
| ドラフト |
表6.5 RHEL 8.1 で SCAP セキュリティーガイドプロファイル
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
Protection Profile for General Purpose Operating Systems |
| 4.2.1 |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 8 |
| 3.2.1 |
表6.6 RHEL 8.0 で対応する SCAP セキュリティーガイドプロファイル
プロファイル名 | プロファイル ID | ポリシーバージョン |
---|---|---|
OSPP: 汎用オペレーティングシステムの保護プロファイル |
| ドラフト |
PCI-DSS v3.2.1 Control Baseline for Red Hat Enterprise Linux 8 |
| 3.2.1 |
関連資料
- RHEL 7 のプロファイルの詳細は、「RHEL 7 で対応している SCAP Security Guide プロファイル」を参照してください。
第7章 AIDE で整合性の確認
AIDE
(Advanced Intrusion Detection Environment) は、システムのファイルのデータベースを作成し、そのデータベースを使用してファイルの整合性を確保し、システムの侵入を検出します。
7.1. AIDE のインストール
以下の手順は、AIDE
をインストールして、そのデータベースを開始するのに必要です。
前提条件
-
AppStream
リポジトリーが有効になっている。
手順
aide パッケージをインストールするには、次のコマンドを実行します。
# yum install aide
初期データベースを生成するには、次のコマンドを実行します。
# aide --init
注記デフォルト設定では、
aide --init
コマンドは、/etc/aide.conf
ファイルで定義するディレクトリーとファイルのセットのみを確認します。ディレクトリーまたはファイルをAIDE
データベースに追加し、監視パラメーターを変更するには、/etc/aide.conf
を変更します。データベースの使用を開始するには、初期データベースのファイル名から末尾の
.new
を削除します。# mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
-
AIDE
データベースの場所を変更するには、/etc/aide.conf
ファイルを編集して、DBDIR
値を変更します。追加のセキュリティーのデータベース、設定、/usr/sbin/aide
バイナリーファイルを、読み取り専用メディアなどの安全な場所に保存します。
7.2. AIDE
を使用した整合性チェックの実行
前提条件
-
AIDE
が適切にインストールされ、そのデータベースが初期化されている。「AIDE のインストール」を参照してください。
手順
手動でチェックを開始するには、以下を行います。
# aide --check Start timestamp: 2018-07-11 12:41:20 +0200 (AIDE 0.16) AIDE found differences between database and filesystem!! ... [trimmed for clarity]
AIDE
は、最低でも、スキャンを毎週実行するように設定する必要があります。AIDE
は毎日実行する必要があります。たとえば、AIDE
を毎日午前 04:05 に実行するようにスケジュールするには、cron
コマンドを使用して、次の行を/etc/crontab
ファイルを追加します。05 4 * * * root /usr/sbin/aide --check
7.3. AIDE データベースの更新
システムの変更 (パッケージの更新、設定ファイルの修正など) を確認してから、基本となる AIDE
データベースを更新することが推奨されます。
前提条件
-
AIDE
が適切にインストールされ、そのデータベースが初期化されている。「AIDE のインストール」を参照してください。
手順
基本となる AIDE データベースを更新します。
# aide --update
aide --update コマンドは、
/var/lib/aide/aide.db.new.gz
データベースファイルを作成します。-
整合性チェックで更新したデータベースを使用するには、ファイル名から末尾の
.new
を削除します。
第8章 LUKS を使用したブロックデバイスの暗号化
ディスクの暗号化は、それを暗号化することにより、ブロックデバイス上のデータを保護します。デバイスで復号したコンテンツにアクセスするには、パスフレーズまたは鍵を認証として提供する必要があります。これは、モバイルコンピューターや、リムーバブルメディアの場合に特に重要になります。これにより、デバイスをシステムから物理的に削除した場合でも、デバイスのコンテンツを保護するのに役立ちます。LUKS 形式は、RHEL におけるブロックデバイスの暗号化のデフォルト実装です。
8.1. LUKS ディスクの暗号化
LUKS (Linux Unified Key Setup-on-disk-format) は、ブロックデバイスを暗号化でき、暗号化したデバイスの管理を簡素化するツールセットを提供します。LUKS を使用すれば、複数のユーザー鍵が、パーティションのバルク暗号化に使用されるマスター鍵を複号できるようになります。
RHEL は、LUKS を使用してブロックデバイスの暗号化を行います。デフォルトではインストール時に、ブロックデバイスを暗号化するオプションが指定されていません。ディスクを暗号化するオプションを選択すると、コンピューターを起動するたびにパスフレーズの入力が求められます。このパスフレーズは、パーティションの複号に用いられるバルク暗号化鍵の「ロックを解除」します。デフォルトのパーティションテーブルの変更を選択すると、暗号化するパーティションを選択できます。この設定は、パーティションテーブル設定で行われます。
LUKS の機能
- LUKS は、ブロックデバイス全体を暗号化するため、脱着可能なストレージメディアやノート PC のディスクドライブといった、モバイルデバイスのコンテンツを保護するのに適しています。
- 暗号化されたブロックデバイスの基本的な内容は任意であり、スワップデバイスの暗号化に役立ちます。また、とりわけデータストレージ用にフォーマットしたブロックデバイスを使用する特定のデータベースに関しても有用です。
- LUKS は、既存のデバイスマッパーのカーネルサブシステムを使用します。
- LUKS は、パラフレーズの強化を提供し、辞書攻撃から保護します。
- LUKS デバイスには複数のキースロットが含まれ、ユーザーはこれを使用してバックアップキーやパスフレーズを追加できます。
LUKS が 行わない こと
- LUKS などのディスク暗号化ソリューションは、システムの停止時にしかデータを保護しません。システムの電源がオンになり、LUKS がディスクを復号すると、そのディスクのファイルは、通常、そのファイルにアクセスできるすべてのユーザーが使用できます。
- LUKS は、多くのユーザーが、同じデバイスにアクセスする鍵をそれぞれ所有することが必要となるシナリオには適していません。LUKS1 形式は鍵スロットを 8 個提供し、LUKS2 形式は鍵スロットを最大 32 個提供します。
- LUKS は、ファイルレベルの暗号化を必要とするアプリケーションには適していません。
暗号化
LUKS に使用されるデフォルトの暗号は aes-xts-plain64
です。LUKS のデフォルトの鍵サイズは 512 ビットです。Anaconda (XTS モード) を使用した LUKS のデフォルトの鍵サイズは 512 ビットです。利用可能な暗号は以下のとおりです。
- AES (Advanced Encryption Standard) - FIPS PUB 197
- Twofish (128 ビットブロック暗号)
- Serpent
8.2. RHEL 8 の LUKS バージョン
RHEL 8 では、LUKS 暗号化のデフォルト形式は LUKS2 です。従来の LUKS1 形式は、完全にサポートされ、以前の RHEL リリースと互換性のある形式として提供されます。
LUKS2 形式は、今後も、バイナリー構造を変更することなく、さまざまな要素を更新できるように設計されています。LUKS2 は、内部的にメタデータに JSON テキスト形式を使用し、メタデータの冗長性を提供し、メタデータの破損を検出し、メタデータコピーからの自動修正を可能にします。
LUKS1 にのみ対応する以前のシステムとの互換性を必要とするシステムでは、LUKS2 を使用しないでください。RHEL 7 は、バージョン 7.6 以降の LUKS2 形式に対応していることに注意してください。
LUKS2 および LUKS1 は、異なるコマンドを使用してディスクを暗号化します。LUKS バージョンに誤ったコマンドを使用すると、データが失われる可能性があります。
LUKS バージョン | 暗号化コマンド |
---|---|
LUKS2 |
|
LUKS1 |
|
オンラインの再暗号化
LUKS2 形式は、デバイスが使用中の間に、暗号化したデバイスの再暗号化に対応します。たとえば、以下のタスクを実行するにあたり、デバイスでファイルシステムをアンマウントする必要はありません。
- ボリュームキーの変更
- 暗号化アルゴリズムの変更
暗号化されていないデバイスを暗号化する場合は、ファイルシステムのマウントを解除する必要があります。暗号化の短い初期化後にファイルシステムを再マウントできます。
LUKS1 形式は、オンライン再暗号化に対応していません。
変換
LUKS2 形式は、LUKS1 により提供されます。特定の状況では、LUKS1 を LUKS2 に変換できます。具体的には、以下のシナリオでは変換ができません。
-
LUKS1 デバイスが、Policy-Based Decryption (PBD - Clevis) ソリューションにより使用されているとマークされている。
cryptsetup
ツールは、luksmeta
メタデータが検出されると、そのデバイスを変換することを拒否します。 - デバイスがアクティブになっている。デバイスが非アクティブ状態でなければ、変換することはできません。
8.3. LUKS2 再暗号化中のデータ保護のオプション
LUKS2 では、再暗号化プロセスで、パフォーマンスやデータ保護の優先度を設定する複数のオプションを選択できます。
checksum
これがデフォルトのモードです。データ保護とパフォーマンスのバランスを取ります。
このモードは、セクターの個々のチェックサムを再暗号化領域に保存するため、復旧プロセスでは、LUKS2 がすでに再暗号化しているセクターを検出できます。このモードでは、ブロックデバイスセクターの書き込みがアトミックである必要があります。
journal
- このモードが最も安全ですが、最も遅くなります。このモードは、バイナリー領域の再暗号化領域をジャーナル化するため、LUKS2 はデータを 2 回書き込みます。
none
-
このモードはパフォーマンスを優先し、データ保護は提供しません。これは、
SIGTERM
シグナルや、Ctrl+C を押すユーザーなど、安全なプロセス終了からのみデータを保護します。予期しないシステムクラッシュやアプリケーションのクラッシュが発生すると、データが破損する可能性があります。
cryptsetup
の --resilience
オプションを使用してモードを選択できます。
LUKS2 の再暗号化プロセスが強制的に突然終了した場合、LUKS2 は以下のいずれかの方法で復旧を実行できます。
-
自動的に実行 (LUKS2 デバイスの次回のオープン動作時)。この動作は、
cryptsetup open
コマンドまたはsystemd-cryptsetup
でデバイスを割り当てると発生します。 -
LUKS2 デバイスで
cryptsetup repair
コマンドを使用して手動で実行。
8.4. LUKS2 を使用したブロックデバイスの既存データの暗号化
この手順では、LUKS2 形式を使用して、暗号化されていないデバイスの既存データを暗号化します。新しい LUKS ヘッダーは、デバイスのヘッドに保存されます。
前提条件
- ブロックデバイスにファイルシステムが含まれている。
データのバックアップを作成している。
警告ハードウェア、カーネル、または人的ミスにより、暗号化プロセス時にデータが失われる場合があります。データの暗号化を開始する前に、信頼性の高いバックアップを作成してください。
手順
暗号化するデバイスにあるファイルシステムのマウントをすべて解除します。以下に例を示します。
# umount /dev/sdb1
LUKS ヘッダーを保存するための空き容量を確認します。以下のいずれかのオプションを選択します。
論理ボリュームを暗号化する場合は、以下のように、ファイルシステムのサイズを変更せずに、論理ボリュームを拡張できます。以下に例を示します。
# lvextend -L+32M vg00/lv00
-
parted
などのパーティション管理ツールを使用してパーティションを拡張します。 -
このデバイスのファイルシステムを縮小します。ext2、ext3、または ext4 のファイルシステムには
resize2fs
ユーティリティーを使用できます。XFS ファイルシステムは縮小できないことに注意してください。
暗号化を初期化します。以下に例を示します。
# cryptsetup reencrypt \ --encrypt \ --init-only \ --reduce-device-size 32M \ /dev/sdb1 sdb1_encrypted
このコマンドを実行するとパスフレーズの入力が求められ、暗号化プロセスが開始します。
デバイスをマウントします。
# mount /dev/mapper/sdb1_encrypted /mnt/sdb1_encrypted
オンライン暗号化を開始します。
# cryptsetup reencrypt --resume-only /dev/sdb1
関連情報
-
詳細は、man ページの
cryptsetup(8)
、lvextend(8)
、resize2fs(8)
、およびparted(8)
を参照してください
8.5. 独立したヘッダーがある LUKS2 を使用してブロックデバイスの既存データの暗号化
この手順では、LUKS ヘッダーを保存するための空き領域を作成せずに、ブロックデバイスの既存データを暗号化します。ヘッダーは、追加のセキュリティー層としても使用できる、独立した場所に保存されます。この手順では、LUKS2 暗号化形式を使用します。
前提条件
- ブロックデバイスにファイルシステムが含まれている。
データのバックアップを作成している。
警告ハードウェア、カーネル、または人的ミスにより、暗号化プロセス時にデータが失われる場合があります。データの暗号化を開始する前に、信頼性の高いバックアップを作成してください。
手順
プールにあるファイルシステムのマウントをすべて解除します。以下に例を示します。
# umount /dev/sdb1
暗号化を初期化します。
# cryptsetup reencrypt \ --encrypt \ --init-only \ --header /path/to/header \ /dev/sdb1 sdb1_encrypted
/path/to/header を、独立した LUKS ヘッダーのあるファイルへのパスに置き換えます。暗号化したデバイスを後でアンロックできるように、接続解除した LUKS ヘッダーにアクセスできる必要があります。
このコマンドを実行するとパスフレーズの入力が求められ、暗号化プロセスが開始します。
デバイスをマウントします。
# mount /dev/mapper/sdb1_encrypted /mnt/sdb1_encrypted
オンライン暗号化を開始します。
# cryptsetup reencrypt --resume-only --header /path/to/header /dev/sdb1
関連情報
-
詳細は、
cryptsetup(8)
の man ページを参照してください。
8.6. LUKS2 を使用した空のブロックデバイスの暗号化
この手順では、LUKS2 形式を使用して空のブロックデバイスを暗号化する方法を説明します。
前提条件
- 空のブロックデバイス。
手順
暗号化した LUKS パーティションとしてパーティションを設定します。
# cryptsetup luksFormat /dev/sdb1
暗号化した LUKS パーティションを開きます。
# cryptsetup open /dev/sdb1 sdb1_encrypted
これにより、パーティションのロックが解除され、デバイスマッパーを使用して新しいデバイスにマッピングされます。これは、
デバイス
が暗号化されたデバイスであり、暗号化されたデータを上書きしないように/dev/mapper/device_mapped_name
を使用して LUKS を通じてアドレス指定する必要があることをカーネルに警告します。パーティションに暗号化されたデータを書き込むには、デバイスをマッピングした名前でアクセスする必要があります。これを実行するには、ファイルシステムを作成する必要があります。以下に例を示します。
# mkfs -t ext4 /dev/mapper/sdb1_encrypted
デバイスをマウントします。
# mount /dev/mapper/sdb1_encrypted
関連情報
-
詳細は、
cryptsetup(8)
の man ページを参照してください。
8.7. storage ロールを使用した LUKS 暗号化ボリュームの作成
storage
ロールを使用し、Ansible Playbook を実行して、LUKS で暗号化されたボリュームを作成および設定できます。
前提条件
Playbook を実行するシステムに Red Hat Ansible Engine がインストールされている。
注記ボリュームを作成するシステムに Red Hat Ansible Automation Platform をインストールする必要はありません。
-
Ansible コントローラーに
rhel-system-roles
パッケージがインストールされている。 - storage システムロールを使用して、LUKS 暗号化ボリュームをデプロイするシステムの詳細を記録したインベントリーファイルがある。
手順
以下の内容を含む新しい
playbook.yml
ファイルを作成します。- hosts: all vars: storage_volumes: - name: barefs type: disk disks: - sdb fs_type: xfs fs_label: label-name mount_point: /mnt/data encryption: true encryption_password: your-password roles: - rhel-system-roles.storage
オプション: Playbook の構文を確認します。
# ansible-playbook --syntax-check playbook.yml
インベントリーファイルで Playbook を実行します。
# ansible-playbook -i inventory.file /path/to/file/playbook.yml
関連情報
- LUKS の詳細は、17 章「LUKS を使用したブロックデバイスの暗号化」を参照してください。
-
storage
システムロールで使用されるパラメーターの詳細は、/usr/share/ansible/roles/rhel-system-roles.storage/README.md
ファイルを参照してください。
第9章 ポリシーベースの複号を使用して暗号化ボリュームの自動アンロックの設定
ポリシーベースの複号 (PBD) は、物理マシンおよび仮想マシンにおいて、ハードドライブで暗号化した root ボリュームおよびセカンダリーボリュームのロックを解除できるようにする一連の技術です。PBD は、ユーザーパスワード、TPM (Trusted Platform Module) デバイス、システムに接続する PKCS #11 デバイス (たとえばスマートカード) などのさまざまなロックの解除方法、もくしは特殊なネットワークサーバーを使用します。
PBD を使用すると、ポリシーにさまざまなロックの解除方法を組み合わせて、さまざまな方法で同じボリュームのロックを解除できるようにすることができます。Red Hat Enterprise Linux における PBD の現在の実装は、Clevis フレームワークと、ピン と呼ばれるプラグインから構成されます。各ピンは、個別のアンロック機能を提供します。現在利用できるピンは以下のとおりです。
-
tang
- ネットワークサーバーを使用してボリュームのロックを解除 -
tpm2
- TPM2 ポリシーを使用してボリュームのロックを解除
NBDE (Network Bound Disc Encryption) は、特定のネットワークサーバーに暗号化ボリュームをバインドできるようにする PBD のサブカテゴリーです。NBDE の現在の実装には、Tang サーバー自体と、Tang サーバー用の Clevis ピンが含まれます。
9.1. NBDE (Network-Bound Disk Encryption)
Red Hat Enterprise Linux では、NBDE は、以下のコンポーネントおよび技術により実装されます。
図9.1 LUKS1 で暗号化したボリュームを使用する場合の NBDE スキーム(luksmeta パッケージは、LUKS2 ボリュームには使用されません)

Tang は、ネットワークのプレゼンスにデータをバインドするためのサーバーです。セキュリティーが保護された特定のネットワークにシステムをバインドする際に利用可能なデータを含めるようにします。Tang はステートレスで、TLS または認証は必要ありません。エスクローベースのソリューション (サーバーが暗号鍵をすべて保存し、使用されたことがあるすべての鍵に関する知識を有する) とは異なり、Tang はクライアントの鍵と相互作用することはないため、クライアントから識別情報を得ることがありません。
Clevis は、自動化された復号用のプラグイン可能なフレームワークです。NBDE では、Clevis は、LUKS ボリュームの自動アンロックを提供します。clevis パッケージは、クライアントで使用される機能を提供します。
Clevis ピン は、Clevis フレームワークへのプラグインです。このようなピンの 1 つは、NBDE サーバー (Tang) との相互作用を実装するプラグインです。
Clevis および Tang は、一般的なクライアントおよびサーバーのコンポーネントで、ネットワークがバインドされた暗号化を提供します。Clevis および Tang は、Red Hat Enterprise Linux で LUKS と組み合わせて、root および非 root のストレージボリュームの暗号化および複号に使用し、NBDE を実現します。
クライアントおよびサーバーのコンポーネントはともに José ライブラリーを使用して、暗号化および複号の操作を実行します。
NBDE のプロビジョニングを開始すると、Tang サーバーの Clevis ピンは、Tang サーバーの、アドバタイズされている非対称鍵の一覧を取得します。もしくは、鍵が非対称であるため、Tang の公開鍵の一覧を帯域外に配布して、クライアントが Tang サーバーにアクセスしなくても動作できるようにします。このモードは オフラインプロビジョニング と呼ばれます。
Tang 用の Clevis ピンは、公開鍵のいずれかを使用して、固有で、暗号論的に強力な暗号鍵を生成します。この鍵を使用してデータを暗号化すると、この鍵は破棄されます。Clevis クライアントは、使いやすい場所に、このプロビジョニング操作で生成した状態を保存する必要があります。データを暗号化するこのプロセスは プロビジョニング手順 と呼ばれています。
LUKS バージョン 2 (LUKS2) は、Red Hat Enterprise Linux 8 のデフォルト形式であるため、NBDE のプロビジョニング状態は、LUKS2 ヘッダーにトークンとして保存されます。luksmeta パッケージによる NBDE のプロビジョニング状態は、LUKS1 で暗号化したボリュームにのみ使用されます。Tang 用の Clevis ピンは、規格を必要とせずに LUKS1 と LUKS2 の両方をサポートします。
クライアントがそのデータにアクセスする準備ができると、プロビジョニング手順で生成したメタデータを読み込み、応答して暗号鍵を戻します。このプロセスは 復旧手順 と呼ばれます。
Clevis は、NBDE ではピンを使用して LUKS ボリュームをバインドしているため、自動的にロックが解除されます。バインドプロセスが正常に終了すると、提供されている Dracut アンロックを使用してディスクをアンロックできます。
9.2. 暗号化クライアント (Clevis) のインストール
この手順に従って、システムに Clevis プラグ可能フレームワークを使用してデプロイと起動を行います。
手順
暗号化されたボリュームを持つシステムに Clevis とそのピンをインストールするには、次のコマンドを実行します。
# yum install clevis
データを複号するには、
clevis decrypt
コマンドを実行して、JWE (JSON Web Encryption) 形式で暗号文を指定します。以下に例を示します。$ clevis decrypt < secret.jwe
関連情報
クリックリファレンスは、組み込みの CLI ヘルプを参照してください。
$ clevis Usage: clevis COMMAND [OPTIONS] clevis decrypt Decrypts using the policy defined at encryption time clevis encrypt sss Encrypts using a Shamir's Secret Sharing policy clevis encrypt tang Encrypts using a Tang binding server policy clevis encrypt tpm2 Encrypts using a TPM2.0 chip binding policy clevis luks bind Binds a LUKS device using the specified policy clevis luks list Lists pins bound to a LUKSv1 or LUKSv2 device clevis luks pass Returns the LUKS passphrase used for binding a particular slot. clevis luks regen Regenerate LUKS metadata clevis luks report Report any key rotation on the server side clevis luks unbind Unbinds a pin bound to a LUKS volume clevis luks unlock Unlocks a LUKS volume
-
詳細は、man ページの
clevis(1)
を参照してください。
9.3. SELinux を Enforcing モードで有効にした Tang サーバーのデプロイメント
この手順では、Enforcing モードの SELinux で限定サービスとして、カスタムポートで実行する Tang サーバーをデプロイします。
前提条件
-
policycoreutils-python-utils
パッケージおよび依存関係がインストールされている。
手順
tang
パッケージとその依存関係をインストールするには、root
で以下のコマンドを実行します。# yum install tang
7500/tcp などの不要なポートを選択し、
tangd
サービスがそのポートにバインドできるようにします。# semanage port -a -t tangd_port_t -p tcp 7500
ポートは 1 つのサービスのみで一度に使用できるため、すでに使用しているポートを使用しようとすると、
ValueError: Port already defined
エラーが発生します。ファイアウォールのポートを開きます。
# firewall-cmd --add-port=7500/tcp # firewall-cmd --runtime-to-permanent
tangd
サービスを有効にします。# systemctl enable tangd.socket
オーバーライドファイルを作成します。
# systemctl edit tangd.socket
以下のエディター画面で、
/etc/systemd/system/tangd.socket.d/
ディレクトリーにある空のoverride.conf
ファイルを開き、次の行を追加して、Tang サーバーのデフォルトのポートを、80 から、以前取得した番号に変更します。[Socket] ListenStream= ListenStream=7500
ファイルを保存して、エディターを終了します。
変更した設定を再読み込みします。
# systemctl daemon-reload
設定が機能していることを確認します。
# systemctl show tangd.socket -p Listen Listen=[::]:7500 (Stream)
tangd
サービスを開始します。# systemctl start tangd.socket
tangd
が、systemd
のソケットアクティベーションメカニズムを使用しているため、最初に接続するとすぐにサーバーが起動します。最初の起動時に、一組の暗号鍵が自動的に生成されます。鍵の手動生成などの暗号化操作を実行するには、jose
ユーティリティーを使用します。
関連情報
-
man ページの
tang(8)
-
man ページの
semanage (8)
-
man ページの
firewall-cmd (1)
-
man ページの
systemd.unit(5)
およびsystemd.socket(5)
-
man ページの
jose(1)
9.4. Tang サーバーの鍵のローテーションおよびクライアントでのバインディングの更新
以下の手順に従って、Tang サーバーの鍵をローテーションし、クライアントの既存のバインディングを更新します。鍵をローテートするのに適した間隔は、アプリケーション、鍵のサイズ、および組織のポリシーにより異なります。
前提条件
- Tang サーバーが実行している。
-
clevis
パッケージおよびclevis-luks
パッケージがクライアントにインストールされている。 -
RHEL 8.2 に、
clevis luks list
、clevis luks report
、およびclevis luks regen
が追加されていることに注意してください。
手順
鍵をローテートするには、Tang サーバーの
/var/db/tang
鍵データベースディレクトリーで/usr/libexec/tangd-keygen
コマンドを使用して鍵を新規生成します。# ls /var/db/tang UV6dqXSwe1bRKG3KbJmdiR020hY.jwk y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk # /usr/libexec/tangd-keygen /var/db/tang # ls /var/db/tang UV6dqXSwe1bRKG3KbJmdiR020hY.jwk y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk 3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk zyLuX6hijUy_PSeUEFDi7hi38.jwk
Tang サーバーが、以下のように新規キーペアから署名キーを公開していることを確認します。
# tang-show-keys 7500 3ZWS6-cDrCG61UPJS2BMmPU4I54
アドバタイズメントから見えなくなるように、古い鍵の名前の先頭に
.
を付けます。以下の例のファイル名は、Tang サーバーの鍵データベースディレクトリーにある一意のファイル名とは異なります。# cd /var/db/tang # ls -l -rw-r--r--. 1 root tang 354 Sep 23 16:08 3ZWS6-cDrCG61UPJS2BMmPU4I54.jwk -rw-r--r--. 1 root tang 349 Sep 23 16:08 I-zyLuX6hijUy_PSeUEFDi7hi38.jwk -rw-r--r--. 1 root root 349 Feb 7 14:55 UV6dqXSwe1bRKG3KbJmdiR020hY.jwk -rw-r--r--. 1 root root 354 Feb 7 14:55 y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk # mv UV6dqXSwe1bRKG3KbJmdiR020hY.jwk .UV6dqXSwe1bRKG3KbJmdiR020hY.jwk # mv y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk .y9hxLTQSiSB5jSEGWnjhY8fDTJU.jwk
Tang は、直ちにすべての変更を適用します。再起動は必要ありません。この時点で、新しいクライアントバインディングは新しい鍵を選択し、以前のクライアントは古い鍵を使用し続けます。
NBDE クライアントで
clevis luks report
コマンドを使用して、Tang サーバーでアドバタイズされた鍵が同じままかどうかを確認します。clevis luks list
コマンドを使用すると、関連するバインディングのあるスロットを特定できます。以下に例を示します。# clevis luks list -d /dev/sda2 1: tang '{"url":"http://tang.srv"}' # clevis luks report -d /dev/sda2 -s 1 ... Report detected that some keys were rotated. Do you want to regenerate luks metadata with "clevis luks regen -d /dev/sda2 -s 1"? [ynYN]
新しい鍵の LUKS メタデータを再生成するには、直前のコマンドプロンプトで
y
を押すか、clevis luks regen
コマンドを使用します。# clevis luks regen -d /dev/sda2 -s 1
すべての古いクライアントが新しい鍵を使用することを確認したら、Tang サーバーから古い鍵を削除できます。次に例を示します。
# cd /var/db/tang # rm .*.jwk
クライアントが使用している最中に古い鍵を削除すると、データが失われる場合があります。このような鍵を誤って削除した場合は、クライアントで clevis luks regen
コマンドを実行し、LUKS パスワードを手動で提供します。
関連情報
-
man ページの
tang-show-keys(1)
、clevis-luks-list(1)
、clevis-luks-report(1)
、およびclevis-luks-regen(1)
9.5. Web コンソールで Tang 鍵を使用した自動アンロックの設定
Tang サーバーが提供する鍵を使用して、LUKS で暗号化したストレージデバイスの自動ロック解除を設定します。
前提条件
RHEL 8 Web コンソールがインストールされている。
詳細は「Web コンソールのインストール」を参照してください。
-
cockpit-storaged
パッケージがシステムにインストールされている。 -
cockpit.socket
サービスがポート 9090 で実行されている。 -
clevis
パッケージ、tang
パッケージ、およびclevis-dracut
パッケージがインストールされている。 - Tang サーバーが実行している。
手順
Web ブラウザーに以下のアドレスを入力して、RHEL Web コンソールを開きます。
https://localhost:9090
リモートシステムに接続する際に、localhost の部分をリモートサーバーのホスト名または IP アドレスに置き換えます。
- 認証情報を指定して、コンテンツ で をクリックします。 をクリックします。暗号化したデバイスを選択し、
Keys セクションの をクリックして Tang キーを追加します。
Tang サーバーのアドレスと、LUKS で暗号化したデバイスのロックを解除するパスワードを指定します。
をクリックして確定します。以下のダイアログウインドウは、鍵ハッシュが一致することを確認するコマンドを提供します。RHEL 8.2 では、
tang-show-keys
スクリプトが導入され、ポート 7500 で実行している Tang サーバーで以下のコマンドを使用してキーハッシュを取得できます。# tang-show-keys 7500 3ZWS6-cDrCG61UPJS2BMmPU4I54
RHEL 8.1 以前では、以下のコマンドを使用して鍵ハッシュを取得します。
# curl -s localhost:7500/adv | jose fmt -j- -g payload -y -o- | jose jwk use -i- -r -u verify -o- | jose jwk thp -i- 3ZWS6-cDrCG61UPJS2BMmPU4I54
Web コンソールと前述のコマンドの出力のキーハッシュが同じ場合は、
をクリックします。初期ブートシステムでディスクバインディングを処理できるようにするには、左側のナビゲーションバーの下部にある
をクリックし、次のコマンドを入力します。# yum install clevis-dracut # dracut -fv --regenerate-all
検証手順
新規に追加された Tang キーが
Keyserver
タイプの Keys セクションに一覧表示されていることを確認します。バインディングが初期ブートで使用できることを確認します。次に例を示します。
# lsinitrd | grep clevis clevis clevis-pin-sss clevis-pin-tang clevis-pin-tpm2 -rwxr-xr-x 1 root root 1600 Feb 11 16:30 usr/bin/clevis -rwxr-xr-x 1 root root 1654 Feb 11 16:30 usr/bin/clevis-decrypt ... -rwxr-xr-x 2 root root 45 Feb 11 16:30 usr/lib/dracut/hooks/initqueue/settled/60-clevis-hook.sh -rwxr-xr-x 1 root root 2257 Feb 11 16:30 usr/libexec/clevis-luks-askpass
関連情報
- RHEL Web コンソールへのインストールおよびログインの詳細は、「RHEL Web コンソールの使用」の章を参照してください。
9.6. Tang を使用する NBDE システムへの暗号化クライアントのデプロイメント
以下の手順は、Tang ネットワークサーバーを使用して、暗号化したボリュームの自動ロック解除を設定する手順を説明します。
前提条件
- Clevis フレームワークがインストールされている。
- Tang サーバーが利用できる。
手順
Clevis 暗号化クライアントを Tang サーバーにバインドするには、
clevis encrypt tang
サブコマンドを使用します。$ clevis encrypt tang '{"url":"http://tang.srv:port"}' < input-plain.txt > secret.jwe The advertisement contains the following signing keys: _OsIk0T-E2l6qjfdDiwVmidoZjA Do you wish to trust these keys? [ynYN] y
この例の URL (http://tang.srv:port) を、
tang
がインストールされているサーバーの URL に変更します。secret.jwe 出力ファイルには、JSON Web の暗号形式で暗号化した暗号文が含まれます。この暗号文は input-plain.txt 入力ファイルから読み込まれます。また、構成に SSH アクセスなしで Tang サーバーとの非対話型の通信が必要な場合は、アドバタイズメントをダウンロードしてファイルに保存できます。
$ curl -sfg http://tang.srv:port/adv -o adv.jws
ファイルやメッセージの暗号化など、次のタスクには adv.jws ファイルのアドバタイズメントを使用します。
$ echo 'hello' | clevis encrypt tang '{"url":"http://tang.srv:port","adv":"adv.jws"}'
データを複号するには、
clevis decrypt
コマンドを実行して、暗号文 (JWE) を提供します。$ clevis decrypt < secret.jwe > output-plain.txt
関連情報
クイックリファレンスは、man ページの
clevis-encrypt-tang(1)
か、組み込みの CLI ヘルプを使用します。$ clevis $ clevis decrypt $ clevis encrypt tang Usage: clevis encrypt tang CONFIG < PLAINTEXT > JWE ...
詳細は、以下の man ページを参照してください。
-
clevis(1)
-
clevis-luks-unlockers(7)
-
9.7. LUKS で暗号化したボリュームからの Clevis ピンの手動削除
clevis luks bind
コマンドで作成されたメタデータを手動で削除する場合や、Clevis が追加したパスフレーズを含む鍵スロットを一掃するには、以下の手順を行います。
LUKS で暗号化したボリュームから Clevis ピンを削除する場合は、clevis luks unbind
コマンドを使用することが推奨されます。clevis luks unbind
を使用した削除手順は、1 回のステップで構成され、LUKS1 ボリュームおよび LUKS2 ボリュームの両方で機能します。以下のコマンド例は、バインディング手順で作成されたメタデータを削除し、/dev/sda2 デバイスの鍵スロット 1 を削除します。
# clevis luks unbind -d /dev/sda2 -s 1
前提条件
- Clevis バインディングを使用した LUKS 暗号化ボリューム。
手順
/dev/sda2 などのボリュームがどの LUKS バージョンであるかを確認し、Clevis にバインドされているスロットおよびトークンを特定します。
# cryptsetup luksDump /dev/sda2 LUKS header information Version: 2 ... Keyslots: 0: luks2 ... 1: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 ... Tokens: 0: clevis Keyslot: 1 ...
上記の例では、Clevis トークンは 0 で識別され、関連付けられた鍵スロットは 1 です。
LUKS2 暗号化の場合は、トークンを削除します。
# cryptsetup token remove --token-id 0 /dev/sda2
デバイスを LUKS1 で暗号化し、
cryptsetup luksDump
コマンドの出力にVersion:1
文字列が示されている場合は、luksmeta wipe
コマンドでこの追加手順を行います。# luksmeta wipe -d /dev/sda2 -s 1
Clevis パスフレーズを含む鍵スロットを削除します。
# cryptsetup luksKillSlot /dev/sda2 1
関連情報
-
詳細は、man ページの
clevis-luks-unbind(1)
、cryptsetup(8)
、およびluksmeta(8)
を参照してください。
9.8. TPM 2.0 ポリシーを使用した暗号化クライアントのデプロイメント
以下の手順は、Trusted Platform Module 2.0 (TPM 2.0) ポリシーを使用して、暗号化したボリュームの自動ロック解除を設定する手順を説明します。
前提条件
- Clevis フレームワークがインストールされている。「暗号化クライアント (Clevis) のインストール」を参照してください。
- システムが 64 ビット Intel アーキテクチャー、または 64 ビット AMD アーキテクチャーである。
手順
TPM 2.0 チップを使用して暗号化するクライアントをデプロイするには、JSON 設定オブジェクト形式の引数のみが使用されている
clevis encrypt tpm2
サブコマンドを使用します。$ clevis encrypt tpm2 '{}' < input-plain.txt > secret.jwe
別の階層、ハッシュ、および鍵アルゴリズムを選択するには、以下のように、設定プロパティーを指定します。
$ clevis encrypt tpm2 '{"hash":"sha1","key":"rsa"}' < input-plain.txt > secret.jwe
データを復号するには、JSON Web Encryption (JWE) 形式の暗号文を提供します。
$ clevis decrypt < secret.jwe > output-plain.txt
ピンは、PCR (Platform Configuration Registers) 状態へのデータのシーリングにも対応します。このように、PCP ハッシュ値が、シーリング時に使用したポリシーと一致する場合にのみ、データのシーリングを解除できます。
たとえば、SHA-1 バンクに対して、インデックス 0 および 1 の PCR にデータをシールするには、以下を行います。
$ clevis encrypt tpm2 '{"pcr_bank":"sha1","pcr_ids":"0,1"}' < input-plain.txt > secret.jwe
関連情報
-
詳細と、可能な設定プロパティーの一覧は、man ページの
clevis-encrypt-tpm2(1)
を参照してください。
9.9. LUKS で暗号化したボリュームの手動登録の設定
以下の手順に従って、NBDE を使用して LUKS で暗号化されたボリュームのロック解除を設定します。
前提条件
- Tang サーバーが実行されていて、使用できるようにしてある。
手順
LUKS で暗号化した既存のボリュームを自動的にアンロックするには、サブパッケージの
clevis-luks
をインストールします。# yum install clevis-luks
PBD 用 LUKS 暗号化ボリュームを特定します。次の例では、ブロックデバイスは /dev/sda2 と呼ばれています。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 12G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 11G 0 part └─luks-40e20552-2ade-4954-9d56-565aa7994fb6 253:0 0 11G 0 crypt ├─rhel-root 253:0 0 9.8G 0 lvm / └─rhel-swap 253:1 0 1.2G 0 lvm [SWAP]
clevis luks bind
コマンドを使用して、ボリュームを Tang サーバーにバインドします。# clevis luks bind -d /dev/sda2 tang '{"url":"http://tang.srv"}' The advertisement contains the following signing keys: _OsIk0T-E2l6qjfdDiwVmidoZjA Do you wish to trust these keys? [ynYN] y You are about to initialize a LUKS device for metadata storage. Attempting to initialize it may result in data loss if data was already written into the LUKS header gap in a different format. A backup is advised before initialization is performed. Do you wish to initialize /dev/sda2? [yn] y Enter existing LUKS password:
このコマンドは、以下の 4 つの手順を実行します。
- LUKS マスター鍵と同じエントロピーを使用して、新しい鍵を作成します。
- Clevis で新しい鍵を暗号化します。
- LUKS2 ヘッダートークンに Clevis JWE オブジェクトを保存するか、デフォルト以外の LUKS1 ヘッダーが使用されている場合は LUKSMeta を使用します。
LUKS を使用する新しい鍵を有効にします。
注記バインド手順では、空き LUKS パスワードスロットが少なくとも 1 つあることが前提となっています。そのスロットの 1 つを
clevis luks bind
コマンドが使用します。
- ボリュームは、現在、既存のパスワードと Clevis ポリシーを使用してロックを解除できます。
システムの起動プロセスの初期段階でディスクバインディングを処理するようにするには、インストール済みのシステムで次のコマンドを実行します。
# yum install clevis-dracut # dracut -fv --regenerate-all
検証手順
Clevis JWE オブジェクトが LUKS ヘッダーに適切に置かれていることを確認するには、
clevis luks list
コマンドを使用します。# clevis luks list -d /dev/sda2 1: tang '{"url":"http://tang.srv:port"}'
(DHCP を使用しない) 静的な IP 設定を持つクライアントに NBDE を使用するには、以下のように、手動でネットワーク設定を dracut ツールに渡します。
# dracut -fv --regenerate-all --kernel-cmdline "ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none:192.0.2.45"
もしくは、静的ネットワーク情報を使用して /etc/dracut.conf.d/
ディレクトリーに .conf ファイルを作成します。以下に例を示します。
# cat /etc/dracut.conf.d/static_ip.conf
kernel_cmdline="ip=192.0.2.10::192.0.2.1:255.255.255.0::ens3:none:192.0.2.45"
初期 RAM ディスクイメージを再生成します。
# dracut -fv --regenerate-all
関連情報
詳細は、以下の man ページを参照してください。
-
clevis-luks-bind(1)
-
dracut.cmdline(7)
9.10. キックスタートを使用して、LUKS で暗号化したボリュームの自動登録の設定
この手順に従って、LUKS で暗号化されたボリュームの登録に Clevis を使用する自動インストールプロセスを構成します。
手順
一時パスワードを使用して、LUKS 暗号化が有効になっているディスクを、
/boot
以外のすべてのマウントポイントで分割するように、キックスタートに指示します。パスワードは、登録プロセスの手順に使用するための一時的なものです。part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --grow --encrypted --passphrase=temppass
OSPP 準拠のシステムには、より複雑な構成が必要であることに注意してください。次に例を示します。
part /boot --fstype="xfs" --ondisk=vda --size=256 part / --fstype="xfs" --ondisk=vda --size=2048 --encrypted --passphrase=temppass part /var --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /tmp --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /home --fstype="xfs" --ondisk=vda --size=2048 --grow --encrypted --passphrase=temppass part /var/log --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass part /var/log/audit --fstype="xfs" --ondisk=vda --size=1024 --encrypted --passphrase=temppass
関連する Clevis パッケージを
%packages
セクションに追加して、インストールします。%packages clevis-dracut %end
clevis luks bind
を呼び出して、%post
セクションのバインディングを実行します。その後、一時パスワードを削除します。%post curl -sfg http://tang.srv/adv -o adv.jws clevis luks bind -f -k- -d /dev/vda2 \ tang '{"url":"http://tang.srv","adv":"adv.jws"}' \ <<< "temppass" cryptsetup luksRemoveKey /dev/vda2 <<< "temppass" %end
前述の例では、バインディング設定の一部として Tang サーバーからアドバタイズメントをダウンロードし、バインディングを完全に非対話型にします。
警告cryptsetup luksRemoveKey
コマンドは、それを適用する LUKS2 デバイスがそれ以上に管理されるのを防ぎます。LUKS1 デバイスに対してのみdmsetup
コマンドを使用して、削除されたマスターキーを回復できます。
Tang サーバーの代わりに TPM 2.0 ポリシーを使用する場合は、同様の手順を使用できます。
関連情報
-
man ページの
clevis(1)
、clevis-luks-bind(1)
、cryptsetup(8)
、およびdmsetup(8)
- キックスタートを使用して Red Hat Enterprise Linux 8 のインストール
9.11. LUKS で暗号化されたリムーバブルストレージデバイスの自動アンロックの設定
この手順に従って、LUKS 暗号化 USB ストレージデバイスの自動ロック解除プロセスを設定します。
手順
USB ドライブなど、LUKS で暗号化したリムーバブルストレージデバイスを自動的にアンロックするには、
clevis-udisks2
パッケージをインストールします。# yum install clevis-udisks2
システムを再起動し、「LUKS で暗号化したボリュームの手動登録の設定」に従って、
clevis luks bind
コマンドを使用したバインディング手順を実行します。以下に例を示します。# clevis luks bind -d /dev/sdb1 tang '{"url":"http://tang.srv"}'
LUKS で暗号化したリムーバブルデバイスは、GNOME デスクトップセッションで自動的にアンロックできるようになりました。Clevis ポリシーにバインドするデバイスは、
clevis luks unlock
コマンドでアンロックできます。# clevis luks unlock -d /dev/sdb1
Tang サーバーの代わりに TPM 2.0 ポリシーを使用する場合は、同様の手順を使用できます。
関連情報
詳細は、以下の man ページを参照してください。
-
clevis-luks-unlockers(7)
9.12. 高可用性 NBDE システムのデプロイメント
Tang は、高可用性デプロイメントを構築する方法を 2 つ提供します。
- クライアントの冗長性 (推奨)
-
クライアントは、複数の Tang サーバーにバインドする機能を使用して設定する必要があります。この設定では、各 Tang サーバーに独自の鍵があり、クライアントは、このサーバーのサブセットに接続することで復号できます。Clevis はすでに、
sss
プラグインを使用してこのワークフローに対応しています。Red Hat は、高可用性のデプロイメントにこの方法を推奨します。 - 鍵の共有
-
冗長性を確保するために、Tang のインスタンスは複数デプロイできます。2 つ目以降のインスタンスを設定するには、
tang
パッケージをインストールし、SSH
経由でrsync
を使用してその鍵ディレクトリーを新規ホストにコピーします。鍵を共有すると鍵への不正アクセスのリスクが高まり、追加の自動化インフラストラクチャーが必要になるため、Red Hat はこの方法を推奨していません。
9.12.1. シャミアの秘密分散を使用した高可用性 NBDE
シャミアの秘密分散 (SSS) は、秘密を複数の固有のパーツに分割する暗号スキームです。秘密を再構築するには、いくつかのパーツが必要になります。数値はしきい値と呼ばれ、SSS はしきい値スキームとも呼ばれます。
Clevis は、SSS の実装を提供します。鍵を作成し、これをいくつかのパーツに分割します。各パーツは、SSS も再帰的に含む別のピンを使用して暗号化されます。また、しきい値 t
も定義します。NBDE デプロイメントで少なくとも t
の部分を復号すると、暗号化鍵が復元され、復号プロセスが成功します。Clevis がしきい値で指定されている数よりも小さい部分を検出すると、エラーメッセージが出力されます。
9.12.1.1. 例 1:2 台の Tang サーバーを使用した冗長性
次のコマンドは、2 台の Tang サーバーのうち少なくとも 1 台が使用可能な場合に、LUKS で暗号化されたデバイスを復号します。
# clevis luks bind -d /dev/sda1 sss '{"t":1,"pins":{"tang":[{"url":"http://tang1.srv"},{"url":"http://tang2.srv"}]}}'
上記のコマンドでは、以下の設定スキームを使用していました。
{ "t":1, "pins":{ "tang":[ { "url":"http://tang1.srv" }, { "url":"http://tang2.srv" } ] } }
この設定では、一覧に記載されている 2 台の tang
サーバーのうち少なくとも 1 つが利用可能であれば、SSS しきい値 t
が 1
に設定され、clevis luks bind
コマンドが秘密を正常に再構築します。
9.13. NBDE ネットワークで仮想マシンのデプロイメント
clevis luks bind
コマンドは、LUKS マスター鍵を変更しません。これは、仮想マシンまたはクラウド環境で使用する、LUKS で暗号化したイメージを作成する場合に、このイメージを実行するすべてのインスタンスがマスター鍵を共有することを意味します。これにはセキュリティーの観点で大きな問題があるため、常に回避する必要があります。
これは、Clevis の制限ではなく、LUKS の設計原理です。クラウドに暗号化された root ボリュームが必要な場合は、クラウドの Red Hat Enterprise Linux の各インスタンスにインストールプロセスを実行できるようにする (通常はキックスタートを使用) 必要があります。このイメージは、LUKS マスター鍵を共有しなければ共有できません。
仮想化環境に自動アンロックをデプロイする場合は、キックスタートファイルを使用して lorax、virt-install などのシステムを使用すること (「キックスタートを使用して、LUKS で暗号化したボリュームの自動登録の設定」を参照)、または暗号化した各仮想マシンに固有のマスター鍵があるようにする自動プロビジョニングツールを使用することを Red Hat は強く推奨します。
TPM 2.0 ポリシーを使用した自動ロック解除は、仮想マシンではサポートされません。
関連情報
詳細は、以下の man ページを参照してください。
-
clevis-luks-bind(1)
9.14. NBDE を使用してクラウド環境に自動的に登録可能な仮想マシンイメージの構築
自動登録可能な暗号化イメージをクラウド環境にデプロイすると、特有の課題が発生する可能性があります。他の仮想化環境と同様に、LUKS マスター鍵を共有しないように、1 つのイメージから起動するインスタンス数を減らすことが推奨されます。
したがって、ベストプラクティスは、どのパブリックリポジトリーでも共有されず、限られたインスタンスのデプロイメントのベースを提供するように、イメージをカスタマイズすることです。作成するインスタンスの数は、デプロイメントのセキュリティーポリシーで定義する必要があります。また、LUKS マスター鍵の攻撃ベクトルに関連するリスク許容度に基づいて決定する必要があります。
LUKS に対応する自動デプロイメントを構築するには、Lorax、virt-install などのシステムとキックスタートファイルを一緒に使用し、イメージ構築プロセス中にマスター鍵の一意性を確保する必要があります。
クラウド環境では、ここで検討する 2 つの Tang サーバーデプロイメントオプションが利用できます。まず、クラウド環境そのものに Tang サーバーをデプロイできます。もしくは、2 つのインフラストラクチャー間で VPN リンクを使用した独立したインフラストラクチャーで、クラウドの外に Tang サーバーをデプロイできます。
クラウドに Tang をネイティブにデプロイすると、簡単にデプロイできます。ただし、別のシステムの暗号文のデータ永続化層でインフラストラクチャーを共有します。Tang サーバーの秘密鍵および Clevis メタデータは、同じ物理ディスクに保存できる場合があります。この物理ディスクでは、暗号文データへのいかなる不正アクセスが可能になります。
このため、Red Hat は、データを保存する場所と、Tang が実行しているシステムを、物理的に分離させることを強く推奨します。クラウドと Tang サーバーを分離することで、Tang サーバーの秘密鍵が、Clevis メタデータと誤って結合することがないようにします。さらに、これにより、クラウドインフラストラクチャーが危険にさらされている場合に、Tang サーバーのローカル制御を提供します。
9.15. Clevis および Tang のシステムロールの概要
RHEL システムロールは、複数の RHEL システムをリモートで管理する一貫した構成インターフェースを提供する Ansible ロールおよびモジュールの集合です。
RHEL 8.3 では、Clevis および Tang を使用した PBD (Policy-Based Decryption) ソリューションの自動デプロイメント用 Ansible ロールが導入されました。rhel-system-roles
パッケージには、これらのシステムロール、関連する例、リファレンスドキュメントが含まれます。
nbde_client
システムロールにより、複数の Clevis クライアントを自動的にデプロイできます。nbde_client
ロールは、Tang バインディングのみをサポートしており、現時点では TPM2 バインディングには使用できない点に留意してください。
nbde_client
ロールには、LUKS を使用して暗号化済みのボリュームが必要です。このロールは、LUKS 暗号化ボリュームの 1 つ以上の Network-Bound (NBDE) サーバー (Tang サーバー) へのバインドに対応します。パスフレーズを使用して既存のボリュームの暗号化を保持するか、または削除できます。パスフレーズを削除したら、NBDE だけを使用してボリュームのロックを解除できます。これは、システムのプロビジョニング後に削除する必要がある一時鍵またはパスワードを使用して、ボリュームが最初に暗号化されている場合に役立ちます。
パスフレーズと鍵ファイルの両方を指定する場合には、ロールは最初に指定した内容を使用します。有効なバインディングが見つからない場合は、既存のバインディングからパスフレーズの取得を試みます。
PBD では、デバイスをスロットにマッピングするものとしてバインディングを定義します。つまり、同じデバイスに複数のバインディングを指定できます。デフォルトのスロットは 1 です。
nbde_client
ロールでは、state
変数も指定できます。新しいバインディングを作成するか、既存のバインディングを更新する場合は、present
を使用します。clevis luks bind
とは異なり、state: present
を使用してデバイススロットにある既存のバインディングを上書きすることもできます。absent
に設定すると、指定したバインディングが削除されます。
nbde_server
ロールを使用すると、自動ディスク暗号化ソリューションの一部として、Tang サーバーをデプロイして管理できます。このロールは以下の機能をサポートします。
- Tang 鍵のローテーション
- Tang 鍵のデプロイおよびバックアップ
関連情報
-
NBDE (Network-Bound Disk Encryption) ロール変数の詳細は、
rhel-system-roles
パッケージをインストールし、/usr/share/doc/rhel-system-roles/nbde_client/
と/usr/share/doc/rhel-system-roles/nbde_server/
ディレクトリーのREADME.md
とREADME.html
ファイルを参照してください。 -
たとえば、system-roles Playbook の場合は、
rhel-system-roles
パッケージをインストールし、/usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/
ディレクトリーを参照してください。 - RHEL システムロールの詳細は、「RHEL のシステムロールの概要」 を参照してください。
9.16. 複数の Tang サーバーを設定する nbde_server システムロールの使用
以下の手順に従って、Tang-server 設定を含む Ansible Playbook を準備および適用します。
前提条件
- Red Hat Ansible Engine のサブスクリプションがシステムに割り当てられている。詳細は、「Red Hat Ansible Engine のダウンロードおよびインストールの方法」 を参照してください。
手順
RHEL Ansible リポジトリーを有効にします。以下に例を示します。
# subscription-manager repos --enable ansible-2-for-rhel-8-x86_64-rpms
Ansible Engine をインストールします。
# yum install ansible
RHEL システムロールをインストールします。
# yum install rhel-system-roles
Tang サーバーの設定が含まれる Playbook を準備します。ゼロから開始するか、または
/usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/
ディレクトリーにある Playbook のいずれかのサンプルを使用することができます。# cp /usr/share/ansible/roles/rhel-system-roles.nbde_server/examples/simple_deploy.yml ./my-tang-playbook.yml
選択したテキストエディターで Playbook を編集します。以下に例を示します。
# vi my-tang-playbook.yml
必要なパラメーターを追加します。以下の Playbook の例では、Tang サーバーのデプロイとキーローテーションを確実に実行します。
--- - hosts: all vars: nbde_server_rotate_keys: yes roles: - linux-system-roles.nbde_server
終了した Playbook を適用します。
# ansible-playbook -i host1,host2,host3 my-tang-playbook.yml
関連情報
-
詳細は、
rhel-system-roles
パッケージをインストールして、/usr/share/doc/rhel-system-roles/nbde_server/
ディレクトリーおよびusr/share/ansible/roles/rhel-system-roles.nbde_server/
ディレクトリーを参照してください。
9.17. 複数の Clevis クライアントを設定する nbde_client システムロールの使用
手順に従って、Clevis-client 設定を含む Ansible Playbook を準備および適用します。
nbde_client
システムロールは、Tang バインディングのみをサポートします。これは、現時点では TPM2 バインディングに使用できないことを意味します。
前提条件
- Red Hat Ansible Engine のサブスクリプションがシステムに割り当てられている。詳細は、「Red Hat Ansible Engine のダウンロードおよびインストールの方法」 を参照してください。
- ボリュームはすでに、LUKS で暗号化されています。
手順
RHEL Ansible リポジトリーを有効にします。以下に例を示します。
# subscription-manager repos --enable ansible-2-for-rhel-8-x86_64-rpms
Ansible Engine をインストールします。
# yum install ansible
RHEL システムロールをインストールします。
# yum install rhel-system-roles
Clevis クライアントの設定が含まれる Playbook を準備します。ゼロから開始するか、または
/usr/share/ansible/roles/rhel-system-roles.nbde_client/examples/
ディレクトリーにある Playbook のいずれかのサンプルを使用することができます。# cp /usr/share/ansible/roles/rhel-system-roles.nbde_client/examples/high_availability.yml ./my-clevis-playbook.yml
選択したテキストエディターで Playbook を編集します。以下に例を示します。
# vi my-clevis-playbook.yml
必要なパラメーターを追加します。以下の Playbook の例では、2 つの Tang サーバーのうち少なくとも 1 台が利用可能な場合に、LUKS で暗号化した 2 つのボリュームを自動的にアンロックするように Clevis クライアントを設定します。
--- - hosts: all vars: nbde_client_bindings: - device: /dev/rhel/root encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com - device: /dev/rhel/swap encryption_key_src: /etc/luks/keyfile servers: - http://server1.example.com - http://server2.example.com roles: - linux-system-roles.nbde_client
終了した Playbook を適用します。
# ansible-playbook -i host1,host2,host3 my-clevis-playbook.yml
関連情報
-
パラメーターの詳細と、
nbde_client
ロールに関する追加情報は、rhel-system-roles
パッケージをインストールし、/usr/share/doc/rhel-system-roles/nbde_client/
および/usr/share/ansible/roles/rhel-system-roles.nbde_client/
ディレクトリーを参照してください。
9.18. 関連情報
-
man ページの
tang(8)
、clevis(1)
、jose(1)
、およびclevis-luks-unlockers(7)
- ナレッジベースの記事「How to set up Network-Bound Disk Encryption with multiple LUKS devices (Clevis+Tang unlocking)」
第10章 システムの監査
Audit は、追加のセキュリティー機能をシステムに提供するのではありません。システムで使用されるセキュリティーポリシーの違反を発見するために使用できます。このような違反は、SELinux などの別のセキュリティー対策で防ぐことができます。
10.1. Linux の Audit
Linux の Audit システムは、システムのセキュリティー関連情報を追跡する方法を提供します。事前設定されたルールに基づき、Audit は、ログエントリーを生成し、システムで発生しているイベントに関する情報をできるだけ多く記録します。この情報は、ミッションクリティカルな環境でセキュリティーポリシーの違反者と、違反者によるアクションを判断する上で必須のものです。
以下は、Audit がログファイルに記録できる情報の概要です。
- イベントの日時、タイプ、結果
- サブジェクトとオブジェクトの機密性のラベル
- イベントを開始したユーザーの ID とイベントの関連性
- Audit 設定の全修正および Audit ログファイルへのアクセス試行
- SSH、Kerberos、およびその他の認証メカニズムの全使用
-
信頼できるデータベース (
/etc/passwd
など) への変更 - システムからの情報のインポート、およびシステムへの情報のエクスポートの試行
- ユーザー ID、サブジェクトおよびオブジェクトラベルなどの属性に基づく include または exclude イベント
Audit システムの使用は、多くのセキュリティー関連の認定における要件でもあります。Audit は、以下の認定またはコンプライアンスガイドの要件に合致するか、それを超えるように設計されています。
- Controlled Access Protection Profile (CAPP)
- Labeled Security Protection Profile (LSPP)
- Rule Set Base Access Control (RSBAC)
- NISPOM (National Industrial Security Program Operating Manual)
- Federal Information Security Management Act (FISMA)
- PCI DSS (Payment Card Industry Data Security Standard)
- セキュリティー技術実装ガイド (Security Technical Implementation Guide (STIG))
Audit は以下でも認定されています。
- National Information Assurance Partnership (NIAP) および Best Security Industries (BSI) による評価
- Red Hat Enterprise Linux 5 における LSPP/CAPP/RSBAC/EAL4 以降の認定
- Red Hat Enterprise Linux 6 における OSPP/EAL4 以降 (Operating System Protection Profile / Evaluation Assurance Level 4 以降) の認定
使用例
- ファイルアクセスの監視
- Audit は、ファイルやディレクトリーがアクセス、修正、または実行されたか、もしくはファイル属性が変更されたかを追跡できます。これはたとえば、重要なファイルへのアクセスを検出し、これらのファイルが破損した場合に監査証跡を入手可能とする際に役に立ちます。
- システムコールの監視
-
Audit は、一部のシステムコールが使用されるたびにログエントリーを生成するように設定できます。これを使用すると、
settimeofday
やclock_adjtime
、その他の時間関連のシステムコールを監視することで、システム時間への変更を追跡できます。 - ユーザーが実行したコマンドの記録
-
Audit はファイルが実行されたかどうかを追跡できるため、特定のコマンドの実行を毎回記録するようにルールを定義できます。たとえば、
/bin
ディレクトリー内のすべての実行可能ファイルにルールを定義できます。これにより作成されるログエントリーをユーザー ID で検索すると、ユーザーごとに実行されたコマンドの監査証跡を生成できます。 - システムのパス名の実行の記録
- ルールの呼び出し時にパスを inode に変換するファイルアクセスをウォッチする以外に、ルールの呼び出し時に存在しない場合や、ルールの呼び出し後にファイルが置き換えられた場合でも、Audit がパスの実行をウォッチできるようになりました。これにより、ルールは、プログラム実行ファイルをアップグレードした後、またはインストールされる前にも機能を継続できます。
- セキュリティーイベントの記録
-
pam_faillock
認証モジュールは、失敗したログイン試行を記録できます。Audit で失敗したログイン試行も記録するように設定すると、ログインを試みたユーザーに関する追加情報が提供されます。 - イベントの検索
-
Audit は
ausearch
ユーティリティーを提供します。これを使用すると、ログエントリーをフィルターにかけ、いくつかの条件に基づく完全な監査証跡を提供できます。 - サマリーレポートの実行
-
aureport
ユーティリティーを使用すると、記録されたイベントのデイリーレポートを生成できます。システム管理者は、このレポートを分析し、疑わしいアクティビティーをさらに調べることができます。 - ネットワークアクセスの監視
-
iptables
ユーティリティーおよびebtables
ユーティリティーは、Audit イベントを発生するように設定できるため、システム管理者がネットワークアクセスを監視できるようになります。
システムのパフォーマンスは、Audit が収集する情報量によって影響される可能性があります。
10.2. Audit システムのアーキテクチャー
Audit システムは、ユーザー空間アプリケーションおよびユーティリティーと、カーネル側のシステムコール処理という 2 つの主要部分で構成されます。カーネルコンポーネントは、ユーザー空間アプリケーションからシステムコールを受け、これを user、task、fstype、または exit のいずれかのフィルターで振り分けます。
システムコールが exclude フィルターを通過すると、前述のフィルターのいずれかに送られます。このフィルターにより、Audit ルール設定に基づいてシステムコールが Audit デーモンに送信され、さらに処理されます。
ユーザー空間の Audit デーモンは、カーネルから情報を収集し、ログファイルのエントリーを作成します。他のユーザー空間ユーティリティーは、Audit デーモン、カーネルの Audit コンポーネント、または Audit ログファイルと相互作用します。
-
auditctl
- Audit 制御ユーティリティーはカーネル Audit コンポーネントと相互作用し、ルールを管理するだけでなくイベント生成プロセスの多くの設定やパラメーターも制御します。 -
残りの Audit ユーティリティーは、Audit ログファイルのコンテンツを入力として受け取り、ユーザーの要件に基づいて出力を生成します。たとえば、
aureport
ユーティリティーは、記録された全イベントのレポートを生成します。
RHEL 8 では、Audit dispatcher デーモン (audisp
) 機能は、Audit デーモン (auditd
) に統合されています。監査イベントと、リアルタイムの分析プログラムの相互作用に使用されるプラグイン設定ファイルは、デフォルトで /etc/audit/plugins.d/
ディレクトリーに保存されます。
10.3. セキュアな環境への auditd の設定
デフォルトの auditd
設定は、ほとんどの環境に適しています。ただし、厳格なセキュリティーポリシーに対応する必要がある場合は、/etc/audit/auditd.conf
ファイルの Audit デーモン設定に以下の設定が推奨されます。
- log_file
-
Audit ログファイル (通常は
/var/log/audit/
) を保持するディレクトリーは、別のマウントポイントにマウントされている必要があります。これにより、その他のプロセスがこのディレクトリー内の領域を使用しないようにし、Audit デーモンの残りの領域を正確に検出します。 - max_log_file
- 1 つの Audit ログファイルの最大サイズを指定します。Audit ログファイルを保持するパーティションで利用可能な領域をすべて使用するように設定する必要があります。
- max_log_file_action
-
max_log_file
に設定した制限に達すると実行するアクションを指定します。Audit ログファイルが上書きされないようにkeep_logs
に設定する必要があります。 - space_left
-
space_left_action
パラメーターに設定したアクションが発生するディスクの空き容量を指定します。管理者は、ディスクの領域を反映して解放するのに十分な時間を設定する必要があります。space_left
の値は、Audit ログファイルが生成される速度によって異なります。 - space_left_action
-
space_left_action
パラメーターは、適切な通知方法 (email
またはexec
) に設定することが推奨されます。 - admin_space_left
-
admin_space_left_action
パラメーターに設定したアクションが発生するディスクの空き領域の最小サイズ。管理者が実行するアクションのログを記録するのに十分なサイズを残す必要があります。 - admin_space_left_action
-
single
を、システムをシングルユーザーモードにし、管理者がディスク領域を解放できるようにします。 - disk_full_action
-
Audit ログファイルが含まれるパーティションに空き領域がない場合に発生するアクションを指定します (
halt
またはsingle
に設定する必要があります)。これにより、Audit がイベントをログに記録できなくなると、システムは、シングルユーザーモードでシャットダウンまたは動作します。 - disk_error_action
-
Audit ログファイルが含まれるパーティションでエラーが検出された場合に発生するアクションを指定します。このパラメーターは、ハードウェアの機能不全処理に関するローカルのセキュリティーポリシーに基づいて、
syslog
、single
、halt
のいずれかに設定する必要があります。 - flush
-
incremental_async
に設定する必要があります。これはfreq
パラメーターと組み合わせて機能します。これは、ハードドライブとのハード同期を強制する前にディスクに送信できるレコードの数を指定します。freq
パラメーターは100
に設定する必要があります。このパラメーターにより、アクティビティーが集中した際に高いパフォーマンスを保ちつつ、Audit イベントデータがディスクのログファイルと確実に同期されるようになります。
残りの設定オプションは、ローカルのセキュリティーポリシーに合わせて設定します。
10.4. auditd の開始および制御
auditd
が設定されたら、サービスを起動して Audit 情報を収集し、ログファイルに保存します。root ユーザーで次のコマンドを実行し、auditd
を起動します。
# service auditd start
システムの起動時に auditd
が開始するように設定するには、次のコマンドを実行します。
# systemctl enable auditd
service auditd action
コマンドを使用すると、auditd
でさまざまなアクションを実行できます。ここでの アクション は以下のいずれかになります。
stop
-
auditd
を停止します。 restart
-
auditd
を再起動します。 reload
またはforce-reload
-
/etc/audit/auditd.conf
ファイルからauditd
の設定を再ロードします。 rotate
-
/var/log/audit/
ディレクトリーのログファイルをローテーションします。 resume
- Audit イベントのログが一旦停止した後、再開します。たとえば、Audit ログファイルが含まれるディスクパーティションの未使用領域が不足している場合などです。
condrestart
またはtry-restart
-
auditd
がすでに起動している場合にのみ、これを再起動します。 status
-
auditd
の稼働状況を表示します。
service
コマンドは、auditd
デーモンと正しく相互作用する唯一の方法です。auid
値が適切に記録されるように、service
コマンドを使用する必要があります。systemctl
コマンドは、2 つのアクション (enable
および status
) にのみ使用できます。
10.5. Audit ログファイルについて
デフォルトでは、Audit システムはログエントリーを /var/log/audit/audit.log
ファイルに保存します。ログローテーションが有効になっていれば、ローテーションされた audit.log
ファイルは同じディレクトリーに保存されます。
下記の Audit ルールを追加して、/etc/ssh/sshd_config
ファイルの読み取りまたは修正の試行をすべてログに記録します。
# auditctl -w /etc/ssh/sshd_config -p warx -k sshd_config
auditd
デーモンが実行している場合は、たとえば次のコマンドを使用して、Audit ログファイルに新しいイベントを作成します。
$ cat /etc/ssh/sshd_config
このイベントは、audit.log
ファイルでは以下のようになります。
type=SYSCALL msg=audit(1364481363.243:24287): arch=c000003e syscall=2 success=no exit=-13 a0=7fffd19c5592 a1=0 a2=7fffd19c4b50 a3=a items=1 ppid=2686 pid=3538 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts0 ses=1 comm="cat" exe="/bin/cat" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="sshd_config" type=CWD msg=audit(1364481363.243:24287): cwd="/home/shadowman" type=PATH msg=audit(1364481363.243:24287): item=0 name="/etc/ssh/sshd_config" inode=409248 dev=fd:00 mode=0100600 ouid=0 ogid=0 rdev=00:00 obj=system_u:object_r:etc_t:s0 nametype=NORMAL cap_fp=none cap_fi=none cap_fe=0 cap_fver=0 type=PROCTITLE msg=audit(1364481363.243:24287) : proctitle=636174002F6574632F7373682F737368645F636F6E666967
上記のイベントは 4 つのレコードで構成されており、タイムスタンプとシリアル番号を共有します。レコードは、常に type=
で始まります。各レコードには、スペースまたはコンマで区切られた名前と値のペア (name=value
) が複数使用されています。上記のイベントの詳細な分析は以下のようになります。
1 つ目のレコード
type=SYSCALL
-
type
フィールドには、レコードのタイプが記載されます。この例のSYSCALL
値は、カーネルへのシステムコールによりこれが記録されたことを示しています。
msg=audit(1364481363.243:24287):
msg
フィールドには以下が記録されます。-
audit(time_stamp:ID)
形式のレコードのタイムスタンプおよび一意の ID。複数のレコードが同じ Audit イベントの一部として生成されている場合は、同じタイムスタンプおよび ID を共有できます。タイムスタンプは Unix の時間形式です (1970 年 1 月 1 日 00:00:00 UTC からの秒数)。 -
カーネル空間およびユーザー空間のアプリケーションが提供するさまざまなイベント固有の
name=value
ペア。
-
arch=c000003e
-
arch
フィールドには、システムの CPU アーキテクチャーに関する情報が含まれます。c000003e
の値は 16 進数表記で記録されます。ausearch
コマンドで Audit レコードを検索する場合は、-i
オプションまたは--interpret
オプションを使用して、16 進数の値を人間が判読できる値に自動的に変換します。c000003e
値はx86_64
として解釈されます。 syscall=2
-
syscall
フィールドは、カーネルに送信されたシステムコールのタイプを記録します。値が2
の場合は、/usr/include/asm/unistd_64.h
ファイルに、人間が判読できる値を指定できます。この場合の2
は、オープン
なシステムコールです。ausyscall
ユーティリティーでは、システムコール番号を、人間が判読できる値に変換できます。ausyscall --dump
コマンドを使用して、システムコールの一覧とその数字を表示します。詳細は、man ページのausyscall
(8) を参照してください。 success=no
-
success
フィールドは、その特定のイベントで記録されたシステムコールが成功したかどうかを記録します。この例では、呼び出しが成功しませんでした。 exit=-13
exit
フィールドには、システムコールが返した終了コードを指定する値が含まれます。この値は、システムコールにより異なります。次のコマンドを実行すると、この値を人間が判読可能なものに変換できます。# ausearch --interpret --exit -13
この例では、監査ログに、終了コード
-13
で失敗したイベントが含まれていることが前提となります。a0=7fffd19c5592
,a1=0
,a2=7fffd19c5592
,a3=a
-
a0
からa3
までのフィールドは、このイベントにおけるシステムコールの最初の 4 つの引数を、16 進法で記録します。この引数は、使用されるシステムコールにより異なります。ausearch
ユーティリティーで解釈できます。 items=1
-
items
フィールドには、システムコールのレコードに続く PATH 補助レコードの数が含まれます。 ppid=2686
-
ppid
フィールドは、親プロセス ID (PPID) を記録します。この例では、2686
は、bash
などの親プロセスの PPID です。 pid=3538
-
pid
フィールドは、プロセス ID (PID) を記録します。この例の3538
はcat
プロセスの PID です。 auid=1000
-
auid
フィールドには、loginuid である Audit ユーザー ID が記録されます。この ID は、ログイン時にユーザーに割り当てられ、ユーザーの ID が変更した後でもすべてのプロセスに引き継がれます (たとえば、su - john
コマンドでユーザーアカウントを切り替えた場合)。 uid=1000
-
uid
フィールドは、解析しているプロセスを開始したユーザーのユーザー ID を記録します。ユーザー ID は、ausearch -i --uid UID
のコマンドを使用するとユーザー名に変換されます。 gid=1000
-
gid
フィールドは、解析しているプロセスを開始したユーザーのグループ ID を記録します。 euid=1000
-
euid
フィールドは、解析しているプロセスを開始したユーザーの実効ユーザー ID を記録します。 suid=1000
-
suid
フィールドは、解析しているプロセスを開始したユーザーのセットユーザー ID を記録します。 fsuid=1000
-
fsuid
フィールドは、解析しているプロセスを開始したユーザーのファイルシステムユーザー ID を記録します。 egid=1000
-
egid
フィールドは、解析しているプロセスを開始したユーザーの実効グループ ID を記録します。 sgid=1000
-
sgid
フィールドは、解析しているプロセスを開始したユーザーのセットグループ ID を記録します。 fsgid=1000
-
fsgid
フィールドは、解析しているプロセスを開始したユーザーのファイルシステムグループ ID を記録します。 tty=pts0
-
tty
フィールドは、解析しているプロセスが開始したターミナルを記録します。 ses=1
-
ses
フィールドは、解析しているプロセスが開始したセッションのセッション ID を記録します。 comm="cat"
-
comm
フィールドは、解析しているプロセスを開始するために使用したコマンドのコマンドライン名を記録します。この例では、この Audit イベントを発生するのに、cat
コマンドが使用されました。 exe="/bin/cat"
-
exe
フィールドは、解析しているプロセスを開始するために使用した実行可能ファイルへのパスを記録します。 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
-
subj
フィールドは、解析しているプロセスの実行時にラベル付けされた SELinux コンテンツを記録します。 key="sshd_config"
-
key
フィールドは、Audit ログでこのイベントを生成したルールに関連付けられている管理者による定義の文字列を記録します。
2 つ目のレコード
type=CWD
2 つ目のレコードの
type
フィールドの値は、CWD
(現在の作業ディレクトリー) です。このタイプは、最初のレコードで指定されたシステムコールを開始したプロセスの作業ディレクトリーを記録するために使用されます。この記録の目的は、相対パスが関連する PATH 記録に保存された場合に、現行プロセスの位置を記録することにあります。これにより、絶対パスを再構築できます。
msg=audit(1364481363.243:24287)
-
msg
フィールドは、最初のレコードと同じタイムスタンプと ID の値を保持します。タイムスタンプは Unix の時間形式です (1970 年 1 月 1 日 00:00:00 UTC からの秒数)。 cwd="/home/user_name"
-
cwd
フィールドは、システムコールが開始したディレクトリーのパスになります。
3 つ目のレコード
type=PATH
-
3 つ目のレコードでは、
type
フィールドの値はPATH
です。Audit イベントには、システムコールに引数として渡されたすべてのパスにPATH
タイプのレコードが含まれます。この Audit イベントでは、1 つのパス (/etc/ssh/sshd_config
) のみが引数として使用されます。 msg=audit(1364481363.243:24287):
-
msg
フィールドは、1 つ目と 2 つ目のレコードと同じタイムスタンプと ID になります。 item=0
-
item
フィールドは、SYSCALL
タイプレコードで参照されているアイテムの合計数のうち、現在のレコードがどのアイテムであるかを示します。この数はゼロベースで、0
は最初の項目であることを示します。 name="/etc/ssh/sshd_config"
-
name
フィールドは、システムコールに引数として渡されたファイルまたはディレクトリーのパスを記録します。この場合、これは/etc/ssh/sshd_config
ファイルです。 inode=409248
inode
フィールドには、このイベントで記録されたファイルまたはディレクトリーに関連する inode 番号が含まれます。以下のコマンドは、inode 番号409248
に関連するファイルまたはディレクトリーを表示します。# find / -inum 409248 -print /etc/ssh/sshd_config
dev=fd:00
-
dev
フィールドは、このイベントで記録されたファイルまたはディレクトリーを含むデバイスのマイナーおよびメジャーの ID を指定します。ここでは、値が/dev/fd/0
デバイスを示しています。 mode=0100600
-
mode
フィールドは、ファイルまたはディレクトリーのパーミッションを、st_mode
フィールドのstat
コマンドが返す数字表記で記録します。詳細は、man ページのstat(2)
を参照してください。この場合、0100600
は-rw-------
として解釈されます。つまり、root ユーザーにのみ、/etc/ssh/sshd_config
ファイルに読み取りおよび書き込みのパーミッションが付与されます。 ouid=0
-
ouid
フィールドは、オブジェクトの所有者のユーザー ID を記録します。 ogid=0
-
ogid
フィールドは、オブジェクトの所有者のグループ ID を記録します。 rdev=00:00
-
rdev
フィールドには、特定ファイルにのみ記録されたデバイス識別子が含まれます。ここでは、記録されたファイルは通常のファイルであるため、このフィールドは使用されません。 obj=system_u:object_r:etc_t:s0
-
obj
フィールドは、実行時に、記録されているファイルまたはディレクトリーにラベル付けする SELinux コンテキストを記録します。 nametype=NORMAL
-
nametype
フィールドは、指定したシステムコールのコンテキストで各パスのレコード操作の目的を記録します。 cap_fp=none
-
cap_fp
フィールドは、ファイルまたはディレクトリーオブジェクトで許可されたファイルシステムベースの機能の設定に関連するデータを記録します。 cap_fi=none
-
cap_fi
フィールドは、ファイルまたはディレクトリーオブジェクトの継承されたファイルシステムベースの機能の設定に関するデータを記録します。 cap_fe=0
-
cap_fe
フィールドは、ファイルまたはディレクトリーオブジェクトのファイルシステムベースの機能の有効ビットの設定を記録します。 cap_fver=0
-
cap_fver
フィールドは、ファイルまたはディレクトリーオブジェクトのファイルシステムベースの機能のバージョンを記録します。
4 つ目のレコード
type=PROCTITLE
-
type
フィールドには、レコードのタイプが記載されます。この例のPROCTITLE
値は、このレコードにより、カーネルへのシステムコールにより発生するこの監査イベントを発生させた完全なコマンドラインを提供することが指定されることを示しています。 proctitle=636174002F6574632F7373682F737368645F636F6E666967
-
proctitle
フィールドは、解析しているプロセスを開始するために使用したコマンドのコマンドラインを記録します。このフィールドは 16 進数の表記で記録され、Audit ログパーサーに影響が及ばないようにします。このテキストは、この Audit イベントを開始したコマンドに復号します。ausearch
コマンドで Audit レコードを検索する場合は、-i
オプションまたは--interpret
オプションを使用して、16 進数の値を人間が判読できる値に自動的に変換します。636174002F6574632F7373682F737368645F636F6E666967
値は、cat /etc/ssh/sshd_config
として解釈されます。
10.6. auditctl で Audit ルールを定義および実行
Audit システムは、ログファイルで取得するものを定義する一連のルールで動作します。Audit ルールは、auditctl
ユーティリティーを使用してコマンドラインで設定するか、/etc/audit/rules.d/
ディレクトリーで設定できます。
auditctl
コマンドを使用すると、Audit システムの基本的な機能を制御し、どの Audit イベントをログに記録するかを指定するルールを定義できます。
ファイルシステムのルールの例
すべての書き込みアクセスと
/etc/passwd
ファイルのすべての属性変更をログに記録するルールを定義するには、次のコマンドを実行します。# auditctl -w /etc/passwd -p wa -k passwd_changes
すべての書き込みアクセスと、
/etc/selinux/
ディレクトリー内の全ファイルへのアクセスと、その属性変更をすべてログに記録するルールを定義するには、次のコマンドを実行します。# auditctl -w /etc/selinux/ -p wa -k selinux_changes
システムロールのルールの例
システムで 64 ビットアーキテクチャーが使用され、システムコールの
adjtimex
またはsettimeofday
がプログラムにより使用されるたびにログエントリーを作成するルールを定義するには、次のコマンドを実行します。# auditctl -a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
ユーザー ID が 1000 以上のシステムユーザーがファイルを削除したりファイル名を変更するたびに、ログエントリーを作成するルールを定義するには、次のコマンドを実行します。
# auditctl -a always,exit -S unlink -S unlinkat -S rename -S renameat -F auid>=1000 -F auid!=4294967295 -k delete
-F auid!=4294967295
オプションが、ログイン UID が設定されていないユーザーを除外するために使用されています。
実行可能なファイルルール
/bin/id
プログラムのすべての実行をログに取得するルールを定義するには、次のコマンドを実行します。
# auditctl -a always,exit -F exe=/bin/id -F arch=b64 -S execve -k execution_bin_id
関連情報
-
パフォーマンスに関するヒントや、使用例などは、man ページの
audictl(8)
を参照してください。
10.7. 永続的な Audit ルールの定義
再起動後も持続するように Audit ルールを定義するには、/etc/audit/rules.d/audit.rules
ファイルに直接追加するか、/etc/audit/rules.d/
ディレクトリーにあるルールを読み込む augenrules
プログラムを使用する必要があります。
auditd
サービスを開始すると、/etc/audit/audit.rules
ファイルが生成されることに注意してください。/etc/audit/rules.d/
のファイルは、同じ auditctl
コマンドライン構文を使用してルールを指定します。ハッシュ記号 (#) に続く空の行とテキストは無視されます。
また、auditctl
コマンドは、以下のように -R
オプションを使用して指定したファイルからルールを読み込むのに使用することもできます。
# auditctl -R /usr/share/audit/sample-rules/30-stig.rules
10.8. 事前に設定されたルールファイルの使用
/usr/share/audit/sample-rules
ディレクトリーには、audit
パッケージが各種の証明書規格に従って、事前設定ルールのファイル一式が提供されています。
- 30-nispom.rules
- NISPOM (National Industrial Security Program Operating Manual) の「Information System Security」の章で指定している要件を満たす Audit ルール設定
- 30-ospp-v42*.rules
- OSPP (Protection Profile for General Purpose Operating Systems) プロファイルバージョン 4.2 に定義されている要件を満たす監査ルール設定
- 30-pci-dss-v31.rules
- PCI DSS (Payment Card Industry Data Security Standard) v3.1 に設定されている要件を満たす監査ルール設定
- 30-stig.rules
- セキュリティー技術実装ガイド (STIG: Security Technical Implementation Guide) で設定されている要件を満たす Audit ルール設定
上記の設定ファイルを使用するには、/etc/audit/rules.d/
ディレクトリーにコピーして、以下のように augenrules --load
コマンドを使用します。
# cd /usr/share/audit/sample-rules/ # cp 10-base-config.rules 30-stig.rules 31-privileged.rules 99-finalize.rules /etc/audit/rules.d/ # augenrules --load
関連情報
-
番号指定スキームを使用して監査ルールを順序付けできます。詳細は、
/usr/share/audit/sample-rules/README-rules
ファイルを参照してください。 -
詳細、トラブルシューティング、およびその他の使用例は、
audit.rules(7)
の man ページを参照してください。
10.9. 永続ルールを定義する augenrules の使用
augenrules
スクリプトは、/etc/audit/rules.d/
ディレクトリーにあるルールを読み込み、audit.rules
ファイルにコンパイルします。このスクリプトは、自然なソート順序の特定の順番で、.rules
で終わるすべてのファイルを処理します。このディレクトリーのファイルは、以下の意味を持つグループに分類されます。
- 10 - カーネルおよび auditctl の設定
- 20 - 一般的なルールに該当してしまう可能性もあるが、ユーザー側で独自ルールを作成することも可能
- 30 - 主なルール
- 40 - 任意のルール
- 50 - サーバー固有のルール
- 70 - システムのローカルルール
- 90 - ファイナライズ (不変)
ルールは、すべてを一度に使用することは意図されていません。ルールは考慮すべきポリシーの一部であり、個々のファイルは /etc/audit/rules.d/
にコピーされます。たとえば、STIG 設定でシステムを設定し、10-base-config
、30-stig
、31-privileged
、99-finalize
の各ルールをコピーします。
/etc/audit/rules.d/
ディレクトリーにルールを置いたら、--load
ディレクティブで augenrules
スクリプトを実行することでそれを読み込みます。
# augenrules --load
/sbin/augenrules: No change
No rules
enabled 1
failure 1
pid 742
rate_limit 0
...
関連情報
-
Audit ルールおよび
augenrules
スクリプトの詳細は、man ページのaudit.rules(8)
およびaugenrules(8)
を参照してください。
10.10. augenrules の無効化
augenrules
ユーティリティーを無効にするには、以下の手順に従います。これにより、Audit が /etc/audit/audit.rules
ファイルで定義されたルールを使用するように切り替えます。
手順
/usr/lib/systemd/system/auditd.service
ファイルを/etc/systemd/system/
ディレクトリーにコピーします。# cp -f /usr/lib/systemd/system/auditd.service /etc/systemd/system/
任意のテキストエディターで
/etc/systemd/system/auditd.service
ファイルを編集します。以下に例を示します。# vi /etc/systemd/system/auditd.service
augenrules
を含む行をコメントアウトし、auditctl -R
コマンドを含む行のコメント設定を解除します。#ExecStartPost=-/sbin/augenrules --load ExecStartPost=-/sbin/auditctl -R /etc/audit/audit.rules
systemd
デーモンを再読み込みして、auditd.service
ファイルの変更を取得します。# systemctl daemon-reload
auditd
サービスを再起動します。# service auditd restart
関連情報
-
augenrules(8)
およびaudit.rules(8)
の man ページ - ナレッジベース記事: Auditd service restart overrides changes made to /etc/audit/audit.rules
第11章 アプリケーションホワイトリストの設定および管理
アプリケーションのホワイトリストは、未知で潜在的に悪意のあるソフトウェアの実行を効率的に防ぎます。
11.1. RHEL でのアプリケーションのホワイトリスト登録
fapolicyd
ソフトウェアフレームワークは、ユーザー定義ポリシーに基づいたアプリケーションのホワイトリスト化およびブラックリスト化の形式を導入しました。アプリケーションのホワイトリスト機能では、システム上で信頼されていないアプリケーションや悪意のあるアプリケーションを実行しないようにするための最も効率的な方法を利用できます。
fapolicyd
フレームワークは、以下のコンテンツを提供します。
-
fapolicyd
サービス -
fapolicyd
コマンドラインユーティリティー -
fapolicyd
YUMプラグイン -
fapolicyd
ルール言語
管理者は、パス、ハッシュ、MIME タイプ、信頼に基づいて、すべてのアプリケーションに実行ルール allow
および deny
の両方を監査する定義できます。
アプリケーションのホワイトリストには、信頼の概念が導入されています。アプリケーションは、システムパッケージマネージャーによって適切にインストールされると信頼されるため、システムの RPM データベースに登録されます。fapolicyd
デーモンは、RPM データベースを信頼できるバイナリーとスクリプトの一覧として使用します。fapolicyd
YUM プラグインは、YUM パッケージマネージャーにより処理されるシステム更新をすべて登録します。プラグインは、このデータベースの変更を fapolicyd
デーモンに通知します。
rpm
ユーティリティーを使用したインストールでは、データベースを手動で更新する必要があり、アプリケーションを追加する他の方法では、カスタムルールを作成し、fapolicyd
サービスを再起動する必要があります。
fapolicyd
サービス構成は、次の構造を持つ /etc/fapolicyd/
ディレクトリーにあります。
-
fapolicyd.rules
ファイルには、実行ルールのallow
およびdeny
が含まれています。 -
fapolicyd.conf
ファイルには、デーモンの構成オプションが含まれています。このファイルは、主にパフォーマンス調整の目的で役に立ちます。
関連情報
-
詳細は、
fapolicyd(8)
、fapolicyd.rules (5)
、およびfapolicyd.conf(5)
の man ページを参照してください。
11.2. アプリケーションのホワイトリストのデプロイメント
RHEL に fapolicyd
フレームワークをデプロイするには、以下を行います。
手順
fapolicyd
パッケージをインストールします。# yum install fapolicyd
fapolicyd
サービスを有効にして開始します。# systemctl enable --now fapolicyd
検証手順
fapolicyd
サービスが正しく実行されていることを確認します。# systemctl status fapolicyd ● fapolicyd.service - File Access Policy Daemon Loaded: loaded (/usr/lib/systemd/system/fapolicyd.service; enabled; vendor p> Active: active (running) since Tue 2019-10-15 18:02:35 CEST; 55s ago Process: 8818 ExecStart=/usr/sbin/fapolicyd (code=exited, status=0/SUCCESS) Main PID: 8819 (fapolicyd) Tasks: 4 (limit: 11500) Memory: 78.2M CGroup: /system.slice/fapolicyd.service └─8819 /usr/sbin/fapolicyd Oct 15 18:02:35 localhost.localdomain systemd[1]: Starting File Access Policy D> Oct 15 18:02:35 localhost.localdomain fapolicyd[8819]: Initialization of the da> Oct 15 18:02:35 localhost.localdomain fapolicyd[8819]: Reading RPMDB into memory Oct 15 18:02:35 localhost.localdomain systemd[1]: Started File Access Policy Da> Oct 15 18:02:36 localhost.localdomain fapolicyd[8819]: Creating database
root 権限を持たないユーザーとしてログインし、アプリケーションのホワイトリストが機能していることを確認します。以下に例を示します。
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
11.3. 信頼ソースを使用して、ファイルを信頼できるとマークします。
この手順は、fapolicyd
の信頼の追加ソースを使用できます。RHEL 8.3 より前のバージョンでは、fapolicyd
が RPM データベースに含まれるファイルのみを信頼していました。fapolicyd
フレームワークは、/etc/fapolicyd/fapolicyd.trust
プレーンテキストファイルを信頼 のソースとして使用するようになりました。fapolicyd.trust
は、テキストエディターまたは fapolicyd
CLI コマンドで直接変更できます。
カスタム fapolicyd
ルールの上書きよりも、fapolicyd.trust
の使用を信頼するものとしてファイルを指定します。
前提条件
-
fapolicyd
フレームワークがシステムにデプロイされます。
手順
カスタムバイナリーを必要なディレクトリにコピーします。以下に例を示します。
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
カスタムバイナリーに trusted のマークを付けます。
# fapolicyd-cli --file add /tmp/ls
上記のコマンドは、対応する行を
/etc/fapolicyd/fapolicyd.trust
に追加します。fapolicyd
を再起動します。# systemctl restart fapolicyd
検証手順
たとえば、カスタムバイナリーが実行できることを確認します。
$ /tmp/ls ls
関連情報
-
詳細は、
fapolicyd-cli(5)
man ページを参照してください。
11.4. アプリケーションのホワイトリストにカスタムルールを追加
fapolicyd
パッケージのデフォルトのルールセットは、システム機能に影響しません。バイナリーとスクリプトを非標準のディレクトリーに保存したり、yum
インストーラーまたは rpm
インストーラーなしでアプリケーションを追加したりするようなカスタムシナリオの場合は、既存のルールを変更するか、新しいルールを追加する必要があります。次の手順は、新しいルールを追加してカスタムバイナリーをホワイトリストに追加する方法を示しています。
前提条件
-
fapolicyd
フレームワークがシステムにデプロイされます。
手順
カスタムバイナリーを必要なディレクトリにコピーします。以下に例を示します。
$ cp /bin/ls /tmp $ /tmp/ls bash: /tmp/ls: Operation not permitted
fapolicyd
サービスを停止します。# systemctl stop fapolicyd
デバッグモードを使用して、対応するルールを識別します。
fapolicyd --debug
コマンドの出力は冗長で、Ctrl+C を押すか、対応するプロセスを強制終了するだけで停止できるため、エラー出力をファイルにリダイレクトします。# fapolicyd --debug 2> fapolicy.output & [1] 51341
または、別の端末で
fapolicyd
デバッグモードを実行できます。許可されなかったコマンドを繰り返します。
$ /tmp/ls bash: /tmp/ls: Operation not permitted
デバッグモードをフォアグラウンドで再開し、Ctrl+C を押して停止します。
# fg fapolicyd --debug ^Cshutting down... Inter-thread max queue depth 1 Allowed accesses: 2 Denied accesses: 1 [...]
または、
fapolicyd
デバッグモードのプロセスを強制終了します。# kill 51341
アプリケーションの実行を拒否するルールを見つけます。
# cat fapolicy.output [...] rule:9 dec=deny_audit perm=execute auid=1000 pid=51362 exe=/usr/bin/bash : file=/tmp/ls ftype=application/x-executable [...]
/etc/fapolicyd/fapolicyd.rules
ファイルで、カスタムバイナリーの実行を拒否したルールの 前に 新しいallow
ルールを追加します。上記のコマンドの出力では、この例に含まれるルールがルール番号 9 であることを示しています。allow perm=execute exe=/usr/bin/bash trust=1 : path=/tmp/ls ftype=application/x-executable trust=0
または、
/etc/fapolicyd/fapolicyd.rules
ファイルに次のルールを追加することにより、/tmp
ディレクトリー内のすべてのバイナリーの実行を許可できます。allow perm=execute exe=/usr/bin/bash trust=1 : dir=/tmp/ all trust=0
カスタムバイナリーのコンテンツの変更を防ぐには、SHA-256 チェックサムを使用して必要なルールを定義します。
$ sha256sum /tmp/ls 780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836 ls
ルールを以下の定義に変更します。
allow perm=execute exe=/usr/bin/bash trust=1 : sha256hash=780b75c90b2d41ea41679fcb358c892b1251b68d1927c80fbc0d9d148b25e836
fapolicyd
サービスを開始します。# systemctl start fapolicyd
検証手順
たとえば、カスタムバイナリーが実行できることを確認します。
$ /tmp/ls ls
関連情報
-
詳細は、
fapolicyd.rules(5)
man ページを参照してください。
11.5. RHEL アプリケーションのホワイトリストのトラブルシューティング
次のセクションでは、fapolicyd
アプリケーション許可リストフレームワークの基本的なトラブルシューティングのヒントと、rpm
コマンドを使用してアプリケーションを追加するためのガイダンスを示します。
rpm
を使用したアプリケーションのインストール
rpm
コマンドを使用してアプリケーションをインストールする場合は、fapolicyd
RPM データベースの手動更新を実行する必要があります。アプリケーション をインストールします。
# rpm -i application.rpm
データベースを更新します。
# fapolicyd-cli --update
この手順を飛ばすとシステムがフリーズする可能性があるため、再起動する必要があります。
サービスのステータス
fapolicyd
が正しく機能しない場合は、サービスステータスを確認します。# systemctl status fapolicyd
デバッグモード
デバッグモードは、一致したルール、データベースステータスなどに関する詳細情報を提供します。
fapolicyd
をデバッグモードに切り替えるには、以下を行います。fapolicyd
サービスを停止します。# systemctl stop fapolicyd
デバッグモードを使用して、対応するルールを識別します。
# fapolicyd --debug
fapolicyd --debug
コマンドの出力は冗長であるため、エラー出力をファイルにリダイレクトできます。# fapolicyd --debug 2> fapolicy.output
fapolicyd
データベースの削除
fapolicyd
データベースに関連する問題を解決するには、データベースファイルを削除してください。# systemctl stop fapolicyd # fapolicyd-cli --delete-db
警告/var/lib/fapolicyd/
ディレクトリーを削除しないでください。fapolicyd
フレームワークは、このディレクトリー内のデータベースファイルのみを自動的に復元します。
fapolicyd
データベースの削除
fapolicyd
には、有効なすべての信頼ソースからのエントリーが含まれます。データベースをダンプした後にエントリーを確認できます。# fapolicyd-cli dump-db
アプリケーションパイプ
まれに、
fapolicyd
パイプファイルを削除するとロックアップが解決する場合があります。# rm -f /var/run/fapolicyd/fapolicyd.fifo
関連情報
-
詳細は、
fapolicyd-cli(1)
の man ページを参照してください。
11.6. 関連情報
-
詳細は、
man -k fapolicyd
コマンドを使用して一覧表示されるfapolicyd
関連の man ページを参照してください。 -
Linux 環境のアプリケーションのホワイトリスト には、カスタムの
fapolicyd
ルールを追加するいくつかの例があります。
第12章 侵入型 USB デバイスに対するシステムの保護
USB デバイスには、スパイウェア、マルウェア、またはトロイの木馬が読み込まれ、データを盗んだり、システムを損傷する可能性があります。Red Hat Enterprise Linux の管理者として、USBGuard で USB 攻撃を阻止できます。
12.1. USBGuard
USBGuard ソフトウェアフレームワークは、カーネルの USB デバイス認証機能に基づく基本的なホワイトリスト機能およびブラックリスト機能を実装することにより、侵入型 USB デバイスに対してシステムを保護します。
USBGuard フレームワークは、次を提供します。
- 動的対話およびポリシー強制向けの IPC (inter-process communication) インターフェースを使用したシステムサービスコンポーネント
-
実行中の
usbguard
システムサービスと対話するコマンドラインインターフェース - USB デバイス認証ポリシーを記述するルール言語
- 共有ライブラリーに実装されたシステムサービスコンポーネントと対話する C++ API
usbguard
システムサービス設定ファイル (/etc/usbguard/usbguard-daemon.conf
) には、IPC インターフェースを使用するためのユーザーおよびグループを認証するオプションが含まれます。
システムサービスは、USBGuard パブリック IPC インターフェースを提供します。Red Hat Enterprise Linux では、このインターフェースへのアクセスはデフォルトで root ユーザーに限定されています。
IPC インターフェースへのアクセスを制限するには、IPCAccessControlFiles
オプション (推奨)、IPCAllowedUsers
オプション、および IPCAllowedGroups
オプションを設定することを検討してください。
アクセス制御リスト (ACL) を未設定のままにしないでください。設定しないと、すべてのローカルユーザーに IPC インターフェイスが公開され、USB デバイスの認証状態を操作して USBGuard ポリシーを変更できるようになります。
12.2. USBGuard のインストール
この手順を使用して、USBGuard
フレームワークをインストールし、開始します。
手順
usbguard
パッケージをインストールします。# yum install usbguard
初期ルールセットを作成します。
# usbguard generate-policy > /etc/usbguard/rules.conf
usbguard
デーモンを起動し、システムの起動時に自動的に起動することを確認します。# systemctl enable --now usbguard
検証手順
usbguard
サービスが実行していることを確認します。# systemctl status usbguard ● usbguard.service - USBGuard daemon Loaded: loaded (/usr/lib/systemd/system/usbguard.service; enabled; vendor preset: disabled) Active: active (running) since Thu 2019-11-07 09:44:07 CET; 3min 16s ago Docs: man:usbguard-daemon(8) Main PID: 6122 (usbguard-daemon) Tasks: 3 (limit: 11493) Memory: 1.2M CGroup: /system.slice/usbguard.service └─6122 /usr/sbin/usbguard-daemon -f -s -c /etc/usbguard/usbguard-daemon.conf Nov 07 09:44:06 localhost.localdomain systemd[1]: Starting USBGuard daemon... Nov 07 09:44:07 localhost.localdomain systemd[1]: Started USBGuard daemon.
USBGuard
が認識する USB デバイスの一覧を表示します。# usbguard list-devices 4: allow id 1d6b:0002 serial "0000:02:00.0" name "xHCI Host Controller" hash...
関連情報
-
usbguard(1)
およびusbguard-daemon.conf(5)
の man ページ
12.3. CLI で USB デバイスのブロックおよび認証
この手順では、usbguard
コマンドを使用して USB デバイスを認証してブロックする方法を説明します。
前提条件
-
usbguard
サービスがインストールされており、実行している。
手順
USBGuard
が認識する USB デバイスの一覧を表示します。# usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
デバイス 6 を認証してシステムと対話します。
# usbguard allow-device 6
デバイス 6 の認証を解除し、削除します。
# usbguard reject-device 6
デバイス 6 の認可を解除し、保持します。
# usbguard block-device 6
USBGuard
では、block および reject は以下の意味で使用されます。
- block - 今は、このデバイスと対話しない
- reject - このデバイスを、存在しないかのように無視する
関連情報
usbguard
コマンドのオプション一覧を表示します。$ usbguard --help
-
usbguard(1)
の man ページ
12.4. USB デバイスの永続的なブロックおよび認証
-p
オプションを使用すると、USB デバイスを永続的にブロックして認証できます。これにより、デバイス固有のルールが現在のポリシーに追加されます。
前提条件
-
usbguard
サービスがインストールされており、実行している。
手順
usbguard
デーモンがルールの書き込みを許可するように SELinux を設定します。usbguard
に関連するsemanage
ブール値を表示します。# semanage boolean -l | grep usbguard usbguard_daemon_write_conf (off , off) Allow usbguard to daemon write conf usbguard_daemon_write_rules (on , on) Allow usbguard to daemon write rules
オプション:
usbguard_daemon_write_rules
のブール値が無効になっている場合は、有効にします。# semanage boolean -m --on usbguard_daemon_write_rules
USBGuard が認識する USB デバイスの一覧を表示します。
# usbguard list-devices 1: allow id 1d6b:0002 serial "0000:00:06.7" name "EHCI Host Controller" hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" parent-hash "4PHGcaDKWtPjKDwYpIRG722cB9SlGz9l9Iea93+Gt9c=" via-port "usb1" with-interface 09:00:00 ... 6: block id 1b1c:1ab1 serial "000024937962" name "Voyager" hash "CrXgiaWIf2bZAU+5WkzOE7y0rdSO82XMzubn7HDb95Q=" parent-hash "JDOb0BiktYs2ct3mSQKopnOOV2h9MGYADwhT+oUtF2s=" via-port "1-3" with-interface 08:06:50
デバイス 6 を永続的に認証してシステムと対話します。
# usbguard allow-device 6 -p
デバイス 6 の認証を完全に解除して削除します。
# usbguard reject-device 6 -p
デバイス 6 の認証を永続的に解除し、デバイスは保持します。
# usbguard block-device 6 -p
USBGuard
では、block および reject は以下の意味で使用されます。
- block - 今は、このデバイスと対話しない
- reject - このデバイスを、存在しないかのように無視する
検証
USBGuard
ルールに変更が含まれていることを確認します。# usbguard list-rules
関連情報
usbguard
コマンドのオプション一覧を表示します。$ usbguard --help
-
usbguard(1)
の man ページ
12.5. USB デバイス用のカスタムポリシーの作成
以下の手順では、シナリオの要件を反映する USB デバイス用のルールセットを作成する手順を説明します。
前提条件
-
usbguard
サービスがインストールされており、実行している。 -
/etc/usbguard/rules.conf
ファイルには、usbguard generate-policy
コマンドで生成した初期ルールセットが含まれます。
手順
現在接続している USB デバイスを認証するポリシーを作成し、生成されたルールを
rules.conf
ファイルに保存します。# usbguard generate-policy --no-hashes > ./rules.conf
--no-hashes
オプションは、デバイスのハッシュ属性を生成しません。構成設定のハッシュ属性は永続的ではない可能性があるため、回避してください。選択したテキストエディターで
rules.conf
ファイルを編集します。次に例を示します。# vi ./rules.conf
必要に応じて、ルールを追加、削除、または編集します。たとえば、以下のルールを使用すると、大容量ストレージインターフェースが 1 つあるデバイスのみがシステムと対話できます。
allow with-interface equals { 08:*:* }
詳細なルール言語の説明とその他の例は、
usbguard-rules.conf(5)
の man ページを参照してください。更新したポリシーをインストールします。
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
usbguard
デーモンを再起動して、変更を適用します。# systemctl restart usbguard
検証手順
カスタムルールがアクティブポリシーにあることを確認します。以下に例を示します。
# usbguard list-rules ... 4: allow with-interface 08:*:* ...
関連情報
-
usbguard-rules.conf(5)
man ページ
12.6. USB デバイス用に構造化されたカスタムポリシーの作成
カスタム USBGuard
ポリシーは、/etc/usbguard/rules.d/
ディレクトリー内の複数の .conf
ファイルで整理できます。次に、usbguard-daemon
は、メインの rules.conf
ファイルを、ディレクトリー内の .conf
ファイルをアルファベット順で組み合わせます。
前提条件
-
usbguard
サービスがインストールされており、実行している。
手順
現在接続している USB デバイスを認証するポリシーを作成し、生成されたルールを、新しい
.conf
ファイル (例:policy.conf
) ファイルに保存します。# usbguard generate-policy --no-hashes > ./policy.conf
--no-hashes
オプションは、デバイスのハッシュ属性を生成しません。構成設定のハッシュ属性は永続的ではない可能性があるため、回避してください。任意のテキストエディターで
rules.conf
ファイルを編集します。次に例を示します。# vi ./policy.conf ... allow id 04f2:0833 serial "" name "USB Keyboard" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...
選択した行を別の
.conf
ファイルに移動します。注記ファイル名の先頭にある 2 つの数字は、デーモンが設定ファイルを読み込む順序を指定します。
たとえば、キーボードのルールを新規
.conf
ファイルにコピーします。# grep "USB Keyboard" ./policy.conf > ./10keyboards.conf
新しいポリシーを
/etc/usbguard/rules.d/
ディレクトリーにインストールします。# install -m 0600 -o root -g root 10keyboards.conf /etc/usbguard/rules.d/10keyboards.conf
残りの行をメインの
rules.conf
ファイルに移動します。# grep -v "USB Keyboard" ./policy.conf > ./rules.conf
残りのルールをインストールします。
# install -m 0600 -o root -g root rules.conf /etc/usbguard/rules.conf
usbguard
デーモンを再起動して、変更を適用します。# systemctl restart usbguard
検証手順
アクティブな USBGuard ルールをすべて表示します。
# usbguard list-rules ... 15: allow id 04f2:0833 serial "" name "USB Keyboard" hash "kxM/iddRe/WSCocgiuQlVs6Dn0VEza7KiHoDeTz0fyg=" parent-hash "2i6ZBJfTl5BakXF7Gba84/Cp1gslnNc1DM6vWQpie3s=" via-port "7-2" with-interface { 03:01:01 03:00:00 } with-connect-type "unknown" ...
rules.conf
ファイルと、/etc/usbguard/rules
ファイルの内容をすべて表示します。.d/ ディレクトリー内の
.conf# cat /etc/usbguard/rules.conf /etc/usbguard/rules.d/*.conf
- アクティブなルールに、ファイルのすべてのルールが正しく、正しい順序で含まれていることを確認します。
関連情報
-
usbguard-rules.conf(5)
man ページ
12.7. USBGuard IPC インターフェースを使用するユーザーおよびグループの認証
この手順を使用して、特定のユーザーまたはグループが USBGuard のパブリック IPC インターフェースを使用するように認証します。デフォルトでは、root ユーザーだけがこのインターフェースを使用できます。
前提条件
-
usbguard
サービスがインストールされており、実行している。 -
/etc/usbguard/rules.conf
ファイルには、usbguard generate-policy
コマンドで生成した初期ルールセットが含まれます。
手順
任意のテキストエディターで
/etc/usbguard/usbguard-daemon.conf
ファイルを編集します。# vi /etc/usbguard/usbguard-daemon.conf
たとえば、
wheel
グループの全ユーザーが IPC インターフェースを使用できるように、ルールがある行を追加して、ファイルを保存します。IPCAllowGroups=wheel
usbguard
コマンドで、ユーザーまたはグループを追加することもできます。たとえば、次のコマンドを使用すると、joesec ユーザーがDevices
セクションおよびExceptions
セクションに完全アクセスできます。さらに、joesec は現在のポリシーの一覧を表示し、ポリシーシグナルをリッスンできます。# usbguard add-user joesec --devices ALL --policy list,listen --exceptions ALL
joesec ユーザーに付与されたパーミッションを削除するには、
usbguard remove-user joesec
コマンドを使用します。usbguard
デーモンを再起動して、変更を適用します。# systemctl restart usbguard
関連情報
-
usbguard(1)
およびusbguard-rules.conf(5)
の man ページ
12.8. Linux 監査ログへの USBguard 認証イベントの記録
以下の手順に従って、USBguard 認証イベントのログと標準の Linux 監査ログを 1 つにまとめます。デフォルトでは、usbguard
デーモンは /var/log/usbguard/usbguard-audit.log
ファイルにイベントを記録します。
前提条件
-
usbguard
サービスがインストールされており、実行している。 -
auditd
サービスが実行している。
手順
usbguard-daemon.conf
ファイルを、選択したテキストエディターで編集します。# vi /etc/usbguard/usbguard-daemon.conf
AuditBackend
オプションを、FileAudit
からLinuxAudit
に変更します。AuditBackend=LinuxAudit
usbguard
デーモンを再起動して、設定変更を適用します。# systemctl restart usbguard
検証手順
監査
デーモンログを USB 認証イベントに対してクエリーします。次に例を示します。# ausearch -ts recent -m USER_DEVICE
関連情報
-
usbguard-daemon.conf(5)
man ページ
12.9. 関連情報
-
usbguard(1)
、usbguard-rules.conf(5)
、usbguard-daemon(8)
、およびusbguard-daemon.conf(5)
の man ページ - USBGuard ホームページ
法律上の通知
このページには機械翻訳が使用されている場合があります (詳細はこちら)。