第1章 カーネルモジュールの使用

本章では、以下を説明します。

  • カーネルモジュールの概要
  • kmod ユーティリティーを使用して、モジュールとその依存関係を管理する方法
  • モジュールパラメーターを設定して、カーネルモジュールの動作を制御する方法
  • 起動時に、モジュールを読み込む方法
注記

本章で説明するカーネルモジュールのユーティリティーを使用するには、最初に root で以下を実行して、ご使用のシステムに kmod パッケージがインストールされていることを確認します。

# yum install kmod

1.1. カーネルモジュールの概要

Linux カーネルは、モノリシックとして設計されています。しかし、各ユースケースで必要とされる追加またはオプションのモジュールでコンパイルされています。つまり、動的に読み込まれる カーネルモジュール を使用してカーネル機能を拡張することができます。カーネルモジュールは、以下のものを提供できます。

  • 新しいハードウェアへのサポートを強化するデバイスドライバー
  • GFS2 または NFS などのファイルシステムのサポート

カーネル自体と同様に、モジュールは動作をカスタマイズするパラメーターを取ることができます。ただし、デフォルトのパラメーターでほとんどのケースで十分に機能します。また、利用可能なパラメーターに使用できる全モジュールやモジュール固有の情報をクエリーできます。さらには、実行中のカーネルに対してモジュールを動的にロード/アンロード (削除) することも可能です。kmod パッケージにより提供される、このようなユーティリティーの多くは、動作の実行時にモジュールの依存関係を考慮するため、手動による依存関係の追跡が必要になることはほぼありません。

最新のシステムでは、必要に応じて、さまざまなメカニズムによりカーネルモジュールが自動的に読み込まれます。ただし、モジュールを手動で読み込むか、削除しないといけない場合もあります。たとえば、どちらのモジュールも基本的な機能は提供できるものの、いずれかのモジュールが好まれる場合か、モジュールが不正な動作をしている場合などです。

1.2. 読み込み済みモジュールの一覧表示

lsmod コマンドを実行すると、現在カーネルに読み込み済みの全カーネルモジュールを一覧表示できます。 以下に例を示します。

# lsmod
Module                  Size  Used by
tcp_lp                 12663  0
bnep                   19704  2
bluetooth             372662  7 bnep
rfkill                 26536  3 bluetooth
fuse                   87661  3
ebtable_broute         12731  0
bridge                110196  1 ebtable_broute
stp                    12976  1 bridge
llc                    14552  2 stp,bridge
ebtable_filter         12827  0
ebtables               30913  3 ebtable_broute,ebtable_nat,ebtable_filter
ip6table_nat           13015  1
nf_nat_ipv6            13279  1 ip6table_nat
iptable_nat            13011  1
nf_conntrack_ipv4      14862  4
nf_defrag_ipv4         12729  1 nf_conntrack_ipv4
nf_nat_ipv4            13263  1 iptable_nat
nf_nat                 21798  4 nf_nat_ipv4,nf_nat_ipv6,ip6table_nat,iptable_nat
[output truncated]

lsmod の出力では、3 つのコラムを表示します。

  • モジュール

    • メモリーに現在読み込まれているカーネルモジュールの名前
  • Size (サイズ)

    • カーネルモジュールが使用するメモリー量 (キロバイト単位)
  • Used by (使用フィールド)

    • Module フィールドにある依存関係の数を表す小数点
    • 依存する Module の名前をコンマ区切りにした文字列。この一覧を使用して、アンロードしたいモジュールに依存しているモジュールすべてを最初にアンロードできます。

最後に、lsmod の出力は /proc/modules 擬似ファイルの内容ほど詳細ではないので、はるかに読み取りやすくなっている点に留意してください。

1.3. モジュール情報の表示

modinfo module_name コマンドを使用してカーネルモジュールに関する詳細情報を表示できます。

注記

カーネルモジュール名を kmod ユーティリティーのいずれかの引数として入力する場合には、その名前の末尾に拡張子 .ko を付けないでください。カーネルモジュール名には拡張子はありません。ただし、対応するファイルには拡張子があります。

例1.1 lsmod を使用したカーネルモジュール情報の一覧表示

Intel PRO/1000 ネットワークドライバーである e1000e モジュールに関する情報を表示するには、root で以下のコマンドを入力します。

# modinfo e1000e
filename:       /lib/modules/3.10.0-121.el7.x86_64/kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko
version:        2.3.2-k
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
author:         Intel Corporation,

1.4. セキュアブート用のカーネルモジュールの署名

Red Hat Enterprise Linux 7 には UEFI セキュアブート機能が含まれているので、Red Hat Enterprise Linux 7 は UEFI セキュアブートが有効になっているシステム上でインストールし、実行できます。Red Hat Enterprise Linux 7 では、UEFI システムでセキュアブートを使用する必要がないことにご留意ください。

セキュアブートが有効な場合は、UEFI オペレーティングシステムのブートローダー、Red Hat Enterprise Linux カーネル、およびすべてのカーネルモジュールを秘密鍵で署名し、それに対応する公開鍵で認証する必要があります。それらが署名・認証されてなければ、システムは起動プロセスを終了できません。

Red Hat Enterprise Linux 7 ディストリビューションには、以下が含まれます。

  • 署名付きブートローダー
  • 署名付きカーネル
  • 署名付きカーネルモジュール

また、署名された第 1 ステージのブートローダーと署名されたカーネルには、組み込み Red Hat 公開鍵が含まれています。これらの署名済みバイナリーおよび組み込み鍵により、Red Hat Enterprise Linux 7 は UEFI セキュアブート対応のシステムで、UEFI ファームウェアが提供する Microsoft UEFI セキュアブート認証局キーを使用してインストール、ブート、および実行できます。

注記

セキュアブートのサポートは、すべての UEFI ベースのシステムに含まれるわけではありません。

以下のセクションでは、セキュアブートが有効になっている UEFI ベースのビルドシステム上で Red Hat Enterprise Linux 7 に使用する、プライベートで構築されたカーネルモジュールへの自己署名に必要な手順を説明しています。また、カーネルモジュールの展開を希望するターゲットシステムに公開鍵をインポートするのに利用可能なオプションについても説明しています。

カーネルモジュールに署名して読み込むには、以下を行う必要があります。

1.4.1. 前提条件

外部でビルドされたカーネルモジュールに署名できるようにするには、次の表にリストされているユーティリティをビルドシステムにインストールします。

表1.1 必要なユーティリティー

ユーティリティー提供するパッケージ使用対象目的

openssl

openssl

ビルドシステム

公開および秘密 X.509 鍵のペアを生成

sign-file

kernel-devel

ビルドシステム

カーネルモジュールの署名に使用する Perl スクリプト

perl

perl

ビルドシステム

署名スクリプトの実行に使用する Perl インタープリター

mokutil

mokutil

ターゲットシステム

公開鍵を手動で登録する際に使用するオプションのユーティリティ

keyctl

keyutils

ターゲットシステム

システムキーリングに公開鍵を表示する際に使用するオプションのツール

注記

カーネルモジュールを構築、署名するビルドシステムは、UEFI セキュアブートを有効にする必要がなく、UEFI ベースのシステムである必要すらありません。

1.4.2. カーネルモジュールの認証

Red Hat Enterprise Linux 7 では、カーネルモジュールの読み込み時に、カーネルのシステムキーリング上の公開 X.509 鍵を使ってモジュールの署名をチェックします。使用される鍵は、カーネルのシステムブラックリストのキーリングにあるものを除きます。次のセクションでは、キー/キーリングのソースの概要、システム内のさまざまなソースからロードされたキーの例を示します。また、ユーザーは、カーネルモジュールの認証に必要なものを確認することができます。

1.4.2.1. カーネルモジュール認証に使用する公開鍵のソース

ブート中にカーネルは、以下の表にある永続的キーストア一式から X.509 鍵をシステムキーリングまたはシステムのブラックリストに読み込みます。

表1.2 システムキーリングのソース

X.509 鍵のソースキー追加に関するユーザー能力UEFI セキュアブートの状態ブート中に読み込まれる鍵

カーネルに埋め込み

×

-

.system_keyring

UEFI セキュアブート "db"

限定的

有効でない

いいえ

有効

.system_keyring

UEFI セキュアブート "dbx"

限定的

有効でない

いいえ

有効

.system_keyring

shim.efi ブートローダーに埋め込み

いいえ

有効でない

いいえ

有効

.system_keyring

Machine Owner Key (MOK) リスト

はい

有効でない

いいえ

有効

.system_keyring

システムが UEFI ベースでない場合、または UEFI セキュアブートが有効になっていない場合は、カーネルに組み込まれた鍵のみがシステムのキーリングに読み込まれます。この場合、カーネルの再構築なしでキーセットを拡張することはできません。

システムのブラックリストキーリングは、無効にされた X.509 鍵の一覧です。ブラックリストにある鍵でモジュールが署名されていると、公開鍵がシステムのキーリングにあったとしても、モジュールは認証に失敗します。

システムのキーリング上にある鍵についての情報は、 keyctl ユーティリティーを使うと表示できます。以下は、UEFI セキュアブートが有効になっていない Red Hat Enterprise Linux 7 システムからの短い出力例です。

# keyctl list %:.system_keyring
3 keys in keyring:
...asymmetric: Red Hat Enterprise Linux Driver Update Program (key 3): bf57f3e87...
...asymmetric: Red Hat Enterprise Linux kernel signing key: 4249689eefc77e95880b...
...asymmetric: Red Hat Enterprise Linux kpatch signing key: 4d38fd864ebe18c5f0b7...

以下は、UEFI セキュアブートが有効になっている Red Hat Enterprise Linux 7 システムからの短い出力例です。

# keyctl list %:.system_keyring
6 keys in keyring:
...asymmetric: Red Hat Enterprise Linux Driver Update Program (key 3): bf57f3e87...
...asymmetric: Red Hat Secure Boot (CA key 1): 4016841644ce3a810408050766e8f8a29...
...asymmetric: Microsoft Corporation UEFI CA 2011: 13adbf4309bd82709c8cd54f316ed...
...asymmetric: Microsoft Windows Production PCA 2011: a92902398e16c49778cd90f99e...
...asymmetric: Red Hat Enterprise Linux kernel signing key: 4249689eefc77e95880b...
...asymmetric: Red Hat Enterprise Linux kpatch signing key: 4d38fd864ebe18c5f0b7...

上記の出力では、UEFI セキュアブート「db」鍵から加わった 2 つの鍵と、shim.efi ブートローダーに組み込まれている Red Hat Secure Boot (CA key 1) が示されています。UEFI セキュアブート関連のソースを使用してキーを識別するカーネルコンソールメッセージを検索することもできます。これには、UEFI セキュアブート db、組み込み shim、および MOK リストが含まれます。

# dmesg | grep 'EFI: Loaded cert'
[5.160660] EFI: Loaded cert 'Microsoft Windows Production PCA 2011: a9290239...
[5.160674] EFI: Loaded cert 'Microsoft Corporation UEFI CA 2011: 13adbf4309b...
[5.165794] EFI: Loaded cert 'Red Hat Secure Boot (CA key 1): 4016841644ce3a8...

1.4.2.2. カーネルモジュール認証の要件

本セクションでは、UEFI セキュアブート機能が有効なシステムでカーネルモジュールを読み込むために必要な条件を説明します。

UEFI セキュアブートが有効な場合、または module.sig_enforce カーネルパラメーターが指定されている場合は、システムのキーリングの鍵を使用して認証された署名済みカーネルモジュールのみを読み込むことができます。また、公開鍵は、システムのブラックリストキーリング上に存在すべきではありません。

UEFI セキュアブートが無効で module.sig_enforce カーネルパラメーターが指定されていない場合は、公開鍵なしで、未署名カーネルモジュールと署名済みカーネルモジュールを読み込むことができます。これは、以下の表で説明されています。

表1.3 カーネルモジュールの読み込み認証要件

モジュールの署名公開鍵ありおよび署名が有効UEFI セキュアブートの状態sig_enforceモジュールの読み込みカーネルの汚染

署名なし

-

有効でない

有効でない

成功

はい

有効でない

有効

失敗

-

有効

-

失敗

-

署名あり

いいえ

有効でない

有効でない

成功

はい

有効でない

有効

失敗

-

有効

-

失敗

-

署名あり

はい

有効でない

有効でない

成功

いいえ

有効でない

有効

成功

いいえ

有効

-

成功

いいえ

1.4.3. 公開および秘密 X.509 鍵のペアの生成

セキュアブートを有効化したシステム上でカーネルモジュールを使用する作業を正常に行うには、公開および秘密 X.509 鍵ペアを生成する必要があります。後で秘密鍵を使用してカーネルモジュールに署名します。セキュアブートで署名済みモジュールを検証するには、適切な公開鍵を Machine Owner Key (MOK) に追加する必要があります。手順は、「システム管理者が手動で公開鍵を MOK リストに追加する」を参照してください。

このキーペア生成のパラメーターの一部は、設定ファイルで指定するのが最適です。

  1. キーペア生成のパラメーターで設定ファイルを作成します。

    # cat << EOF > configuration_file.config
    [ req ]
    default_bits = 4096
    distinguished_name = req_distinguished_name
    prompt = no
    string_mask = utf8only
    x509_extensions = myexts
    
    [ req_distinguished_name ]
    O = Organization
    CN = Organization signing key
    emailAddress = E-mail address
    
    [ myexts ]
    basicConstraints=critical,CA:FALSE
    keyUsage=digitalSignature
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid
    EOF
  2. X.509 公開鍵と秘密鍵のペアを以下の例のように作成します。

    # openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 \
    -batch -config configuration_file.config -outform DER \
    -out my_signing_key_pub.der \
    -keyout my_signing_key.priv

    公開鍵は my_signing_key_pub.der ファイルに書き込まれます。この秘密鍵は my_signing_key.priv ファイルに書き込まれます。

  3. カーネルモジュールを認証、読み込むすべてのシステムに公開鍵を登録します。

    詳細は「公開鍵のターゲットシステムでの登録」を参照してください。

警告

強力なセキュリティー対策とアクセスポリシーを適用して、秘密鍵の内容を保護します。悪用すれば、この鍵は、一致する公開鍵で認証されるシステムのセキュリティに危害を与えるために使用できます。

1.4.4. 公開鍵のターゲットシステムでの登録

セキュアブートが有効になっている UFEI ベースのマシンで Red Hat Enterprise Linux 7 を起動すると、無効化したキーの dbx データベースにあるものを除いて、セキュアブート db キーデータベースにあるすべてのパブリックキーのシステムキーにカーネルがロードされます。以下のセクションでは、システムキーリングが公開鍵を使用してカーネルモジュールを認証できるように、ターゲットシステムで公開鍵をインポートする方法を説明します。

1.4.4.1. 公開鍵を含むファクトリーファームウェアイメージ

システムでカーネルモジュールの認証を実現するために、ファクトリーファームウェアイメージで公開鍵を UEFI セキュアブート鍵データベースに組み入れるようシステムベンダーに要求することを検討します。

1.4.4.2. システム管理者が手動で公開鍵を MOK リストに追加する

Machine Owner Key (MOK) 機能を使用して、UEFI セキュアブートキーデータベースを拡張することができます。セキュアブートが有効になっている UEFI ベースのシステムで Red Hat Enterprise Linux 7 が起動すると、鍵データベースの鍵に加えて、MOK リストの鍵もシステムキーリングに追加されます。MOK リストの鍵は、セキュアブートデータベースの鍵と同様に永続的かつ安全な方法で保存されますが、これらは別個の機能です。MOK 機能は shim.efiMokManager.efigrubx64.efi、および Red Hat Enterprise Linux 7 mokutil ユーティリティーによってサポートされます。

MOK 鍵の登録は、各ターゲットシステムの UEFI システムコンソールでユーザーが物理的に手動で対応する必要があります。それにもかかわらず、MOK 機能は、新規生成された鍵ペアのテストとこれで署名されたカーネルモジュールのテストにおいて便利な方法を提供します。

公開鍵を MOK リストに追加するには、以下に従います。

  1. 公開鍵を MOK リストに追加するようリクエストします。

    # mokutil --import my_signing_key_pub.der

    この MOK 登録リクエストに関するパスワードの入力と確認が求められます。

  2. マシンを再起動します。

    この保留中の MOK 鍵の登録リクエストは shim.efi によって認識され、 MokManager.efi を起動して UEFI コンソールからの登録を完了できます。

  3. このリクエストに関連付けたパスワードを入力し、登録を確認します。

    公開鍵が MOK リストに永続的に追加されます。

鍵が MOK リストに追加されると、UEFI セキュアブートが有効になっているシステムの起動時に毎回、この鍵はシステムのキーリングに自動的に追加されます。

1.4.5. 秘密鍵を使用したカーネルモジュールの署名

カーネルモジュールの準備が完了していることを前提とします。

  • Perl スクリプトを使用して、秘密鍵でカーネルモジュールに署名します。

    # perl /usr/src/kernels/$(uname -r)/scripts/sign-file \
    sha256 \
    my_signing_key.priv\
    my_signing_key_pub.der\
    my_module.ko
    注記

    Perl スクリプトを使用するには、署名するカーネルモジュールファイルの他に、秘密および公開鍵の両方を含むファイルを提供する必要があります。

    カーネルモジュールは ELF イメージ形式で、Perl スクリプトは署名を計算して、カーネルモジュールファイルの ELF イメージに直接追加します。modinfo ユーティリティーを使うと、カーネルモジュールの署名がある場合は、それについての情報を表示できます。modinfo の使用についての情報は、「モジュール情報の表示」を参照してください。

    この追加された署名は ELF イメージセクションには含まれず、また ELF イメージの正式な一部ではありません。このため、readelf のようなユーティリティーは、この署名をカーネルモジュールに表示することができません。

    これでカーネルモジュールの読み込み準備が完了しました。署名済みのカーネルモジュールは、UEFI セキュアブートが無効となっているシステムまたは UEFI 以外のシステムでも読み込み可能であることに注意してください。つまり、署名済みのカーネルモジュールと署名なしのカーネルモジュールの両方を提供する必要はないことになります。

1.4.6. 署名済みカーネルモジュールの読み込み

公開鍵が登録されてシステムキーリングに格納されたら、 mokutil を使って公開鍵を MOK リストに追加します。次に、modprobe コマンドを使用して、カーネルモジュールを手動で読み込みます。

  1. オプションで、公開鍵の登録前にカーネルモジュールを読み込まないことを確認します。

    現在読み込み済みのカーネルモジュールを一覧表示する方法は、「読み込み済みモジュールの一覧表示」を参照してください。

  2. 現在のブートで、システムキーリングに追加されている鍵を確認します。

    # keyctl list %:.system_keyring

    公開鍵はまだ登録されていないので、このコマンドの出力には表示されません。

  3. 公開鍵の登録をリクエストします。

    # mokutil --import my_signing_key_pub.der
  4. 再起動して、UEFI コンソールでの登録を完了します。

    # reboot
  5. システムキーリングの鍵を再度確認します。

    # keyctl list %:.system_keyring
  6. モジュールを必要なカーネルの /extra/ ディレクトリーにコピーします。

    # cp my_module.ko /lib/modules/$(uname -r)/extra/
  7. モジュールの依存関係の一覧を更新します。

    # depmod -a
  8. カーネルモジュールを読み込み、正常にロードされたことを確認します。

    # modprobe -v my_module
    # lsmod | grep my_module
    1. オプションで、起動時にモジュールを読み込むには、そのモジュールを /etc/modules-loaded.d/my_module.conf ファイルに追加します。

      # echo "my_module" > /etc/modules-load.d/my_module.conf

このページには機械翻訳が使用されている場合があります (詳細はこちら)。