パッケージとリポジトリの概要

私たちは皆そこにいて、プログラムが必要です。そして私たちは何をしますか? 私たちのほとんどはapt-getinstall postfix and presto! 魔法のようにPostfixがインストールされています。

しかし、それは本当に魔法ではありません。 パッケージマネージャーapt-getは、パッケージを検索、ダウンロード、インストールします。 これは非常に便利ですが、apt-getが標準のリポジトリリストで必要なプログラムを見つけられない場合はどうでしょうか。 ありがたいことに、apt-getを使用すると、ユーザーはカスタムのダウンロード場所(リポジトリと呼ばれる)を指定できます。

このチュートリアルでは、独自の安全なリポジトリを設定し、他の人が使用できるように公開する方法について説明します。 Ubuntu 14.04 LTSドロップレットにリポジトリを作成し、同じディストリビューションの別のドロップレットからのダウンロードをテストします。

このガイドを最大限に活用するには、apt-getを使用したパッケージの管理に関するチュートリアルを確認してください。

前提条件

2つのUbuntu14.04LTSドロップレット

ガイドの終わりまでに、次のようになります。

  • リポジトリ署名キーを準備して公開しました
  • リポジトリマネージャーであるRepreproを使用してリポジトリを設定します
  • WebサーバーNginxでリポジトリを公開しました
  • 別のサーバーにリポジトリを追加しました

署名キーを準備して公開する

まず、有効なパッケージ署名キーが必要です。 すべてのパッケージにデジタル署名するため、この手順は安全なリポジトリにとって非常に重要です。 パッケージ署名により、ダウンローダーはソースが信頼できるという確信を得ることができます。

このセクションでは、次の手順に従って、暗号化されたマスター公開鍵と署名サブ鍵を生成します。

  • マスターキーを生成する
  • パッケージ署名用のサブキーを生成する
  • サブキーからマスターキーを切り離します

マスターキーを生成する

マスターキーを作りましょう。 これは人々が信頼するものであるため、このキーは安全に保管する必要があります。

始める前に、apt-getを介してrng-toolsをインストールしましょう。

apt-get install rng-tools

GPGは、キーを生成するためにエントロピーと呼ばれるランダムデータを必要とします。 エントロピーは通常、Linuxカーネルによって時間の経過とともに生成され、プールに格納されます。 ただし、クラウドサーバー(ドロップレットなど)では、カーネルがGPGに必要な量のエントロピーを生成するのに問題がある場合があります。 カーネルを支援するために、rngdプログラム(rng-toolsパッケージに含まれています)をインストールします。 このプログラムは、ホストサーバー(ドロップレットが配置されている場所)にエントロピーを要求します。 取得されると、rngdはデータをエントロピープールに追加し、GPGなどの他のアプリケーションで使用できるようにします。

次のようなメッセージが表示された場合:

Trying to create /dev/hwrng device inode...
Starting Hardware RNG entropy gatherer daemon: (failed).
invoke-rc.d: initscript rng-tools, action "start" failed.

次のコマンドを使用して、rngdデーモンを手動で起動します。

rngd -r /dev/urandom

デフォルトでは、rngdは / dev /hwrngからエントロピーを取得するための特別なデバイスを探します。 一部のドロップレットにはこのデバイスがありません。 これを補うために、 -r ディレクティブを指定して、疑似ランダムデバイス / dev /urandomを使用します。 詳細については、チュートリアル追加のエントロピーを設定する方法をご覧ください。

エントロピーのプールができたので、マスターキーを生成できます。 これを行うには、コマンドgpgを呼び出します。 次のようなプロンプトが表示されます。

gpg --gen-key
gpg (GnuPG) 1.4.16; Copyright (C) 2013 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.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1

プロンプトで、最初のオプション「RSAおよびRSA(デフォルト)」1を指定します。 これを選択すると、 gpg が最初に署名鍵を生成し、次に暗号化サブ鍵を生成します(両方ともRSAアルゴリズムを使用)。 このチュートリアルでは暗号化キーは必要ありませんが、優れた人物がかつて言ったように、「なぜですか?」 両方を使用することに不利な点はありません。将来、暗号化にキーを使用する可能性があります。

Enter を押すと、キーサイズの入力を求められます。

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096

キーのサイズは、マスターキーの安全性に直接関係します。 ビットサイズが大きいほど、キーの安全性が高くなります。 Debianプロジェクトでは、署名キーに4096ビットを使用することを推奨しているため、ここでは4096を指定します。 今後2〜5年間は、デフォルトのビットサイズ2048で十分です。 1024のサイズは、不快なほど安全ではないため、使用しないでください。

Enter を押して、期限切れのプロンプトを表示します。

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0

マスターキーには通常有効期限はありませんが、このキーを使用する予定がある限り、この値を設定してください。 このリポジトリを今後6か月間だけ使用する予定の場合は、6mを指定できます。 0は永久に有効になります。

Enter を押してから、yを押します。 「ユーザーID」を生成するように求められます。 この情報は、他の人や自分自身がこのキーを識別するために使用されます。したがって、実際の情報を使用してください。

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <[email protected]>"

Real name: Mark Lopez
Email address: [email protected]
Comment: 
You selected this USER-ID:
    "Mark Lopez <[email protected]>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

情報が正しければ、oEnterを押してください。 このキーにアクセスできるのはあなただけであることを確認するために、パスワードを追加する必要があります。 gpgキーのパスワードを回復する方法がないため、必ずこのパスワードを記憶してください(良いことです)。

You need a Passphrase to protect your secret key.

Enter passphrase: (hidden)
Repeat passphrase: (hidden)

さて、いくつかの魔法(数学)が起こります。 これには少し時間がかかる場合がありますので、腰を下ろすか、お気に入りの飲み物を1杯飲んでください。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 300 more bytes)
+++++
................+++++
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
..+++++
+++++
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 10E6133F marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   4096R/10E6133F 2014-08-16
      Key fingerprint = 1CD3 22ED 54B8 694A 0975  7164 6C1D 28A0 10E6 133F
uid                  Mark Lopez <[email protected]>
sub   4096R/7B34E07C 2014-08-16

これでマスターキーができました。 出力は、署名用のマスターキーを作成したことを示しています(上記のpub行の`0E6133F )。 キーには異なるIDがあります。 署名キーのIDをメモします(例では 10E6133F を使用しています)。 署名用の別のサブキーを作成するときは、次の手順でその情報が必要になります。

パッケージ署名用のサブキーを生成する

次に、このサーバーでマスターキーが不要になるように、2番目の署名キーを作成します。 マスターキーは、サブキーに権限を与えるルート権限と考えてください。 ユーザーがマスターキーを信頼する場合、サブキーへの信頼が暗示されます。

ターミナルで次を実行します。

gpg --edit-key 10E6133F

サンプルIDをキーのIDに置き換えます。 このコマンドは、gpg環境に入ります。 ここで、新しいキーを編集してサブキーを追加できます。 次の出力が表示されます。

gpg (GnuPG) 1.4.16; Copyright (C) 2013 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.

Secret key is available.

pub  4096R/10E6133F  created: 2014-08-16  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  4096R/7B34E07C  created: 2014-08-16  expires: never       usage: E
[ultimate] (1). Mark Lopez <[email protected]>

gpg>

プロンプトで、addkeyと入力します。

addkey

Enterを押します。 GPGはパスワードの入力を求めます。 このキーの暗号化に使用したパスワードを入力します。

Key is protected.

You need a passphrase to unlock the secret key for
user: "Mark Lopez <[email protected]>"
4096-bit RSA key, ID 10E6133F, created 2014-08-16

gpg: gpg-agent is not available in this session
Enter passphrase: <hidden>

キータイプの次のプロンプトが表示されます。

Please select what kind of key you want:
   (3) DSA (sign only)
   (4) RSA (sign only)
   (5) Elgamal (encrypt only)
   (6) RSA (encrypt only)
Your selection? 4

signing サブキーを作成したいので、「RSA(署名のみ)」4を選択します。 RSAはクライアントの方が高速ですが、DSAはサーバーの方が高速です。 この場合、RSAを選択します。これは、パッケージで作成するすべての署名について、おそらく数百のクライアントがそれを検証する必要があるためです。 2つのタイプは同等に安全です。

ここでも、キーサイズの入力を求められます。

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096

このチュートリアルでは、セキュリティを強化するために4096を使用します。

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 1y

すでにマスターキーがあるため、サブキーの有効期限はそれほど重要ではありません。 1年は良い時間枠です。

Enterキーを押してから、 y (yes)を2回入力して、次の2つのプロンプトを表示します。 いくつかの数学は別のキーを生成します。

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
............+++++
.+++++

pub  4096R/10E6133F  created: 2014-08-16  expires: never       usage: SC
                     trust: ultimate      validity: ultimate
sub  4096R/7B34E07C  created: 2014-08-16  expires: never       usage: E
sub  4096R/A72DB3EF  created: 2014-08-16  expires: 2015-08-16  usage: S
[ultimate] (1). Mark Lopez <[email protected]>

gpg>

プロンプトでsaveと入力します。

save

上記の出力では、マスターキーの SC は、キーが署名と認証専用であることを示しています。 E は、キーが暗号化にのみ使用できることを意味します。 私たちの署名キーは、Sだけで正しく見ることができます。

新しい署名キーのIDをメモします(この例では、上の2番目の sub行にA72DB3EF が表示されています)。 キーのIDは異なります。

save と入力してターミナルに戻り、新しいキーを保存します。

save

サブキーからマスターキーを切り離す

サブキーを作成するポイントは、サーバーにマスターキーが不要になるようにすることです。これにより、サーバーの安全性が高まります。 次に、マスターキーをサブキーから切り離します。 マスターキーとサブキーをエクスポートしてから、GPGのストレージからキーを削除してから、サブキーだけを再インポートする必要があります。

まず、 –export-secret-keyおよび–exportコマンドを使用してキー全体をエクスポートしましょう。 マスターキーのIDを使用することを忘れないでください!

gpg --export-secret-key 10E6133F > private.key
gpg --export 10E6133F >> private.key

デフォルトでは、 –export-secret-keyおよび–export はキーをコンソールに出力するため、代わりに出力を新しいファイル( private.key ])。 上記のように、必ず独自のマスターキーIDを指定してください。

重要:private.keyファイルのコピーを安全な場所(サーバー上ではない)に作成します。 可能な場所はフロッピーディスクまたはUSBドライブです。 このファイルには、秘密鍵、公開鍵、暗号化サブキー、および署名サブキーが含まれています。

このファイルを安全な場所にバックアップしたら、ファイルを削除します。

#back up the private.key file before running this# rm private.key

次に、公開鍵とサブ鍵をエクスポートします。 生成したマスターキーと2番目のサブキーに一致するようにIDを変更してください(最初のサブキーは使用しないでください)。

gpg --export 10E6133F > public.key
gpg --export-secret-subkeys A72DB3EF > signing.key

キーのバックアップができたので、サーバーからマスターキーを削除できます。

gpg --delete-secret-key 10E6133F

署名サブキーのみを再インポートします。

gpg --import public.key signing.key

サーバーにマスターキーがないことを確認します。

gpg --list-secret-keys
sec#  4096R/10E6133F 2014-08-16
uid                  Mark Lopez <[email protected]>
ssb   4096R/7B34E07C 2014-08-16
ssb   4096R/A72DB3EF 2014-08-16

の後のに注意してください。 これは、マスターキーがインストールされていないことを意味します。 サーバーには、署名サブキーのみが含まれています。

キーをクリーンアップします。

rm public.key signing.key

最後に行う必要があるのは、署名キーを公開することです。

gpg --keyserver keyserver.ubuntu.com --send-key 10E6133F

このコマンドは、キーを公開されているキーの保管庫(この場合はUbuntu独自のキーサーバー)に公開します。 これにより、他の人があなたのキーをダウンロードして、パッケージを簡単に確認できるようになります。

Repreproを使用してリポジトリを設定する

それでは、このチュートリアルの要点であるapt-getリポジトリの作成に取り掛かりましょう。 Apt-getリポジトリは管理が最も簡単なものではありません。 ありがたいことに R。 ベルンハルト Repreproを作成しました。これは、「Debianパッケージのローカルリポジトリ(Mirrorerとも呼ばれます)の作成、管理、同期」に使用されていました。 RepreproはGNUライセンスの下にあり、完全にオープンソースです。

Repreproのインストールと構成

Repreproは、デフォルトのUbuntuリポジトリからインストールできます。

apt-get update
apt-get install reprepro

Repreproの構成はリポジトリ固有です。つまり、複数のリポジトリを作成する場合は、さまざまな構成を使用できます。 まず、リポジトリのホームを作成しましょう。

このリポジトリ専用のフォルダを作成し、そこに移動します。

mkdir -p /var/repositories/
cd /var/repositories/

構成ディレクトリを作成します。

mkdir conf
cd conf/

2つの空の構成ファイル(optionsおよびdistributions)を作成します。

touch options distributions

お気に入りのテキストエディタでoptionsファイルを開きます( nano はデフォルトでインストールされています)。

nano options

このファイルにはRepreproのオプションが含まれており、Repreproが実行されるたびに読み取られます。 ここで指定できるオプションがいくつかあります。 その他のオプションについては、マニュアルを参照してください。

テキストエディタで、次を追加します。

ask-passphrase

ask-passphrase ディレクティブは、署名時にGPGパスワードを要求するようにRepreproに指示します。 これをオプションに追加しない場合、キーが暗号化されているとRepreproは停止します(暗号化されています)。

Ctrl + x、y、Enterを押すと、変更が保存され、コンソールに戻ります。

ディストリビューションファイルを開きます。

nano distributions

このファイルには、4つの必須ディレクティブがあります。 これらをファイルに追加します。

Codename: trusty
Components: main
Architectures: i386 amd64
SignWith: A72DB3EF

Codename ディレクティブは、リリースされたDebianディストリビューションのコード名に直接関連しており、必須です。 これは、パッケージをダウンロードするディストリビューションのコードネームであり、必ずしもこのサーバーのディストリビューションと一致している必要はありません。 たとえば、Ubuntu14.04LTSリリースはtrustyと呼ばれ、Ubuntu12.04LTSはpreciseと呼ばれ、Debian7.6はwheezyと呼ばれます。 このリポジトリはUbuntu14.04LTS用であるため、trustyをここで設定する必要があります。

Componentsフィールドは必須です。 これは単純なリポジトリにすぎないため、ここでmainを設定します。 「non-free」や「contrib」などの他の名前空間があります。適切な命名スキームについては、apt-getを参照してください。

Architecturesはもう1つの必須フィールドです。 このフィールドには、このリポジトリ内のバイナリアーキテクチャがスペースで区切られて一覧表示されます。 このリポジトリは32ビットおよび64ビットサーバーのパッケージをホストするため、 i386amd64がここに設定されます。 必要に応じてアーキテクチャを追加または削除します。

他のコンピューターがパッケージを検証する方法を指定するには、SignWithディレクティブを使用します。 これはオプションのディレクティブですが、署名には必須です。 この例の前半の署名キーのIDはA72DB3EFであったため、ここで設定します。 生成したサブキーのIDと一致するように、このフィールドを変更します。

Ctrl + `x、y、Enterを押してファイルを保存して終了します。

これで、Repreproに必要な構造が設定されました。

Repreproでパッケージを追加する

まず、ディレクトリを一時的な場所に変更しましょう。

mkdir -p /tmp/debs
cd /tmp/debs

使用するいくつかのサンプルパッケージが必要です– wget それらと一緒に:

wget https://github.com/Silvenga/examples/raw/master/example-helloworld_1.0.0.0_amd64.deb
wget https://github.com/Silvenga/examples/raw/master/example-helloworld_1.0.0.0_i386.deb 

これらのパッケージは、このガイドのためだけに作成されたものであり、リポジトリの機能を証明するための簡単なbashスクリプトが含まれています。 必要に応じて、さまざまなパッケージを使用できます。

プログラムlsを実行すると、次のレイアウトが得られます。

ls
example-helloworld_1.0.0.0_amd64.deb  example-helloworld_1.0.0.0_i386.deb

これで、2つのサンプルパッケージができました。 1つは32ビット(i386)コンピューター用、もう1つは64ビット(amd64)コンピューター用です。 次の方法で、両方をリポジトリに追加できます。

reprepro -b /var/repositories includedeb trusty example-helloworld_1.0.0.0_*

-b 引数は、リポジトリの「(b)ase」ディレクトリを指定します。 includedeb コマンドには、< distribution code name > and < file path(s) >の2つの引数が必要です。 Repreproは、サブキーパスコードの入力を2回要求します。

Exporting indices...
C3D099E3A72DB3EF Mark Lopez <[email protected]> needs a passphrase
Please enter passphrase: < hidden >
C3D099E3A72DB3EF Mark Lopez <[email protected]> needs a passphrase
Please enter passphrase: < hidden >

成功!

リストと削除

list コマンドの後にコードネームを付けると、管理対象パッケージを一覧表示できます。 例えば:

reprepro -b /var/repositories/ list trusty

trusty|main|i386: example-helloworld 1.0.0.0
trusty|main|amd64: example-helloworld 1.0.0.0

パッケージを削除するには、removeコマンドを使用します。 removeコマンドには、パッケージのコードネームとパッケージ名が必要です。 例えば:

reprepro -b /var/repositories/ remove trusty example-helloworld

リポジトリを公開する

これで、いくつかのパッケージを含むローカルパッケージリポジトリができました。 次に、NginxをWebサーバーとしてインストールして、このリポジトリを公開します。

Nginxをインストールします

apt-get update
apt-get install nginx

Nginxには、デフォルトの設定例がインストールされています。 別の機会にファイルを見たい場合に備えて、ファイルのコピーを作成してください。

mv /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak
touch /etc/nginx/sites-available/default

空の構成ファイルができたので、新しいリポジトリをホストするようにNginxサーバーの構成を開始できます。

お気に入りのテキストエディタで構成ファイルを開きます。

nano /etc/nginx/sites-available/default

そして、次の構成ディレクティブを追加します。

server {

	## Let your repository be the root directory
	root		/var/repositories;
	
	## Always good to log
	access_log 	/var/log/nginx/repo.access.log;
	error_log 	/var/log/nginx/repo.error.log;

	## Prevent access to Reprepro's files
	location ~ /(db|conf) {
		deny 		all;
		return 		404;
	}
}

Nginxにはかなり正しいデフォルトがあります。 Repreproのファイルへのアクセスを拒否しながら、構成する必要があるのはルートディレクトリだけでした。 詳細については、インラインコメントを参照してください。

Nginxサービスを再起動して、これらの新しい構成を読み込みます。

service nginx restart

パブリックUbuntuリポジトリを使用する準備が整いました!

ユーザーにリポジトリの場所を知らせるには、DropletのIPアドレスが必要です。 ドロップレットのパブリックアドレスがわからない場合は、ifconfigで見つけることができます。

ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 04:01:23:f9:0e:01
          inet addr:198.199.114.168  Bcast:198.199.114.255  Mask:255.255.255.0
          inet6 addr: fe80::601:23ff:fef9:e01/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16555 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16815 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:7788170 (7.7 MB)  TX bytes:3058446 (3.0 MB)

上記の例では、サーバーのアドレスは198.199.114.168です。 あなたのものは異なります。

RepreproサーバーのIPアドレスを使用して、このリポジトリを他の適切なサーバーに追加できるようになりました。

新しいリポジトリからパッケージをインストールする

まだ行っていない場合は、Ubuntu 14.04 LTSで別のDropletを起動して、新しいリポジトリからテストインストールを実行できるようにします。

新しいサーバーで、公開鍵をダウンロードして、リポジトリからパッケージを確認します。 キーをkeyserver.ubuntu.comに公開したことを思い出してください。

これは、apt-keyコマンドで実行されます。

apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 10E6133F

このコマンドは、指定されたキーをダウンロードし、そのキーをapt-getデータベースに追加します。 adv コマンドは、apt-keyにGPGを使用してキーをダウンロードするように指示します。 他の2つの引数は、GPGに直接渡されます。 キーを「keyserver.ubuntu.com」にアップロードしたので、 –keyserver keyserver.ubuntu.com ディレクティブを使用して、同じ場所からキーを取得しました。 The –recv-keys ディレクティブは、追加する正確なキーを指定します。

次に、apt-getのリポジトリのアドレスを追加して検索します。 前の手順で使用したリポジトリサーバーのIPアドレスが必要になります。 これは、add-apt-repositoryプログラムを使用して簡単に実行できます。

add-apt-repository "deb http://198.199.114.168/ trusty main"

add-apt-repositoryに指定した文字列に注意してください。 ほとんどのDebianリポジトリは、次の一般的な形式で追加できます。

deb (repository location) (current distribution code name)  (the components name)

リポジトリの場所は、サーバーの場所に設定する必要があります。 HTTPサーバーがあるため、プロトコルは http://です。 例の場所は198.199.114.168でした。 サーバーのコードネームはtrustyです。 これは単純なリポジトリであるため、コンポーネントを「メイン」と呼びます。

リポジトリを追加したら、必ず apt-getupdateを実行してください。 このコマンドは、すべての既知のリポジトリをチェックして、更新と変更(今行ったものを含む)を確認します。

apt-get update

apt-getを更新した後、リポジトリからサンプルパッケージをインストールできます。 通常はapt-getコマンドを使用してください。

apt-get install example-helloworld

すべてが成功した場合は、 example-helloworld を実行して、次を確認できます。

Hello, World!
This package was successfully installed!

おめでとう! 作成したリポジトリからパッケージをインストールしました。

サンプルパッケージを削除するには、次のコマンドを実行します。

apt-get remove example-helloworld

これにより、インストールしたサンプルパッケージが削除されます。

結論

このガイドでは、安全なAPTリポジトリの作成に着手しました。 パッケージに署名するための安全なキーを作成する方法を学びました。 Repreproを使用してリポジトリを作成および管理する方法。 このリポジトリを別のサーバーに追加する方法。 ここにある他のガイドをチェックして、オープンソースとLinuxでできるすばらしいことについての知識をさらに深めてください。