GNU Privacy Guard – это и есть GPG – свободная реализация шифрования данных для их защиты. Это очень актуально, ведь информацию, если она персональная, конфиденциальная или просто секретная необходимо защищать. Технология GPG основана на защите данных при помощи ключей шифрования, которые изначально должны быть созданы, а также соответствующим образом распространены между участниками обмена защищаемыми данными.
Как работает защита данных с помощью ключей GPG
Для того, чтобы стороны могли передавать друг другу зашифрованные данные, должен быть выполнен ряд условий:
- наличие ключей шифрования GPG, которые представляют собой пару ключей — открытый и закрытый;
- обе стороны должны обменяться открытыми ключами;
- передающая сторона должна зашифровать данные с помощью открытого ключа, полученного от принимающей стороны при обмене этими ключами;
- принимающая сторона при получении шифрованных данный должна расшифровать их своим закрытым ключом, открытой частью которого (т. е. открытым ключом) были зашифрованы данные передающей стороной.
Отсюда вытекают два важных момента:
- расшифровать данные можно только закрытым ключом, который должен храниться у его владельца в надёжном и недоступном для посторонних месте;
- данные всегда шифруются именно ключом адресата, т. е. того, кому нужно передать зашифрованные данные.
Открытые ключи распространяются свободно. Ими можно обмениваться непосредственно, либо загружать на специальные сервера для хранения и обслуживания ключей GPG.
Также необходимо иметь специальный сертификат для отзыва открытых ключей, чтобы сделать их недействительными. Кроме того механизм защиты данных по ключам позволяет подписывать отправляемые данные закрытым ключом, т. е. гарантировать, что эти данные отправлены именно тем, кто указан как отправитель. А соответствующий этому закрытому ключу открытый ключ, имеющийся у принимающей стороны может это подтвердить. Таким образом и достигается достоверная идентификация пользователей и надёжная защита передаваемых данных.
Установка системы GPG в Linux
Практически во всех популярных дистрибутивах Linux установить систему GPG позволяет система управления пакетами (СУП) этого дистрибутива. Например, для Ubuntu:
$ sudo apt install gnupg
Наименования пакетов также могут различаться в зависимости от используемого дистрибутива, так для CentOS:
$ sudo yum install gnupg2
Теперь можно приступить к созданию самих ключей.
Генерация и подпись ключей
Для генерации и управления ключами системы GPG предназначена команда gpg. Более подробно с ней можно ознакомиться на страницах интерактивного руководства, используя команду man gpg. Для создания же, собственно, пары (открытый и закрытый) ключей нужно выполнить команду gpg с опцией —gen-key:
$ gpg --gen-key
В ходе выполнения команды у пользователя будут запрошены некоторые персональные данные, такие как полное имя и e-mail, необходимо их ввести, после чего начнётся генерация ключей, которая может занять некоторое время. После чего будет выведена информация о созданных ключах:
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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. Замечание: "gpg --full-generate-key" вызывает полнофункциональный диалог создания ключа. GnuPG должен составить идентификатор пользователя для идентификации ключа. Ваше полное имя: John Silver Адрес электронной почты: john@silver.ru Вы выбрали следующий идентификатор пользователя: "John Silver <john@silver.ru>" Сменить (N)Имя, (E)Адрес; (O)Принять/(Q)Выход? O Необходимо получить много случайных чисел. Желательно, чтобы Вы в процессе генерации выполняли какие-то другие действия (печать на клавиатуре, движения мыши, обращения к дискам); это даст генератору случайных чисел больше возможностей получить достаточное количество энтропии. Необходимо получить много случайных чисел. Желательно, чтобы Вы в процессе генерации выполняли какие-то другие действия (печать на клавиатуре, движения мыши, обращения к дискам); это даст генератору случайных чисел больше возможностей получить достаточное количество энтропии. gpg: ключ 49192168EGELF50S помечен как абсолютно доверенный gpg: создан каталог '/home/john/.gnupg/openpgp-revocs.d' gpg: сертификат отзыва записан в '/home/john/.gnupg/openpgp-revocs.d/FFBD0C66CBA22A8739ACB07949192168EGELF50S.rev'. открытый и секретный ключи созданы и подписаны. pub rsa3072 2019-03-27 [SC] [годен до: 2021-03-26] FFBD0C66CBA22A8739ACB07949192168EGELF50S uid John Silver <john@silver.ru> sub rsa3072 2019-03-27 [E] [годен до: 2021-03-26]
Здесь pub – это открытый ключ, значение «FFBD0C66CBA22A8739ACB07949192168EGELF50S» — его отпечаток, uid – идентификатор, состоящий из полей имени и e-mail, пользователя-владельца ключа. Этот идентификатор нужно использовать при указании ключа, а также для обозначения адресата, которому предназначается сообщение (данные), зашифрованное этим ключом. Можно указывать любое из полей. В нижеследующих примерах будет указываться email.
Для созданных ключей также автоматически будет сгенерирован и сертификат отзыва. Либо это можно сделать вручную:
$ gpg --output ~/revocation.crt --gen-revoke your_email@address.ru
Созданный сертификат revocation.crt нужно хранить также надёжно, как и закрытые ключи. При создании сертификата отзыва нужно указать возможную причину отзыва ключа, а также комментарий к отзыву. Эту информацию будут видеть другие пользователи систем управления ключами GPG. Опция —output служит для вывода сертификата отзыва в файл, в данном случае revocation.crt.
Очень важно также подписывать ключи, которые были получены от других пользователей, если достоверно известно, что это именно те пользователи, за которых они себя выдают и ключи принадлежат действительно им. Это часто происходит при импорте открытых ключей других пользователей. После проверки их (и ключей и их пользователей-владельцев) очень желательно эти ключи подписать:
$ gpg --sign-key other_user@address.ru
После подписи импортированного ключа нужно дать знать об этом его владельцу, чтобы он мог использовать этот ключ (ведь он подписанный) как аргумент для других пользователей, которые буду видеть, что его уже кто-то «одобрил» и доверяет ему. Для этого подписанный ключ экспортируется в файл и отправляется обратно его владельцу.
Импорт и экспорт ключей
Для того, чтобы экспортировать, например подписанный (в предыдущей главе) ключ нужно выполнить команду:
$ gpg –-output ~/signed.key –-export –-armor other_user@address.ru
Опция —armor создаёт вывод в виде символов ASCII, т. е. в виде текста. По-умолчанию (если эту опцию не указывать) gpg создаст двоичный вывод. Теперь полученный файл с подписанным ключом можно отправлять его владельцу. Он в свою очередь может его импортировать себе в GPG, а также внести некоторую информацию о подписи:
$ gpg --import ~/signed.key
Таким образом происходит, собственно обмен открытыми и подписанными ключами между пользователями.
Если нужно перенести свой секретный ключ куда-либо (для использования на других компьютерах), то нужно использовать опцию —export-secrert-key:
$ gpg --output mygpgkey_private.txt --armor --export-secret-key my_email.address.ru
Чтобы теперь импортировать этот секретный ключ на другом компьютере, нужно воспользоваться опцией —allow-secret-key-import:
$ gpg --allow-secret-key-import --import mygpgkey_private.txt
Шифрование и дешифровка данных
Чтобы зашифровать данные в GPG используется опция —encrypt:
$ gpg --recipient other_user@address.ru --encrypt somefile
Здесь какой-либо файл somefile зашифруется открытым ключом пользователя, идентифицируемого с помощью его e-mail (other_user@address.ru) и только он сможет расшифровать этот файл своим закрытым ключом:
$ gpg --decrypt-files somefile.gpg
Как можно видеть, при шифровке на выходе получаются файлы с расширением *.gpg.
Проверка подлинности ключа пользователя
Каким образом можно узнать, что пользователь, предоставивший свой открытый ключ действительно тот, за кого себя выдаёт, т. е. подлинный владелец соответствующего закрытого ключа?
Для этого существует отпечаток ключа, который можно получить с помощью опции —fingerprint:
$ gpg --fingerprint john@silver.ru pub rsa3072 2019-03-27 [SC] [годен до: 2021-03-26] FFBD 0C66 CBA2 2A87 39AC B079 4919 2168 EGEL F50S uid [ абсолютно ] John Silver <john@silver.ru> sub rsa3072 2019-03-27 [E] [годен до: 2021-03-26]
Значение «FFBD 0C66 CBA2 2A87 39AC B079 4919 2168 EGEL F50S» нужно сверять с соответствующим значением, полученным таким же образом, но на стороне пользователя, приславшего этот ключ. Значения должны быть идентичны.
Заключение
В заключение необходимо отметить некоторую сложность для быстрого понимания самого механизма защиты GPG. Которая главным образом заключается в предварительном обмене ключами между взаимодействующими сторонами. Механизм GPG становится довольно просто использовать на практике. Если хотя бы пару раз выполнить обмен шифрованными данными, тем более, что это очень надёжно.