AWSで管理しているAmazon Linux
が古いバージョンのまま放置していることありませんか?
Customers with existing Amazon Linux AMI instances should run the following command to ensure they receive the updated package: sudo yum update kernel.
カーネルをアップデートして最新のカーネルにするように書いてあるのですが、
Amazon Linux
のバージョンが古いインスタンスでは、
単にカーネルのアップデートだけでは、最新のカーネルにアップデートされません。
この記事ではその際の対応手順を説明します。
※ 説明のためにコミュニティAMIにある古いAMIを使って進めます。
対象のマシンにsshし、インフォメーションをチェック
しばらくOSをアップデートされていないインスタンスにsshします。
OSが更新されていない場合は、以下のように
$ ssh hogehost
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
Amazon Linux version 2017.09 is available.
Amazon Linux version 2017.09 is available.
Amazon Linux version 2017.09が利用できます
と表示されていますね。
あまり意識しないと見逃しがちですが、このような情報もしっかり確認しましょう。
さらにカーネルのバージョンを確認します。
$ uname -srv
Linux 4.4.5-15.26.amzn1.x86_64 #1 SMP Wed Mar 16 17:15:34 UTC 2016
カーネルも2016年に作られたバージョンのままになっていますね。
yum.confをチェックし、AMIを特定のバージョンに固定されていないか確認する
AMIを特定のバージョンに固定するにはどうすればよいですか?
上記の公式ドキュメントに書かれているようにAmazon Linux
のマシーンイメージでは、1つのバージョンから次のバージョンへ連続的な更新を提供するように設定されていますが、過去のバージョンでは/etc/yum.conf
のreleasever
変数がなかったり、リリースバージョンが固定されていることがあります。
その場合は単にyum update
だけでは最新のパッケージに更新されません。
今回対象のyum.conf
を見てみると
$ cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
keepcache=0
debuglevel=2
logfile=/var/log/yum.log
distroverpkg=system-release
exactarch=1
obsoletes=1
gpgcheck=1
plugins=1
installonly_limit=3
deltarpm=0
# by default the yum configuration will point to the latest release
# of Amazon Linux AMI. If you prefer not to automatically move to
# new releases, comment out this line.
releasever=2016.03
# 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
releasever
が2016.03
に固定されています。
この状態では、カーネルをアップデートしても変更されません。
$ sudo yum update kernel
Loaded plugins: priorities, update-motd, upgrade-helper
No packages marked for update
そこで更新させるためには以下のように変更する必要があります。
releasever=latest
releaseverを「latest」に変更して、カーネルをアップデート
先ほどのyum.conf
のリリースサーバーを最新に更新します。
$ cp -ip /etc/yum.conf /tmp/
$ sudo vi /etc/yum.conf
$ diff /etc/yum.conf /tmp/yum.conf
17c17
< releasever=latest
---
> releasever=2016.03
#更新しました
# kernelをアップデートする
$ sudo yum update kernel
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/latest | 2.1 kB 00:00
amzn-updates/latest | 2.3 kB 00:00
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64 0:4.9.51-10.52.amzn1 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
========================================================================================================================================================================================================================================================
Package Arch Version Repository Size
========================================================================================================================================================================================================================================================
Installing:
kernel x86_64 4.9.51-10.52.amzn1 amzn-main 17 M
Transaction Summary
========================================================================================================================================================================================================================================================
Install 1 Package
Total download size: 17 M
Installed size: 71 M
Is this ok [y/d/N]: y
Downloading packages:
kernel-4.9.51-10.52.amzn1.x86_64.rpm | 17 MB 00:01
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : kernel-4.9.51-10.52.amzn1.x86_64 1/1
Verifying : kernel-4.9.51-10.52.amzn1.x86_64 1/1
Installed:
kernel.x86_64 0:4.9.51-10.52.amzn1
Complete!
先ほどは、アップデートするカーネルはありませんでしたが、今回はアップデートされました。
再起動後に再度インスタンスにアクセスして、カーネルがアップデートされたか確認します。
$ ssh hogehost
Last login: Sat Jan 20 02:10:39 2018
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
No packages needed for security; 138 packages available
Run "sudo yum update" to apply all updates.
Amazon Linux version 2017.09 is available.
$ uname -srv
Linux 4.9.51-10.52.amzn1.x86_64 #1 SMP Fri Sep 29 01:16:19 UTC 2017
カーネルは4.4.5
から4.9.51
に上がったようですね。ところがまだ最新ではないです。
またssh
を行ったら、早速情報が更新されています。
No packages needed for security; 138 packages available
Run "sudo yum update" to apply all updates.
カーネルのアップデートではなく、パッケージのアップデートを勧められています。
全てのパッケージアップデートする
そこでカーネルだけれはなく全てのパッケージをアップデートさせます。
パッケージを全てアップデートすると既存で動いているサービスに影響を与えることがあるので、バージョンの依存関係があるパッケージについては除外しましょう
今回はカーネルを最新にアップデートさせることが目標なので、上記を考慮せずに全てのパッケージをアップデートします。
$ sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
--> Running transaction check
---> Package acpid.x86_64 0:1.0.10-2.1.6.amzn1 will be updated
---> Package acpid.x86_64 0:2.0.19-6.7.amzn1 will be an update
・・・(省略)
# インストールとアップデートをするパッケージが一覧されるのでチェック
========================================================================================================================================================================================================================================================
Package Arch Version Repository Size
========================================================================================================================================================================================================================================================
Updating:
acpid x86_64 2.0.19-6.7.amzn1 amzn-main 73 k
at x86_64 3.1.10-48.15.amzn1 amzn-main 66 k
audit x86_64 2.6.5-3.28.amzn1 amzn-main 272 k
audit-libs x86_64 2.6.5-3.28.amzn1 amzn-main 96 k
・・・(省略)
Installing for dependencies:
libXcomposite x86_64 0.4.3-4.6.amzn1 amzn-main 21 k
libidn2 x86_64 0.16-1.2.amzn1 amzn-main 103 k
libnghttp2 x86_64 1.21.1-1.4.amzn1 amzn-main 73 k
libseccomp x86_64 2.3.1-2.4.amzn1 amzn-main 79 k
libunistring x86_64 0.9.3-6.1.amzn1 amzn-main 419 k
perl-Time-HiRes x86_64 4:1.9725-272.5.amzn1 amzn-main 46 k
python27-futures noarch 3.0.3-1.3.amzn1 amzn-main 30 k
Transaction Summary
========================================================================================================================================================================================================================================================
Install ( 7 Dependent packages)
Upgrade 138 Packages
Total download size: 192 M
yum update
では、インストールを始める前に、インストールとアップデートをするパッケージが一覧されます。
その後にアップデートするか選べるので、パッケージを確認してから、動いているサービスに影響がないか確認するといいと思います。
このままアップデートを実行します。
Is this ok [y/d/N]: y
Downloading packages:
(1/145): acpid-2.0.19-6.7.amzn1.x86_64.rpm | 73 kB 00:00
(2/145): at-3.1.10-48.15.amzn1.x86_64.rpm | 66 kB 00:00
・・・(省略)
xfsprogs.x86_64 0:4.5.0-9.21.amzn1 yum.noarch 0:3.4.3-150.70.amzn1 yum-metadata-parser.x86_64 0:1.1.4-10.20.amzn1 yum-plugin-priorities.noarch 0:1.1.31-40.29.amzn1
yum-plugin-upgrade-helper.noarch 0:1.1.31-40.29.amzn1 yum-utils.noarch 0:1.1.31-40.29.amzn1
Complete!
全てのパッケージをアップデートしました。再起動を行い、再度sshします。
$ ssh hogehost
Last login: Sat Jan 20 02:17:24 2018
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2017.09-release-notes/
10 package(s) needed for security, out of 34 available
Run "sudo yum update" to apply all updates.
$ uname -srv
Linux 4.9.51-10.52.amzn1.x86_64 #1 SMP Fri Sep 29 01:16:19 UTC 2017
カーネルのバージョンはかわっていませんが、
10 package(s) needed for security, out of 34 available
Run "sudo yum update" to apply all updates.
バージョンアップ後、さらにセキュリティ問題のためアップデートするように警告されていますね。
すべでのパッケージをアップデートしたことで、最新のカーネルにアップデートできるようになりました。
パッケージ全てをアップデートする(2回目)
最新のカーネルにアップデートするべく、再度アップデートします。
$ sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
Resolving Dependencies
・・・(省略)
Installed:
kernel.x86_64 0:4.9.77-31.58.amzn1
Dependency Installed:
libtool-ltdl.x86_64 0:2.4.2-20.4.8.5.32.amzn1 nss-pem.x86_64 0:1.0.3-4.3.amzn1
Updated:
aws-cfn-bootstrap.noarch 0:1.4-27.19.amzn1 aws-cli.noarch 0:1.14.9-1.48.amzn1 curl.x86_64 0:7.53.1-13.80.amzn1 docker.x86_64 0:17.09.1ce-1.111.amzn1 docker-storage-setup.noarch 0:0.6.0-1.18.giteb688d4.amzn1
ec2-net-utils.noarch 0:0.5-1.34.amzn1 ec2-utils.noarch 0:0.5-1.34.amzn1 ecs-init.x86_64 0:1.16.2-1.amzn1 irqbalance.x86_64 2:1.3.0-1.26.amzn1 java-1.7.0-openjdk.x86_64 1:1.7.0.161-2.6.12.0.75.amzn1
kernel-tools.x86_64 0:4.9.77-31.58.amzn1 krb5-libs.x86_64 0:1.15.1-8.43.amzn1 libcurl.x86_64 0:7.53.1-13.80.amzn1 nss.x86_64 0:3.28.4-12.80.amzn1 nss-softokn.x86_64 0:3.28.3-8.41.amzn1
nss-softokn-freebl.x86_64 0:3.28.3-8.41.amzn1 nss-sysinit.x86_64 0:3.28.4-12.80.amzn1 nss-tools.x86_64 0:3.28.4-12.80.amzn1 nss-util.x86_64 0:3.28.4-3.53.amzn1 openssl.x86_64 1:1.0.2k-8.106.amzn1
python27.x86_64 0:2.7.12-2.121.amzn1 python27-boto.noarch 0:2.48.0-1.2.amzn1 python27-botocore.noarch 0:1.8.13-1.66.amzn1 python27-devel.x86_64 0:2.7.12-2.121.amzn1 python27-libs.x86_64 0:2.7.12-2.121.amzn1
ruby20.x86_64 0:2.0.0.648-1.30.amzn1 ruby20-irb.noarch 0:2.0.0.648-1.30.amzn1 ruby20-libs.x86_64 0:2.0.0.648-1.30.amzn1 rubygem20-bigdecimal.x86_64 0:1.2.0-1.30.amzn1 rubygem20-psych.x86_64 0:2.0.0-1.30.amzn1
rubygems20.noarch 0:2.0.14.1-1.30.amzn1 system-release.noarch 0:2017.09-0.1 wget.x86_64 0:1.18-3.28.amzn1
Complete!
再起動してアップデートを反映させます。
$ ssh hogehost
Last login: Sat Jan 20 02:21:06 2018
__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2017.09-release-notes/
$ uname -srv
Linux 4.9.77-31.58.amzn1.x86_64 #1 SMP Thu Jan 18 22:15:23 UTC 2018
カーネルもCPU脆弱性の対応がされた最新のバージョンになりました。
まとめ
今回2016年のAmazon Linux
のKernelを最新版にアップデートにするには以下のような流れです。
- yum.conf更新(リリースバージョンを最新にする)
- yum update(1回目。2016 → 2017にコミットされたバージョンをあげる)
- yum update(2回目。2017 → 最新の2018にコミットされたバージョンをあげる。)
何回 yum update
が必要なのかは、管理しているインスタンスのバージョンによりますが、
OSのバージョンアップは早いうちからやっていた方が明らかに楽ですし、
パッケージを全てアップデートする場合は既存のサービスに影響を与える可能性もあります。
改めてセキュリティ対策は、コツコツアップデートしていかなければという学びを得ました。
また、ssh
の情報にしっかり目を通すことで、どうアップデートすべきかわかるので最新のOSに保ちつつ管理していきましょう。