link もっと前
   2019年 8月 12日 -
      2019年 8月 3日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示


link permalink

独自の apt サーバー - その 3 - apt の信頼システム

Packages には各 Debian パッケージのハッシュ値が記述されていて、悪意ある者が Debian パッケージを改変しても検知できるようになっています。Release には Packages のハッシュ値が記述されていて、Packages を改変されても検知できるようになっています。

Release の改変に対しては、サーバーの作成者が署名を付け、Release が作成時から改変されていないことを保証します。

パッケージ(*.deb) <--(ハッシュ値)-- Packages <--(ハッシュ値)-- Release <--(署名)-- InRelease もしくは Release.gpg

保証の関係を図示すると上記のとおりです。前回の apt-get update のエラーメッセージは InRelease もしくは Release.gpg が存在しない、もしくは、あっても信頼できない署名だと言って怒っているのです。


最初から apt-get に信頼されている鍵は公式サーバーが使っている鍵ですが、当然ながら私は知りません。ですので、

  • 秘密鍵、公開鍵を作成
  • 自作した鍵を apt に信用してもらう
  • 自作した鍵で Release ファイルに署名


# gpg --gen-key

gpg (GnuPG) 2.2.12; Copyright (C) 2018 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Note: Use "gpg --full-generate-key" for a full featured key generation dialog.

GnuPG needs to construct a user ID to identify your key.

Real name:

名前やメールアドレスを聞かれるので適宜答えてください。途中でパスフレーズを聞かれます。今回はテストなので、名前は Test User、パスフレーズは abcd1234 にしました。

自作した鍵を apt に信用してもらう

自作した鍵を apt に信用してもらうには、公開鍵(秘密鍵ではありません)を apt の信頼済み鍵束に登録します。

自分用の公開鍵をエクスポートし apt に登録
# gpg --list-keys

pub   rsa3072 2019-08-11 [SC] [expires: 2021-08-10]
      A24D479395FF7F2B4A787D29439D445DCA4AF8F6      ★この ID を指定する
uid           [ultimate] Test User
sub   rsa3072 2019-08-11 [E] [expires: 2021-08-10]

# mkdir /var/www/linux/debian/gpg
# gpg --export A24D479395FF7F2B4A787D29439D445DCA4AF8F6 > /var/www/linux/debian/gpg/public.key

# curl | apt-key add -

# apt-key list

pub   rsa3072 2019-08-11 [SC] [expires: 2021-08-10]
      A24D 4793 95FF 7F2B 4A78  7D29 439D 445D CA4A F8F6    ★自作の鍵が追加された
uid           [ unknown] Test User
sub   rsa3072 2019-08-11 [E] [expires: 2021-08-10]

pub   rsa4096 2019-04-14 [SC] [expires: 2027-04-12]
      80D1 5823 B7FD 1561 F9F7  BCDD DC30 D7C2 3CBB ABEE
uid           [ unknown] Debian Archive Automatic Signing Key (10/buster) <>
sub   rsa4096 2019-04-14 [S] [expires: 2027-04-12]

pub   rsa4096 2019-04-14 [SC] [expires: 2027-04-12]
      5E61 B217 265D A980 7A23  C5FF 4DFA B270 CAA9 6DFA
uid           [ unknown] Debian Security Archive Automatic Signing Key (10/buster) <>
sub   rsa4096 2019-04-14 [S] [expires: 2027-04-12]


自分で作った鍵ペアのうち、公開鍵を gpg --export でファイルにエクスポートし、HTTP サーバーに配置します。公開鍵ファイルを apt-key add で信頼済みの鍵束に追加します。

今回作成した鍵はテストが終わったら不要なので apt-key del ’キーID’ で削除してください。apt-key list で出てきたキー ID をコピペすれば良いです(スペースもそのまま入れて OK)。

自作した鍵で Release ファイルに署名する

最後に Release ファイルに署名します。Release ファイルの署名には 2種類あって、署名を Release ファイルと一緒に書く InRelease ファイルと、署名だけを別に書く Release.gpg ファイルがあります。

InRelease だけ作成すれば機能するようですが、とりあえず両方の作り方を紹介しておきます。

Release の署名を作成する

### GnuPG で Release ファイルに署名

# echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback --clearsign -o InRelease Release
# echo -n "abcd1234" | gpg --batch --passphrase-fd 0 --pinentry-mode loopback -abs -o Release.gpg Release
# chmod 644 Release InRelease Release.gpg

署名が完了したら apt-get update してみましょう。

Release の署名を作成する
# apt-get update

Get:1 buster InRelease [3941 B]
Hit:2 testing InRelease
Get:3 buster/stable amd64 Packages [1752 B]
Get:4 buster/stable amd64 Contents (deb) [1242 B]
Fetched 6935 B in 0s (25.7 kB/s)                               
Reading package lists... Done

うまくいきました。apt-get install docker-ce を実行すると、、、

apt-get を実行
# apt-get install docker-ce

Reading package lists... Done
Building dependency tree
Reading state information... Done
Package docker-ce is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source
However the following packages replace it:

E: Package 'docker-ce' has no installation candidate

どうやら依存関係を無視して Docker のパッケージを 1つしか登録しなかったため、依存関係のエラーが出てしまったようです。

他のパッケージ(docker-ce_cli,もダウンロードしましょう。pool/stable/amd64 の下に追加し、apt-ftparchive と署名をやり直します。

|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
    |-- dists
    |   `-- buster
    |       |-- InRelease
    |       |-- Release
    |       |-- Release.gpg
    |       |-- packages-amd64.db
    |       |-- pool
    |       |   `-- stable
    |       |       `-- amd64
    |       |           |-- containerd.io_1.2.6-3_amd64.deb
    |       |           |-- docker-ce-cli_19.03.1~3-0~debian-buster_amd64.deb
    |       |           `-- docker-ce_19.03.1~3-0~debian-buster_amd64.deb
    |       `-- stable
    |           |-- Contents-amd64
    |           |-- Contents-amd64.bz2
    |           |-- Contents-amd64.gz
    |           `-- binary-amd64
    |               |-- Packages
    |               |-- Packages.bz2
    |               `-- Packages.gz
    `-- gpg
        `-- public.key

10 directories, 16 files

以上のようなディレクトリ構成になるはずです。もう一度 apt-get install docker-ce してみましょう。

再び apt-get を実行
# apt-get install docker-ce

Reading package lists... Done
Building dependency tree 
Reading state information... Done
The following additional packages will be installed:
  aufs-dkms aufs-tools cgroupfs-mount docker-ce-cli
Suggested packages:
The following NEW packages will be installed:
  aufs-dkms aufs-tools cgroupfs-mount docker-ce docker-ce-cli
0 upgraded, 6 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/88.0 MB of archives.
After this operation, 390 MB of additional disk space will be used.
Do you want to continue? [Y/n]

Selecting previously unselected package aufs-dkms.
(Reading database ... 325385 files and directories currently installed.)
Preparing to unpack .../0-aufs-dkms_4.19+20190211-1_all.deb ...
Unpacking aufs-dkms (4.19+20190211-1) ...
Selecting previously unselected package aufs-tools.
Preparing to unpack .../1-aufs-tools_1%3a4.14+20190211-1_amd64.deb ...
Unpacking aufs-tools (1:4.14+20190211-1) ...
Selecting previously unselected package cgroupfs-mount.
Preparing to unpack .../2-cgroupfs-mount_1.4_all.deb ...
Unpacking cgroupfs-mount (1.4) ...
Selecting previously unselected package
Preparing to unpack .../3-containerd.io_1.2.6-3_amd64.deb ...
Unpacking (1.2.6-3) ...
Selecting previously unselected package docker-ce-cli.
Preparing to unpack .../4-docker-ce-cli_5%3a19.03.1~3-0~debian-buster_amd64.deb ...
Unpacking docker-ce-cli (5:19.03.1~3-0~debian-buster) ...
Selecting previously unselected package docker-ce.
Preparing to unpack .../5-docker-ce_5%3a19.03.1~3-0~debian-buster_amd64.deb ...
Unpacking docker-ce (5:19.03.1~3-0~debian-buster) ...
Setting up aufs-tools (1:4.14+20190211-1) ...
Setting up (1.2.6-3) ...
Created symlink /etc/systemd/system/ -> /lib/systemd/system/containerd.service.
Setting up docker-ce-cli (5:19.03.1~3-0~debian-buster) ...
Setting up aufs-dkms (4.19+20190211-1) ...
Loading new aufs-4.19+20190211 DKMS files...
Building for 4.19.0-5-amd64
Building initial module for 4.19.0-5-amd64


以上のように apt-get もうまくいきました。良かった良かった。

[編集者: すずき]
[更新: 2019年 9月 1日 04:22]
link 編集する


  • コメントはありません。
open/close この記事にコメントする

link permalink

独自の apt サーバー - その 2 - apt-ftparchive の設定、実行

Web サーバーあるいは FTP サーバーで Debian パッケージを配布する場合、*.deb ファイル以外に Contents, Package, Release ファイルが必要です。これらのファイルを作成するためのツールが apt-ftparchive です。

今回は HTML サーバーで配布することを考えます。Debian だと /var/www がルートディレクトリになっていることが多いと思います。以降 /var/www がルートディレクトリだとします。

ディレクトリ構成は前回紹介(2019年 8月 11日の日記参照)した Docker のディレクトリ構成に習うとします。Debian パッケージはどんなファイルでも良いです(後ほどテストするときのため amd64 向けのパッケージのほうが良いです)が、今回は Docker のパッケージを 1つダウンロードしてきて試します。

HTML サーバーのルートディレクトリ、*.deb ファイルの置き場所
# cd /var/www

# tree linux

|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
    `-- dists
        `-- buster
            |-- pool
            |   `-- stable
            |       `-- amd64
            |           `-- docker-ce_19.03.1~3-0~debian-buster_amd64.deb
            `-- stable
                `-- binary-amd64

9 directories, 3 files

Debian パッケージのみを配置した後のディレクトリ構造は上記のようになります。

apt-ftparchive の設定ファイル

設定ファイルは apt_generate_debian_buster.conf と apt_release_debian_buster.conf と 2つを使います。前者はディレクトリ構造を指定するファイルで、apt-ftparchive generate の引数に指定します。後者はリリース情報(ラベル、オリジナルなど)を指定するファイルで、apt-ftparchive release の -c オプションに指定します。



Dir::ArchiveDir ".";
Dir::CacheDir   "dists/buster";
Default::Packages::Compress   ". gzip bzip2";
Default::Packages::Extensions ".deb";
Default::Sources::Compress    ". gzip bzip2";
Default::Contents::Compress   ". gzip bzip2";
Default::FileMode             0644;
TreeDefault::Directory        "dists/buster/pool/stable/amd64";
TreeDefault::Packages         "dists/buster/stable/binary-amd64/Packages";

Tree "dists/buster" {
    Sections "stable";
    Architectures "amd64";

BinDirectory "dists/buster/stable/binary-amd64" {
    Packages "dists/buster/stable/binary-amd64/Packages";
    Contents "dists/buster/stable/Contents-amd64";

この設定ファイルにはいくつかディレクトリパスが登場します。パスは apt-ftparchive を実行するディレクトリ(/var/www/linux/buster)からの相対パスで記述します。

Tree::Sections と Tree::Architectures は少し特殊で、ディレクトリパスの一部を構成します。{Tree}/{Sections} ディレクトリに Contents ファイルが作成され、{Tree}/{Sections}/{Architectures} ディレクトリに Packages ファイルが作成されます。

apt_generate_debian_buster.conf で複数の Sections を指定


Tree "dists/buster" {
    Sections "stable testing";
    Architectures "amd64";

上記のように Tree::Sections には複数のセクションが指定でき、Tree::Architectures には複数のアーキテクチャが指定できるはずですが、今のところ TreeDefault::Packages との対応がよくわからず、使いこなせていません。複数のセクションを同時に指定する手段が見つかったら、また日記で書こうと思います。


APT::FTPArchive::Release {
    Architectures "amd64";
    Components "stable";
    Label "Test Label";
    Origin "Test";
    Suite "buster";

リリース情報を記述するファイルは上記のように書きます。APT::FTPArchive::Release には他のフィールドも記述できます。apt-ftparchive の release コマンドのヘルプ(リンク)によると「Origin, Label, Suite, Version, Codename, Date, NotAutomatic, ButAutomaticUpgrades, Acquire-By-Hash, Valid-Until, Signed-By, Architectures, Components, Description」が指定できるとのことですが、意味が説明されておらず、何を書くべきなのかわかりません……。

apt-ftparchive の実行

設定ファイルを記述した後は apt-ftparchive を実行して、Debian パッケージの情報について記述した Contents, Packages, Release の各ファイルを作成します。

apt-ftparchive を実行

# export TARGET=debian
# export DIST=buster
# export SECT=stable
# export ARCH=amd64
# mkdir -p /var/www/linux/${TARGET}/dists/${DIST}/${SECT}/binary-${ARCH}
# mkdir -p /var/www/linux/${TARGET}/dists/${DIST}/pool/${SECT}/${ARCH}

### *.deb ファイルをコピーする(モジュールによってコピー元は違うと思うので、これは一例)
### cp *.deb /var/www/linux/${TARGET}/dists/${DIST}/pool/${SECT}/${ARCH}

### Packages, Contents ファイルを作る
### linux/debian の下で apt-ftparchive を実行しないと *.deb が見つからないといわれる

# cd /var/www/linux/${TARGET}
# find . -name "Contents-*" -or -name "Contents-*.*" | xargs rm -f
# find . -name "Packages" -or -name "Packages.*" -or -name "packages-*" | xargs rm -f
# find . -name Release -or -name Release.gpg -or -name InRelease | xargs rm -f
# apt-ftparchive generate ../conf/apt_generate_${TARGET}_${DIST}.conf

### Release ファイルを作る
### linux/debian/dists/buster の下で apt-ftparchive を実行しないと、
### 後ほど apt-get を実行した際にパッケージが見つからないといわれる

# cd /var/www/linux/${TARGET}/dists/${DIST}
# apt-ftparchive release -c=../../../conf/apt_release_${TARGET}_${DIST}.conf . > Release


apt-ftparchive の実行後
# tree linux

|-- conf
|   |-- apt_generate_debian_buster.conf
|   `-- apt_release_debian_buster.conf
`-- debian
   `-- dists
        `-- buster
            |-- Release
            |-- packages-amd64.db
            |-- pool
            |   `-- stable
            |       `-- amd64
            |           `-- docker-ce_19.03.1~3-0~debian-buster_amd64.deb
            `-- stable
                |-- Contents-amd64
                |-- Contents-amd64.bz2
                |-- Contents-amd64.gz
                `-- binary-amd64
                    |-- Packages
                    |-- Packages.bz2
                    `-- Packages.gz

コマンド実行後、Contents, Packages, Release ファイルが生成され、上記のように配置されます。

独自 apt サーバー完成ならず?

Contents, Packages, Release ファイルがあれば apt-get に apt サーバーとして認識してもらえるはずです。

/etc/apt/sources.list に独自 apt サーバーを追加

deb [arch=amd64] buster stable

適当な Debian マシンの apt の設定ファイルに、さきほど作成した独自 apt サーバーを追加し apt-get update を実行します。HTTP サーバーの IP アドレスは とします。

独自 apt サーバーに対して apt-get を実行
# apt-get update

Ign:1 buster InRelease
Get:2 buster Release [3233 B]
Ign:3 buster Release.gpg
Hit:4 testing InRelease
Reading package lists... Done
E: The repository ' buster Release' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.


Contents, Packages, Release ファイルを作成しても終わりではありません。apt には悪意ある者が Debian パッケージを改変しても検知できる仕組みが搭載されていて、その対応をしないと「信用できないリポジトリ」だといわれてエラーになります。


apt_generate_debian_buster.conf の修正

TreeDefault::Directory        "dists/buster/pool/stable/stable/amd64";

TreeDefault::Directory        "dists/buster/pool/stable/amd64";
[編集者: すずき]
[更新: 2019年 9月 1日 04:22]
link 編集する


  • コメントはありません。
open/close この記事にコメントする

link permalink

独自の apt サーバー - その 1 - ディレクトリ構成

会社で独自の Debian パッケージを配布する際に、難しくてかなり困ったので、下調べの結果を兼ねてメモしておきます。

やりたいこととしては、独自に作成した Debian パッケージ(*.deb ファイル)を、

  • 複数の OS: Debian, Ubuntu など
  • 複数の版: stable, testing, nightly など
  • 複数のアーキテクチャ: amd64, arm64 など

この 3つをどのように組み合わせても対応できるような、ディレクトリ構成と、apt サーバーの設定を作成することです。

Docker が参考になる

ディレクトリ構成は、最初から考えるのは大変なので、参考として Docker の apt リポジトリリンク)を見てみます。

Docker の apt リポジトリサーバー
        buster/ : Debian 10.0
            edge/ : なんだろ?
            nightly/ : 1日ごとにビルドされた版
            pool/ : *.deb が入っているディレクトリ
            stable/ : 安定版
            test/ : テスト版?
        jessie/  : Debian 8.0
        stretch/ : Debian 9.0
        wheezy/  : Debian 7.0
    gpg : GnuPG の公開鍵、apt-key で追加する

        artful/  : Ubuntu 17.10
        bionic/  : Ubuntu 18.04 LTS
        cosmic/  : Ubuntu 18.10
        disco/   : Ubuntu 19.04
        trusty/  : Ubuntu 14.04 LTS
        xenial/  : Ubuntu 16.04 LTS
        yakkety/ : Ubuntu 16.10
        zesty/   : Ubuntu 17.04
    gpg : GnuPG の公開鍵、apt-key で追加する

こんな作りになっています。debian/dists もしくは ubuntu/dists の下に各バージョンのコードネームが並んでいます。例えば debian/dists/buster であれば Debian 10.0 用です。

コードネームのディレクトリの下には、各版 stable, test 用のディレクトリが並んでいます。pool ディレクトリは版名ではなくて、パッケージファイル *.deb を格納するディレクトリです。

Debian 10.0 用のディレクトリ以下
        buster/ : Debian 10.0
            edge/ : なんだろ?
            nightly/ : 1日ごとにビルドされた版
                binary-amd64/ : PC, 64bit 用パッケージ情報
                    Packages   : パッケージ一覧
                binary-arm64/ : AArch64 用パッケージ情報
                binary-armhf/ : AArch32 用パッケージ情報
                Contents-amd64 : PC, 64bit 用
                Contents-arm64 : AArch64 用
                Contents-armhf : AArch32 用
            pool/ : *.deb が入っているディレクトリ
                edge/ : stable と同じ構成
                nightly/ : stable と同じ構成
                    amd64/ : PC, 64bit 用 *.deb
                    arm64/ : AArch64 用 *.deb
                    armhf/ : AArch32 用 *.deb
                test/ : stable と同じ構成
            stable/ : 安定版
            test/ : テスト版
            InRelease   : GnuPG の署名が追記された Release ファイル
            Release     : Contents, Packages の SHA ハッシュ一覧が書かれたファイル
            Release.gpg : GnuPG の署名だけ書かれたファイル

Debian 向けと Ubuntu 向けはほぼ同じ構成です。

[編集者: すずき]
[更新: 2019年 9月 1日 04:21]
link 編集する


  • コメントはありません。
open/close この記事にコメントする

link もっと前
   2019年 8月 12日 -
      2019年 8月 3日  
link もっと後


link 記事を新規作成

合計:  counter total
本日:  counter today

link About
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 10/13 23:20



最近のコメント 5件

  • link 19年09月01日
    すずき 「私も正直びっくりです。間違って違う製品を...」
    (更新:09/04 23:39)
  • link 19年09月01日
    hdk 「車向けの製品の中でも、車載コンピューター...」
    (更新:09/02 23:20)
  • link 19年07月18日
    hdk 「あっ、AAMはマニュアルのオペレーション...」
    (更新:07/25 00:02)
  • link 19年07月18日
    すずき 「AAM(ASCII Adjust AX ...」
    (更新:07/24 22:22)
  • link 19年07月18日
    hdk 「加算減算は符号のありなしどちらも命令が同...」
    (更新:07/24 07:25)

最近の記事 3件

link もっとみる
  • link 19年10月06日
    すずき 「[RISC-V のバイナリダンプを逆アセンブルする] 相変わらず空...」
    (更新:10/13 23:20)
  • link 19年10月12日
    すずき 「[台風 19号] あの台風 15号(Faxai)(2019年 9月...」
    (更新:10/13 22:04)
  • link 19年09月08日
    すずき 「[台風 15号] 超強力な台風 15号(Faxai)が来るというこ...」
    (更新:10/13 22:03)


open/close wiki
open/close Java API


open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 過去日記について


open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報