サードパーティのAPTパッケージリポジトリを追加する際に使用する
リポジトリの正当性を担保する仕組み
Linuxにおけるパッケージ管理システムは,
- パッケージに悪意のあるコードが含まれていないこと
- パッケージメンテナ以外の第三者が作ったパッケージがリポジトリにアップロードされていないこと
- 本来のリポジトリとは別の場所からパッケージをダウンロードしていないこと
まず一番気になる1についてですが,
2も厳密にはAPTの対象外です。Ubuntuの公式リポジトリの場合は,
APTで正当性を確認するのは,
この
- sources.
listに記録されているURLからInReleaseファイルをダウンロードする - InReleaseファイルを,
ローカルにあらかじめ保存しておいたリポジトリ鍵で検証する - main/
binary-amd64/PackagesなどのPackagesファイルをダウンロードする - Packagesファイルのハッシュを,
InReleaseの中の情報で検証する - Packagesのパスに応じてpool/
main/以下などから, 対象のパッケージファイルをダウンロードする - ダウンロードしたパッケージファイルのハッシュを,
Packagesファイルの中の情報で検証する
InReleaseに対する署名は,
- ※1
- このあたりの情報は
「 man apt-secure
」でも確認できます。
たとえばUbuntu 20.
- ※2
- InReleaseとは別にReleaseやRelease.
gpgを使う場合もあります。Releaseが大本のデータで, Release. gpgはそれに対する署名情報です。InReleaseはReleaseとRelease. gpgをひとつにまとめたファイル (Inline signed Release) です。またAPTが取得したInReleaseやReleaseファイルは 「 /var/
」lib/ apt/ lists 以下に保存されています。
-----BEGIN PGP SIGNED MESSAGE-----Hash: SHA512Origin: UbuntuLabel: UbuntuSuite: focalVersion: 20.04Codename: focalDate: Thu, 23 Apr 2020 17:33:17 UTCArchitectures: amd64 arm64 armhf i386 ppc64el riscv64 s390xComponents: main restricted universe multiverseDescription: Ubuntu Focal 20.04(中略) 7ef83228ec207df10acac48fbdd811125826751 main/binary-amd64/Packages(中略)+m9MS1XP0RN13iWp3zXSlWJGPO/mDezqQ7vZ8Iwx=7xQ1-----END PGP SIGNATURE-----
Packagesも含むメタデータ情報のURLが示すコンテンツごとの,
それに対してリポジトリからダウンロードできる,
- ※3
- リポジトリの特定のコンポーネントのすべてのパッケージ情報が含まれるため,
公式リポジトリではxzやgzで圧縮されているものしか置かれていません。
Package: accountsserviceArchitecture: amd64Version: 0.6.55-0ubuntu13.2Priority: standardSection: gnomeOrigin: UbuntuMaintainer: Ubuntu Developers Original-Maintainer: Debian freedesktop.org maintainers Bugs: https://bugs.launchpad.net/ubuntu/+filebugInstalled-Size: 452Depends: dbus, libaccountsservice0 (= 0.6.55-0ubuntu13.2), libc6 (>= 2.4), libglib2.0-0 (>= 2.44), libpolkit-gobject-1-0 (>= 0.99)Suggests: gnome-control-centerFilename: pool/main/a/accountsservice/accountsservice_0.6.55-0ubuntu13.2_amd64.debSize: 61424MD5sum: 8d0c520e5edae8a0526a76982530ce2aSHA1: 6859166c5c490cf4be3ce74dce3816bb56d4a5f0SHA256: 344201d66fa1327b1dfce472dc062c5eba482f4caaecb1b832ec658869660b51SHA512: 964b9ceef71c3cb3cf88dfda3344814c19030de01a59d514268bb2fa89d6495bf9bd587a44517aa960f71b06c04550d5fe9b9cfbd83840e06179708adc4e85cfHomepage: https://www.freedesktop.org/wiki/Software/AccountsService/Description: query and manipulate user account informationTask: standardDescription-md5: 8aeed0a03c7cd494f0c4b8d977483d7ePackage: acctArchitecture: amd64(後略)
そしてaccountsservice_
」
- ※4
- 特に公式リポジトリやそのミラーリポジトリはストレージ・
ネットワーク負荷が高いためおいそれとはHTTPS化できませんし, 上記のような仕組みの結果としてHTTPS化する意味も今のところあまりありません。ただしリポジトリの公開鍵の配布なども合わせて行う場合は, HTTPS化は必須です。ちなみにお行儀の悪いプロキシーが間に挟まると, 上記のメタデータとハッシュの対応に齟齬が生じ, 「apt update」 などで 「ハッシュサムが適合しません」 などのエラーが出てパッケージの更新が失敗します。このあたりの対応については第331回の 「パッケージ管理のハウツー集」 も参照してください。
ここでポイントになってくるのが,
$ gpg --list-keys --keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg/etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg------------------------------------------------------pub rsa4096 2018-09-17 [SC]F6ECB3762474EDA9D21B7022871920D1991BC93Cuid [不明] Ubuntu Archive Automatic Signing Key (2018)
たとえばInReleaseファイルをダウンロードして検証してみましょう。
$ wget http://jp.archive.ubuntu.com/ubuntu/dists/focal/InRelease$ gpgv --keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg InReleasegpgv: 2020年04月24日 02時34分17秒 JSTに施された署名gpgv:RSA鍵3B4FE6ACC0B21F32を使用gpgv: 署名を検査できません: 公開鍵がありませんgpgv: 2020年04月24日 02時34分17秒 JSTに施された署名gpgv:RSA鍵871920D1991BC93Cを使用gpgv: "Ubuntu Archive Automatic Signing Key (2018) "からの正しい署名
鍵「3B4FE6ACC0B21F32」
このようにAPTによるパッケージの正当性は,