eCryptfs и шифрование домашнего каталога в Linux






Многие обращали внимание на предложение Ubuntu во время установки зашифровать домашний каталог пользователя. Я до недавних пор всегда его игнорировал из соображений «хрен знает, что они там выдумали, разбираться неохота», но однажды любопытство пересилило и нашлось свободное для познания сей тайны время. Всех, кому интересно, приглашаю под кат.




Лучший способ научиться чему-то — это сделать самостоятельно. В качестве подопытного кролика было решено взять Debian 6.0.3, оказавшуюся под рукой и не шифровавшей домашние каталоги пользователей. На ней весь процесс и производился. Если у вас в качестве ОС используется нечто совсем далёкое, гарантий, что процесс настройки будет таким же — никаких.

Как это работает

Для организации защиты ваших персональных данных в Ubuntu разработчики предпочли eCryptfs — файловую систему, работающую «поверх» любой другой обычной ФС и прозрачно шифрующую/дешифрующую содержимое файлов. Криптографические метаданные eCryptfs хранит в заголовках каждого файла, таким образом вы можете без проблем переносить любой файл между различными системами. Всё это счастье реализовано на уровне ядра Linux, обеспечивая хороший уровень производительности по сравнению с FUSE-шифрованием (например, EncFS).

Установка

Всё, что нужно для работы eCryptfs, во всех современных Linux-дистрибутивах имеются по умолчанию «из коробки». Если же ядро Linux вы собирали самостоятельно, то удостоверьтесь, что в вашей сборке присутствует необходимый модуль:

modprobe ecryptfs && lsmod | grep ecryptfs

Далее, для работы с eCryptfs нам понадобятся userspace-инструменты, которые в Debain/Ubuntu легко устанавливаются из пакета:

apt-get install ecryptfs-utils

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

Чтобы лучше понять и увидеть на практике, как работает eCryptfs, смонтируем какой-нибудь каталог и посмотрим, что происходит в реальности. Для начала создадим пустой каталог, который будем шифровать:

mkdir /mnt/ecryptfs-demo

Теперь смонтируем созданный каталог используя eCryptfs:

mount -t ecryptfs /mnt/ecryptfs-demo/ /mnt/ecryptfs-demo/

Обратите внимание, что исходным и целевым каталогом команде mount указан один и тот же каталог. Это несколько «нетрадиционно» для операции монтирования, однако вполне допустимо и удобно. Если вас это запутывает, вы можете использовать разные точки с более осмысленными именами, вроде:

mount -t ecryptfs /mnt/plaintext/ /mnt/encrypted/

После ввода команды вам необходимо ввести пароль для ключа шифрования:

Passphrase:

Введите пароль, не забывая о том, что его утеря будет означать невозможность получения данных! После ввода пароля вам будет предложено выбрать алгоритм шифрования, с по-умолчанию выбранным AES:

Select cipher:
 1) aes: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 2) blowfish: blocksize = 16; min keysize = 16; max keysize = 56 (not loaded)
 3) des3_ede: blocksize = 8; min keysize = 24; max keysize = 24 (not loaded)
 4) twofish: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 5) cast6: blocksize = 16; min keysize = 16; max keysize = 32 (not loaded)
 6) cast5: blocksize = 8; min keysize = 5; max keysize = 16 (not loaded)
Selection [aes]:

Далее вам необходимо выбрать размер ключа:

Select key bytes:
 1) 16
 2) 32
 3) 24
Selection [16]:

Значением следующей опции вы разрешаете или запрещаете доступ к файлам, которые не были зашифрованы при помощи eCrypfs:

Enable plaintext passthrough (y/n) [n]:

Шифровать или нет имена файлов:

Enable filename encryption (y/n) [n]:

Далее вы увидите сводку выбранных опций (их можно использовать в опциях монтирования в будущем):

Attempting to mount with the following options:
  ecryptfs_unlink_sigs
  ecryptfs_key_bytes=16
  ecryptfs_cipher=aes
  ecryptfs_sig=8f9887d2339cafb0

Если вы впервые монтируете и/или сигнатура этого монтирования не сохранена в кэше, то вас вежливо предупредят о том, что вы могли ввести пароль неверно:

WARNING: Based on the contents of [/root/.ecryptfs/sig-cache.txt],
it looks like you have never mounted with this key
before. This could mean that you have typed your
passphrase wrong.

Если всё ок, можно подтверждать монтирование:

Would you like to proceed with the mount (yes/no)? : yes

Чтобы избежать в будущем появления вышеуказанного предупреждения, вы можете добавить сигнатуру монтирования eCryptfs в файл:

Would you like to append sig [8f9887d2339cafb0] to
[/root/.ecryptfs/sig-cache.txt]
in order to avoid this warning in the future (yes/no)? : yes

Если всё прошло успешно, вы получите соответствующее сообщение:

Successfully appended new sig to user sig cache file
Mounted eCryptfs

Теперь скопируем что-нибудь в смонтированный каталог:

cp /etc/passwd /mnt/ecryptfs-demo/

Посмотрим его содержимое и размер:

cat /mnt/ecryptfs-demo/passwd
...

file /mnt/ecryptfs-demo/passwd
/mnt/ecryptfs-demo/passwd: ASCII text
ls -l /mnt/ecryptfs-demo/passwd
-rw-r--r-- 1 root root 911 Feb  7 01:18 /mnt/ecryptfs-demo/passwd

Теперь отмонтируем eCryptfs и посмотри, как изменился наш файл:

umount /mnt/ecryptfs-demo/

file /mnt/ecryptfs-demo/passwd
/mnt/ecryptfs-demo/passwd: data
ls -l /mnt/ecryptfs-demo/passwd
-rw-r--r-- 1 root root 12288 Feb  7 01:18 /mnt/ecryptfs-demo/passwd

Заглянув же вовнутрь файла, вы увидите там лишь двоичные данные.

pam_ecryptfs

Ещё одной довольно интересной и полезной штукой, идущей в поставке eCryptfs, является PAM-модуль pam_ecryptfs. Вызывается этот модуль во время логина пользователя и работает следующим образом. Если в домашнем каталоге обнаруживается файл ~/.ecryptfs/wrapped-passphrase, а также файл ~/.ecryptfs/auto-mount то модуль pam_ecryptfs расшифровывает содержимое файла ~/.ecryptfs/wrapped-passphrase, используя пароль пользователя. Далее расшифрованное содержимое используется в качестве пароля при монтировании каталога ~/.Private в точку ~/Private. Таким образом, пользователю не нужно дополнительно монтировать каталог с личными зашифрованными данными, всё происходит автоматически. Для того, чтобы модуль работал, он должен быть соответствующим образом объявлен в /etc/pam.d/common-auth:

auth    required        pam_ecryptfs.so unwrap

и в /etc/pam.d/common-session:

session optional        pam_ecryptfs.so unwrap

Зашифрованный персональный каталог Private

Чтобы пользователям было сухо и комфортно при самостоятельном создании Private-каталогов, разработчики включили в поставку eCryptfs специальный shell-скрипт ecryptfs-setup-private, который делает всю работу по подготовке персонального шифрованного хранилища:

  1. создаёт каталоги  ~/.Private и ~/Private;
  2. шифрует пароль монтирования и сохраняет его в ~/.ecryptfs/wrapped-passphrase;
  3. позволяет настроить опции автомонтирования/размонтирования и т. п.

Работает сценарий очень просто и при запуске в режиме «по умолчанию» не требует никаких дополнительных параметров:

$ ecryptfs-setup-private

На следующий запрос введите ваш пароль, который используете при аутентификации в системе:

Enter your login passphrase:

После вам будет предложено ввести пароль, который будет использоваться при монтировании. Если не заполнять это поле, то пароль будет сгенерирован автоматически:

Enter your mount passphrase [leave blank to generate one]:

Очередное напоминание для забывчивых:

************************************************************************
YOU SHOULD RECORD YOUR MOUNT PASSPHRASE AND STORE IT IN A SAFE LOCATION.
  ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase
THIS WILL BE REQUIRED IF YOU NEED TO RECOVER YOUR DATA AT A LATER TIME.
************************************************************************

создание файлов, каталогов и тестирование:

Done configuring.
Testing mount/write/umount/read...
Testing succeeded.

И, наконец, сообщение о том, что теперь достаточно перевойти в систему, чтобы начать пользоваться благами цивилизации:

Logout, and log back in to begin using your encrypted directory.

Заново авторизуйтесь с системе и посмотрите, смонтировался ли каталог ~/.Private:

mount | grep Private
/home/ashep/.Private on /home/ashep/Private type ecryptfs (ecryptfs_sig=1ed127ee6eb43a05,ecryptfs_fnek_sig=2f5ceedfd83a052d,ecryptfs_cipher=aes,ecryptfs_key_bytes=16)

Всё отлично, самое время проверить работоспособность нашего нового хранилища:

$ echo "Hello, world" > ~/Private/hello.txt
$ ls -l ~/.Private/
total 12
-rw-r--r-- 1 ashep ashep 12288 Feb  7 03:14 ECRYPTFS_FNEK_ENCRYPTED.FWYjLCvTq1c39ETk7I99JlZPttqOZToCEDxsV7hasxemXl1ISz2J-43cKk--

Теперь, когда вы выйдите из системы, модуль pam_ecryptfs автоматически размонтирует точку ~/Private, таким образом оставив ваши данные в зашифрованном каталоге ~/.Private. Если вы не хотите, чтобы каталог ~/Private монтировался и/или размонтировался автоматически, удалите соответственно файл ~/.ecryptfs/auto-mount и/или ~/.ecryptfs/auto-umount.

Также имейте ввиду, что сценарий ecryptfs-setup-private принимает ряд опций, при помощи которых вы можете управляет его поведением:

$ ecryptfs-setup-private --help

Usage:

/usr/bin/ecryptfs-setup-private [-f|--force] [-w|--wrapping] [--nopwcheck] [-n|--no-fnek]
  [-u|--username USER] [-l|--loginpass LOGINPASS]
  [-m|--mountpass MOUNTPASS]

 -f, --force      Force overwriting of an existing setup
 -w, --wrapping   Use an independent wrapping passphrase,
                  different from the login passphrase
 -n, --no-fnek    Do not encrypt filenames; If this flag is
                  omitted, and the kernel supports filename
                  encryption, then filenames will be encrypted
 -u, --username   Username for encrypted private mountpoint,
                  defaults to yourself
 -l, --loginpass  Login/Wrapping passphrase for USER,
                  used to wrap MOUNTPASS
 --nopwcheck      Do not check the validity of the specified
                  login password (useful for LDAP user accounts)
 --noautomount    Setup this user such that the encrypted private
                  directory is not automatically mounted on login
 --noautoumount   Setup this user such that the encrypted private
                  directory is not automatically unmounted at
                  logout
 -m, --mountpass  Passphrase for mounting the ecryptfs directory,
                  defaults to randomly generated 16 bytes
 -b, --bootstrap  Bootstrap a new user's entire home directory
                  Generates a random mount passphrase, which
          will be wrapped when the new login passphrase
          is set. SHOULD ONLY BE CALLED FROM 'adduser'.
 --undo           Provide instructions on how to undo an
                  encrypted private setup
   Be sure to properly escape your parameters according to your
   shell's special character nuances, and also surround the
   parameters by double quotes, if necessary.

Полное шифрование домашнего каталога

Идея хранения критически-важных данных в отдельном каталоге очень даже недурна собой, но не лишена очевидного недостатка. А именно: вы обязаны постоянно выбирать, что нужно шифровать, а что не нужно. Ну, или хранить вообще всё в Private-каталоге, что, мягко-говоря, не очень удобно. Вместо того, чтобы выделять отдельный каталог, не лучше ли зашифровать вообще весь домашний каталог? Именно это и предлагает вам Ubuntu при установке, и именно eCryptfs она для этого использует!

Если вы при установке выбрали опцию, показанную на скриншоте в начале статьи, то вы уже являетесь счастливым защищённым от врага пользователем. Если же это не так, но вам очень хочется спрятать от чужих глаз свои данные в случае чего и вы уже поняли, что eCryptfs — это именно то, что вам нужно для этого, то нет проблем!

Основная загвоздка при полном шифровании домашнего каталога состоит в том, что необходимо «вынести» каталог с зашифрованными данными за пределы точки монтирования. Разработчики Ubuntu решили проблему очень просто:

# ls -l /home/ashep/.Private
lrwxrwxrwx 1 ashep ashep 30 2011-12-07 04:44 /home/ashep/.Private -> /home/.ecryptfs/ashep/.Private

То есть, в домашнем каталоге находится лишь символическая ссылка, следуя которой, eCryptfs монтирует нужный каталог. При этом, точка монтирования переопределена в файле ~/.ecryptfs/Private.mnt и указывает на домашний каталог пользователя, т. е., в данном случае, на /home/ashep. Гениально и просто!

Чтобы избавить вас от необходимости перемещать файлы и настраивать вручную все пути и символические ссылки, разработчики предлагают shell-сценарий ecryptfs-migrate-home, который проделает всю «грязную» работу за вас. Также разработчики предупреждают о том, что этот сценарий может сделать ваши данные недоступными, если вдруг что-то пойдёт не так, поэтому обязательно сделайте резервную копию перед тем, как будете запускать скрипт! Также перед запуском убедитесь, что в системе установлены утилиты rsync и lsof, а также в том, что на разделе, где находится /home, имеется достаточно свободного места.

Сценарий необходимо запускать от root, передав в качестве параметра логин пользователя, который «мигрирует». Пользователь не должен находится в системе, а также от его имени не должно быть запущено ни одного процесса.

ecryptfs-migrate-home -u ashep
INFO:  Checking disk space, this may take a few moments.  Please be patient.
INFO:  Checking for open files in /home/ashep

************************************************************************
YOU SHOULD RECORD YOUR MOUNT PASSPHRASE AND STORE IT IN A SAFE LOCATION.
  ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase
THIS WILL BE REQUIRED IF YOU NEED TO RECOVER YOUR DATA AT A LATER TIME.
************************************************************************

Done configuring.

INFO:  Encrypted home has been set up, encrypting files now...this may take a while.

========================================================================
Some Important Notes!

 1. The file encryption appears to have completed successfully, however,
    ashep MUST LOGIN IMMEDIATELY, _BEFORE_THE_NEXT_REBOOT_,
    TO COMPLETE THE MIGRATION!!!

 2. If ashep can log in and read and write their files, then the migration is complete,
    and you should remove /home/ashep.81yFQbNJ.
    Otherwise, restore /home/ashep.81yFQbNJ back to /home/ashep.

 3. ashep should also run 'ecryptfs-unwrap-passphrase' and record
    their randomly generated mount passphrase as soon as possible.
 4. To ensure the integrity of all encrypted data on this system, you
    should also encrypted swap space with 'ecryptfs-setup-swap'.
========================================================================

Если всё пройдёт успешно, то, как требует сценарий, мигрировавший пользователь должен войти в систему до перезагрузки. Также обратите внимание, что скрипт оставляет копию незашифрованных данных в отдельном каталоге (в приведённом примере это /home/ashep.81yFQbNJ), который необходимо удалить после того, как пользователь определит, что всё прошло успешно.

Теперь, когда мигрировавший пользователь войдёт в систему, его домашний каталог будет смонтирован следующим образом:

mount | grep Private
/home/ashep/.Private on /home/ashep type ecryptfs (ecryptfs_sig=d8324d90c49de223,ecryptfs_fnek_sig=c4c68e3df79abc0a,ecryptfs_cipher=aes,ecryptfs_key_bytes=16)

при этом ~/.Private является символической ссылкой на каталог за пределами домашней папки:

ls -l /home/ashep/.Private
lrwxrwxrwx 1 ashep ashep 30 Feb 7 03:48 /home/ashep/.Private -> /home/.ecryptfs/ashep/.Private




eCryptfs и шифрование домашнего каталога в Linux: 4 комментария

  1. Признаться, классная, объёмная и полезная статья. Я обычно использую truecrypt или же шифрую нужные данные с помощью gpg, но это все вручную. Любой, кто поменяет пароль от рута на моей учётке, без проблем откроет и браузер, где сохранены пароли на некоторые форумы, к примеру. Тут, как я понимаю, будет сложнее добыть информацию.

  2. Aleksdem, если вы с TrueCrypt будете использовать пароли вместо ключей или же хранить ключи так, чтобы до них нельзя было добраться, получив доступ к машине, то и получить доступ к данным будет практически нереально.

    А eCryptfs понравилась мне лично из-за того, что умеет делать модуль pam_ecryptfs. В остальном — всё те же алгоритмы и уровень защиты.

  3. Привет всем, при установке ubuntu server также надо шывровать домашний каталог?

    p.s. Наперед спасибо за ответ

  4. проверил на debian 6

    зашифровал дом. каталог пользователя test

    # su test

    и вуаля — все файлы доступны

    подозреваю, что это так же будет работать под любым судоером, следовательно имеет смысл только в системе с одним судоером и то надо тестить, не знаю как сбрасывается пароль в системе без рута

Комментарии запрещены.