Ubuntu 14.04で安全なパッケージリポジトリにRepreproを使用する方法

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

私たちは皆そこにいました–プログラムが必要です–そして私たちは何をしますか? 私たちのほとんどは、公正であり、プレストです! 魔法のようにPostfixがインストールされています。

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

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

このガイドを最大限に活用するには、https://www.digitalocean.com/community/tutorials/how-to-manage-packages-in-ubuntu-and-debian-with-aptのチュートリアルを確認してください。 -get-apt-cache [apt-getを使用したパッケージの管理]。

前提条件

2つの* Ubuntu 14.04 LTS *ドロップレット

ガイドの終わりまでに、次のものが得られます。

  • リポジトリ署名キーの準備と公開

  • リポジトリマネージャーであるRepreproを使用してリポジトリをセットアップする

  • WebサーバーNginxでリポジトリを公開しました

  • 別のサーバーにリポジトリを追加しました

署名キーの準備と公開

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

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

  • マスターキーを生成する

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

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

マスターキーを生成する

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

始める前に、インストールしましょう:

apt-get install rng-tools

GPGでは、キーを生成するためにエントロピーと呼ばれるランダムデータが必要です。 エントロピーは通常、Linuxカーネルによって時間の経過とともに生成され、プールに保存されます。 ただし、クラウドサーバー(Dropletなど)では、カーネルが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 -r /dev/urandom

デフォルトでは、rngdはからエントロピーを取得するための特別なデバイスを探します。 一部のドロップレットにはこのデバイスがありません。 これを補うために、ディレクティブを指定して擬似ランダムデバイスを使用します。 詳細については、チュートリアルをご覧ください:https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged [追加エントロピーのセットアップ方法]。

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

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?

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

ヒットすると、キーサイズの入力を求められます:

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

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

有効期限のプロンプトを押します。

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)

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

ヒット、その後。 「ユーザー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:
Email address:
Comment:
You selected this USER-ID:
   "Mark Lopez <[email protected]>"

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

情報が正しい場合は、とを押します。 あなただけがこのキーにアクセスできるようにパスワードを追加する必要があります。 gpgキーのパスワードを回復する方法はありませんので(このことを忘れないでください)、このパスワードを必ず覚えておいてください。

You need a Passphrase to protect your secret key.

Enter passphrase:
Repeat passphrase:

魔法(数学)が発生します。 これには少し時間がかかる場合がありますので、お座りになるか、お気に入りの飲み物を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/ 2014-08-16
     Key fingerprint = 1CD3 22ED 54B8 694A 0975  7164 6C1D 28A0 10E6 133F
uid                  Mark Lopez <[email protected]>
sub   4096R/ 2014-08-16

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

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

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

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

+ gpg --edit-key +

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

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

押す 。 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?

<i>署名</ i>サブキーを作成するため、「RSA(署名のみ)」「+ 4+」を選択します。 RSAはクライアントにとっては高速ですが、DSAはサーバーにとっては高速です。 このケースでは、パッケージに作成するすべての署名について、数百のクライアントがそれを確認する必要があるため、RSAを選択しています。 2つのタイプは等しく安全です。

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

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

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

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)

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

Enterキーを押し、次の2つのプロンプトに対して(yes)を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:
                    trust: ultimate      validity: ultimate
sub  4096R/7B34E07C  created: 2014-08-16  expires: never       usage:
sub  4096R/  created: 2014-08-16  expires: 2015-08-16  usage:
[ultimate] (1). Mark Lopez <[email protected]>

gpg>

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

save

上記の出力では、マスターキーから、キーは署名と認証専用であることがわかります。 キーは暗号化にのみ使用できることを意味します。 署名キーは、のみで正しく表示できます。

新しい署名キーISに注意してください(上記の2行目に示されている例)。 キーのIDは異なります。

入力して端末に戻り、新しいキーを保存します。

save

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

サブキーを作成するポイントは、サーバー上にマスターキーを必要としないため、より安全になります。 次に、サブキーからマスターキーを切り離します。 マスターキーとサブキーをエクスポートし、GPGのストレージからキーを削除してから、サブキーのみを再インポートする必要があります。

最初にとコマンドを使用して、キー全体をエクスポートします。 マスターキーのIDを忘れずに使用してください。

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

デフォルトでは、キーをコンソールに出力するため、代わりに出力を新しいファイルにパイプします()。 上記のように、必ず独自のマスターキーIDを指定してください。

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

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

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

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

gpg --export  > public.key
gpg --export-secret-subkeys  > signing.key

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

gpg --delete-secret-key

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

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
  • sec の後の#*に注意してください。 これは、マスターキーがインストールされていないことを意味します。 サーバーには、署名サブキーのみが含まれています。

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

rm public.key signing.key

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

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

このコマンドは、鍵の公開倉庫(この場合はUbuntu独自の鍵サーバー)に鍵を公開します。 これにより、他のユーザーがキーをダウンロードし、パッケージを簡単に検証できます。

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

それでは、このチュートリアルのポイントであるapt-getリポジトリを作成しましょう。 Apt-getリポジトリは管理が最も簡単なものではありません。 ありがたいことにhttps://packages.qa.debian.org/r/reprepro.html[R。 Bernhard]はRepreproを作成しました。Repreproは、「Debianパッケージのローカルリポジトリの作成、管理、同期」(ミラーとしても知られています)を使用していました。 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つの空の構成ファイル(および)を作成します。

touch options distributions

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

nano options

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

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

ask-passphrase

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

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

ファイルを開きます。

nano distributions

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

Codename:
Components:
Architectures:
SignWith:

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

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

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

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

ファイルを保存して終了するには、Ctrl + `xを押してからyとEnterを押します。

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

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

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

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

動作するサンプルパッケージが必要です。

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  example-helloworld_1.0.0.0_*
  • -b *引数は、リポジトリの「(b)ase」ディレクトリを指定します。 このコマンドには2つの引数が必要です-+ <配布コード名>と<ファイルパス> +。 Repreproは、サブキーパスコードを2回要求します。

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

成功!

リストと削除

コマンドの後にコード名を付けて管理パッケージを一覧表示できます。 例えば:

reprepro -b /var/repositories/ list

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

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

reprepro -b /var/repositories/ remove

リポジトリを公開する

これで、いくつかのパッケージを含むローカルパッケージリポジトリができました。 次に、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アドレスが必要です。 Dropletのパブリックアドレスがわからない場合は、で見つけることができます。

ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 04:01:23:f9:0e:01
         inet addr:  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を起動して、新しいリポジトリからテストインストールを実行できるようにします。

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

これはコマンドで実行されます。

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

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

次に、リポジトリのアドレスを追加して検索します。 前の手順で作成したリポジトリサーバーのIPアドレスが必要です。 これはプログラムで簡単に行えます。

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

与える文字列に注意してください。 ほとんどのDebianリポジトリは、次の一般的な形式で追加できます。

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

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

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

apt-get update

apt-getを更新した後、リポジトリからサンプルパッケージをインストールできるようになりました。 通常どおりコマンドを使用します。

apt-get install example-helloworld

すべてが成功した場合、実行して確認できます:

Hello, World!
This package was successfully installed!

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

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

apt-get remove example-helloworld

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

結論

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