09.07.2015 @ 0:48 Использование GPG в быту. Первые шаги. Легко представить ситуацию, когда в жизни появляется необходимость зашифровать файл для его последующего хранения или зашифровать сообщение для передачи конкретному лицу. Спектр применения шифрования в быту достаточно широк, чтобы убедиться, что знать как это делать вполне неплохо и в жизни точно пригодится мы пройдёмся по этому руководству и испробуем всё на себе. Цель этой статьи — показать один из множества вариантов применения шифрования, которым можно воспользоваться и зашифроваться в случае необходимости. В качестве примера я возьму достаточно хорошо распространённый инструмент, под названием gpg. В примере будет рассмотрен подъём с нулевого уровня и до самой вершины, взойдя на которую мы сможем увидеть, как это можно осуществить на примере работы с удалённым сервером и с вашим любимым ноутбуком. В наличии имеются виртуальный север Ubuntu 14.04.2 LTS и зарекомендовавший себя в работе его дальний родственник ноутбук с OS X Yosemite. Все работы будут производиться исключительно в терминале с выводом всех необходимых для этого команд. Для более тщательного понимания этого руководства, я добавлю пару уточняющих комментариев для того, чтобы созданные ключи было проще сохранить и использовать спустя какое то время, когда всё уже забудется и вспомнить где и какой ключ был просто не реально. Для того чтобы этого не случилось, мы сделаем следующие шаги. Мы создадим структуру из папок и создадим файлик README в котором поясним кратко но понятно какие файлы и зачем были у нас созданы. Открываем ноутбук и как говорится, поехали: mkdir -p ~/GPGKeys/master_keypair && echo 'Описание файлов:' > ~/GPGKeys/README && cd ~/GPGKeys/ Далее нам необходимо сгенерировать пару ключей (секретный и публичный), делается это с помощью команды выполняемой от пользователя под которым вы работаете, как и в моём случае. gpg --gen-key после нажатия клавиши ввод, мы увидим такой вот вывод в окне терминала: gpg (GnuPG/MacGPG2) 2.0.27; Copyright (C) 2015 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 keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Выбираю 4096, что бы было понадёжнее. Requested keysize is 4096 bits 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 Тут я ставлю 0 поскольку срок службы ключа выбираю бессрочный. Key does not expire at all Is this correct? (y/N) y Подтверждаю это указав, что ключ не имеет срока годности. GnuPG needs to construct a user ID to identify your key. Real name: Ivan Ivanovich Email address: ivan@ivanovich.com Comment: This is key for files crypting. Ввожу данные о ключе, имя фамилию, электронный адрес, и небольшой комментарий, чтобы запомнить для чего этот ключ создавался Real name: Ivan Ivanovich Email address: ivan@ivanovich.com Comment: This is key for files crypting. You selected this USER-ID: "Ivan Ivanovich (This is key for files crypting.) " Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o You need a Passphrase to protect your secret key. Указываем серьёзную фразу-пароль, смело можно указывать достаточно длинные значения, я обычно пользуюсь строками до 64 символов, чего вполне достаточно для работы. 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: key 5065C92B 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: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u gpg: next trustdb check due at 2018-08-19 pub 4096R/5065C92B 2015-07-01 Key fingerprint = 38A7 F428 1CC9 2838 8F8A 4E39 3BEA E223 5065 C92B uid [ultimate] Ivan Ivanovich (This is key for files crypting.) sub 4096R/2A2235BE 2015-07-01 Это значит что всё прошло успешно и мы создали пару ключей. 5065C92B — это имя ключа и нам необходимо записать эту информацию в наш README файл, что мы можем сделать с помощью следующей команды, а заодно мы сохраним имя в переменную и можем на протяжении нашего руководства уже использовать её. export MYKEY=5065C92B && echo "$MYKEY - имя моего ключа" >> README Если посмотреть в текущую директорию, то мы не увидим никаких новых файлов, кроме тех что мы создали ранее. GPGKeys/ ├── README └── master_keypair Поскольку ключи создались в домашней директории в папке ~/.gnupg в специальных файлах, которые мы пока трогать не будем. Но нам хочется сохранить наши ключи в надёжное место, а для этого нам необходимо проделать следующие нехитрые и понятные команды: gpg --export-secret-keys --armor $MYKEY > master_keypair/ivan@ivanovich.com.private.gpg-key gpg --export --armor $MYKEY > master_keypair/ivan@ivanovich.com.public.gpg-key Сейчас у нас в папке имеются приватный и секретные ключи. Теперь мы готовы к работе. ├── README └── master_keypair ├── ivan@ivanovich.com.private.gpg-key └── ivan@ivanovich.com.public.gpg-key Для начала мы копируем секретный ключ в надёжное место, куда никто кроме нас не имеет доступ. А приватный ключ отправляем на север, сделать это можно разными способами, кому как удобнее. Я предложу опять же воспользоваться командной строкой: gpg --export -a $MYKEY > master_keypair/ivanov_publickey.asc Я заранее настроил файл ~/.ssh/config в котором прописаны условия коннекта к моему серверу и поэтому пользуюсь только именем хоста (MyServer), вы тоже можете себе сделать так же, удобно, рекомендую: (Привожу пример содержания моего файла ~/.ssh/config выделенные жирным данные нужно заменить на свои. В моём случае я не пользуюсь паролем и использую только RSA ключ, что тоже добавляет удобства в работе. Но если вы используете пароль, то достаточно дописать в конфиге Password и через пробел указать ваш пароль.) Host MyServer HostName your_server_ip_address User user_name scp master_keypair/ivanov_publickey.asc MyServer:/home/user ivanov_publickey.asc 100% 3947 3.9KB/s 00:00 После того как ключ был передан, мы переходим на сервер. ssh MyServer Далее я буду работать на сервере и все команды будут выполняться на нём же. Мы видим что ключ был успешно загружен. ivanov@server:~$ ls -alt | head -n 2 total 1156748 -rw-r--r-- 1 ivan ivan 3947 Jun 31 16:16 ivanov_publickey.asc Нам осталось применить на практике изученный материал и увидеть как всё это работает. Импортируем наш ключ gpg --import ivanov_publickey.asc После импорта получаем ответ: gpg: key 5065C92B: public key "Ivan Ivanovich (This is key for files crypting.) " imported gpg: Total number processed: 1 gpg: imported: 1 (RSA: 1) Также с помощью команды gpg -k мы сможем увидеть этот ключ у нас в хранилище. gpg -k /home/ivan/.gnupg/pubring.gpg ------------------------------ pub 4096R/5065C92B 2015-07-01 uid Ivan Ivanovich (This is key for files crypting.) sub 4096R/2A2235BE 2015-07-01 Указываем наш KEY-ID 5065C92B в конфиге nano ~/.gpg.conf в качестве default-key 5065C92B После чего редактируем наш ключ и добавляем ему trust. Это для того что бы при выполнении криптования gpg не задавал нам лишних вопросов. gpg --edit-key 5065C92B 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. pub 4096R/5065C92B created: 2015-07-01 expires: never usage: SC trust: full validity: unknown sub 4096R/2A2235BE created: 2015-07-01 expires: never usage: E [ unknown] (1). Ivan Ivanovich (This is key for files crypting.) Войдя в интерактивный режим gpg мы вводим команду trust в резултьтате работы которой нам будут заданы следующие вопросы: gpg> trust pub 4096R/5065C92B created: 2015-07-01 expires: never usage: SC trust: full validity: unknown sub 4096R/2A2235BE created: 2015-07-01 expires: never usage: E [ unknown] (1). Ivan Ivanovich (This is key for files crypting.) Please decide how far you trust this user to correctly verify other users' keys (by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menu Your decision? 5 Do you really want to set this key to ultimate trust? (y/N) y А далее запускаем команду, которая создаст бекап базы данных, закриптует его налету нашим ключом и выложит в публичный доступ с помощью сервиса позволяющего выкладывать бесплатно файлы весом до 5 гб и сроком хранения до 15 дней. Собственно как распорядиться файлом вы решите сами, я всего лишь привёл пример. mysqldump -uroot -p database_name | gzip | gpg --encrypt -r 5065C92B | curl -X PUT --upload-file "-" https://transfer.sh/dump-ivanov после чего мы получим ссылку такого вида: https://transfer.sh/JSdzb/dump-ivanov Далее чтобы закончить начатый эксперимент, мы скачаем этот файл себе и попробуем открыть его wget https://transfer.sh/JSdzb/dump-ivanov При попытке открыть файл open dump-ivanov Мы увидим такое вот окно: Из содержания которого совершенно понятно что контент прочитать не представляется возможным. Но у нас есть секретный ключ. Поэтому мы поступим следующим порядком: Попросим gpg открыть нам указанный файл gpg dump-ivanov в ответ на эту просьбу получим: You need a passphrase to unlock the secret key for user: "Ivan Ivanovich (This is key for files crypting.) " 4096-bit RSA key, ID 2A2235BE, created 2015-07-01 (main key ID 5065C92B) Вводим фразу-пароль которую мы вводили при создании ключа. gpg: encrypted with 4096-bit RSA key, ID 2A2235BE, created 2015-07-01 "Ivan Ivanovich (This is key for files crypting.) " gpg: dump-ivanov: unknown suffix Enter new filename: Вводим имя файла dump-ivanov.gzip под которым мы хотип сохранить расшифрованный файл. Жмём Enter, Барабанная дробь, вводим команду для открытия файла: open dump-ivanov.gzip Видим как система распаковывает полученный архив И конечно же получаем наш раскриптованный файл дампа базы данных В итоге мы прошли от создания ключей до варианта его использования, которых на самом деле много. Надеюсь вам было интересно и вы будете использовать криптование в своей работе для шифрования нужных и не нужных файлов. Рекомендую вчитаться в документацию о GPG, там много интересного, а также если вас интересуют другие варианты использования GPG, например шифрование писем, использование подписи, публикация вашего ключа на северах и создание web of trust дайте мне знать и я обязательно создам ещё один материал. Буду рад услышать отзовы и критику в свой адрес. Спасибо за время которое вы потратили на чтение этого материала. Taanab 13630 Cryptography Читать дальше >>