Паранойя не лечится!
Но и не преследуется по закону.
Поэтому в Linux
Kernel 4.1 добавлена поддержка шифрования файловой системы ext4 на
уровне отдельных файлов и директорий. Зашифровать можно только пустую
директорию. Все файлы, которые будут созданы в такой директории, также
будут зашифрованы. Шифруются только имена файлов и содержимое,
метаданные не шифруются, inline data (когда данные файла, не
превышающие по размеру 60 байт, хранятся в айноде) в файлах не
поддерживается. Поскольку расшифровка содержимого файла выполняется
непосредственно в памяти, шифрование доступно только в том случае,
когда размер кластера совпадает с PAGE_SIZE, т.е. равен 4К.
1. Как это работает
Для начала необходимо освоить несколько полезных команд
Форматирование тома с опцией шифрования
# mkfs.ext4 -O encrypt /dev/xxx
Включение опции шифрования на существующий том
# tune2fs -O encrypt /dev/xxx
Создание ключа шифрования # mount /dev/xxx /mnt/xxx $ e4crypt add_key Enter passphrase (echo disabled):
Added key with descriptor [8e679e4449bb9235]
При создании ключа том с поддержкой шифрования должен быть
примонтирован, иначе e4crypt выдаст ошибку “No salt values available”.
Если примонтировано несколько томов с опцией encrypt, то будут созданы
ключи для каждого. Утилита e4crypt входит в состав e2fsprogs.
Ключи добавляются в Linux Kernel Keyring [1]. Чтение списка ключей
$ keyctl show Session Keyring
Ключи, используемые для шифрования, имеют тип “logon”. Содержимое
(payload) ключей такого типа недоступно из пространства пользователя —
keyctl команды read, pipe, print вернут ошибку. В данном примере у
ключа префикс “ext4”, но может быть и “fscrypt”. Если keyctl
отсутствует в системе, то необходимо установить пакет keyutils.
92
Создание зашифрованной директории
$ mkdir /mnt/xxx/encrypted_folder $ e4crypt set_policy 8e679e4449bb9235 /mnt/xxx/encrypted_folder/ Key with descriptor [8e679e4449bb9235] applied to /mnt/xxx/encrypted_folder/.
Здесь в команду set_policy передается дескриптор созданного ключа без
указания префикса (ext4) и типа (logon). Одним и тем же ключом можно
зашифровать несколько директорий. Для шифрования разных директорий
можно использовать разные ключи. Чтобы узнать, каким ключом зашифрована
директория, необходимо выполнить команду:
Установить другую политику безопасности на зашифрованную директорию не получится:
$ e4crypt add_key Enter passphrase (echo disabled): Added key with descriptor [9dafe822ae6e7994] $ e4crypt set_policy 9dafe822ae6e7994 /mnt/xxx/encrypted_folder/ Error [Invalid argument] setting policy. The key descriptor [9dafe822ae6e7994] may not match the existing encryption context for directory [/mnt/xxx/encrypted_folder/].
Зато такую директорию можно беспрепятственно удалить:
$ rm -rf /mnt/xxx/encrypted_folder/ $ ll /mnt/xxx total 24 drwxr-xr-x 3 user user 4096 Apr 21 15:14 ./ drwxr-xr-x 4 root root 4096 Mar 29 15:30 ../ drwx------ 2 root root 16384 Apr 17 12:41 lost+found/ $
93
Шифрование файла
$ echo "My secret file content" > /mnt/xxx/encrypted_folder/my_secrets.txt $ cat /mnt/xxx/encrypted_folder/my_secrets.txt My secret file content $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 my_secrets.txt
Имена файлов в директории и содержимое файла будут доступны, пока в
хранилище ключей существует ключ, которым была зашифрована директория.
После аннулирования ключа доступ к директории будет сильно ограничен:
$ keyctl revoke 803843970 $ keyctl show Session Keyring 771961813 --alswrv 1000 65534 keyring: _uid_ses.1000 771026675 --alswrv 1000 65534 \_ keyring: _uid.1000 803843970: key inaccessible (Key has been revoked)
Ключ аннулирован, читаем содержимое директории:
$ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 BhqTNRNHDBwpa9S1qCaXwC
Имя файла уже абырвалг. Но всё-таки попробуем прочитать файл:
$ cat /mnt/xxx/encrypted_folder/BhqTNRNHDBwpa9S1qCaXwC cat: /mnt/xxx/encrypted_folder/BhqTNRNHDBwpa9S1qCaXwC: Required key not available
NOTE: в Ubuntu 17.04 (kernel 4.10.0-19) директория остается доступной после удаления ключа до перемонтирования.
Директория зашифрована ключом с дескриптором “8e679e4449bb9235”. Ключ
отсутствует в хранилище. Несмотря на это, директория и содержимое файла
в свободном доступе.
$ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 my_secrets.txt $ cat /mnt/xxx/encrypted_folder/my_secrets.txt My secret file content
Перемонтирование:
# umount /dev/xxx # mount /dev/xxx /mnt/xxx $ ll /mnt/xxx/encrypted_folder/ total 12 drwxr-xr-x 2 user user 4096 Apr 20 14:25 ./ drwxr-xr-x 5 user user 4096 Apr 20 14:15 ../ -rw-r--r-- 1 user user 23 Apr 20 14:26 BhqTNRNHDBwpa9S1qCaXwC