klink0v (klink0v) wrote,
klink0v
klink0v

Курощение LUKS

Допустим, у вас есть ноутбук с Linux на борту, который вы везде таскаете с собой. При этом есть ненулевая вероятность, что его могут украсть, либо он потеряется сам по себе. Хотелось бы как-то защитить свои данные. Единственный способ сделать это — шифровать их.

Linux умеет eCryptFS, которая довольно неплохо интегрируется в графическую пользовательскую среду. Но она мне по некоторым причинам не нравится. Я признаю только блочные устройства, только LUKS и только хардкор. Не в последнюю очередь ввиду того, что я (внезапно) могу монтировать LUKS+ext2 даже в винде. В том числе недавно пробовал под Windows 8.1  — всё ОК. Работает нормально, каши не просит. Кроссплатформенность рулит.

Таким образом, самый правильный метод — поместить на LUKS-раздел весь свой "/home" целиком. Но что делать, если этим компьютером кроме вас пользуется кто-нибудь ещё? Брат, сват, начальник, не знаю кто. И он(а) не хочет каждый раз при загрузке машины вводить длинный и корявый пароль от криптораздела, тем более что никакой ценной информации у него (неё) всё равно там нет. Ниже предлагаю решение для подобной ситуации.

Итак, галопом по Европам. Сперва вкратце о том, как создавать этот самый шифрованный раздел.


  1. Распределяем свободное место на накопителе как обычно. Не забываем про выравнивание по 4К-секторам для современных жестких дисков и по страницам памяти для флешек и SSD-шек. Лично мне нравится parted, но подойдёт что угодно. Для примера пусть целевой раздел называется "/dev/sda7".

  2. Забиваем его псевдослучайными данными. Чтобы никто не догадался. Заклинание:
    openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > /dev/sda7

  3. Создаём собственно LUKS-заголовок. Параметры являются делом вкуса, но лично мне душу греют вот такие значения.
    cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 512 --hash sha512  --iter-time 5000 /dev/sda7

  4. Не лишним также будет забэкапить этот загловок и сохранить в сухом и тёмном месте. Во избежание. А то ж если вдруг случайно побьётся, ужос-ужос как грустно будет.

  5. Активируем раздел. Попутно придумываем ему какое-нибудь имя. Пусть для примера будет "myhome".
    cryptsetup luksOpen /dev/sda7 myhome

  6. Пишем поверх криптораздела файловую систему. Тип и параметры опять-же зависят от предполагаемого использования. Если нужно будет её потом читать из-под винды, то лучше брать ext2 с размером inode=128. Если она будет лежать на SSD-шке, то разумнее использовать ext4. Если раздел достаточно большой, то имеет смысл ручками задать число Inod-ов, а не то с дефолтными настройками он на 60-гиговом диске отожрет 1 гигабайт чисто под метаданные. Которые всё равно никогда в жизни не заполнятся ничем полезным. Поэтому лично я поступаю как-то так:
    mkfs.ext4 -b 4096 -I 128 -N 1006080 -m 0 -L myhome -O large_file,sparse_super,^ext_attr /dev/mapper/myhome

  7. Выполняем команду "blkid" и заботливо выписываем куда-нибудь на бумажку или в текстовый файлик UUID-ы двух блочных устройств: раздела "до-шифрования" (/dev/sda7) и раздела "после-шифрования" (/dev/mapper/myhome). Они нам чуть позже пригодятся.

Итак, создали. Фуф. Теперь надо объяснить пингвину, в какой момент нужно выпрашивать у нас пароль и куда монтировать всё это чудо опосля расшифровки.


  1. Идём в старый добрый "/etc/fstab" и рисуем там точку монтирования. Куда именно — вам виднее.
    UUID=2ef13463-e14a-4eb2-b4a0-f7ae5fb1fd7e /home/stas ext4 nofail,noatime,nodiratime,nouser_xattr 0 0
    Обратите внимание на опцию "nofail", это самое важное. Всё остальное — дело вкуса. Для SSD-шек можно ещё trim указать. UUID мы берём с предыдущего шага.

  2. Теперь курочим "/etc/crypttab".
    myhome UUID=009e297c-e352-4d92-879a-c3d09f0f2581 none luks,noauto
    Здесь основная магия заключена в заклинании "noauto". UUID также берём с шага номер 7 (говорил же, пригодится, а вы не верили). Для SSD-шки в конце также полезно будет дописать опцию "discard".

  3. Вооот. И почти что финал. Смотрим мой предыдущий псто. Там говорится о том, как запилить systemd с тем, чтобы он отдал нам один псевдотерминал (tty) под наши грязные нужды. В данном случае — под интерактивное приглашение ввода пароля для криптораздела. Особо повторяться не буду. Сперва уменьшаем количество этих самых псевдотерминалов руной "NAutoVTs=2" в "/etc/systemd/logind.conf". А потом подкладываем яйцо дракона конфиг для systemd примерно нижеследующего содержания.
    [Unit]
    Description=CryptStart on TTY3

    [Service]
    Type=idle
    ExecStart=/sbin/cryptdisks_start myhome
    StandardInput=tty
    StandardOutput=tty
    TTYPath=/dev/tty3

    [Install]
    WantedBy = multi-user.target
    Где параметр для утилиты (которая на самом деле shell-скрипт) "cryptdisks_start" обязательно должен совпадать с тем, что вы там понаписали в "/etc/crypttab". Всё остальное особой роли не играет.

Усё. Теперь при загрузке компьютера неискушённый пользователь ничего не заметит. А искушенный, прежде чем логиниться в "иксы", сперва нажмёт на клавиатуре комбинацию "Alt-Ctrl+F3", где его будет терпеливо дожидаться промпт ввода пароля. Там он прошепчет свою секретную фразу, нажмёт Enter, подождёт немного. После чего жмакнет "Alt+F7" и только тогда со спокойной душой введёт пароль на вход в систему. Как говорится, "мой /home — моя крепость"!
Tags: linux, luks, администрирование, безопасность, криптография
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 1 comment