経緯
私はDockerをよく使っていて、公式imageを用いるが、大体はdebianが親になっていることが多い。
そして、メンテナンスされていないimageも多々有り、祖先のdebianイメージのバージョンがどんどん古くなってしまっている。危ない。
そんな古い公式imageを利用することになった。
問題
古いdebianイメージ(私の場合はjessie)でapt update
をするといかのようなエラーが出た
$ apt update
...
W: GPG error: http://security.debian.org jessie/updates InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY XXXXXXXXXX
- debian(なのかaptなのか)は、セキュリティのためパッケージが本物であることを検証するためにGPGという仕組みを利用しているらしい。
- 古いdebianのaptは、その鍵の有効期限が切れていることがあるらしく、今回のようなエラーが出るらしい。
- GPGというのは公開鍵暗号方式を用いた署名の仕組みらしい。
- SSLなどと違い第三者機関としての認証局は無く、俺自身が認証局となることだ…という感じらしい。
- 自分が認証するので、自分の鍵で他人の鍵に署名したりしてもらったりするらしい。
- 署名していいケースというのは、物理的に対象の人物と出会い、十分に身分を証明してもらったときのみらしい。
- 対処法をググると腐るほど出てくるが、エラーの鍵をinstallしてしまえばいいという手順がかいてある。しかし私にはそんなことをして良いか(安全か)全然わからん。
だいたい私は今何度「らしい」といったのか。私はただ単にaptでパッケージをインストールしたいだけだというのに。何なんじゃもう。ブラックボックスで使わせてくれよもう
理解度が足りて無く、それをやっていいという納得が得られないので、GPGについて深く理解するしかなさそうだ。
・・・と思っていたところ
$ apt-get update
$ apt-get install debian-keyring debian-archive-keyring
$ apt-get update
で治ったではないか。
これが何なのか。正直わからん。
Debian プロジェクトは、偽造を防ぐために開発者が自分のパッケージであることの 表明に GnuPG による電子署名を行うことを要求しています。 本パッケージには、GnuPG のキーリングと Debian 開発者 (アップロード権を持つ者と持たない者) や Debian メンテナの GnuPG 鍵が含まれています。
らしい。
だが、これがセキュリティ的にだめじゃないことだけはわかる。
よくわかっていない私は特に何も認証操作をしていないからだ。
WARNING: The following packages cannot be authenticated!
debian-archive-keyring debian-keyring
って出てたのでもうダメだ。
もうだめなのだが、もうこれでいいと思うことにした。(後述)
Dockerでの話
FROM xxxx # メンテナンスを放棄された、祖先に鍵の有効期限が切れた可愛そうなdebianを持つimage
RUN apt-get update \
&& apt-get install -y --force-yes debian-keyring debian-archive-keyring \
&& apt-get update \
&& apt-get install -y \
* \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
という感じになる。
--force-yes
でWARNING: The following packages cannot be authenticated!
を無視する。
なんだか自己改造しているロボットみたいだ。
今回私は仕方なくメンテナンスを放棄されたimageを使ったが、普通は潔く最新のimage使ったいい。公式imageに無いなら自分で作ったほうがいい。
こういうことがないようにDockerhubにimageを公開する開発者の方々に置かれましては、Dockerhubのbuild settingsで「祖先のimageが更新されたら自動で更新する」ようにしておいてほしい。
追記
に公式マニュアルっぽいものを発見した。
ここに書いてある対処法はdebian-archive-keyringパッケージの更新だ。
しかし、apt-get install debian-archive-keyring
を実行するとThe following packages cannot be authenticated!
と出る。
そもそもdebian-archive-keyringパッケージというのはaptの署名鍵を管理するプログラムだ。
とはいえ、こいつもaptパッケージだ。つまりこいつ自身の署名鍵が期限切れしてたらどうしようもないのだ。
普通に使うときは、期限切れの前に余裕を持って更新された鍵が配布されるなり、こいつだけ時期をずらして更新されたりするのだろう。(と推測する)
本末転倒だ。ブートストラップ問題というやつだ。もうダメだ。
このことについてのQ&Aが見つけられて
言ってることは、やっぱりこれはブートストラップ問題なので、
- ちゃんとしたいなら頑張って鍵信用できる方法でinstallしなさい
- ちゃんとしなくていいなら
apt-get install debian-archive-keyring
を行って警告は無視しなさい
ということだ。
そろそろ私も疲れてきたのでもうちゃんとしたくはない。
このへんで記事は締めくくろうと思う。
ただ、Docker使っているのだから最新のイメージの中の秘密鍵をexportしてくれば、ちゃんとできる気がしますな。