第6章 カーネル機能

本章では、多くのユーザー空間ツールを有効にするカーネル機能の目的および使用について説明します。また、これらのツールの詳細についてのリソースも紹介します。

6.1. コントロールグループ

6.1.1. コントロールグループとは?

注記

コントロールグループの名前空間は、Red Hat Enterprise Linux 7.5 ではテクノロジープレビューとして提供されています。

Linux コントロールグループ (cgroup) は、システムハードウェアの使用上の制限を有効にし、cgroup 内で実行する個々のプロセスが cgroup の設定で許可された分だけ活用していることを確認します。

コントロールグループ は、名前空間 が有効にしたリソースの使用量を制限します。たとえば、ネットワーク名前空間により、あるプロセスの特定のネットワークカードへのアクセスが可能となり、cgroup はこのプロセスのカードの使用量が 50%を超えないように確認し、他のプロセスが帯域幅を確実に利用できるようにします。

コントロールグループの名前空間は、/proc/self/ns/cgroup インターフェースを経由して個々の cgroup の仮想化ビューを提供します。

目的は、グローバルな名前空間から cgroup への特権付きデータの漏えいを回避し、コンテナーマイグレーションなどの他の機能を有効にすることです。

現在、コンテナーを単一の cgroup と関連付けることが格段に容易となっていることから、コンテナーにはより一貫した cgroup のビューがあります。また、コンテナー内部のタスクを有効にし、属している cgroup の仮想化ビューが可能となります。

6.1.2. 名前空間とは?

名前空間は、分離したシステムリソースの仮想化ビューを可能にするカーネル機能です。システムリソースからプロセスを分離させることで、プロセスが相互作用可能なものを指定および制御できます。名前空間は、コントロールグループにとって不可欠なものです。

6.1.3. サポートしている名前空間

以下の名前空間は、Red Hat Enterprise Linux 7.5 以降でサポートされています。

  • マウント

    • マウント名前空間は、ファイルシステムのマウントポイントを分離します。これにより各プロセスは明確なファイルシステム領域を持つことができ、その領域内で操作します。
  • UTS

    • ホスト名および NIS ドメイン名
  • IPC

    • System V IPC、POSIX メッセージキュー
  • PID

    • プロセス ID
  • ネットワーク

    • ネットワークデバイス、スタック、ポートなど。
  • ユーザー

    • ユーザーおよびグループ ID
  • コントロールグループ

    • cgroup の分離
注記

コントロールグループの使用方法は、『リソース管理ガイド』 で説明しています。

6.2. カーネルソースチェッカー

Linux カーネルモジュールのソースチェッカー (ksc) は、所定のカーネルモジュール内におけるホワイトリスト以外の記号を確認するツールです。Red Hat パートナーもこのツールを使用して、Red Hat Bugzilla データベースにバグを報告することで、ホワイトリストに含まれる記号のレビューを要求できます。

6.2.1. 使用方法

本ツールは "-k" オプションでモジュールへのパスを受け取ります。

# ksc -k e1000e.ko
Checking against architecture x86_64
Total symbol usage: 165	Total Non white list symbol usage: 74

# ksc -k /path/to/module

出力は、$HOME/ksc-result.txt に保存されます。ホワイトリストへ追加された記号のレビューが要求されると、ホワイトリストに記載されていない各記号の使用方法の説明が ksc-result.txt ファイルに追加される必要があります。"-p" オプションで ksc を実行することで、リクエストバグを報告することができます。

注記

KSC は現在、xz 圧縮をサポートしていません。ksc ツールは、xz 圧縮方法を処理できず、以下のエラーメッセージを表示します。

Invalid architecture, (Only kernel object files are supported)

この制限がなくなるまで、システム管理者は ksc ツールを実行する前に、xz 圧縮を使用して任意のサードパーティーモジュールを手動で展開する必要があります。

6.3. ファイルの Direct Access (DAX)

DAX で知られるファイルの Direct Access により、アプリケーションは、ファイルシステムへのアクセスをバッファーするためにページキャッシュを使用することなく、ストレージデバイスへのデータの読み取りおよび書き込みが可能となります。

この機能は、'direct_access' ブロックデバイス操作を実装するファイルシステムで利用可能で、'-o' でファイルシステムをマウントするか、または /etc/fstab のオプションセクションに 'dax' を追加するかのいずれかで有効となります。

コードの実例を含む詳しい情報は、kernel-doc パッケージを参照してください。これは、/usr/share/doc/kernel-doc-<version>/Documentation/filesystems/dax.txt に保存されていて、'<version>' が対応するカーネルバージョン番号になります。

6.4. ユーザー空間用のメモリー保護キー (別名 PKU または PKEYS)

メモリー保護キーは、ページベースの保護を強化するメカニズムを提供しますが、アプリケーションが保護ドメインを変更した時にページテーブルを修正する必要はありません。これは、各ページテーブルエントリーで以前無視されていた 4 ビットを「保護キー」に割り当て、可能なキーを 16 個提供することで有効となります。

メモリー保護キーは、いくつかの Intel CPU チップセットのハードウェア機能です。 プロセッサーがこの機能をサポートしているかどうかは、pku in /proc/cpuinfo の存在を確認します。

$ grep pku /proc/cpuinfo

この機能をサポートするために、CPU は各キーに対して 2 つの別々のビット (Access Disable と Write Disable) を持つ、ユーザーがアクセス可能な新しいレジスター (PKRU) を提供します。この新しいレジスターの読み取りおよび書き込み用の新しい命令が 2 つ (RDPKRU と WRPKRU) 存在します。

プログラミングの実例を含む詳しい情報は、kernel-doc パッケージが提供する /usr/share/doc/kernel-doc-*/Documentation/x86/protection-keys.txt を参照してください。

6.5. Kernel Adress Space Layout Randomization

Kernel Adress Space Layout Randomization (KASLR) は 2 つの部分で構成され、これらが共に機能して Linux カーネルのセキュリティーを強化します。

  • カーネルテキスト KASLR
  • メモリー管理の KASLR

カーネルテキストの物理アドレスと仮想アドレスの場所が、個別にランダム化されます。カーネルの物理アドレスは 64 TB の任意の場所に配置できますが、カーネルの仮想アドレスは、[0xffffffff80000000, 0xffffffffc0000000] の間の 1 GB 領域に制限されます。

メモリー管理の KASLR には 3 つのセクションがあり、これらのセクションの開始アドレスは特定のエリアでランダム化されます。したがって、悪意のコードが、カーネルアドレス領域にその記号が置かれていることを知る必要がある場合に、KASLR は悪意のコードにカーネルの実行を挿入またはリダイレクトしないようにすることができます。

メモリー管理の KASLR には、以下の 3 つのセクションがあります。

  • 直接マッピングセクション
  • vmalloc セクション
  • vmemmap セクション

KASLR コードが Linux カーネルにコンパイルされ、デフォルトで有効になりました。明示的に無効にするには、nokaslr カーネルオプションをカーネルコマンドラインに追加します。