22 kGraftを使用したLinuxカーネルのライブパッチ適用 #
このドキュメントでは、kGraftライブパッチ適用テクノロジの基本原理について説明するとともに、SLE Live Patchingサービスの使用ガイドラインを提供します。
kGraftは、Linuxカーネルを停止することなく、実行時にカーネルのパッチを適用するライブパッチ適用テクノロジです。これにより、ミッションクリティカルなシステムにとって重要なシステムのアップタイム、つまりシステムの可用性が最大化されます。また、このテクノロジによってカーネルの動的なパッチ適用が可能になるため、ユーザは、予定されたダウンタイムまで延期することなく、重要なセキュリティアップデートをインストールできます。
kGraftパッチは、カーネル内の関数全体を置換することを目的としたカーネルモジュールです。kGraftは基本的に、パッチが適用されたコードとカーネルのベースコードを実行時に統合するためのカーネル内インフラストラクチャを提供します。
SLE Live Patchingは、SUSE Linux Enterprise Serverの定期保守に加えて提供されるサービスです。SLE Live Patchingを通じて配信されるkGraftパッチは、SLESの定期保守のアップデートを補足するものです。SLE Live Patchingの展開にも共通の更新スタックおよび手順を使用することができます。
このドキュメントで提供される情報は、AMD64/Intel 64およびPOWERアーキテクチャに関連しています。異なるアーキテクチャを使用する場合は、手順が異なる場合があります。
22.1 kGraftの利点 #
kGraftを使用したカーネルのライブパッチ適用は、緊急時(深刻な脆弱性が確認され、極力修正する必要がある場合や、システムの安定性に関する深刻な問題があり、既知の修正が提供されている場合など)における迅速な対応に特に役立ちます。緊急を要しない、予定されたアップデートには使用されません。
kGraftの一般的な使用事例としては、起動に15分以上かかることも珍しくない、大容量のRAMを搭載したメモリデータベースなどのシステム、再起動なしで数週間または数カ月を要する大規模なシミュレーション、多数の消費者に継続的なサービスを提供するインフラストラクチャのビルディングブロックなどがあります。
kGraftの主な利点は、短時間であってもカーネルを停止する必要がない点です。
kGraftパッチは、 RPMパッケージ内の.ko
カーネルモジュールです。パッケージのインストールまたは更新時に、insmod
コマンドを使用してカーネルに挿入されます。kGraftは、関数が実行中であってもカーネル内の関数全体を置換します。必要に応じて、更新されたkGraftモジュールが既存のパッチを置換することもあります。
さらに、kGraftは効率的です。他の標準のLinuxテクノロジを活用するので、kGraftには少量のコードしか含まれていません。
22.2 kGraftの機能の詳細 #
kGraftは、ftraceインフラストラクチャを使用してパッチを適用します。AMD64/Intel 64アーキテクチャにおける実装は次のとおりです。
カーネル関数にパッチを適用する場合、kGraftは、新しい関数へのジャンプを挿入するために、関数の冒頭にスペースを必要とします。このスペースは、関数のプロファイリングをオンにしたGCCによってカーネルのコンパイル時に割り当てられます。具体的には、5バイトの呼び出し命令がカーネル関数の冒頭に挿入されます。このようにインストルメント化されたカーネルの起動時に、プロファイリング中の呼び出しが5バイトのNOP (操作なし)命令に置換されます。
パッチの適用が開始されると、最初のバイトがINT3 (ブレークポイント)命令に置換されます。これにより、5バイトの命令を置換する際の不可分性が確保されます。他の4バイトは、新しい関数のアドレスに置換されます。最後に、最初のバイトがJMP (ロングジャンプ)命令コードに置換されます。
システム内の他のCPUの推論的なデコードキューをフラッシュするために、このプロセス全体を通してIPI NMIが使用されます。これにより、ごく短時間であってもカーネルを停止することなく、新しい関数に切り替えることができます。IPI NMIによる割り込みはマイクロ秒単位で測定することができ、いずれの場合でもカーネルの実行中に発生するので、サービスの中断とは見なされません。
呼び出し元にパッチが適用されることはありません。代わりに、呼び出し先のNOPが新しい関数へのJMPに置換されます。JMP命令は永久に残ります。これにより、構造体内でも関数ポインタが考慮されるので、パッチが適用されない場合に備えて古いデータを保存しておく必要はありません。
ただし、これらの手順だけでは十分ではありません。関数は不可分的に置換されるわけではないので、カーネルの一部で修正された新しい関数が引き続き、別の場所で古い関数を呼び出したり、その逆の呼び出しが行われたりすることがあります。関数インタフェースのセマンティクスがパッチで変更された場合は、混乱が生じます。
そのため、すべての関数が置換されるまで、kGraftは、トランポリンに基づいた、RCU(読み取り-コピー-更新)に似たアプローチを使用して、それぞれのユーザ側スレッド、カーネルスレッド、カーネル割り込みで一貫性を確保します。カーネルの最初と最後にスレッド別のフラグが設定されます。これにより、古い関数は常に別の古い関数を呼び出し、新しい関数は常に新しい関数を呼び出すようになります。すべてのプロセスに「新しいユニバース」のフラグが設定されると、パッチの適用が完了し、トランポリンを削除することができます。コードは、パッチが適用された各関数の過度に長いジャンプを除き、パフォーマンスに影響を及ぼすことなく、フルスピードで動作することができます。
22.3 kGraftパッチのインストール #
ここでは、SUSE Linux Enterprise Live Patching拡張機能のアクティベーションとkGraftパッチのインストールについて説明します。
22.3.1 SLE Live Patchingのアクティベーション #
SLE Live Patchingをシステムでアクティベートするには、次の手順に従います。
SLESシステムをまだ登録していない場合は、登録します。登録は、システムのインストール時に行うことも、YaSTの
モジュール(yast2 registration
)を使用して後から行うこともできます。登録後、 をクリックすると、入手可能なオンラインアップデートのリストが表示されます。SLESシステムはすでに登録しているものの、SLE Live Patchingをまだアクティベートしていない場合は、YaSTの
モジュール(yast2 registration
)を開き、 をクリックします。入手可能な拡張機能のリストで
を選択し、 をクリックします。ライセンス条項を確認し、
をクリックします。SLE Live Patchingの登録コードを入力し、
をクリックします。Live Patching
パターンが選択されているはずです。
22.3.2 システムの更新 #
SLE Live Patchingのアップデートは、パッチの適用に標準のSLE更新スタックを使用できるような形で配信されます。初期ライブパッチの更新には、
zypper patch
、YaSTオンラインアップデート、または同等の方法を使用できます。パッケージのインストール時に、カーネルに自動的にパッチが適用されます。ただし、スリープ状態のすべてのプロセスがウェイクアップし、処理を完了するまで、古いカーネル関数の呼び出しが完全になくなるわけではありません。これにはかなりの時間がかかることがあります。それでも、古いカーネル関数を使用するスリープ状態のプロセスがセキュリティ上の問題になるとは考えられません。それにもかかわらず、kGraftの最新バージョンでは、すべてのプロセスがカーネルとユーザ側の境界を越えて、以前のパッチからパッチが適用された関数の使用を停止するまで、別のkGraftパッチを適用することはできません。
パッチ適用の全体的なステータスを参照するには、
/sys/kernel/kgraft/in_progress
でフラグを確認します。値1
は、ウェイクアップする必要があるスリープ状態のプロセスがあり、パッチの適用が進行中であることを示します。値0
は、すべてのプロセスがパッチが適用された関数のみを使用しており、パッチの適用がすでに完了していることを示します。また、kgr status
コマンドを使用して同じ情報を取得することもできます。プロセスごとにフラグを確認することもできます。それぞれのプロセスについて、
/proc/PROCESS_NUMBER/kgr_in_progress
で数値を確認します。この場合も、値1
は、ウェイクアップする必要があるスリープ状態のプロセスを示します。また、kgr blocking
コマンドを使用して、スリープ状態のプロセスのリストを出力することもできます。
22.4 パッチのライフサイクル #
ライブパッチの有効期限はzypper lifecycle
を使用して参照できます。パッケージ
lifecycle-data-sle-live-patching がインストールされていることを確認してください。
tux >
zypper lifecycle
Product end of support Codestream: SUSE Linux Enterprise Server 12 2024-10-31 SUSE Linux Enterprise Server 12 SP2 n/a* Extension end of support SUSE Linux Enterprise Live Patching 2017-10-31 Package end of support if different from product: SUSEConnect Now, installed 0.2.41-18.1, update available 0.2.42-19.3.1 apache2-utils Now *) See https://www.suse.com/lifecycle for latest information
パッチの有効期限に達した場合、今後そのカーネルバージョン用のライブパッチは提供されません。ライブパッチのライフサイクル期間が終わる前に、カーネルの更新を計画してください。
22.5 kGraftパッチの削除 #
kGraftパッチを削除するには、次の手順に従います。
まず、Zypperを使用してパッチ自体を削除します。
zypper rm kgraft-patch-3_12_32-25-default
次に、マシンを再起動します。
22.6 カーネル実行スレッドのスタック #
kGraftを処理するには、カーネルスレッドを作成する必要があります。サードパーティのソフトウェアはkGraftの採用に対応していないことがあり、カーネルモジュールによってカーネル実行スレッドが大量に生成される場合があります。このようなスレッドによって、パッチ適用プロセスが無期限にブロックされます。緊急手段として、kGraftでは、すべての実行スレッドが安全なチェックポイントを越えるまで待機することなく、パッチ適用プロセスを強制的に終了することができます。そのためには、/sys/kernel/kgraft/in_progress
に0
を書き込みます。この手順を実行する前に、SUSEのサポートにお問い合わせください。
22.7 kgr
ツール #
kgr
ツールを使用すると、kGraftのさまざまな管理タスクを簡略化することができます。使用可能なコマンドは次のとおりです。
kgr status
kGraftパッチ適用の全体的なステータス(
ready
またはin_progress
)を表示します。kgr patches
ロードされたkGraftパッチのリストを表示します。
kgr blocking
kGraftパッチ適用の完了を妨げているプロセスのリストを表示します。デフォルトでは、PIDのみが列挙されます。
-v
を指定すると、コマンドラインが出力されます(可能な場合)。-v
をもう1つ指定すると、スタックトレースも表示されます。
詳細については、man kgr
を参照してください。
22.8 kGraftテクノロジの範囲 #
kGraftは、関数の置換に基づいています。kGraftでは、データ構造の変更は間接的にしか実行できません。そのため、カーネルのデータ構造の変更には特別な注意が必要です。変更が大規模な場合は、再起動が必要になることもあります。また、kGraftでは、1つのコンパイラを使用して古いカーネルをコンパイルし、別のコンパイラを使用してパッチをコンパイルするような状況に対処できない場合があります。
kGraftの動作により、カーネルスレッドを大量に生成するサードパーティモジュールのサポートは限定的です。
22.9 SLE Live Patchingの範囲 #
SUSE Common Vulnerability Scoring System (CVSS)レベル7+脆弱性の修正や、システムの安定性またはデータの破損に関連するバグ修正は、SLE Live Patchingの範囲内で出荷されます。前述の基準を満たすすべての種類の修正についてライブパッチを生成できるわけではありません。技術的な理由でカーネルライブパッチの生成が実行不可能な場合、SUSEは修正をスキップする権利を有します。SUSE CVSSの評価の基礎であるCVSS 3.0の詳細については、https://www.first.org/cvss/を参照してください。
22.10 サポートプロセスとの相互作用 #
SUSEのサポートを利用して技術的な問題を解決する間に、いわゆるProgram Temporary Fix(PTF)を受け取ることがあります。PTFは、SLE Live Patchingの基盤を成すパッケージをはじめ、さまざまなパッケージについて発行されることがあります。
前のセクションに記載された条件に適合するkGraftのPTFは、通常どおりにインストールできます。SUSEでは、当該のシステムを再起動する必要がないこと、将来のライブアップデートが問題なく適用されることを確認します。
ベースカーネルについて発行されたPTFによって、ライブパッチ適用プロセスが中断されます。まず、PTFカーネル全体を実行時に置換することはできないので、PTFカーネルのインストール時には再起動が必要になります。次に、定期保守のアップデートについてライブパッチが発行された場合、PTFを置換するには、再起動がもう一度必要になります。
SLE Live Patchingの他のパッケージに関するPTFは、通常の保証を含む通常のPTFと同様に処理できます。