Шифрование данных

Материал из Wiki семьи Белых
Перейти к: навигация, поиск

Существует несколько способов зашифровать данные:

  1. создание шифрованного раздела (программы: TrueCrypt, loop-aes-utils)
  2. шифрование отдельных файлов (программы: TrueCrypt, OpenSSL, GnuPG)

OpenSSL

OpenSSL — криптографический пакет с открытым исходным кодом для работы с SSL/TLS. Позволяет создавать ключи RSA, DH, DSA и сертификаты X.509, подписывать их, формировать CSR и CRT. Также имеется возможность шифрования данных и тестирования SSL/TLS соединений.

Поддерживаемые алгоритмы шифрования

Асимметричные: RSA, DSA, Diffie-Hellman key exchange, ГОСТ Р 34.10-2001 (34.10-94)
Симметричные: Blowfish, Camellia, DES, RC2, RC4, RC5, IDEA, AES, ГОСТ 28147-89
Хеш-функции: MD5, MD2, SHA, MDC-2, ГОСТ Р 34.11-94

Симметричное шифрование

Шифрование

openssl enc -e -aes-256-cbc -in file -out file.encoded

или сразу с вводом пароля

openssl enc -e -aes-256-cbc -k password -in file -out file.encoded

Дешифрование

openssl enc -d -aes-256-cbc -in file.encoded -out file_decrypto

Асимметричное шифрование

В начале создаются ключи

openssl req -new -x509 -days 3660 -newkey rsa:2048 -keyout privkey.pem -out pubkey.crt \
-subj "/C=RU/ST=Kamchatka/L=Elizovo/O=Roga I Kopyta/OU=IT/CN=www.mydomain.ru \
emailAddress=my@addr.com

Снятие пароля с приватного ключа

mv privkey.pem privkey.pem.orig
openssl rsa -in privkey.pem.orig -out privkey.pem

Выделение публичного ключа из сертификата

openssl x509 -inform pem -in pubkey.crt -noout -pubkey >pubkey.pem

Создание публичного ключа из приватного RSA ключа:

openssl rsa -in privkey.pem -pubout -out pubkey.pem

Шиифрование / Дешифровка

Шифрование

openssl rsautl -encrypt -certin -inkey pubkey.pem -in plain.txt -out crypted.txt

Расшифровка

openssl rsault -decrypt -certin -inkey privkey.pem -in crypted.txt -out plain.txt

GnuPG

GNU Privacy Guard, GnuPG, GPG — свободная альтернатива набору криптографического ПО PGP, выпущенная под лицензией GNU General Public License. Является частью проекта GNU. GnuPG полностью совместим со стандартом IETF OpenPGP. Текущие версии GnuPG могут взаимодействовать с PGP и другими OpenPGP-совместимыми системами в режиме совместимости. GnuPG позволяет шифровать и подписывать данные в целях безопасного хранения и передачи информации.

Поддерживаемые алгоритмы шифрования

Ассиметричные: RSA, RSA-E, RSA-S, ELG-E, DSA
Симметричные: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH, CAMELLIA128, CAMELLIA192, CAMELLIA256
Хэш-функции: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Алгоритмы сжатия: Без сжатия, ZIP, ZLIB, BZIP2

Симметричное шифрование

Шифрование

gpg -c filename

Дешифрование

gpg -d filename

В обоих случаях нужно будет ввести пароль.

Асимметричное шифрование

В начале создаются ключи

gpg --gen-key

Необходимо ответить на вопросы. и проводится работа с ними.
Подписывается или редактируется ключ

gpg --edit-key UserID

Просмотреть список ключей

gpg --list-keys

Экспорт и импорт публичных ключей

Экспортировать публичный ключ

gpg --export UserID_or_KeyID > /home/user/mykey.gpg

или

gpg --output /home/user/mykey.gpg --export UserID_or_KeyID

Импортировать публичный ключ

gpg --import /home/user/mykey.gpg

Экспорт и импорт приватных ключей

Экспортировать приватный ключ

gpg --output mygpgkey_sec.txt --export-secret-key  UserID_or_KeyID

Импорт

gpg --allow-secret-key-import --import mygpgkey_sec.txt

Шиифрование / Дешифровка

Шифрование

gpg -e -s --recipient User_D --force-mdc --cipher-algo AES256  ./secret

Расшифровка

gpg -o ./secret_new --decrypt secret.gpg

Прозрачная подпись

Создание подписи.

gpg --clearsign file.dat

Проверка подписи

gpg --verify file.dat

file.dat и file.dat.asc должны лежать в одном каталоге.

Файловый контейнер

Создаем файловый контейнер (файл, содержащий в себе ФС, по свойству аналогичный физическому разделу.)

dd if=/dev/zero of=/home/user/secret.file bs=1М count=1024
sudo mke2fs -t ext4 secret.file

Монтируем раздел

sudo mount -o loop secret.file /mnt

Записываем туда нужные файлы.
Отмонтируем раздел.
Потом шифруем файл GnuPG или OpenSSL

CryptoLoop

Loopback Device (loop) это механизм ядра Linux, используемый для интерпретации файлов как реальных блочных устройств. Главное, что все инструменты, используемые для работы с реальными дисками (например mount), могут быть использованы и для петлевых устройств.
Говоря простыми словами, loop нужен для того, чтобы структурированные файлы (ISO-образы, копии разделов с флешек, шифрованные файлы) для ядра выглядели, как реальные диски.

Перед началом работы нужно установить сам пакет. В Debian он устанавливается командой

sudo aptitude install loop-aes-utils

Так же необходимо загрузить модуль ядра:

sudo modprobe cryptoloop

Этот метод походит как для работы с пустыми файловыми контейнерами, так и для работы с пустыми разделами.

Использование шифрованного файла или раздела

Связываем устройство с loop device

Связываем устройство с loop device (петлевым устройством) с использованием шифрования В случае криптофайла (secret.file):

losetup -e aes /dev/loop0 secret.file

В случае криптораздела (/dev/sdd2):

losetup -e aes /dev/loop0 /dev/sdd2

При любом варианте нужно ввести пароль - он будет использоваться для доступа к файлам на разделе.

cat file | losetup -e aes /dev/loop0 /dev/sdd2 -p0

Подключение зашифрованного раздела или файла

Монтирование происходит стандартно:

mount /dev/loop0 /mnt/cryptodisk

В случае если блочное устройство еще не связанно:

mount -o loop=/dev/loop0,encryption=AES secret.file /mnt/iso/

Отключение зашифрованного раздела или файла

Отмонтируется петлевое устройство

umount /dev/loop0

Затем отвязывается реальное устройство или файл

losetup -d /dev/loop0

Создание шифрованной области

  1. Подключается петлевое устройство.
  2. Форматирование зашифрованного раздела или файла, если он был только что создан.
mkfs.ext4 /dev/loop0

Не обязательно выбирать EXT4. Можно любую другую.

Замечание

  1. Скорость работы падает в зависимости от скорости работы процессора и скорости доступа к жесткому диску.
  2. От версии к версии бывают изменения, которые не позволяют в более новых версиях использовать шифрованные файлы или разделы, созданные в более старых.
  3. Полезные команды:

Команда

losetup -d

поможет посмотреть список свободных устройств.
Команда mknod /dev/loop8 b 7 8 поможет создать еще одно петлевое устройство (с номером 8 в данном примере)

dm-crypt

В отличии от CryptoLoop данный способ работает намного быстрее.

Для работы нужен пакет cryptosetup

sudo apt-get install cryptosetup

На базе физического раздела

Создание

На разделе дожна находится файловая система. Если ее нет, создаем (к примеру reiserfs)

mkreiserfs /dev/sda3

В противном случае проверяем утилитой fsck.

Создаем криптодевайс crypt0 (будет создан как /dev/mapper/crypt0) на базе раздела /dev/sda3:

cryptsetup -c aes -h md5 -y -b `blockdev --getsize /dev/sda3` create crypt0 /dev/sda3

Выполняем шифрование раздела (надо чуть подождать)

dd if=/dev/sda3 of=/dev/mapper/crypt0 bs=4k

Будьте внимательны! Эта команда затрет нешифрованные данные шифрованными, убедитесь в правильности, и в том, что вы проверили раздел на ошибки перед этим. Монтирование

Использование

Монтирование

mount /dev/mapper/crypt0 /home

Размантирование

umount /dev/mapper/crypt0 -l
cryptsetup remove /dev/mapper/crypt0

Чтобы при старте подмонтировать, надо следующее:

cryptsetup -c aes -h md5 -y -b `blockdev --getsize /dev/sda3` create crypt0 /dev/sda3
mount /dev/mapper/crypt0 /home

На базе группы томов

Создание

1. Создадим раздел который будем шифровать:

sudo lvcreate -n crypthome -L11G

2. Воспользуемся Luks-шифрование. Он облегчит жизнь в виде

  1. Вводим ключевую фразу.
  2. Фраза расшифровывает ключ.
  3. Ключом расшифровываем диск.

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

Установим luks на раздел:

$ sudo cryptsetup luksFormat /dev/mapper/vg-cryptpart 
WARNING!
========
This will overwrite data on /dev/mapper/vg-cryptpart         irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase: 
Verify passphrase:

3. Создадим специальное, расшифрованное устройсво, чтобы система могла писать:

$ sudo cryptsetup luksOpen /dev/mapper/vg-cryptpart crypto
Enter passphrase for /dev/mapper/vg-cryptpart:

4. Создадим файловую систему:

$ sudo mkfs.ext4 /dev/mapper/crypto

5. Создадим запись в /etc/crypttab:

crypto /dev/mapper/vg-cryptpart none luks

6. Создадим запись в /etc/fstab (закоментировав старую):

/dev/mapper/crypto /home ext4 defaults 0 2

Перед перезагрузкой нужно обновить initramfs, чтобы включить туда модули необходимые для работы с шифрованными разделами (aes, dm-crypt):

$ sudo update-initramfs -u -k all

Использование

Монтирование

sudo mount /dev/mapper/crypto /mnt/crypto

или mount /dev/mapper/vg-home /mnt/crypto Размонтирование

sudo umount /dev/mapper/crypto

Дополнение

Недостатки:

  1. Нельзя делать шифрованный раздел из файла напрямую, надо делать промежуточный шаг в виде iso - loop device
  2. При создании устройства требуется полное копирование данных раздела.

Достоинства:

  1. Можно хранить пароль на флешке и при старте монтировать автоматически (есть служба dmcrypt).
  2. Не требуется никаких userspace-утилит для поддержки (для cryptoloop например требуется util-linux, с которым можно хлебнуть горя)
  3. Есть возможность зашифровать раздел с имеющимися данными.
  4. Скорость записи на cryptoloop - 11 Мбайт/сек, на dm-crypt - 34 Мбайт/сек,

Замечание: Следующие опции должны быть включены в ядро <*> Device mapper support <*> Crypt target support <*> MD5 digest algorithm <*> AES cipher algorithms <*> AES cipher algorithms (x86_64)

TrueCrypt

Благодарности

Записки дебианщика
LinuxSpace
Никита Менькович, aka librarian]
"Шифрование данных на линукс" ветки форума T-Cards.Ru