この前、自宅のサーバ達のカーネルアップデートを行った時のことを備忘録的な感じで紹介していく。
目次
概要
今回はサーバをkernel4.15へとアップデートする方法を紹介する。
なぜkernel 4.15なのかというと、少し前にintel/amdのcpuに存在する脆弱性「Meltdown」「Spectre」を修正する為だ。
この2つの脆弱性はcpuの投機的実行に関する脆弱性であり、この脆弱性をを使用することで、悪意のあるコードが、保護され通常はアクセス不可なメモリにアクセスすることが可能になってしまう。
また、この脆弱性を使用することで、ある物理マシンで動いている仮想マシンから、別の仮想マシンのデータを閲覧することが可能でIaaS SaaS PasSを提供するサービスでは影響がかなり大きいと思われる。
現状今できる対策は各OS以下の通り。しかし未だ完全に脆弱性を克服することはできず、影響を緩和している状態である。
スペクターとメルトダウンから Windows デバイスを保護する
ARM ベースおよび Intel CPU の投機的実行の脆弱性について
また、上記アップデート以外にもBIOSマイクロコードアップデートも行う必要もある。
このブログではkernel-4.15.10へアップデートする方法を紹介する。また今回のLinuxで使用するブートローダはGRUBを使用している。
カーネルアップデート(RedHat系)
ここではyumを使用してkernelアップデートを行う。
1.まずはelrepoのレポジトリを追加する。elrepoの公開鍵をインポート。
# rpm –import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
※上の方法以下のようなエラーが出る場合は下を実行。
curl: (35) Cannot communicate securely with peer: no common encryption algorithm(s)
# rpm –import http://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
2.レポジトリをインポートする。
# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm |
3.インポートしたレポジトリを有効化。
# yum –enablerepo=elrepo-kernel -y install kernel-ml |
4.一度再起動を行う。
# reboot |
5.ブートローダでカーネルイメージを選択する画面では必ず最新版のものを選択する。(この例ではGRUB)
6.現在インストールされているカーネルのパッケージを最新版へ切り替える。以下のコマンドで現在のカーネルパッケージの情報が確認できる。(例ではkernel 3.10)
# rpm -qa | grep kernel | grep 3.10 kernel-headers-3.10.0-514.6.1.el7.x86_64 kernel-ml-4.15.10-1.el7.elrepo.x86_64 kernel-tools-3.10.0-514.6.1.el7.x86_64 kernel-3.10.0-693.17.1.el7.x86_64 kernel-tools-libs-3.10.0-514.6.1.el7.x86_64 kernel-3.10.0-514.6.1.el7.x86_64 kernel-3.10.0-123.el7.x86_64 |
7.yumコマンドでパッケージの切り替え。
# yum –enablerepo=elrepo-kernel -y swap kernel-headers kernel-ml-headers # yum –enablerepo=elrepo-kernel -y swap kernel-tools-libs kernel-ml-tools-libs # yum –enablerepo=elrepo-kernel -y install kernel-ml-tools # yum –enablerepo=elrepo-kernel -y swap kernel-devel kernel-ml-devel |
上記でエラーが出た場合(おそらくパッケージがインストールされていない等)の場合は足りないパッケージをインストール。
# yum –enablerepo=elrepo-kernel -y install kernel-ml-devel |
8.全て切り替えが完了したら、古いカーネルを削除する。
# yum -y remove kernel |
9.もう一度再起動し、問題なく起動すればカーネルアップデートは完了。
# reboot |
カーネルアップデート(Debian系)
Debian系のカーネルアップデートはRedHat系と比べるとかなり簡単にアップデートを行うことができる。
1.パッケージのダウンロードディレクトリを作成し、そこへ移動する。
# mkdir kernel-4.15.10 && cd kernel-4.15.10/ |
2.wgetコマンドでCPUにあったカーネルをダウンロードする。(普通のintel 64bitCPUであれば amd64)
# wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.10/linux-headers-4.15.10-041510_4.15.10-041510.201803152130_all.deb # wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.10/linux-headers-4.15.10-041510-generic_4.15.10-041510.201803152130_amd64.deb # wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.10/linux-headers-4.15.10-041510-lowlatency_4.15.10-041510.201803152130_amd64.deb # wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.10/linux-image-4.15.10-041510-generic_4.15.10-041510.201803152130_amd64.deb # wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.15.10/linux-image-4.15.10-041510-lowlatency_4.15.10-041510.201803152130_amd64.deb |
3.dpkgコマンドを使用して全パッケージをインストールする。
# dpkg -i *.deb |
4.再起動し、ブートローダで最新版のカーネルイメージを選択。問題なく起動すればアップデートは完了。
# reboot |
ESXiバグ対策
このカーネルアップデートを行うことによって、ESXiの別のバグと遭遇してしまうことがある。具体的には以下の条件に合う時に発現する。
1.仮想マシンのLinux Kernelが4.8以上
2.仮想マシンのバージョンが13以上
3.ESXiのバージョンが6.5以上
バグの症状としては、仮想マシンが応答しなくなるというもので、ESXi側から無理やり再起動しないと復旧しない。このバグの対策として、vmxファイルにパラメータを追加することで回避することができる。
1.まずは対象仮想マシンの電源をoffにし、データストアからvmxファイルをダウンロードする。
左ペインのストレージを展開しdatastore1を選択。そして上のほうにあるデータストアブラウザを選択。
2.ブラウザを開いたら、仮想マシンのホスト名でフォルダが作られているので展開し、vmxファイルを選択。
その後、上のほうにある「ダウンロード」をクリックすることでダウンロードすることができる。
3.テキストエディタでvmxファイルを開き、下記パラメータを追記。
1 |
vmxnet3.rev.30 = FALSE |
4.編集が終わったらvmxのアップロードを行う。まずは既存のvmxファイルを選択し上のほうにある「削除」を押し削除。
5.上のほうにある「アップロード」をクリックし、編集したvmxファイルをアップロード。ここでvmxファイルがデータストア上に表示されているかも確認。
6.対象マシンの仮想マシンを起動し、問題なく動作すればOK。
CPUの脆弱性情報の確認
以下のコマンドを実行することで、今回の脆弱性の対応状況を確認することができる。
# cat /sys/devices/system/cpu/vulnerabilities/* |
結果はこんな感じ
1 2 3 |
Mitigation: PTI Mitigation: __user pointer sanitization Mitigation: Full generic retpoline |
1行目はMeltdownにおける対策状況で、カーネルがPTI(Page Table Isolation)を使用することで影響を緩和している事を表している。
2-3行目はSpectre(じつはv1, v2という2種類の脆弱性にわかれている)における対応状況で、それぞれ脆弱性を緩和している事を示している。(具体的には何をしているのかは不明…)