FreeBSDのオリジナルのpkgサイトを作る

標準のオプションでコンパイルしていないportsを利用しているときとか自分専用のpkgサイトがあると便利ですよね。例えば弊社ではDOVECOT2のオプションをONにしてpostfixをビルドしています。その作り方をかなり前に社内の掲示板に書いたのですが、それをブログに転載します。

STEP1

普通にportsからpostfixをコンパイル、インストールする。

STEP2

pkgコマンドでpackageにする。

pkg -vv で ABIを確認しておくとVersion毎にディレクトリをわけなくてよいので楽。

とりあえず

/usr/ports/packages/FreeBSD:10:amd64

をパッケージの保存先とする。dovecot2,cyrus-sasl,pcreも依存しているのでいれておく

# pkg create -o /usr/ports/packages/FreeBSD:10:amd64 postfix

STEP3

レポジトリを作る

# pkg repo /usr/ports/packages/FreeBSD:10:amd64/

STEP4

ローカルファイルから持ってくるだけならこれで完成である

/usr/local/etc/pkg/repos/test.conf

というファイルに

test: {
  url: file:/usr/ports/packages/${ABI}
  enable: yes
  priority: 1
}

と書いておけばよい。pkg -vvで確認できる。その後

# pkg install -r test postfix

でインストールできることを確認できる。

# pkg install -rtest postfix
Updating test repository catalogue...
test repository is up-to-date.
All repositories are up-to-date.
The following 2 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        postfix: 2.11.3_3,1 [test]
        dovecot2: 2.2.15_2 [test]

The process will require 27 MB more space.
5 MB to be downloaded.

Proceed with this action? [y/N]:

ネットワーク経由で持ってくる

man pkg.confによると URLは

http://, https://, ftp://, file://, ssh://

が使えるようである。SSHは

ssh: {
  url: ssh://user@ssh.example.com/usr/ports/packages/${ABI}
  enable: yes
  priority: 1
}

と書いておけばよい。httpもftpも同様。

ftp: {
  url: ftp://ftp.example.com/pub/packages/${ABI}
  enable: yes
  priority: 1
}

当然 sshや ftpのサーバをセットアップしておかないといけない

pkg+httpとは何ぞや?

デフォルトの設定 /etc/pkg/FreeBSD.conf
を覗くと、

url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",

と書いてある。これはDNSのSRVレコードを使って効率よく
ミラー等を利用するための記法である。drillや digコマンドを使って

# drill _http._tcp.pkg.freebsd.org. srv

と調べてみるとよいであろう。

署名を付ける

ここまでの手順で作成したものには署名がない。個人的に使う分にはこれでよいだろうが、
一般公開をするためには署名があったほうがよいであろう。
(もちろん署名があるだけでは不十分で通信そのものがSSLなどで保護されているべきである)
署名の方法は公開鍵とフィンガープリントの二種類用意されている。

opensslで公開鍵のペアを作り公開鍵を提示する手法。

% man pkg-repo

に詳しく書いてある。まず鍵を作成する

       % openssl genrsa -out repo.key 2048
       % chmod 0400 repo.key
       % openssl rsa -in repo.key -out repo.pub -pubout

repo.keyが秘密鍵で、repo.pubが公開鍵である。公開鍵はなんらか方法でクライアント(pkgを利用するサイト)に送っておく

次にその秘密鍵で署名をしてレポジトリを作成する

# pkg repo /usr/ports/packages/FreeBSD:10:amd64/ repo.key

クライアント側では設定ファイルに公開鍵のパスを指定する

test: {
  url: http://www.example.com/pub/packages/${ABI}
  enable: yes
  priority: 1
  signature_type: pubkey
  pubkey: /usr/local/etc/pkg/repos/repo.pub
}

FingerPrint

man pkg-repoを参考に署名をするためのscriptを作成する。
sign.shとでもして作成をしておく

       #!/bin/sh
       read -t 2 sum
       [ -z "$sum" ] && exit 1
       echo SIGNATURE
       echo -n $sum | /usr/bin/openssl dgst -sign repo.key -sha256 -binary
       echo
       echo CERT
       cat repo.pub
       echo END

その後

# pkg repo /usr/ports/packages/FreeBSD:10:amd64/ signing_command: ./sign.sh

を実行する。

インストールする側に署名ファイルを置いておく必要がある。ここでは

/usr/local/etc/pkg/repos

とし、その下に revokedと trustedというディレクトリを用意する。
fingerprintを

# sha256 -q repo.pub

で求めておき、truestedの下に適当なファイル名で

function: sha256
fingerprint: ae9f016190512cc2107f2555c070c5ab2bad1ef73a370edc96f1b1b18022cdc1

のように置いておく。

クライアント側の設定は以下のようにする。

test: {
  url: http://www.example.com/pub/packages/${ABI}
  enable: yes
  priority: 1
  signature_type: fingerprints
  pubkey: /usr/local/etc/pkg/repos
}
Posted by issei

カテゴリ: BSD