Шифрование в Linux


Шифрование - тема очень актуальная. В многих случаях информация, идея - это самая дорогая 
часть проекта и нужно уметь ее защищать. Чем лучше защищаешь - тем спокойнее спишь. В 
России это особенно важно еще и потому, что весь бизнес построен на инсайде, знакомствах, 
корешах и других бесчестных принципах. Одним словом "подсмотри и укради". Так, конечно, 
быть не должно. В старые времена, когда я еще сидел под виндой, я пользовался программой 
PGP. Это работало, но немного муторно. Я знаю, что существуют и другие, более удобные 
решения - но всё равно они не так удобны и быстры, как в Linux. А в Linux я знаю несколько 
способов. Сразу обозначим - можно шифровать голый раздел целиком, а можно - сделать псевдо 
раздел внутри шифрованного файла. Меня чаще интересовал второй способ.

== Способ 1 - cryptoloop ==

Это самый простой и надежный способ, который к сожалению, сейчас помечен как Depricated, и 
в Debian Testing, к примеру, уже не работает (Зато работает в Ubuntu, Gentoo и проч.). 
Суть простая - делаем файл, делаем loop-устройство, шифруем. Монтируем через fstab с 
легкостью.

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

# modprobe loop
# modprobe cryptoloop
# modprobe aes

Дальше - всего несколько строк, о которых в деталях можно почитать в man losetup

# dd if=/dev/urandom of=/home/somefile.dsk bs=1M count=50
# chmod 600 /home/somefile.dsk
# losetup -e aes /dev/loop0 /home/somefile.dsk
Password:
Init (up to 16 hex digits):
# mkfs -t ext2 /dev/loop0
# mount -t ext2 /dev/loop0 /mnt
.....
# umount /mnt/
# losetup -d /dev/loop0

Чтобы в дальнейшем было легко монтировать, прописываем в fstab:

/home/somefile.dsk       /mnt     ext2            noauto,users,loop,encryption=aes            0 0

Не забываем, что в /etc/modules, или аналогичный файл, желательно прописать
модули loop,cryptoloop,aes в автозагрузку

Замечания:

* /dev/urandom в Linux - это медленно устройство. Для больших файлов - лучше использовать 
  что-нибудь побыстрее.
* В качестве шифров можно использовать DES,AES,BLOWFISH,TWOFISH,IDEA и другие, с разной 
  длиной ключа. О стойкости и быстроте шифров - нужно читать отдельно и разбираться детально
* Шифры должны быть собраны как модули или в компилены в ядро. В некоторых системах нужно 
  устанавливать отдельные пакеты, типа aes-loop-utils.
* На стационарных компьютерах лучше делать не маленькие файлы, а большие - чтобы на 
  простой флешке враги не унесли, а помучались хотя бы - на какой носитель скинуть. Можно 
  сделать наоборот - хранить шифрованный файл только на своей священной флешке, 
  пользоваться по ночам, в месте, недоступном для врагов.


== Способ 2 - dm-crypt ==

Вместо cryptoloop сейчас рекомендуется использовать dm-crypt. Это немного сложнее, однако 
и возможностей больше.

# modprobe dm_mod
# modprobe dm_crypt
# modprobe aes
# dd of=/home/secret.fs bs=1M count=100
# chmod 600 /home/secret.fs
# losetup /dev/loop0 /home/secret.fs
# cryptsetup -v -c aes -y create secretfs /dev/loop0
# cryptsetup status secretfs
# dd if=/dev/zero of=/dev/mapper/secretfs
# mke2fs -j -O dir_index /dev/mapper/secretfs
# mount /dev/mapper/secretfs /mnt
...
# umount /mnt
# cryptsetup remove secretfs
# losetup -d /dev/loop0


Для монтирования-размонтирования можно сделать такие простые bash-скрипты:

secret_mount.sh

losetup /dev/loop0 /home/secret.fs;
cryptsetup create secretfs /dev/loop0;
mount /dev/mapper/secretfs /mnt;

secret_umount.sh

umount /mnt;
cryptsetup remove secretfs;
losetup -d /dev/loop0;

Можно обойтись и без скриптов - а просто прописать

/etc/crypttab

secretfs /home/secret.fs none cipher=aes-cbc-plain,size=256

/etc/fstab

/dev/mapper/secretfs /mnt ext2 noauto,acl,user_xattr 0 0


== Способ 3 - dm-crypt + LUKS ==

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

# modprobe dm_mod dm_crypt aes
# dd if=/dev/urandom of=/home/test.dsk bs=1M count=10
# chmod 600 /home/test.dsk
# losetup /dev/loop0 /home/test.dsk
# cryptsetup -v -c aes -s 256 luksFormat /dev/loop0
# cryptsetup luksOpen /dev/loop0 testdsk
# mkfs.ext2 /dev/mapper/testdsk
# mount /dev/mapper/testdsk /mnt/mycryptdisk
...
# umount /mnt/mycryptdisk
# cryptdisk luksClose testdsk
# losetup -d /dev/loop0

В файл /etc/crypttab прописыываем 

testdsk   /home/test.dsk  none   luks,noauto

В файл /etc/fstab

/dev/mapper/testdsk           /mnt/mycryptdisk     ext2            noauto,users    0 0


В дальнейшем, монтировать можно двумя командами:

cryptdisks_start testdsk
mount /mnt/mycryptdisk
...do something...
cryptdisks_stop testdsk
umount /mnt/mycryptdisk


Замечания:

* Для автозапуска процесса монтирования при загрузке нужно поднять автозапуск сервиса 
  /etc/init.d/cryptdisks
* Шифровать можно не только паролем - можно использовать файл с ключом.
* dm-crypt (и LUKS) позволяет использовать несколько паролей/ключей, что бывает удобно, 
  если один из паролей забываешь или теряешь.


== Другие способы ==

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


P.S.

В Российской Федерации ЛЮБАЯ КОММЕРЧЕСКАЯ ДЕЯТЕЛЬНОСТЬ, связанная с использованием 
криптографических средств, подлежит обязательному лицензированию. Причем существующие 
условия закона настолько жесткие, что использовать шифры вне государственной деятельности 
практически невозможно. По этой причине - любое физическое лицо или организации легально 
может только "оказывать IT-услуги" и "сопровождать IT-проекты" без какого-либо любого даже 
самого маленького намека на криптографию. Получается, что защищаться можно только 
самостоятельно и в любом случае это нелегально. Гипербола конечно.