Как использовать Acadepro для безопасного хранилища пакетов в Ubuntu 14.04

Введение в пакеты и репозитории

Мы все были там - нуждаемся в программе - и что мы делаем? Большинство из нас просто и престижно! У нас волшебным образом установлен Postfix.

Впрочем, это не волшебство. Менеджер пакетов apt-get ищет, загружает и устанавливает пакет для вас. Это очень удобно, но что если apt-get не может найти нужную вам программу в своем стандартном списке репозиториев? К счастью, apt-get позволяет пользователям указывать пользовательские места загрузки (так называемые репозитории).

В этом руководстве мы рассмотрим настройку собственного безопасного хранилища и сделаем его общедоступным для использования другими. Мы будем создавать репозиторий на Ubuntu 14.04 LTS Droplet и тестировать загрузку с другой Droplet с тем же дистрибутивом.

Чтобы получить максимальную отдачу от этого руководства, обязательно ознакомьтесь с нашим учебником для https://www.digitalocean.com/community/tutorials/how-to-manage-packages-in-ubuntu-and-debian-with-apt -get-apt-cache [управление пакетами с помощью apt-get].

Предпосылки

Две * Ubuntu 14.04 LTS * Капли

К концу руководства у вас будет:

  • Подготовлен и опубликован ключ подписи репозитория

  • Настройте репозиторий с Acadepro, менеджером репозитория

  • Сделал хранилище общедоступным с веб-сервером Nginx

  • Добавлен репозиторий на другом сервере

Подготовить и опубликовать ключ подписи

Во-первых, нам нужен действующий ключ подписи пакета. Этот шаг крайне важен для безопасного репозитория, так как мы будем подписывать все пакеты цифровой подписью. Подписание пакета дает загрузчику уверенность в том, что источнику можно доверять.

В этом разделе вы создадите зашифрованный главный открытый ключ и подписывающий подраздел, выполнив следующие действия:

  • Генерация Мастер Ключа

  • Создать подраздел для подписи пакетов

  • Отсоединить мастер-ключ от подключа

Генерация Мастер Ключа

Давайте сделаем мастер-ключ. Этот ключ должен храниться в безопасности, так как это то, что люди будут доверять.

Прежде чем мы начнем, давайте установим:

apt-get install rng-tools

GPG требует случайных данных, называемых энтропией, для генерации ключей. Обычно энтропия генерируется ядром Linux и сохраняется в пуле. Однако на облачных серверах (таких как Droplets) ядро ​​может иметь проблемы с генерированием энтропии, необходимой для 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 ищет специальное устройство для получения энтропии. Некоторые капли не имеют этого устройства. Чтобы компенсировать это, мы используем псевдослучайное устройство, указав директиву. Для получения дополнительной информации, вы можете проверить наш учебник: Как установить дополнительную энтропию .

Теперь, когда у нас есть пул энтропии, мы можем сгенерировать мастер-ключ. Сделайте это, вызвав команду. Вы увидите подсказку, похожую на следующую:

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 месяцев, вы можете указать это. сделает его действительным навсегда.

Хит, тогда. Вам будет предложено сгенерировать «идентификатор пользователя». Эта информация будет использоваться другими и вами для идентификации этого ключа - так что используйте реальную информацию!

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:

Теперь для некоторой магии (математика), чтобы произойти. Это может занять некоторое время, поэтому сядьте или возьмите чашку любимого напитка.

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

Теперь у нас есть мастер-ключ. Вывод показывает, что мы создали мастер-ключ для подписи (`в строке выше). Ваш ключ будет иметь разные идентификаторы. Запишите свои подписывающие ключи IS (пример использует). Эта информация понадобится нам на следующих шагах при создании другого подраздела для подписи.

Создать подраздел для подписи пакетов

Теперь мы создадим второй ключ подписи, чтобы нам не понадобился главный ключ на этом сервере. Думайте о главном ключе как о корневом полномочии, которое дает полномочия подразделам. Если пользователь доверяет главному ключу, подразумевается доверие к подразделу.

В терминале выполните:

+ gpg --edit-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.

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, потому что для каждой подписи, которую мы делаем на пакете, возможно, сотням клиентов потребуется его проверить. Два типа одинаково безопасны.

Снова нам предлагается размер ключа.

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)

У нас уже есть мастер-ключ, поэтому срок действия подключа менее важен. Один год - хороший срок.

Нажмите Enter, а затем дважды нажмите (да) для следующих двух запросов. Некоторая математика сгенерирует другой ключ.

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

В приведенном выше выводе наш главный ключ сообщает, что ключ предназначен только для подписи и сертификации. Это означает, что ключ может быть использован только для шифрования. Наш ключ подписи может быть правильно виден только с.

Запишите идентификатор вашего нового ключа подписи (пример показан во второй строке выше). Идентификатор вашего ключа будет другим.

Войдите, чтобы вернуться в терминал и сохранить ваш новый ключ.

save

Отсоединить мастер-ключ от подключа

Смысл создания подраздела заключается в том, что нам не нужен главный ключ на нашем сервере, что делает его более безопасным. Теперь мы отсоединим наш главный ключ от нашего подраздела. Нам нужно будет экспортировать мастер-ключ и подраздел, затем удалить ключи из хранилища GPG, а затем повторно импортировать только подраздел.

Сначала давайте использовать команды и для экспорта всего ключа. Не забудьте использовать идентификатор своего мастер-ключа!

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

По умолчанию и выводит ключ на нашу консоль, поэтому вместо этого мы передаем вывод в новый файл (). Обязательно укажите свой собственный идентификатор мастер-ключа, как указано выше.

  • Важно: сделать копию файла в безопасном месте * (не на сервере). Возможные места находятся на дискете или USB-накопителе. Этот файл содержит ваш закрытый ключ, открытый ключ, подраздел шифрования и подпись.

  • После того, как вы сделали резервную копию этого файла в безопасном месте, * удалите файл:

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

Теперь экспортируйте ваш открытый ключ и ваш подраздел. Обязательно измените идентификаторы, чтобы они соответствовали мастер-ключу и второму сгенерированному вами подразделу (не используйте первый подраздел).

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

Обратите внимание на * # * через * сек *. Это означает, что наш мастер-ключ не установлен. Сервер содержит только наш подписной подраздел.

Убери свои ключи:

rm public.key signing.key

Последнее, что вам нужно сделать, это опубликовать свой ключ подписи.

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

Эта команда публикует ваш ключ в общедоступном хранилище ключей - в данном случае это собственный сервер ключей Ubuntu. Это позволяет другим загружать ваш ключ и легко проверять ваши пакеты.

Настроить репозиторий с помощью Acadepro

Теперь давайте перейдем к сути этого урока: создаем репозиторий apt-get. Apt-get репозитории - не самая простая вещь для управления. К счастью, R. Бернхард создал Препро, который использовал для «создания, управления и синхронизации локального репозитория пакетов Debian» (также известного как Mirrorer). Представление находится под лицензией GNU и полностью открытым исходным кодом.

Установите и настройте репро

Представление может быть установлено из репозиториев Ubuntu по умолчанию.

apt-get update
apt-get install reprepro

Конфигурация для Contepro зависит от репозитория, то есть вы можете иметь различные конфигурации, если вы создаете несколько репозиториев. Давайте сначала построим дом для нашего хранилища.

Создайте специальную папку для этого хранилища и перейдите в нее.

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

Создайте каталог конфигурации.

mkdir conf
cd conf/

Создайте два пустых файла конфигурации (и).

touch options distributions

Откройте файл в вашем любимом текстовом редакторе (установлен по умолчанию).

nano options

Этот файл содержит параметры для Acadepro и будет читаться при каждом запуске. Есть несколько вариантов, которые вы можете указать здесь. Смотрите руководство для других опций.

В вашем текстовом редакторе добавьте следующее.

ask-passphrase

Директива сообщает, что Представление запрашивает пароль GPG при подписании. Если мы не добавим это к опциям, Представпро умрет, если наш ключ зашифрован (это так).

Ctrl + x, затем y и Enter сохранят наши изменения и вернутся в консоль.

Откройте файл.

nano distributions

Этот файл имеет четыре обязательные директивы. Добавьте их в файл.

Codename:
Components:
Architectures:
SignWith:

Директива напрямую относится к кодовому имени выпущенных дистрибутивов Debian и является обязательной. Это кодовое имя для дистрибутива, который будет загружать пакеты, и не обязательно должен соответствовать дистрибутиву этого сервера. Например, выпуск Ubuntu 14.04 LTS называется * trusty *, Ubuntu 12.04 LTS называется * точный *, а Debian 7.6 известен как * wheezy *. Этот репозиторий предназначен для Ubuntu 14.04 LTS, поэтому здесь нужно установить * trusty *.

Поле обязательно для заполнения. Это всего лишь простой репозиторий, поэтому установите здесь + main +. Существуют и другие пространства имен, такие как «non-free» или «contrib» - обратитесь к apt-get для правильных схем именования.

это еще одно обязательное поле. В этом поле перечислены двоичные архитектуры в этом хранилище, разделенные пробелами. В этом хранилище будут размещаться пакеты для 32-разрядных и 64-разрядных серверов, поэтому он установлен здесь. Добавляйте или удаляйте архитектуры по мере необходимости.

Чтобы указать, как другие компьютеры будут проверять наши пакеты, мы используем директиву. Это необязательная директива, но требуется для подписания. Ключ подписи ранее в этом примере имел идентификатор, поэтому он установлен здесь. Измените это поле в соответствии с идентификатором подключа, который вы создали.

Сохраните и выйдите из файла, нажав Ctrl + `x, затем y и Enter.

Теперь вы создали необходимую структуру для Acadepro.

Добавить пакет с Представпро

Сначала давайте изменим наш каталог на временное местоположение.

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

Теперь у нас есть два примера пакетов. Один для 32-разрядных (i386) компьютеров, другой для 64-разрядных (amd64) компьютеров. Вы можете добавить их обоих в наш репозиторий с помощью:

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

Аргумент * -b * указывает каталог «(b) ase» для репозитория. Команде требуется два аргумента - + <имя кода распространения> и <путь к файлам> +. Представление дважды запросит пароль нашего подключа.

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

Чтобы удалить пакет, используйте команду. Команда удаления требует кодовое имя пакета и имя пакета. Например:

reprepro -b /var/repositories/ remove

Сделать хранилище общедоступным

Теперь у нас есть локальное хранилище пакетов с парой пакетов. Далее мы установим Nginx в качестве веб-сервера, чтобы сделать этот репозиторий общедоступным.

Установить 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 есть довольно нормальные настройки по умолчанию. Все, что нам нужно было настроить, это корневой каталог, при этом отказывая в доступе к файлам Acadepro. Смотрите встроенные комментарии для более подробной информации.

Перезапустите службу Nginx, чтобы загрузить эти новые конфигурации.

service nginx restart

Ваш общедоступный репозиторий Ubuntu готов к использованию!

Вам понадобится IP-адрес вашего Droplet, чтобы пользователи знали местоположение хранилища. Если вы не знаете общедоступный адрес вашей 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. Твой будет другим.

С IP-адресом вашего сервера представляет вы можете добавить этот репозиторий на любой другой соответствующий сервер.

Установить пакет из нашего нового репозитория

Если вы еще этого не сделали, запустите еще одну Droplet с Ubuntu 14.04 LTS, чтобы вы могли выполнить тестовую установку из вашего нового репозитория.

На новом сервере загрузите ваш открытый ключ, чтобы проверить пакеты из своего хранилища. Напомним, что вы опубликовали свой ключ к.

Это делается с помощью команды.

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

Эта команда загружает указанный ключ и добавляет ключ в базу данных apt-get. Команда говорит использовать GPG для загрузки ключа. Два других аргумента передаются непосредственно в 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: // *. Пример местоположения был. Кодовое имя нашего сервера * верный *. Это простой репозиторий, поэтому мы назвали компонент «основным».

После того, как мы добавим репозиторий, обязательно запустите. Эта команда проверит все известные репозитории на наличие обновлений и изменений (включая тот, который вы только что сделали).

apt-get update

После обновления apt-get вы можете установить пример пакета из своего репозитория. Используйте команду как обычно.

apt-get install example-helloworld

Если все прошло успешно, теперь вы можете выполнить и посмотреть:

Hello, World!
This package was successfully installed!

Поздравляем! Вы только что установили пакет из репозитория, который вы создали!

Чтобы удалить пример пакета, выполните эту команду:

apt-get remove example-helloworld

Это удаляет пример пакета, который вы только что установили.

Заключение

В этом руководстве вы намереваетесь создать безопасное хранилище APT. Вы узнали, как создать безопасный ключ для подписи пакетов; как создать репозиторий и управлять им с помощью Препро; и как добавить этот репозиторий на другой сервер. Ознакомьтесь с другими руководствами здесь, чтобы еще больше расширить свои знания о классных вещах, которые позволяют вам делать Open Source и Linux.

Related