Linux
 Computer >> コンピューター >  >> システム >> Linux

Ubuntu Livepatchでサーバーの再起動を回避する方法|再起動不要でカーネルの脆弱性に対応

Ubuntu Livepatchでサーバーの再起動を回避する方法|再起動不要でカーネルの脆弱性に対応

再起動できないサーバーが抱える問題

自分でサーバーを管理していると、遅かれ早かれこうしたジレンマに直面します。「OSを再起動しなければならないのに、そのマシンでは中断できない重要なサービスが稼働している」という状況です。

そもそも、なぜ再起動が必要なのでしょうか?apt-get upgradeを実行した後は、すべてが正常に動作しているように見えます。しかし、見た目どおりとは限りません。Windowsのように再起動を強制されることなく、アップグレード後もシステムは問題なく動き続けますが、それでも再起動が必要なケースがあるのです。

典型的な例が、システムの中核であるカーネルの脆弱性です。脆弱性が発見されると、修正版が新しいパッケージとしてサーバーに配信されます。修正済みカーネルをインストールしても、ファイルがディスクに書き込まれるだけで、実際に動作し続けるのはメモリ(RAM)に読み込まれた古いカーネルのままです。

つまり、サーバーは以前に発見されたセキュリティホールに対して脆弱な状態が続きます。他のプロセスやデーモン、サービスであればOSを再起動せずに再読み込みできますが、カーネルはシステムの心臓部にあたるため、従来は次回起動時にしか入れ替えられませんでした。

Ubuntu Livepatchによる解決策

Ubuntu Livepatchを使えば、再起動なしでカーネルのセキュリティホールを塞ぐことができます。これにより、セキュリティを損なうことなく、再起動を数週間〜数か月単位で回避・延期できるのです。

ライブパッチングの基本的な仕組みはシンプルです。関数に脆弱性が見つかったら、その関数を書き直して欠陥を取り除き、新しい関数をメモリ上のどこかにロードします。そして関数が呼び出された際には、カーネル内の旧コードを実行する代わりに、書き換えられた新コードへ処理を振り向けるという流れです。

Ubuntu Livepatchでサーバーの再起動を回避する方法|再起動不要でカーネルの脆弱性に対応

ただし、一見シンプルに動作する多くの技術と同じように、その実装や内部の技術的詳細は決して簡単ではありません。幸い、利用者側は細部を意識する必要はありません。

UbuntuでLivepatchをセットアップする手順

まず、該当ページにアクセスしてUbuntu Oneアカウントを作成します(すでにアカウントをお持ちならログインしてください)。届いたメールを確認し、アカウント確認用リンクをクリックします。

次に、Canonical Livepatch Serviceのページに移動し、「Ubuntuユーザー」を選択してトークン生成ボタンをクリックします。表示されたページに、サーバー上で入力すべき正確なコマンドが示されます。まず最初のコマンドとして、以下を実行します。

sudo snap install canonical-livepatch

snapパッケージが完全にインストールされるまで数秒待ちましょう。完了すると、下の画像のような結果が表示されます。

Ubuntu Livepatchでサーバーの再起動を回避する方法|再起動不要でカーネルの脆弱性に対応

最後に、Canonicalのページに記載されている最後のコマンド

sudo canonical-livepatch enable #PASTE_YOUR_TOKEN_HERE

を実行すれば、サービスが有効化されます。以降は、必要に応じてカーネルへセキュリティパッチが自動的に適用され、ユーザー側での操作は一切不要になります。

snapデーモンが未導入の場合の対処法

まれに、先ほどの最初のコマンドが失敗し、-bash: /usr/bin/snap: No such file or directoryというエラーが表示されることがあります。これは、サーバープロバイダーが提供するUbuntuイメージに、snapデーモンがデフォルトで含まれていないことを意味します。以下のコマンドでインストールしてください。

sudo apt update && sudo apt install snapd

その後、前のセクションのコマンド2つを再度実行すればOKです。

Livepatch以外のアップデート管理も忘れずに

Livepatchはカーネルへのセキュリティアップデートをすべて自動適用してくれます。しかし、それ以外のシステム部分については、以下のようなコマンドで定期的にアップグレードする必要があります。

sudo apt update && sudo apt upgrade

この作業は週に1回、可能ならそれ以上の頻度で実施しましょう。重要なシステムパッケージによっては、「最新のセキュリティ修正を適用するために再起動が必要」と促されることがあります。

Ubuntu Livepatchでサーバーの再起動を回避する方法|再起動不要でカーネルの脆弱性に対応

これらは通常、グレースフル(安全な)再起動であり、サービスに中断をもたらしません。例えば上記のケースでは、アクティブなSSHセッションを切断することなく、SSHデーモンだけが再起動されています。

それ以外の場面では、パッチ適用済みの新コードを確実にメモリへ読み込ませるため、自分でサービスを再起動するのも有効です。例えばnginxパッケージがアップグレードされたのに気づいたら、

systemctl restart nginx.service

を実行してnginxデーモンを再読み込みしましょう。これを怠ると、パッケージ自体は最新でも、実際には古い脆弱なコードのまま動作し続け、既知の攻撃に対してサーバーが無防備になってしまう恐れがあります。アップグレード時に自動で再起動してくれるパッケージもあれば、そうでないものもあるため、「apt upgrade」が何を行ったかに注意を払い、必要に応じてサービスを再起動する習慣をつけるのがおすすめです。ログを確認すれば、自動的に再起動されたかどうかも判別できます。

まとめ

ご覧のとおり、CanonicalのおかげでサーバーへのLivepatch導入は非常に簡単になりました。カーネルに関しては、ユーザー側で行うべきメンテナンス作業は一切ありません。日常的な運用としては、ときどき以下のコマンドを実行してステータスを確認する程度で十分です。

canonical-livepatch status
  1. Linuxの時刻をNTPサーバーと同期する方法【systemd対応・非対応両方を解説】

    パソコンの内蔵時計は完璧ではありません。数日、数週間、あるいは数か月が経つと時刻が徐々にずれ込み、実際の時間を正しく表示しなくなります。たとえば、実際には「10時33分」なのに「10時30分」と表示されるといった具合です。昔のパソコンでは、定期的に手動で時計を合わせるのが一般的でした。しかし、インターネット接続が普及して以降、現代のOSはNTPサーバーの助けを借りて時計を自動的に調整するようになりました。NTPとは?NTPは「Network Time Protocol(ネットワーク・タイム・プロトコル)」の略称です。ネットワーク接続を通じてコンピューターの時計を同期させ、常に正確な時刻を保つた

  2. NginxでDDoS攻撃を防ぐ方法|トラフィック監視からIP遮断まで徹底解説

    DDoS(Distributed Denial of Service)攻撃とは、大量の不正な通信によってサーバーのリソースを食い潰し、正常なサービスを妨害するサイバー攻撃のことです。いわばコンピューターの世界における「組織的な襲撃」であり、無数の悪意あるリクエストが重なり合うことで、経験豊富な管理者が運用するサーバーでさえも機能停止に追い込まれるほどの脅威となります。さらに厄介なのは、こうした攻撃には複数の手口が存在するという点です。幸いにも、サーバー側の設定を適切に行えば、これらの攻撃に効果的に対抗できます。 NginxはUnix系マシンで広く利用されている人気の高いWebサーバーソフトウ