レタスのかわをぜんぶむく

ぜんぶむきます

AmazonLinuxでカーネルバージョンをダウングレードする

脆弱性の検証に利用する場合や、そこまで積極的な用途でなくとも
一部ソフトウェアでは互換性のあるカーネルバージョンが明確に指定されているケースがある。

その場合現在より古いカーネルバージョンを明示的に指定して利用したい。
手順を調べたのでまとめる。

手順

  • 古いカーネルを導入する
  • デフォルトカーネルを差し替えて再起動する
  • (Optional) アップデート対象からカーネル関連モジュールを除外する

古いカーネルを導入する

まずは現時点でのカーネルバージョンを確認する。

# uname -a
Linux ip-172-31-23-7.ap-northeast-1.compute.internal 4.14.193-149.317.amzn2.x86_64 #1 SMP Thu Sep 3 19:04:44 UTC 2020 x86_64 x86_64 x86_64 GNU/Linu

# grubby --default-kernel
/boot/vmlinuz-4.14.193-149.317.amzn2.x86_64

現状では4.14.193-149.317.amzn2が導入されているようだ。

今回はカーネルバージョンkernel-4.9.85-47.59.amzn2を指定して導入する。

# yum install kernel-4.9.85-47.59.amzn2
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                          | 3.7 kB  00:00:00
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kernel.x86_64 0:4.9.85-47.59.amzn2 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================================
 Package                              アーキテクチャー                     バージョン                                       リポジトリー                              容量
===========================================================================================================================================================================
インストール中:
 kernel                               x86_64                               4.9.85-47.59.amzn2                               amzn2-core                                17 M

トランザクションの要約
===========================================================================================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 17 M
インストール容量: 75 M
Is this ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
kernel-4.9.85-47.59.amzn2.x86_64.rpm                                                                                                                |  17 MB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : kernel-4.9.85-47.59.amzn2.x86_64                                                                                                           1/1
  検証中                  : kernel-4.9.85-47.59.amzn2.x86_64                                                                                                           1/1

インストール:
  kernel.x86_64 0:4.9.85-47.59.amzn2

完了しました!

(必要であれば) デフォルトカーネルを差し替える

AMIの仮想化タイプによってはカーネルをインストール後に手動でデフォルトカーネルを変更する必要がある。
(HVMではなくPVと呼ばれるタイプの仮想化タイプでは手動での変更が必要)

# grubby --default-kernel
/boot/vmlinuz-4.9.85-47.59.amzn2.x86_64

今回はインストールされたカーネルがデフォルトカーネルになっているため、そのまま再起動。

# reboot now

(Optional) アップデート対象からカーネル関連モジュールを除外する

検証などに利用するために短期的に利用するだけであれば以下の作業は不要。
本来であれば脆弱性などの問題があるため推奨されない。あくまで自己責任で。

現状は4.14.193-149.317.amzn24.9.85-47.59.amzn2がインストール済みとなっている。

最新カーネルのバージョンが上がった際にyum updateでカーネルが更新されないように設定を行う。
検証のために新しい方(4.14.193-149.317.amzn2)を削除する。

# uname -a
Linux ip-172-31-23-7.ap-northeast-1.compute.internal 4.9.85-47.59.amzn2.x86_64 #1 SMP Wed Mar 14 21:51:55 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

# grubby --default-kernel
/boot/vmlinuz-4.9.85-47.59.amzn2.x86_64

# ls -al /boot/
合計 75976
dr-xr-xr-x  4 root root     4096 10月 23 18:29 .
dr-xr-xr-x 18 root root      257 10月 23 18:21 ..
-rw-r--r--  1 root root      174  9月  3 19:06 .vmlinuz-4.14.193-149.317.amzn2.x86_64.hmac
-rw-r--r--  1 root root      170  3月 14  2018 .vmlinuz-4.9.85-47.59.amzn2.x86_64.hmac
-rw-------  1 root root  2829664  9月  3 19:06 System.map-4.14.193-149.317.amzn2.x86_64
-rw-------  1 root root  2900199  3月 14  2018 System.map-4.9.85-47.59.amzn2.x86_64
-rw-r--r--  1 root root   120243  9月  3 19:06 config-4.14.193-149.317.amzn2.x86_64
-rw-r--r--  1 root root   104187  3月 14  2018 config-4.9.85-47.59.amzn2.x86_64
drwxr-xr-x  3 root root       17  9月 21 21:10 efi
drwx------  5 root root       79 10月 23 18:29 grub2
-rw-------  1 root root 31826017  9月 21 21:12 initramfs-4.14.193-149.317.amzn2.x86_64.img
-rw-------  1 root root 28205290 10月 23 18:29 initramfs-4.9.85-47.59.amzn2.x86_64.img
-rw-r--r--  1 root root   669043  9月 21 21:12 initrd-plymouth.img
-rw-r--r--  1 root root   235508  9月  3 19:07 symvers-4.14.193-149.317.amzn2.x86_64.gz
-rw-r--r--  1 root root   202798  3月 14  2018 symvers-4.9.85-47.59.amzn2.x86_64.gz
-rwxr-xr-x  1 root root  5727184  9月  3 19:06 vmlinuz-4.14.193-149.317.amzn2.x86_64
-rwxr-xr-x  1 root root  4936688  3月 14  2018 vmlinuz-4.9.85-47.59.amzn2.x86_64

# yum remove kernel-4.14.193-149.317.amzn2
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ kernel.x86_64 0:4.14.193-149.317.amzn2 を 削除
--> 依存性解決を終了しました。

依存性を解決しました

===========================================================================================================================================================================
 Package                             アーキテクチャー                    バージョン                                           リポジトリー                            容量
===========================================================================================================================================================================
削除中:
 kernel                              x86_64                              4.14.193-149.317.amzn2                               installed                              101 M

トランザクションの要約
===========================================================================================================================================================================
削除  1 パッケージ

インストール容量: 101 M
上記の処理を行います。よろしいでしょうか? [y/N]y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  削除中                  : kernel-4.14.193-149.317.amzn2.x86_64                                                                                                       1/1
  検証中                  : kernel-4.14.193-149.317.amzn2.x86_64                                                                                                       1/1

削除しました:
  kernel.x86_64 0:4.14.193-149.317.amzn2

完了しました!

yum list updatesで削除した最新カーネルがリストされることを確認する。

# yum list updates
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
更新したパッケージ
awscli.noarch                                                                         1.18.147-1.amzn2.0.1                                                       amzn2-core
ec2-net-utils.noarch                                                                  1.4-3.amzn2                                                                amzn2-core
kernel.x86_64                                                                         4.14.198-152.320.amzn2                                                     amzn2-core
kernel-tools.x86_64                                                                   4.14.198-152.320.amzn2                                                     amzn2-core
p11-kit.x86_64                                                                        0.23.21-2.amzn2.0.1                                                        amzn2-core
p11-kit-trust.x86_64                                                                  0.23.21-2.amzn2.0.1                                                        amzn2-core
pam.x86_64                                                                            1.1.8-23.amzn2.0.1                                                         amzn2-core
python2-botocore.noarch                                                               1.18.6-1.amzn2.0.1                                                         amzn2-core
python2-rpm.x86_64                                                                    4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm.x86_64                                                                            4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm-build-libs.x86_64                                                                 4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm-libs.x86_64                                                                       4.11.3-40.amzn2.0.5                                                        amzn2-core
rpm-plugin-systemd-inhibit.x86_64                                                     4.11.3-40.amzn2.0.5                                                        amzn2-core

初期に入っていた4.14.193-149.317.amzn2から4.14.198-152.320.amzn2に上がってしまっているが
古いカーネルを利用している状態だと、kernel関連のモジュールがアップデート対象に含まれることが確認できた。

このままだとyum updateしたタイミングでカーネルのバージョンが上がってしまうため
/etc/yum.confの[main]配下にexclude=kernel*を追加し、アップデート対象から除外する。

[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3
distroverpkg=system-release
timeout=5
retries=7
exclude=kernel* # ←ここ

#  This is the default, if you make this bigger yum won't see if the metadata
# is newer on the remote and so you'll "gain" the bandwidth of not having to
# download the new metadata and "pay" for it by yum not having correct
# information.
#  It is esp. important, to have correct metadata, for distributions like
# Fedora which don't keep old packages around. If you don't like this checking
# interupting your command line usage, it's much better to have something
# manually check the metadata once an hour (yum-updatesd will do this).
# metadata_expire=90m

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

更新後再度確認を行う。

# yum list updates
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                          | 3.7 kB  00:00:00
amzn2extra-docker                                                                                                                                   | 3.0 kB  00:00:00
更新したパッケージ
awscli.noarch                                                                          1.18.147-1.amzn2.0.1                                                      amzn2-core
ec2-net-utils.noarch                                                                   1.4-3.amzn2                                                               amzn2-core
p11-kit.x86_64                                                                         0.23.21-2.amzn2.0.1                                                       amzn2-core
p11-kit-trust.x86_64                                                                   0.23.21-2.amzn2.0.1                                                       amzn2-core
pam.x86_64                                                                             1.1.8-23.amzn2.0.1                                                        amzn2-core
python2-botocore.noarch                                                                1.18.6-1.amzn2.0.1                                                        amzn2-core
python2-rpm.x86_64                                                                     4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm.x86_64                                                                             4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm-build-libs.x86_64                                                                  4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm-libs.x86_64                                                                        4.11.3-40.amzn2.0.5                                                       amzn2-core
rpm-plugin-systemd-inhibit.x86_64                                                      4.11.3-40.amzn2.0.5                                                       amzn2-core

kernel.x86_64,kernel-tools.x86_64がリストされなくなった。
(本来は良くないが)これで古いカーネルを利用し続けることができる。