Debian GNU/Linux 9 stretch でのセキュリティアップデート方法

## 概要

- Debian GNU/Linux サーバの日々の定常作業として実施するべき apt upgrade 作業手順をまとめる
- 通常のパッケージ更新と Linux カーネルのパッケージ更新の2パターン

## apt とは

[apt\(8\) — apt — Debian stretch — Debian Manpages](https://manpages.debian.org/stretch/apt/apt.8.ja.html)

> apt は、パッケージ管理システム用の高レベルのコマンドラインインターフェースを提供します。エンドユーザインターフェースとして設計されています。また apt-get(8) や apt-cache(8) のような専用の APT ツールと比べて、デフォルトでインタラクティブな使用に適したいくつかのオプションが有効になっています。

## 準備

/etc/apt/sources.list に Debian パッケージ取得元の情報を記述する。

```
# cat /etc/apt/sources.list

# stretch
deb http://ftp.jp.debian.org/debian stretch main contrib non-free
deb http://ftp.jp.debian.org/debian stretch-updates main contrib non-free
deb http://security.debian.org/ stretch/updates main contrib non-free
deb-src http://ftp.jp.debian.org/debian stretch main contrib non-free
deb-src http://ftp.jp.debian.org/debian stretch-updates main contrib non-free
deb-src http://security.debian.org/ stretch/updates main contrib non-free
```

[sources\.list\(5\) — apt — Debian stretch — Debian Manpages](https://manpages.debian.org/stretch/apt/sources.list.5.ja.html)

> sources.list - APT のデータ取得元の設定リスト

[Debian JP Project \- ミラーサイトについて](https://www.debian.or.jp/using/mirror.html)

> Debian JP Project は、利用者の利便性を考慮した Debian ミラーサーバとして ftp.jp.debian.org を運用しています。
> 
> ftp.jp.debian.org は複数の (比較的高速な接続を持つ) Debian ミラーサーバを用いた DNS ラウンドロビン (+ サーバによる重み付け) を行っており、特定ミラーサーバの障害影響を回避できます。また、単なる DNS ラウンドロビンとは異なり、対象となっているサーバが障害で停止していたりミラーが正常に更新されていなかったりした場合は自動切り離しを実施し、利用者からは特に何も意識することなく、最新のミラーを利用できます。

## 通常のセキュリティアップデート

### 実施コマンド概要

このようなコマンドを実施してパッケージを更新する。

```
# apt update
# apt list --upgradable
# apt upgrade
# checkrestart
```

### パッケージを更新する必要があるか確認

```
# apt update
無視:1 http://ftp.jp.debian.org/debian stretch InRelease
取得:2 http://ftp.jp.debian.org/debian stretch-updates InRelease [91.0 kB]
ヒット:3 http://ftp.jp.debian.org/debian stretch Release   
取得:4 http://security.debian.org stretch/updates InRelease [94.3 kB]
取得:6 http://security.debian.org stretch/updates/main Sources [188 kB]
取得:7 http://security.debian.org stretch/updates/main amd64 Packages [464 kB]
取得:8 http://security.debian.org stretch/updates/main Translation-en [203 kB]
1,040 kB を 1秒 で取得しました (580 kB/s)                  
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
アップグレードできるパッケージが 1 個あります。表示するには 'apt list --upgradable' を実行してください。
```

### 更新されるパッケージを確認

```
# apt list --upgradable
一覧表示... 完了
libarchive13/stable 3.2.2-2+deb9u1 amd64 [3.2.2-2 からアップグレード可]
N: 追加バージョンが 1 件あります。表示するには '-a' スイッチを付けてください。
```

[apt\(8\) — apt — Debian stretch — Debian Manpages](https://manpages.debian.org/stretch/apt/apt.8.ja.html)

> list は、一定の基準を満たすパッケージのリストを表示することができるという点で、 dpkg-query --list に似ています。インストール済 ( --installed)、アップグレード可能 ( --upgradeable) または利用可能なすべてのバージョン ( --all-versions) の一覧オプションでも、パッケージ名をマッチさせる glob(7) パターンをサポートしています。

apt upgrade の -s (--simulate) オプションで確認することもできる。

```
# apt upgrade -s
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージはアップグレードされます:
  libarchive13
アップグレード: 1 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
Inst libarchive13 [3.2.2-2] (3.2.2-2+deb9u1 Debian-Security:9/stable [amd64])
Conf libarchive13 (3.2.2-2+deb9u1 Debian-Security:9/stable [amd64])
```

[apt\-get\(8\) — apt — Debian stretch — Debian Manpages](https://manpages.debian.org/stretch/apt/apt-get.8.ja.html)

> -s, --simulate, --just-print, --dry-run, --recon, --no-act
> 何もしない - 現在のシステム状態に基づいて起こるイベントのシミュレーションを行い、実際にはシステムを変更しません。ロックは無効になる ( Debug::NoLocking) ので、apt-get 実行中にシステムの状態が変化する可能性があります。シミュレーションは root 以外のユーザが実行できますが、シミュレーションを歪めるすべての apt 設定への読み取りアクセス権を持っていない可能性があります。この警告を表す通知は、root 以外のユーザではデフォルトで表示されます ( APT::Get::Show-User-Simulation-Note)。設定項目: APT::Get::Simulate

### パッケージを更新

```
# apt upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージはアップグレードされます:
  libarchive13
アップグレード: 1 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
294 kB のアーカイブを取得する必要があります。
この操作後に追加で 0 B のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://security.debian.org stretch/updates/main amd64 libarchive13 amd64 3.2.2-2+deb9u1 [294 kB]
294 kB を 0秒 で取得しました (487 kB/s)
changelog を読んでいます... 完了
(データベースを読み込んでいます ... 現在 85257 個のファイルとディレクトリがインストールされています。)
.../libarchive13_3.2.2-2+deb9u1_amd64.deb を展開する準備をしています ...
libarchive13:amd64 (3.2.2-2+deb9u1) で (3.2.2-2 に) 上書き展開しています ...
libarchive13:amd64 (3.2.2-2+deb9u1) を設定しています ...
libc-bin (2.24-11+deb9u3) のトリガを処理しています ...
```

### パッケージが更新されていることを確認

dpkg コマンドでパッケージのバージョンが上がっていることを確認できる。

```
# dpkg -l libarchive13
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前                バージョン     アーキテクチャ 説明
+++-===================-==============-==============-===========================================
ii  libarchive13:amd64  3.2.2-2+deb9u1 amd64          Multi-format archive and compression librar
```

### 再起動するプロセスがあるか確認

```
# checkrestart
Found 0 processes using old versions of upgraded files
```

再起動するプロセスが検出された場合は、必要に応じてプロセスを再起動する。

通常のパッケージ更新はこれで完了となる。

## Linux カーネルのアップデート

### 実施コマンド概要

このようなコマンドを実施して Linux カーネルのパッケージを更新する。

```
# apt update
# apt list --upgradable
# apt upgrade
# shutdown -r now
```

### パッケージを更新する必要があるか確認

```
# apt update
無視:1 http://ftp.jp.debian.org/debian stretch InRelease
ヒット:2 http://ftp.jp.debian.org/debian stretch-updates InRelease        
ヒット:3 http://ftp.jp.debian.org/debian stretch Release                                           
ヒット:4 http://security.debian.org stretch/updates InRelease                                      
パッケージリストを読み込んでいます... 完了                                                         
依存関係ツリーを作成しています       
状態情報を読み取っています... 完了
アップグレードできるパッケージが 1 個あります。表示するには 'apt list --upgradable' を実行してください。
```

### 更新されるパッケージを確認

```
# apt upgrade -s
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージはアップグレードされます:
  linux-image-4.9.0-8-amd64
アップグレード: 1 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
Inst linux-image-4.9.0-8-amd64 [4.9.130-2] (4.9.144-3 Debian:9.8/stable [amd64])
Conf linux-image-4.9.0-8-amd64 (4.9.144-3 Debian:9.8/stable [amd64])

# apt list --upgradable
一覧表示... 完了
linux-image-4.9.0-8-amd64/stable 4.9.144-3 amd64 [4.9.130-2 からアップグレード可]
N: 追加バージョンが 2 件あります。表示するには '-a' スイッチを付けてください。

# apt list --upgradable -a
一覧表示... 完了
linux-image-4.9.0-8-amd64/stable 4.9.144-3 amd64 [4.9.130-2 からアップグレード可]
linux-image-4.9.0-8-amd64/now 4.9.130-2 amd64 [インストール済み、4.9.144-3 にアップグレード可]
linux-image-4.9.0-8-amd64/stable 4.9.110-3+deb9u6 amd64
```

### インストールされている Linux カーネルのバージョンとパッケージを確認

```
# uname -mrsv
Linux 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64

# dpkg -l linux-image-4.9.0-8-amd64
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前                バージョン     アーキテクチャ 説明
+++-===================-==============-==============-===========================================
ii  linux-image-4.9.0-8 4.9.130-2      amd64          Linux 4.9 for 64-bit PCs
```

### パッケージを更新

```
# apt upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
アップグレードパッケージを検出しています... 完了
以下のパッケージはアップグレードされます:
  linux-image-4.9.0-8-amd64
アップグレード: 1 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
39.1 MB のアーカイブを取得する必要があります。
この操作後に追加で 137 kB のディスク容量が消費されます。
続行しますか? [Y/n] y
取得:1 http://ftp.jp.debian.org/debian stretch/main amd64 linux-image-4.9.0-8-amd64 amd64 4.9.144-3 [39.1 MB]
39.1 MB を 4秒 で取得しました (8,261 kB/s)            
changelog を読んでいます... 完了
(データベースを読み込んでいます ... 現在 76806 個のファイルとディレクトリがインストールされています。)
.../linux-image-4.9.0-8-amd64_4.9.144-3_amd64.deb を展開する準備をしています ...
linux-image-4.9.0-8-amd64 (4.9.144-3) で (4.9.130-2 に) 上書き展開しています ...
linux-image-4.9.0-8-amd64 (4.9.144-3) を設定しています ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-4.9.0-8-amd64
/etc/kernel/postinst.d/zz-update-grub:
Generating grub configuration file ...
Linux イメージを見つけました: /boot/vmlinuz-4.9.0-8-amd64
Found initrd image: /boot/initrd.img-4.9.0-8-amd64
Linux イメージを見つけました: /boot/vmlinuz-4.9.0-7-amd64
Found initrd image: /boot/initrd.img-4.9.0-7-amd64
完了
```

### パッケージが更新されていることを確認

パッケージのバージョンが上がっていることを確認できる。

```
# dpkg -l linux-image-4.9.0-8-amd64
要望=(U)不明/(I)インストール/(R)削除/(P)完全削除/(H)保持
| 状態=(N)無/(I)インストール済/(C)設定/(U)展開/(F)設定失敗/(H)半インストール/(W)トリガ待ち/(T)トリガ保留
|/ エラー?=(空欄)無/(R)要再インストール (状態,エラーの大文字=異常)
||/ 名前                バージョン     アーキテクチャ 説明
+++-===================-==============-==============-===========================================
ii  linux-image-4.9.0-8 4.9.144-3      amd64          Linux 4.9 for 64-bit PCs
```

Linux カーネルは OS を再起動するまで更新されないので、バージョンが上がっていないことを確認できる。

```
# uname -mrsv
Linux 4.9.0-8-amd64 #1 SMP Debian 4.9.130-2 (2018-10-27) x86_64
```

### OS を再起動

shutdown -r now または reboot コマンドで OS を再起動する。

```
# shutdown -r now
```

### Linux カーネルのバージョンを確認

OS が起動したら再度ログインする。
Linux カーネルのバージョンが上がっていることを確認できる。

```
# uname -mrsv
Linux 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3 (2019-02-02) x86_64
```

Linux カーネルのパッケージ更新はこれで完了となる。

## セキュリティアップデートを実施するタイミング

パッケージのセキュリティ更新があった場合は debian-security-announce メーリングリストにアナウンスが流れるため、自分はこれが来たタイミングで apt update を実施して、更新する必要があるか判断している。

[Debian Mailing Lists \-\- Index for debian\-security\-announce](https://lists.debian.org/debian-security-announce/)

## 参考情報

- [Debian \-\- セキュリティ情報](https://www.debian.org/security/index.ja.html)
- [Debian Mailing Lists \-\- Index for debian\-security\-announce](https://lists.debian.org/debian-security-announce/)