18.3 Шифрование файлов в Linux (Encrypting Linux Files)¶
Точно так же, как для шифрования сетевого обмена между Linux-системами используется OpenSSH, шифрование применяется и для защиты файлов в файловой системе Linux. Для этого существуют разнообразные инструменты — как открытые, так и проприетарные. Для экзаменов Linux+/LPIC-1 необходимо знать, как использовать утилиту GNU Privacy Guard (GPG) (GNU Privacy Guard) с открытым исходным кодом для шифрования файлов. Именно этот инструмент будет рассмотрен далее. Будут освещены следующие темы:
- Принцип работы GPG
- Использование GPG для шифрования файлов
Начнём с изучения принципа работы GPG.
Принцип работы GPG (How GPG Works)¶
GNU Privacy Guard (GPG) — реализация с открытым исходным кодом стандарта OpenPGP (RFC 4880). GPG позволяет шифровать и цифровым образом подписывать данные и сообщения. Например, можно шифровать файлы в файловой системе Linux, а также шифровать и цифровым образом подписывать сообщения электронной почты.
GPG предоставляет криптографический модуль, которым можно пользоваться непосредственно из командной строки с помощью утилиты gpg. Модуль также можно вызывать из сценариев оболочки или других программ. Например, поддержка GPG интегрирована в несколько популярных почтовых клиентов Linux, таких как Evolution и KMail, а также в клиенты мгновенных сообщений, например Psi.
Доступны также различные графические надстройки (front ends) для GPG: среди наиболее популярных — KGPG и Seahorse. Однако для экзаменов Linux+/LPIC-1 необходимо знать, как использовать GPG из командной строки — именно это будет освещено в данной главе.
GPG работает аналогично OpenSSH: использует как асимметричное, так и симметричное шифрование. GPG сначала генерирует случайный симметричный ключ и шифрует им передаваемое сообщение. Сам симметричный ключ затем шифруется открытым ключом получателя и отправляется вместе с зашифрованным сообщением. Когда получатель принимает сообщение, GPG сначала расшифровывает симметричный ключ с помощью закрытого ключа пользователя, а затем использует расшифрованный симметричный ключ для дешифрования оставшейся части сообщения.
GPG поддерживает множество алгоритмов шифрования, в том числе:
- Симметричное шифрование:
- AES
- 3DES
- Blowfish
- Асимметричное шифрование:
- Elgamal
- RSA
- Хеши:
- MD5
- SHA-1 и SHA-2
- RIPEMD-160
- Цифровые подписи:
- DSA
- RSA
Использование GPG для шифрования файлов (Using GPG to Encrypt Files)¶
Для шифрования файла с помощью GPG выполните следующие шаги:
-
Сгенерируйте ключи с помощью GPG. Введите
gpg --gen-keyв командной строке. Пример вывода:rtracy@openSUSE:~> gpg --gen-key gpg (GnuPG) 2.0.22; 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. Затем предлагается задать размер ключа:
-
Укажите размер ключа. Размер по умолчанию 2048 бит обычно достаточен. Затем предлагается настроить срок действия ключа:
-
Укажите срок истечения ключа. Можно задать количество дней, недель, месяцев или лет.
-
Создайте идентификатор пользователя для ключа. Первый параметр — настоящее имя. Это имя важно, поскольку оно будет использоваться в дальнейшем при шифровании. В следующем примере в качестве имени введено
rtracy: -
При появлении запроса введите адрес электронной почты.
-
При появлении запроса введите произвольный комментарий. Затем предлагается подтвердить созданный идентификатор пользователя:
-
Если данные верны, введите
Oдля подтверждения идентификатора. Затем предлагается ввести парольную фразу для ключа, как показано на рис. 18-10.

Рис. 18-10. Ввод парольной фразы GPG
-
Введите уникальную парольную фразу для ключа. После этого предлагается выполнить различные действия в системе, пока генерируется ключ:
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 использует эти действия для генерации случайных чисел. Если активности недостаточно, появится запрос на увеличение активности:
После выполнения этих шагов пара ключей сгенерирована. Файлы ключей хранятся в каталоге ~/.gnupg в домашнем каталоге пользователя. В этом каталоге создаются следующие файлы:
secring.gpg— секретная связка ключей GPG;pubring.gpg— публичная связка ключей GPG;trustdb.gpg— база доверия GPG.
Прежде чем продолжать, настоятельно рекомендуется создать резервную копию закрытого ключа на случай его повреждения. Это крайне важно: если зашифровать файлы с помощью пары ключей, а затем потерять ключ, расшифровать их уже не получится. Даже если пересоздать пару ключей, расшифровать файлы не выйдет, поскольку они зашифрованы другой парой.
Для создания резервной копии пары ключей GPG введите в командной строке:
Например:
gpg --export-secret-keys --armor rtracy@openSUSE > rtracy-privatekey.asc
rtracy@openSUSE:~> ls
addnum firstnames mytestfile.txt rtracy-privatekey.asc
В целях безопасности не следует оставлять этот файл на жёстком диске. Рекомендуется записать его на оптический диск или скопировать на USB-накопитель и убрать в надёжное место. Это позволит восстановить закрытый ключ в случае повреждения оригинала.
Теперь можно использовать пару ключей для шифрования файлов и сообщений. Например, для шифрования файла в файловой системе Linux:
-
В командной строке введите
gpg –e –r key_user_name filename. В приведённом примере шифруется файлmytestfile.txtс использованием ранее созданного ключа. Параметр-eуказываетgpgзашифровать файл. При создании идентификатора пользователя ключа было указано имяrtracy, поэтому оно и вводится здесь: -
В командной строке используйте команду
lsдля просмотра новой зашифрованной версии файла, созданнойgpg. Исходный файл остаётся нетронутым. Новый файл будет иметь то же имя с добавленным расширением.gpg. В данном примере имя нового файла —mytestfile.txt.gpg. На рис. 18-11 показаны различия между исходным и зашифрованным файлами.

Рис. 18-11. Просмотр файла, зашифрованного с помощью gpg
После шифрования файл можно расшифровать командой gpg. Синтаксис: gpg --output output_filename --decrypt encrypted_filename. Например, для расшифровки файла mytestfile.txt.gpg:
rtracy@openSUSE:~> gpg --output mytestfile.txt.decrypted --decrypt mytestfile.txt.gpg
You need a passphrase to unlock the secret key for
user: "rtracy (<rtracy@openSUSE>"
2048-bit RSA key, ID FB8BF16C, created 2015-01-24 (main key ID 9DF54AB2)
gpg: encrypted with 2048-bit RSA key, ID FB8BF16C, created 2015-01-24
"rtracy (<rtracy@openSUSE>"
rtracy@openSUSE:~> cat mytestfile.txt.decrypted
This is a text file that I wrote.
rtracy@openSUSE:~>
На данном этапе можно шифровать и расшифровывать файлы в локальной системе. Но как обмениваться зашифрованными файлами с другим пользователем так, чтобы оба могли их расшифровать? Для этого необходимо обменяться и установить открытые ключи GPG на обеих системах. Это можно сделать двумя способами.
Первый способ — скопировать открытые ключи на общедоступный сервер ключей в интернете. Для этого введите:
Для этой команды необходимо знать идентификационный номер открытого ключа GPG. Он отображается при первоначальном создании пары ключей, однако если он не был записан, его можно получить из командной строки:
rtracy@openSUSE:~> gpg --fingerprint rtracy@openSUSE > key_ID.txt
rtracy@openSUSE:~> cat key_ID.txt
pub 2048R/9DF54AB2 2015-01-24
Key fingerprint = AF46 4AB3 1397 B88E BC6A FBDA 465F 82C4 9DF5 4AB2
uid rtracy <rtracy@openSUSE>
sub 2048R/FB8BF16C 2015-01-24
В данном примере вывод команды сохранён в файл key_ID.txt. Идентификационный номер ключа содержится в первой строке вывода (выделен жирным). После получения идентификационного номера открытый ключ GPG можно скопировать на общедоступный сервер ключей. Для системы из примера:
Этот вариант хорошо подходит при обмене ключами с большим числом пользователей. Если обмен нужен с ограниченным кругом лиц, можно обменяться ключами напрямую.
Второй способ — экспортировать открытые ключи и отправить их друг другу:
Например:
Каждый пользователь копирует файл ключа другому пользователю. Например, для отправки ключа пользователю student на узле fedora:
После этого каждый пользователь должен импортировать открытые ключи других пользователей в связку ключей GPG командой gpg --import public_key_filename. В следующем примере сначала файл открытого ключа скопирован с системы openSUSE на fedora, затем ключ импортирован:
[student@fedora ~]$ gpg --import gpg.pub
gpg: key 9DF54AB2: public key "rtracy <rtracy@openSUSE>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
[student@fedora ~]
Каждый пользователь должен повторить этот процесс. После этого стороны смогут использовать ключи GPG друг друга для шифрования и расшифровки файлов. Просмотреть ключи в связке ключей GPG можно командой gpg --list-keys:
[student@fedora ~]$ gpg --list-keys
/home/student/.gnupg/pubring.gpg
--------------------------------
pub 2048R/9DF54AB2 2015-01-24
uid rtracy <rtracy@openSUSE>
sub 2048R/FB8BF16C 2015-01-24
[student@fedora ~]$
В данном примере открытый ключ, ранее созданный на openSUSE, импортирован в связку ключей пользователя student на fedora. Файл связки ключей хранится в каталоге ~/.gnupg/ и называется pubring.gpg.
Примечание
Файл gpg.conf также находится в каталоге ~/.gnupg. Он позволяет настраивать поведение gpg в системе.
Затем необходимо выполнить обратный обмен: импортировать открытый ключ пользователя student с системы fedora на систему openSUSE. После импорта открытых ключей можно обмениваться зашифрованными файлами и расшифровывать их. Синтаксис: gpg --output output_filename --symmetric encrypted_filename. Например, для расшифровки файла mytestfile.txt.gpg на системе fedora:
[student@fedora ~]$ gpg --output mytestfile.txt.decrypted --symmetric mytestfile.txt.gpg
[student@fedora ~]$ ls
Desktop Music Pictures Documents mykeyfile
Templates Downloads mytestfile.txt.decrypted Videos
gpg.pub mytestfile.txt.gpg Public
[student@fedora ~]$
При выполнении этой команды будет запрошена парольная фраза, заданная при первоначальном создании закрытого ключа. После ввода парольной фразы расшифрованная версия файла будет создана и станет доступна локальному пользователю.
Отзыв ключей (Key Revocation)¶
Прежде чем завершить эту главу, необходимо рассмотреть тему отзыва ключей. Иногда возникает необходимость отозвать ключ, то есть изъять его из открытого использования. Это следует сделать, если ключ был скомпрометирован, утерян, или если была забыта парольная фраза.
Примечание
Забывание парольной фразы — очень распространённая проблема, приводящая к отзыву ключа.
Для отзыва ключа создаётся сертификат отзыва ключа (key revocation certificate). Рекомендуется создавать сертификат отзыва сразу после создания пары ключей, на случай если он потребуется позднее. Важно помнить: создание сертификата отзыва не отзывает пару ключей автоматически. Ключ отзывается только при выдаче (issuing) сертификата отзыва. По сути, сертификат создаётся и хранится в надёжном месте на случай необходимости.
Для создания (но не выдачи) сертификата отзыва введите:
Идентификатор ключа можно просмотреть с помощью параметра --fingerprint. В следующем примере создаётся сертификат отзыва для пары ключей GPG пользователя student на системе fedora:
[student@fedora ~]$ gpg --fingerprint student@fedora
pub 2048R/899AB9E6 2015-01-24
Key fingerprint = A469 942C F5C9 555A B4A4 F975 1B3A CB26 899A B9E6
uid student <student@fedora>
sub 2048R/A86F1A4B 2015-01-24
[student@fedora ~]$ gpg --output revoke.asc --gen-revoke 899AB9E6
sec 2048R/899AB9E6 2015-01-24 student <student@fedora>
Create a revocation certificate for this key? (y/N) y
Please select the reason for the revocation:
0 = No reason specified
1 = Key has been compromised
2 = Key is superseded
3 = Key is no longer used
Q = Cancel
(Probably you want to select 1 here)
Your decision? 1
Enter an optional description; end it with an empty line:
> This key has been compromised
>
Reason for revocation: Key has been compromised
This key has been compromised
Is this okay? (y/N) y
You need a passphrase to unlock the secret key for
user: "student <student@fedora>"
2048-bit RSA key, ID 899AB9E6, created 2015-01-24
ASCII armored output forced.
Revocation certificate created.
Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable. But have some caution: The print system of
your machine might store the data and make it available to others!
Обратите внимание: в этом примере потребовалось указать причину отзыва и более подробное описание, а также ввести парольную фразу, использованную при создании пары ключей. Рекомендуется избегать хранения сертификата отзыва на жёстком диске — лучше записать его на оптический диск или скопировать на USB-накопитель вместе с резервной копией пары ключей и убрать в надёжное место. Если кто-то получит доступ к этому файлу, он сможет отозвать ваш сертификат без вашего ведома и согласия.
Совет
В выводе команды предлагается распечатать сертификат отзыва. Это неудобный способ архивирования. При необходимости использовать его пришлось бы вводить сертификат вручную. Предпочтительнее скопировать его на USB-накопитель, хранящийся в надёжном месте. Не забудьте удалить файл с жёсткого диска, какой бы способ архивирования ни использовался.
Если сертификат действительно оказался скомпрометирован и требуется отозвать ключ, достаточно импортировать сертификат отзыва так же, как обычный сертификат:
Пример:
[student@fedora ~]$ gpg --import revoke.asc
gpg: key 899AB9E6: "student <student@fedora>" revocation certificate imported
gpg: Total number processed: 1
gpg: new key revocations: 1
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
После этого можно убедиться, что ключ отозван, введя gpg --list-keys key_ID. Отозванный ключ должен исчезнуть из связки ключей. Если для распространения открытого ключа использовался способ с ручным обменом, необходимо также импортировать сертификат отзыва на все системы, где был импортирован открытый ключ. При использовании общедоступного сервера ключей сертификат отзыва следует направить и туда:
Это уведомит всех пользователей вашего открытого ключа о его компрометации и необходимости прекратить его использование.
Упражнение 18-4. Использование GPG для шифрования файлов
В этом упражнении вы будете использовать GPG для шифрования файла и отправки его на вторую Linux-систему. Затем вы экспортируете открытый ключ, скопируете его на вторую систему и используете для расшифровки отправленного файла.
Примечание
Для выполнения этого упражнения потребуются как минимум две Linux-системы. Можно использовать две реальные системы, две виртуальные машины или их сочетание.
VIDEO Посмотрите видео к упражнению 18-4 для наглядной демонстрации выполнения задания.
Выполните следующие шаги:
-
Создайте пару ключей GPG: a. Загрузите первую систему Linux и войдите как обычный пользователь. b. Откройте сеанс терминала. c. Введите
gpg --gen-keyв командной строке. d. При запросе типа ключа нажмите Enter, чтобы выбрать вариант по умолчанию (1) — RSA и RSA. e. При запросе размера ключа нажмите Enter для выбора размера по умолчанию 2048 бит. f. При запросе срока действия ключа нажмите Enter для выбора варианта по умолчанию (0) — без ограничения срока. g. Введитеyдля подтверждения выбора.Примечание
Здесь это делается в демонстрационных целях. В реальных условиях следует настраивать срок действия ключей. Если ключ когда-либо окажется скомпрометирован, он станет недействительным по истечении заданного срока.
h. Укажите идентификатор пользователя для ключа: введите имя длиной не менее пяти символов. Запишите введённое имя — оно понадобится позже. i. При запросе введите адрес электронной почты. Запишите его — он понадобится позже. j. При запросе введите полное имя в качестве комментария. k. При запросе подтверждения созданного идентификатора введите
O(букву O) для подтверждения. l. При запросе парольной фразы введите уникальную парольную фразу. m. При запросе двигайте мышью, нажимайте клавиши или открывайте лоток оптического привода. После этого пара ключей будет создана. -
Зашифруйте файл с помощью GPG: a. В командной строке введите
gpg –e –r key_user_name mytestfile.txt, заменивkey_user_nameнастоящим именем, указанным при создании ключа. Файлmytestfile.txtбыл создан в упражнении 18-1. Если файл отсутствует, создайте новый с таким именем. b. В командной строке проверьте с помощьюls, что файлmytestfile.txt.gpgбыл создан. -
Расшифруйте только что созданный файл: a. Введите
gpg --output mytestfile.txt.decrypted --decrypt mytestfile.txt.gpgв командной строке. b. Используйте командуcatдля отображения содержимого файлаmytestfile.txt.decryptedи убедитесь, что оно соответствует исходному файлу. -
Отправьте зашифрованный файл на другую систему и расшифруйте его там: a. Загрузите вторую Linux-систему и войдите как обычный пользователь. b. Используйте команду
pingдля проверки сетевой связи с первой системой. c. Вернитесь на первую систему. d. С командной строки первой системы экспортируйте ключ:gpg –export --armor key_owner_email > gpg.pub. e. Скопируйте файлыgpg.pubиmytestfile.txt.gpgс первой системы на вторую командойscp. f. Перейдите на вторую систему. g. Убедитесь, что файлgpg.pubскопирован в домашний каталог пользователя. h. Импортируйте открытый ключ с первой системы в связку ключей GPG:gpg --import ~/gpg.pub. i. Проверьте, что ключ импортирован:gpg --list-keys. j. Расшифруйте скопированный зашифрованный файл:gpg --output mytestfile.txt.decrypted --symmetric mytestfile.txt.gpg. k. При запросе введите парольную фразу, заданную при создании ключа GPG на первой системе. l. Используйтеcatдля отображения содержимого файлаmytestfile.txt.decryptedи убедитесь, что оно совпадает с содержимым исходного файла на первой системе. -
Выполните задачи обслуживания пары ключей GPG: a. Создайте резервную копию пары ключей GPG:
gpg --export-secret-keys --armor key_owner_email_address > gpgkey.asc. b. Создайте сертификат отзыва ключа:gpg --output revoke.asc --gen-revoke key_ID. Идентификатор ключа можно просмотреть с помощью параметра--fingerprint.