mirror of
https://gitlab.com/cryptsetup/cryptsetup.git
synced 2025-12-05 16:00:05 +01:00
2503 lines
106 KiB
Plaintext
2503 lines
106 KiB
Plaintext
Sections
|
|
|
|
1. General Questions
|
|
2. Setup
|
|
3. Common Problems
|
|
4. Troubleshooting
|
|
5. Security Aspects
|
|
6. Backup and Data Recovery
|
|
7. Interoperability with other Disk Encryption Tools
|
|
8. Issues with Specific Versions of cryptsetup
|
|
9. References and Further Reading
|
|
A. Contributors
|
|
|
|
|
|
1. General Questions
|
|
|
|
|
|
* 1.1 What is this?
|
|
|
|
This is the FAQ (Frequently Asked Questions) for cryptsetup. It
|
|
covers Linux disk encryption with plain dm-crypt (one passphrase,
|
|
no management, no metadata on disk) and LUKS (multiple user keys
|
|
with one master key, anti-forensic features, metadata block at
|
|
start of device, ...). The latest version of this FAQ should
|
|
usually be available at
|
|
https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions
|
|
|
|
|
|
* 1.2 WARNINGS
|
|
|
|
ATTENTION: If you are going to read just one thing, make it the
|
|
section on Backup and Data Recovery. By far the most questions on
|
|
the cryptsetup mailing list are from people that managed to damage
|
|
the start of their LUKS partitions, i.e. the LUKS header. In
|
|
most cases, there is nothing that can be done to help these poor
|
|
souls recover their data. Make sure you understand the problem and
|
|
limitations imposed by the LUKS security model BEFORE you face
|
|
such a disaster! In particular, make sure you have a current header
|
|
backup before doing any potentially dangerous operations.
|
|
|
|
SSDs/FLASH DRIVES: SSDs and Flash are different. Currently it is
|
|
unclear how to get LUKS or plain dm-crypt to run on them with the
|
|
full set of security features intact. This may or may not be a
|
|
problem, depending on the attacker model. See Section 5.19.
|
|
|
|
BACKUP: Yes, encrypted disks die, just as normal ones do. A full
|
|
backup is mandatory, see Section "6. Backup and Data Recovery" on
|
|
options for doing encrypted backup.
|
|
|
|
CLONING/IMAGING: If you clone or image a LUKS container, you make a
|
|
copy of the LUKS header and the master key will stay the same!
|
|
That means that if you distribute an image to several machines, the
|
|
same master key will be used on all of them, regardless of whether
|
|
you change the passphrases. Do NOT do this! If you do, a root-user
|
|
on any of the machines with a mapped (decrypted) container or a
|
|
passphrase on that machine can decrypt all other copies, breaking
|
|
security. See also Item 6.15.
|
|
|
|
DISTRIBUTION INSTALLERS: Some distribution installers offer to
|
|
create LUKS containers in a way that can be mistaken as activation
|
|
of an existing container. Creating a new LUKS container on top of
|
|
an existing one leads to permanent, complete and irreversible data
|
|
loss. It is strongly recommended to only use distribution
|
|
installers after a complete backup of all LUKS containers has been
|
|
made.
|
|
|
|
UBUNTU INSTALLER: In particular the Ubuntu installer seems to be
|
|
quite willing to kill LUKS containers in several different ways.
|
|
Those responsible at Ubuntu seem not to care very much (it is very
|
|
easy to recognize a LUKS container), so treat the process of
|
|
installing Ubuntu as a severe hazard to any LUKS container you may
|
|
have.
|
|
|
|
NO WARNING ON NON-INTERACTIVE FORMAT: If you feed cryptsetup from
|
|
STDIN (e.g. via GnuPG) on LUKS format, it does not give you the
|
|
warning that you are about to format (and e.g. will lose any
|
|
pre-existing LUKS container on the target), as it assumes it is
|
|
used from a script. In this scenario, the responsibility for
|
|
warning the user and possibly checking for an existing LUKS header
|
|
is shifted to the script. This is a more general form of the
|
|
previous item.
|
|
|
|
LUKS PASSPHRASE IS NOT THE MASTER KEY: The LUKS passphrase is not
|
|
used in deriving the master key. It is used in decrypting a master
|
|
key that is randomly selected on header creation. This means that
|
|
if you create a new LUKS header on top of an old one with
|
|
exactly the same parameters and exactly the same passphrase as the
|
|
old one, it will still have a different master key and your data
|
|
will be permanently lost.
|
|
|
|
PASSPHRASE CHARACTER SET: Some people have had difficulties with
|
|
this when upgrading distributions. It is highly advisable to only
|
|
use the 95 printable characters from the first 128 characters of
|
|
the ASCII table, as they will always have the same binary
|
|
representation. Other characters may have different encoding
|
|
depending on system configuration and your passphrase will not
|
|
work with a different encoding. A table of the standardized first
|
|
128 ASCII characters can, e.g. be found on
|
|
http://en.wikipedia.org/wiki/ASCII
|
|
|
|
|
|
* 1.3 System specific warnings
|
|
|
|
- Ubuntu as of 4/2011: It seems the installer offers to create
|
|
LUKS partitions in a way that several people mistook for an offer
|
|
to activate their existing LUKS partition. The installer gives no
|
|
or an inadequate warning and will destroy your old LUKS header,
|
|
causing permanent data loss. See also the section on Backup and
|
|
Data Recovery.
|
|
|
|
This issue has been acknowledged by the Ubuntu dev team, see here:
|
|
http://launchpad.net/bugs/420080
|
|
|
|
Update 4/2013: I am still unsure whether this has been fixed by
|
|
now, best be careful. They also seem to have added even more LUKS
|
|
killer functionality to the Ubuntu installer. I can only strongly
|
|
recommended to not install Ubuntu on a system with existing LUKS
|
|
containers without complete backups.
|
|
|
|
|
|
* 1.4 My LUKS-device is broken! Help!
|
|
|
|
First: Do not panic! In many cases the data is still recoverable.
|
|
Do not do anything hasty! Steps:
|
|
|
|
- Take some deep breaths. Maybe add some relaxing music. This may
|
|
sound funny, but I am completely serious. Often, critical damage is
|
|
done only after the initial problem.
|
|
|
|
- Do not reboot. The keys mays still be in the kernel if the device
|
|
is mapped.
|
|
|
|
- Make sure others do not reboot the system.
|
|
|
|
- Do not write to your disk without a clear understanding why this
|
|
will not make matters worse. Do a sector-level backup before any
|
|
writes. Often you do not need to write at all to get enough access
|
|
to make a backup of the data.
|
|
|
|
- Relax some more.
|
|
|
|
- Read section 6 of this FAQ.
|
|
|
|
- Ask on the mailing-list if you need more help.
|
|
|
|
|
|
* 1.5 Who wrote this?
|
|
|
|
Current FAQ maintainer is Arno Wagner <arno@wagner.name>. If you
|
|
want to send me encrypted email, my current PGP key is DSA key
|
|
CB5D9718, fingerprint 12D6 C03B 1B30 33BB 13CF B774 E35C 5FA1 CB5D
|
|
9718.
|
|
|
|
Other contributors are listed at the end. If you want to contribute,
|
|
send your article, including a descriptive headline, to the
|
|
maintainer, or the dm-crypt mailing list with something like "FAQ
|
|
..." in the subject. You can also send more raw information and
|
|
have me write the section. Please note that by contributing to this
|
|
FAQ, you accept the license described below.
|
|
|
|
This work is under the "Attribution-Share Alike 3.0 Unported"
|
|
license, which means distribution is unlimited, you may create
|
|
derived works, but attributions to original authors and this
|
|
license statement must be retained and the derived work must be
|
|
under the same license. See
|
|
http://creativecommons.org/licenses/by-sa/3.0/ for more details of
|
|
the license.
|
|
|
|
Side note: I did text license research some time ago and I think
|
|
this license is best suited for the purpose at hand and creates the
|
|
least problems.
|
|
|
|
|
|
* 1.6 Where is the project website?
|
|
|
|
There is the project website at https://gitlab.com/cryptsetup/cryptsetup/
|
|
Please do not post questions there, nobody will read them. Use
|
|
the mailing-list instead.
|
|
|
|
|
|
* 1.7 Is there a mailing-list?
|
|
|
|
Instructions on how to subscribe to the mailing-list are at on the
|
|
project website. People are generally helpful and friendly on the
|
|
list.
|
|
|
|
The question of how to unsubscribe from the list does crop up
|
|
sometimes. For this you need your list management URL, which is
|
|
sent to you initially and once at the start of each month. Go to
|
|
the URL mentioned in the email and select "unsubscribe". This page
|
|
also allows you to request a password reminder.
|
|
|
|
Alternatively, you can send an Email to dm-crypt-request@saout.de
|
|
with just the word "help" in the subject or message body. Make sure
|
|
to send it from your list address.
|
|
|
|
The mailing list archive is here:
|
|
http://dir.gmane.org/gmane.linux.kernel.device-mapper.dm-crypt
|
|
|
|
|
|
* 1.8 Unsubscribe from the mailing-list
|
|
|
|
Send mail to dm-crypt-unsubscribe@saout.de from the subscribed
|
|
account. You will get an email with instructions.
|
|
|
|
Basically, you just have to respond to it unmodified to get
|
|
unsubscribed. The listserver admin functions are not very fast. It
|
|
can take 15 minutes or longer for a reply to arrive (I suspect
|
|
greylisting is in use), so be patient.
|
|
|
|
Also note that nobody on the list can unsubscribe you, sending
|
|
demands to be unsubscribed to the list just annoys people that are
|
|
entirely blameless for you being subscribed.
|
|
|
|
If you are subscribed, a subscription confirmation email was sent
|
|
to your email account and it had to be answered before the
|
|
subscription went active. The confirmation emails from the
|
|
listserver have subjects like these (with other numbers):
|
|
|
|
Subject: confirm 9964cf10.....
|
|
|
|
and are sent from dm-crypt-request@saout.de. You should check
|
|
whether you have anything like it in your sent email folder. If
|
|
you find nothing and are sure you did not confirm, then you should
|
|
look into a possible compromise of your email account.
|
|
|
|
|
|
2. Setup
|
|
|
|
|
|
* 2.1 LUKS Container Setup mini-HOWTO
|
|
|
|
This item tries to give you a very brief list of all the steps you
|
|
should go though when creating a new LUKS encrypted container, i.e.
|
|
encrypted disk, partition or loop-file.
|
|
|
|
01) All data will be lost, if there is data on the target, make a
|
|
backup.
|
|
|
|
02) Make very sure you have the right target disk, partition or
|
|
loop-file.
|
|
|
|
03) If the target was in use previously, it is a good idea to
|
|
wipe it before creating the LUKS container in order to remove any
|
|
trace of old file systems and data. For example, some users have
|
|
managed to run e2fsck on a partition containing a LUKS container,
|
|
possibly because of residual ext2 superblocks from an earlier use.
|
|
This can do arbitrary damage up to complete and permanent loss of
|
|
all data in the LUKS container.
|
|
|
|
To just quickly wipe file systems (old data may remain), use
|
|
|
|
wipefs -a <target device>
|
|
|
|
To wipe file system and data, use something like
|
|
|
|
cat /dev/zero > <target device>
|
|
|
|
This can take a while. To get a progress indicator, you can use
|
|
the tool dd_rescue (->google) instead or use my stream meter "wcs"
|
|
(source here: http://www.tansi.org/tools/index.html) in the
|
|
following fashion:
|
|
|
|
cat /dev/zero | wcs > <target device>
|
|
|
|
Be very sure you have the right target, all data will be lost!
|
|
|
|
Note that automatic wiping is on the TODO list for cryptsetup, so
|
|
at some time in the future this will become unnecessary.
|
|
|
|
Alternatively, plain cm-crypt can be used for a very fast wipe with
|
|
crypto-grade randomness, see Item 2.19
|
|
|
|
04) Create the LUKS container:
|
|
cryptsetup luksFormat <target device>
|
|
|
|
Just follow the on-screen instructions.
|
|
|
|
Note: Passphrase iteration is determined by cryptsetup depending on
|
|
CPU power. On a slow device, this may be lower than you want. I
|
|
recently benchmarked this on a Raspberry Pi and it came out at
|
|
about 1/15 of the iteration count for a typical PC. If security is
|
|
paramount, you may want to increase the time spent in iteration, at
|
|
the cost of a slower unlock later. For the Raspberry Pi, using
|
|
|
|
cryptsetup luksFormat -i 15000 <target device>
|
|
|
|
gives you an iteration count and security level equal to an average
|
|
PC for passphrase iteration and master-key iteration. If in doubt,
|
|
check the iteration counts with
|
|
|
|
cryptsetup luksDump <target device>
|
|
|
|
and adjust the iteration count accordingly by creating the container
|
|
again with a different iteration time (the number after '-i' is the
|
|
iteration time in milicesonds) until your requirements are met.
|
|
|
|
05) Map the container. Here it will be mapped to /dev/mapper/c1:
|
|
cryptsetup luksOpen <target device> c1
|
|
|
|
06) (Optionally) wipe the container (make sure you have the right target!):
|
|
cat /dev/zero > /dev/mapper/c1
|
|
|
|
Note that this creates a small information leak, as an attacker can
|
|
determine whether a 512 byte block is zero if the attacker has
|
|
access to the encrypted container multiple times. Typically a
|
|
competent attacker that has access multiple times can install a
|
|
passphrase sniffer anyways, so this leakage is not very
|
|
significant. For getting a progress indicator, see step 03.
|
|
|
|
Note that at some time in the future, cryptsetup will do this for
|
|
you, but currently it is a TODO list item.
|
|
|
|
07) Create a file system in the mapped container, for example an
|
|
ext3 file system (any other file system is possible):
|
|
|
|
mke2fs -j /dev/mapper/c1
|
|
|
|
08) Mount your encrypted file system, here on /mnt:
|
|
mount /dev/mapper/c1 /mnt
|
|
|
|
Done. You can now use the encrypted file system to store data. Be
|
|
sure to read though the rest of the FAQ, these are just the very
|
|
basics. In particular, there are a number of mistakes that are
|
|
easy to make, but will compromise your security.
|
|
|
|
|
|
* 2.2 LUKS on partitions or raw disks?
|
|
|
|
This is a complicated question, and made more so by the availability
|
|
of RAID and LVM. I will try to give some scenarios and discuss
|
|
advantages and disadvantages. Note that I say LUKS for simplicity,
|
|
but you can do all the things described with plain dm-crypt as well.
|
|
Also note that your specific scenario may be so special that most
|
|
or even all things I say below do not apply.
|
|
|
|
Be aware that if you add LVM into the mix, things can get very
|
|
complicated. Same with RAID but less so. In particular, data
|
|
recovery can get exceedingly difficult. Only do so if you have a
|
|
really good reason and always remember KISS is what separates an
|
|
engineer from an amateur. Of course, if you really need the added
|
|
complexity, KISS is satisfied. But be very sure as there is a price
|
|
to pay for it. In engineering, complexity is always the enemy and
|
|
needs to be fought without mercy when encountered.
|
|
|
|
Also consider using RAID instead of LVM, as at least with the old
|
|
superblock format 0.90, the RAID superblock is in the place (end
|
|
of disk) where the risk of it permanently damaging the LUKS header
|
|
is smallest and you can have your array assembled by the RAID
|
|
controller (i.e. the kernel), as it should be. Use partition type
|
|
0xfd for that. I recommend staying away from superblock formats
|
|
1.0, 1.1 and 1.2 unless you really need them. Be aware that you
|
|
lose autodetection with them and have to fall back to some
|
|
user-space script to do it.
|
|
|
|
Scenarios:
|
|
|
|
(1) Encrypted partition: Just make a partition to your liking,
|
|
and put LUKS on top of it and a filesystem into the LUKS container.
|
|
This gives you isolation of differently-tasked data areas, just as
|
|
ordinary partitioning does. You can have confidential data,
|
|
non-confidential data, data for some specific applications,
|
|
user-homes, root, etc. Advantages are simplicity as there is a 1:1
|
|
mapping between partitions and filesystems, clear security
|
|
functionality and the ability to separate data into different,
|
|
independent (!) containers.
|
|
|
|
Note that you cannot do this for encrypted root, that requires an
|
|
initrd. On the other hand, an initrd is about as vulnerable to a
|
|
competent attacker as a non-encrypted root, so there really is no
|
|
security advantage to doing it that way. An attacker that wants to
|
|
compromise your system will just compromise the initrd or the
|
|
kernel itself. The better way to deal with this is to make sure the
|
|
root partition does not store any critical data and move that to
|
|
additional encrypted partitions. If you really are concerned your
|
|
root partition may be sabotaged by somebody with physical access
|
|
(that would however strangely not, say, sabotage your BIOS,
|
|
keyboard, etc.), protect it in some other way. The PC is just not
|
|
set-up for a really secure boot-chain (whatever some people may
|
|
claim).
|
|
|
|
(2) Fully encrypted raw block device: For this, put LUKS on the
|
|
raw device (e.g. /dev/sdb) and put a filesystem into the LUKS
|
|
container, no partitioning whatsoever involved. This is very
|
|
suitable for things like external USB disks used for backups or
|
|
offline data-storage.
|
|
|
|
(3) Encrypted RAID: Create your RAID from partitions and/or full
|
|
devices. Put LUKS on top of the RAID device, just if it were an
|
|
ordinary block device. Applications are just the same as above, but
|
|
you get redundancy. (Side note as many people seem to be unaware of
|
|
it: You can do RAID1 with an arbitrary number of components in
|
|
Linux.) See also Item 2.8.
|
|
|
|
(4) Now, some people advocate doing the encryption below the RAID
|
|
layer. That has several serious problems. One is that suddenly
|
|
debugging RAID issues becomes much harder. You cannot do automatic
|
|
RAID assembly anymore. You need to keep the encryption keys for the
|
|
components in sync or manage them somehow. The only possible
|
|
advantage is that things may run a little faster as more CPUs do
|
|
the encryption, but if speed is a priority over security and
|
|
simplicity, you are doing this wrong anyways. A good way to
|
|
mitigate a speed issue is to get a CPU that does hardware AES.
|
|
|
|
|
|
* 2.3 How do I set up encrypted swap?
|
|
|
|
As things that are confidential can end up in swap (keys,
|
|
passphrases, etc. are usually protected against being swapped to
|
|
disk, but other things may not be), it may be advisable to do
|
|
something about the issue. One option is to run without swap, which
|
|
generally works well in a desktop-context. It may cause problems
|
|
in a server-setting or under special circumstances. The solution to
|
|
that is to encrypt swap with a random key at boot-time.
|
|
|
|
NOTE: This is for Debian, and should work for Debian-derived
|
|
distributions. For others you may have to write your own startup
|
|
script or use other mechanisms.
|
|
|
|
01) Add the swap partition to /etc/crypttab. A line like the following
|
|
should do it:
|
|
|
|
swap /dev/<partition> /dev/urandom swap,noearly
|
|
|
|
Warning: While Debian refuses to overwrite partitions with a
|
|
filesystem or RAID signature on it, if your disk IDs may change
|
|
(adding or removing disks, failure of disk during boot, etc.), you
|
|
may want to take additional precautions. Yes, this means that your
|
|
kernel device names like sda, sdb, ... can change between reboots!
|
|
This is not a concern if you have only one disk. One possibility is
|
|
to make sure the partition number is not present on additional
|
|
disks or also swap there. Another is to encapsulate the swap
|
|
partition (by making it a 1-disk RAID1 or by using LVM), so that it
|
|
gets a persistent identifier. Specifying it directly by UUID does
|
|
not work, unfortunately, as the UUID is part of the swap signature
|
|
and that is not visible from the outside due to the encryption and
|
|
in addition changes on each reboot with this setup.
|
|
|
|
Note: Use /dev/random if you are paranoid or in a potential
|
|
low-entropy situation (embedded system, etc.). This may cause the
|
|
operation to take a long time during boot. If you are in a "no
|
|
entropy" situation, you cannot encrypt swap securely. In this
|
|
situation you should find some entropy, also because nothing else
|
|
using crypto will be secure, like ssh, ssl or GnuPG.
|
|
|
|
Note: The "noearly" option makes sure things like LVM, RAID, etc.
|
|
are running. As swap is non-critical for boot, it is fine to start
|
|
it late.
|
|
|
|
02) Add the swap partition to /etc/fstab. A line like the following
|
|
should do it:
|
|
|
|
/dev/mapper/swap none swap sw 0 0
|
|
|
|
That is it. Reboot or start it manually to activate encrypted swap.
|
|
Manual start would look like this:
|
|
|
|
/etc/init.d/crypdisks start
|
|
swapon /dev/mapper/swap
|
|
|
|
|
|
* 2.4 What is the difference between "plain" and LUKS format?
|
|
|
|
First, unless you happen to understand the cryptographic background
|
|
well, you should use LUKS. It does protect the user from a lot of
|
|
common mistakes. Plain dm-crypt is for experts.
|
|
|
|
Plain format is just that: It has no metadata on disk, reads all
|
|
parameters from the commandline (or the defaults), derives a
|
|
master-key from the passphrase and then uses that to de-/encrypt
|
|
the sectors of the device, with a direct 1:1 mapping between
|
|
encrypted and decrypted sectors.
|
|
|
|
Primary advantage is high resilience to damage, as one damaged
|
|
encrypted sector results in exactly one damaged decrypted sector.
|
|
Also, it is not readily apparent that there even is encrypted data
|
|
on the device, as an overwrite with crypto-grade randomness (e.g.
|
|
from /dev/urandom) looks exactly the same on disk.
|
|
|
|
Side-note: That has limited value against the authorities. In
|
|
civilized countries, they cannot force you to give up a crypto-key
|
|
anyways. In quite a few countries around the world, they can force
|
|
you to give up the keys (using imprisonment or worse to pressure
|
|
you, sometimes without due process), and in the worst case, they
|
|
only need a nebulous "suspicion" about the presence of encrypted
|
|
data. Sometimes this applies to everybody, sometimes only when you
|
|
are suspected of having "illicit data" (definition subject to
|
|
change) and sometimes specifically when crossing a border. Note
|
|
that this is going on in countries like the US and the UK, to
|
|
different degrees and sometimes with courts restricting what the
|
|
authorities can actually demand.
|
|
|
|
My advice is to either be ready to give up the keys or to not have
|
|
encrypted data when traveling to those countries, especially when
|
|
crossing the borders. The latter also means not having any
|
|
high-entropy (random) data areas on your disk, unless you can
|
|
explain them and demonstrate that explanation. Hence doing a
|
|
zero-wipe of all free space, including unused space, may be a good
|
|
idea.
|
|
|
|
Disadvantages are that you do not have all the nice features that
|
|
the LUKS metadata offers, like multiple passphrases that can be
|
|
changed, the cipher being stored in the metadata, anti-forensic
|
|
properties like key-slot diffusion and salts, etc..
|
|
|
|
LUKS format uses a metadata header and 8 key-slot areas that are
|
|
being placed at the beginning of the disk, see below under "What
|
|
does the LUKS on-disk format looks like?". The passphrases are used
|
|
to decrypt a single master key that is stored in the anti-forensic
|
|
stripes.
|
|
|
|
Advantages are a higher usability, automatic configuration of
|
|
non-default crypto parameters, defenses against low-entropy
|
|
passphrases like salting and iterated PBKDF2 passphrase hashing,
|
|
the ability to change passphrases, and others.
|
|
|
|
Disadvantages are that it is readily obvious there is encrypted
|
|
data on disk (but see side note above) and that damage to the
|
|
header or key-slots usually results in permanent data-loss. See
|
|
below under "6. Backup and Data Recovery" on how to reduce that
|
|
risk. Also the sector numbers get shifted by the length of the
|
|
header and key-slots and there is a loss of that size in capacity
|
|
(1MB+4096B for defaults and 2MB for the most commonly used
|
|
non-default XTS mode).
|
|
|
|
|
|
* 2.5 Can I encrypt an already existing, non-empty partition to use
|
|
LUKS?
|
|
|
|
There is no converter, and it is not really needed. The way to do
|
|
this is to make a backup of the device in question, securely wipe
|
|
the device (as LUKS device initialization does not clear away old
|
|
data), do a luksFormat, optionally overwrite the encrypted device,
|
|
create a new filesystem and restore your backup on the now
|
|
encrypted device. Also refer to sections "Security Aspects" and
|
|
"Backup and Data Recovery".
|
|
|
|
For backup, plain GNU tar works well and backs up anything likely
|
|
to be in a filesystem.
|
|
|
|
|
|
* 2.6 How do I use LUKS with a loop-device?
|
|
|
|
This can be very handy for experiments. Setup is just the same as
|
|
with any block device. If you want, for example, to use a 100MiB
|
|
file as LUKS container, do something like this:
|
|
|
|
head -c 100M /dev/zero > luksfile # create empty file
|
|
losetup /dev/loop0 luksfile # map luksfile to /dev/loop0
|
|
cryptsetup luksFormat /dev/loop0 # create LUKS on loop device
|
|
|
|
Afterwards just use /dev/loop0 as a you would use a LUKS partition.
|
|
To unmap the file when done, use "losetup -d /dev/loop0".
|
|
|
|
|
|
* 2.7 When I add a new key-slot to LUKS, it asks for a passphrase but
|
|
then complains about there not being a key-slot with that
|
|
passphrase?
|
|
|
|
That is as intended. You are asked a passphrase of an existing
|
|
key-slot first, before you can enter the passphrase for the new
|
|
key-slot. Otherwise you could break the encryption by just adding a
|
|
new key-slot. This way, you have to know the passphrase of one of
|
|
the already configured key-slots in order to be able to configure a
|
|
new key-slot.
|
|
|
|
|
|
* 2.8 Encryption on top of RAID or the other way round?
|
|
|
|
Unless you have special needs, place encryption between RAID and
|
|
filesystem, i.e. encryption on top of RAID. You can do it the other
|
|
way round, but you have to be aware that you then need to give the
|
|
passphrase for each individual disk and RAID autodetection will
|
|
not work anymore. Therefore it is better to encrypt the RAID
|
|
device, e.g. /dev/dm0 .
|
|
|
|
This means that the typical layering looks like this:
|
|
|
|
Filesystem <- top
|
|
|
|
|
Encryption
|
|
|
|
|
RAID
|
|
|
|
|
Raw partitions
|
|
|
|
|
Raw disks <- bottom
|
|
|
|
The big advantage is that you can manage the RAID container just
|
|
like any RAID container, it does not care that what is in it is
|
|
encrypted.
|
|
|
|
|
|
* 2.9 How do I read a dm-crypt key from file?
|
|
|
|
Use the --key-file option, like this:
|
|
|
|
cryptsetup create --key-file keyfile e1 /dev/loop0
|
|
|
|
This will read the binary key from file, i.e. no hashing or
|
|
transformation will be applied to the keyfile before its bits are
|
|
used as key. Extra bits (beyond the length of the key) at the end
|
|
are ignored. Note that if you read from STDIN, the data will still
|
|
be hashed, just as a key read interactively from the terminal. See
|
|
the man-page sections "NOTES ON PASSPHRASE PROCESSING..." for more
|
|
detail.
|
|
|
|
|
|
* 2.10 How do I read a LUKS slot key from file?
|
|
|
|
What you really do here is to read a passphrase from file, just as
|
|
you would with manual entry of a passphrase for a key-slot. You can
|
|
add a new passphrase to a free key-slot, set the passphrase of an
|
|
specific key-slot or put an already configured passphrase into a
|
|
file. In the last case make sure no trailing newline (0x0a) is
|
|
contained in the key file, or the passphrase will not work because
|
|
the whole file is used as input.
|
|
|
|
To add a new passphrase to a free key slot from file, use something
|
|
like this:
|
|
|
|
cryptsetup luksAddKey /dev/loop0 keyfile
|
|
|
|
To add a new passphrase to a specific key-slot, use something like
|
|
this:
|
|
|
|
cryptsetup luksAddKey --key-slot 7 /dev/loop0 keyfile
|
|
|
|
To supply a key from file to any LUKS command, use the --key-file
|
|
option, e.g. like this:
|
|
|
|
cryptsetup luksOpen --key-file keyfile /dev/loop0 e1
|
|
|
|
|
|
* 2.11 How do I read the LUKS master key from file?
|
|
|
|
The question you should ask yourself first is why you would want to
|
|
do this. The only legitimate reason I can think of is if you want
|
|
to have two LUKS devices with the same master key. Even then, I
|
|
think it would be preferable to just use key-slots with the same
|
|
passphrase, or to use plain dm-crypt instead. If you really have a
|
|
good reason, please tell me. If I am convinced, I will add how to
|
|
do this here.
|
|
|
|
|
|
* 2.12 What are the security requirements for a key read from file?
|
|
|
|
A file-stored key or passphrase has the same security requirements
|
|
as one entered interactively, however you can use random bytes and
|
|
thereby use bytes you cannot type on the keyboard. You can use any
|
|
file you like as key file, for example a plain text file with a
|
|
human readable passphrase. To generate a file with random bytes,
|
|
use something like this:
|
|
|
|
head -c 256 /dev/random > keyfile
|
|
|
|
|
|
* 2.13 If I map a journaled file system using dm-crypt/LUKS, does it
|
|
still provide its usual transactional guarantees?
|
|
|
|
Yes, it does, unless a very old kernel is used. The required flags
|
|
come from the filesystem layer and are processed and passed onwards
|
|
by dm-crypt. A bit more information on the process by which
|
|
transactional guarantees are implemented can be found here:
|
|
|
|
http://lwn.net/Articles/400541/
|
|
|
|
Please note that these "guarantees" are weaker than they appear to
|
|
be. One problem is that quite a few disks lie to the OS about
|
|
having flushed their buffers. Some other things can go wrong as
|
|
well. The filesystem developers are aware of these problems and
|
|
typically can make it work anyways. That said, dm-crypt/LUKS will
|
|
not make things worse.
|
|
|
|
One specific problem you can run into though is that you can get
|
|
short freezes and other slowdowns due to the encryption layer.
|
|
Encryption takes time and forced flushes will block for that time.
|
|
For example, I did run into frequent small freezes (1-2 sec) when
|
|
putting a vmware image on ext3 over dm-crypt. When I went back to
|
|
ext2, the problem went away. This seems to have gotten better with
|
|
kernel 2.6.36 and the reworking of filesystem flush locking
|
|
mechanism (less blocking of CPU activity during flushes). It
|
|
should improve further and eventually the problem should go away.
|
|
|
|
|
|
* 2.14 Can I use LUKS or cryptsetup with a more secure (external)
|
|
medium for key storage, e.g. TPM or a smartcard?
|
|
|
|
Yes, see the answers on using a file-supplied key. You do have to
|
|
write the glue-logic yourself though. Basically you can have
|
|
cryptsetup read the key from STDIN and write it there with your
|
|
own tool that in turn gets the key from the more secure key
|
|
storage.
|
|
|
|
For TPM support, you may want to have a look at tpm-luks at
|
|
https://github.com/shpedoikal/tpm-luks. Note that tpm-luks is not
|
|
related to the cryptsetup project.
|
|
|
|
|
|
* 2.15 Can I resize a dm-crypt or LUKS partition?
|
|
|
|
Yes, you can, as neither dm-crypt nor LUKS stores partition size.
|
|
Whether you should is a different question. Personally I recommend
|
|
backup, recreation of the encrypted partition with new size,
|
|
recreation of the filesystem and restore. This gets around the
|
|
tricky business of resizing the filesystem. Resizing a dm-crypt or
|
|
LUKS container does not resize the filesystem in it. The backup is
|
|
really non-optional here, as a lot can go wrong, resulting in
|
|
partial or complete data loss. Using something like gparted to
|
|
resize an encrypted partition is slow, but typically works. This
|
|
will not change the size of the filesystem hidden under the
|
|
encryption though.
|
|
|
|
You also need to be aware of size-based limitations. The one
|
|
currently relevant is that aes-xts-plain should not be used for
|
|
encrypted container sizes larger than 2TiB. Use aes-xts-plain64
|
|
for that.
|
|
|
|
|
|
* 2.16 How do I Benchmark the Ciphers, Hashes and Modes?
|
|
|
|
Since version 1.60 cryptsetup supports the "benchmark" command.
|
|
Simply run as root:
|
|
|
|
cryptsetup benchmark
|
|
|
|
It will output first iterations/second for the key-derivation
|
|
function PBKDF2 parameterized with different hash-functions, and
|
|
then the raw encryption speed of ciphers with different modes and
|
|
key-sizes. You can get more than the default benchmarks, see the
|
|
man-page for the relevant parameters. Note that XTS mode takes two
|
|
keys, hence the listed key sizes are double that for other modes
|
|
and half of it is the cipher key, the other half is the XTS key.
|
|
|
|
|
|
* 2.17 How do I Verify I have an Authentic cryptsetup Source Package?
|
|
|
|
Current maintainer is Milan Broz and he signs the release packages
|
|
with his PGP key. The key he currently uses is the "RSA key ID
|
|
D93E98FC", fingerprint 2A29 1824 3FDE 4664 8D06 86F9 D9B0 577B
|
|
D93E 98FC. While I have every confidence this really is his key and
|
|
that he is who he claims to be, don't depend on it if your life is
|
|
at stake. For that matter, if your life is at stake, don't depend
|
|
on me being who I claim to be either.
|
|
|
|
That said, as cryptsetup is under good version control, a malicious
|
|
change should be noticed sooner or later, but it may take a while.
|
|
Also, the attacker model makes compromising the sources in a
|
|
non-obvious way pretty hard. Sure, you could put the master-key
|
|
somewhere on disk, but that is rather obvious as soon as somebody
|
|
looks as there would be data in an empty LUKS container in a place
|
|
it should not be. Doing this in a more nefarious way, for example
|
|
hiding the master-key in the salts, would need a look at the
|
|
sources to be discovered, but I think that somebody would find that
|
|
sooner or later as well.
|
|
|
|
That said, this discussion is really a lot more complicated and
|
|
longer as an FAQ can sustain. If in doubt, ask on the mailing list.
|
|
|
|
|
|
* 2.18 Is there a concern with 4k Sectors?
|
|
|
|
Not from dm-crypt itself. Encryption will be done in 512B blocks,
|
|
but if the partition and filesystem are aligned correctly and the
|
|
filesystem uses multiples of 4kiB as block size, the dm-crypt layer
|
|
will just process 8 x 512B = 4096B at a time with negligible
|
|
overhead. LUKS does place data at an offset, which is 2MiB per
|
|
default and will not break alignment. See also Item 6.12 of this
|
|
FAQ for more details. Note that if your partition or filesystem is
|
|
misaligned, dm-crypt can make the effect worse though.
|
|
|
|
|
|
* 2.19 How can I wipe a device with crypto-grade randomness?
|
|
|
|
The conventional recommendation if you want to not just do a
|
|
zero-wipe is to use something like
|
|
|
|
cat /dev/urandom > <taget-device>
|
|
|
|
That is very slow and painful at 10-20MB/s on a fast computer.
|
|
Using cryptsetup and a plain dm-crypt device with a random key, it
|
|
is much faster and gives you the same level of security. The
|
|
defaults are quite enough.
|
|
|
|
For device set-up, do the following:
|
|
|
|
cryptsetup open --type plain -d /dev/urandom /dev/<block-device> to_be_wiped
|
|
|
|
Then you have several options. Simple wipe without
|
|
progress-indicator:
|
|
|
|
cat /dev/zero > /dev/mapper/to_be_wiped
|
|
|
|
Progress-indicator by dd_rescue:
|
|
|
|
dd_rescue -w /dev/zero /dev/mapper/to_be_wiped
|
|
|
|
Progress-indicator by my "wcs" stream meter (available from
|
|
http://www.tansi.org/tools/index.html ):
|
|
|
|
cat /dev/zero | wcs > /dev/mapper/to_be_wiped
|
|
|
|
Remove the mapping at the end and you are done.
|
|
|
|
|
|
3. Common Problems
|
|
|
|
|
|
* 3.1 My dm-crypt/LUKS mapping does not work! What general steps are
|
|
there to investigate the problem?
|
|
|
|
If you get a specific error message, investigate what it claims
|
|
first. If not, you may want to check the following things.
|
|
|
|
- Check that "/dev", including "/dev/mapper/control" is there. If it
|
|
is missing, you may have a problem with the "/dev" tree itself or
|
|
you may have broken udev rules.
|
|
|
|
- Check that you have the device mapper and the crypt target in your
|
|
kernel. The output of "dmsetup targets" should list a "crypt"
|
|
target. If it is not there or the command fails, add device mapper
|
|
and crypt-target to the kernel.
|
|
|
|
- Check that the hash-functions and ciphers you want to use are in
|
|
the kernel. The output of "cat /proc/crypto" needs to list them.
|
|
|
|
|
|
* 3.2 My dm-crypt mapping suddenly stopped when upgrading cryptsetup.
|
|
|
|
The default cipher, hash or mode may have changed (the mode changed
|
|
from 1.0.x to 1.1.x). See under "Issues With Specific Versions of
|
|
cryptsetup".
|
|
|
|
|
|
* 3.3 When I call cryptsetup from cron/CGI, I get errors about
|
|
unknown features?
|
|
|
|
If you get errors about unknown parameters or the like that are not
|
|
present when cryptsetup is called from the shell, make sure you
|
|
have no older version of cryptsetup on your system that then gets
|
|
called by cron/CGI. For example some distributions install
|
|
cryptsetup into /usr/sbin, while a manual install could go to
|
|
/usr/local/sbin. As a debugging aid, call "cryptsetup --version"
|
|
from cron/CGI or the non-shell mechanism to be sure the right
|
|
version gets called.
|
|
|
|
|
|
* 3.4 Unlocking a LUKS device takes very long. Why?
|
|
|
|
The iteration time for a key-slot (see Section 5 for an explanation
|
|
what iteration does) is calculated when setting a passphrase. By
|
|
default it is 1 second on the machine where the passphrase is set.
|
|
If you set a passphrase on a fast machine and then unlock it on a
|
|
slow machine, the unlocking time can be much longer. Also take into
|
|
account that up to 8 key-slots have to be tried in order to find the
|
|
right one.
|
|
|
|
If this is problem, you can add another key-slot using the slow
|
|
machine with the same passphrase and then remove the old key-slot.
|
|
The new key-slot will have an iteration count adjusted to 1 second
|
|
on the slow machine. Use luksKeyAdd and then luksKillSlot or
|
|
luksRemoveKey.
|
|
|
|
However, this operation will not change volume key iteration count
|
|
(MK iterations in output of "cryptsetup luksDump"). In order to
|
|
change that, you will have to backup the data in the LUKS
|
|
container (i.e. your encrypted data), luksFormat on the slow
|
|
machine and restore the data. Note that in the original LUKS
|
|
specification this value was fixed to 10, but it is now derived
|
|
from the PBKDF2 benchmark as well and set to iterations in 0.125
|
|
sec or 1000, whichever is larger. Also note that MK iterations
|
|
are not very security relevant. But as each key-slot already takes
|
|
1 second, spending the additional 0.125 seconds really does not
|
|
matter.
|
|
|
|
|
|
* 3.5 "blkid" sees a LUKS UUID and an ext2/swap UUID on the same
|
|
device. What is wrong?
|
|
|
|
Some old versions of cryptsetup have a bug where the header does
|
|
not get completely wiped during LUKS format and an older ext2/swap
|
|
signature remains on the device. This confuses blkid.
|
|
|
|
Fix: Wipe the unused header areas by doing a backup and restore of
|
|
the header with cryptsetup 1.1.x:
|
|
|
|
cryptsetup luksHeaderBackup --header-backup-file <file> <device>
|
|
cryptsetup luksHeaderRestore --header-backup-file <file> <device>
|
|
|
|
|
|
* 3.6 cryptsetup segfaults on Gentoo amd64 hardened ...
|
|
|
|
There seems to be some interference between the hardening and and
|
|
the way cryptsetup benchmarks PBKDF2. The solution to this is
|
|
currently not quite clear for an encrypted root filesystem. For
|
|
other uses, you can apparently specify USE="dynamic" as compile
|
|
flag, see http://bugs.gentoo.org/show_bug.cgi?id=283470
|
|
|
|
|
|
4. Troubleshooting
|
|
|
|
|
|
* 4.1 I get the error "LUKS keyslot x is invalid." What does that
|
|
mean?
|
|
|
|
This means that the given keyslot has an offset that points
|
|
outside the valid keyslot area. Typically, the reason is a
|
|
corrupted LUKS header because something was written to the start of
|
|
the device the LUKS container is on. Refer to Section "Backup and
|
|
Data Recovery" and ask on the mailing list if you have trouble
|
|
diagnosing and (if still possible) repairing this.
|
|
|
|
|
|
* 4.2 I cannot unlock my LUKS container! What could be the problem?
|
|
|
|
First, make sure you have a correct passphrase. Then make sure you
|
|
have the correct key-map and correct keyboard. And then make sure
|
|
you have the correct character set and encoding, see also
|
|
"PASSPHRASE CHARACTER SET" under Section 1.2.
|
|
|
|
If you are sure you are entering the passphrase right, there is the
|
|
possibility that the respective key-slot has been damaged. There
|
|
is no way to recover a damaged key-slot, except from a header
|
|
backup (see Section 6). For security reasons, there is also no
|
|
checksum in the key-slots that could tell you whether a key-slot has
|
|
been damaged. The only checksum present allows recognition of a
|
|
correct passphrase, but that only works if the passphrase is
|
|
correct and the respective key-slot is intact.
|
|
|
|
In order to find out whether a key-slot is damaged one has to look
|
|
for "non-random looking" data in it. There is a tool that
|
|
automatizes this in the cryptsetup distribution from version 1.6.0
|
|
onwards. It is located in misc/keyslot_checker/. Instructions how
|
|
to use and how to interpret results are in the README file. Note
|
|
that this tool requires a libcryptsetup from cryptsetup 1.6.0 or
|
|
later (which means libcryptsetup.so.4.5.0 or later). If the tool
|
|
complains about missing functions in libcryptsetup, you likely
|
|
have an earlier version from your distribution still installed. You
|
|
can either point the symbolic link(s) from libcryptsetup.so.4 to
|
|
the new version manually, or you can uninstall the distribution
|
|
version of cryptsetup and re-install that from cryptsetup >= 1.6.0
|
|
again to fix this.
|
|
|
|
|
|
* 4.3 Can a bad RAM module cause problems?
|
|
|
|
LUKS and dm-crypt can give the RAM quite a workout, especially when
|
|
combined with software RAID. In particular the combination RAID5 +
|
|
LUKS + XFS seems to uncover RAM problems that never caused obvious
|
|
problems before. Symptoms vary, but often the problem manifest
|
|
itself when copying large amounts of data, typically several times
|
|
larger than your main memory.
|
|
|
|
Side note: One thing you should always do on large data
|
|
copy/movements is to run a verify, for example with the "-d"
|
|
option of "tar" or by doing a set of MD5 checksums on the source
|
|
or target with
|
|
|
|
find . -type f -exec md5sum \{\} \; > checksum-file
|
|
|
|
and then a "md5sum -c checksum-file" on the other side. If you get
|
|
mismatches here, RAM is the primary suspect. A lesser suspect is
|
|
an overclocked CPU. I have found countless hardware problems in
|
|
verify runs after copying or making backups. Bit errors are much
|
|
more common than most people think.
|
|
|
|
Some RAM issues are even worse and corrupt structures in one of the
|
|
layers. This typically results in lockups, CPU state dumps in the
|
|
system logs, kernel panic or other things. It is quite possible to
|
|
have the problem with an encrypted device, but not with an
|
|
otherwise the same unencrypted device. The reason for that is that
|
|
encryption has an error amplification property: You flip one bit
|
|
in an encrypted data block, and the decrypted version has half of
|
|
its bits flipped. This is an important security property for modern
|
|
ciphers. With the usual modes in cryptsetup (CBC, ESSIV, XTS), you
|
|
get up to a completely changed 512 byte block per bit error. A
|
|
corrupt block causes a lot more havoc than the occasionally
|
|
flipped single bit and can result in various obscure errors.
|
|
|
|
Note, that a verify run on copying between encrypted or
|
|
unencrypted devices will reliably detect corruption, even when the
|
|
copying itself did not report any problems. If you find defect
|
|
RAM, assume all backups and copied data to be suspect, unless you
|
|
did a verify.
|
|
|
|
|
|
* 4.4 How do I test RAM?
|
|
|
|
First you should know that overclocking often makes memory
|
|
problems worse. So if you overclock (which I strongly recommend
|
|
against in a system holding data that has some worth), run the
|
|
tests with the overclocking active.
|
|
|
|
There are two good options. One is Memtest86+ and the other is
|
|
"memtester" by Charles Cazabon. Memtest86+ requires a reboot and
|
|
then takes over the machine, while memtester runs from a
|
|
root-shell. Both use different testing methods and I have found
|
|
problems fast with each one that the other needed long to find. I
|
|
recommend running the following procedure until the first error is
|
|
found:
|
|
|
|
- Run Memtest86+ for one cycle
|
|
|
|
- Run memtester for one cycle (shut down as many other applications
|
|
as possible)
|
|
|
|
- Run Memtest86+ for 24h or more
|
|
|
|
- Run memtester for 24h or more
|
|
|
|
If all that does not produce error messages, your RAM may be sound,
|
|
but I have had one weak bit that Memtest86+ needed around 60 hours
|
|
to find. If you can reproduce the original problem reliably, a good
|
|
additional test may be to remove half of the RAM (if you have more
|
|
than one module) and try whether the problem is still there and if
|
|
so, try with the other half. If you just have one module, get a
|
|
different one and try with that. If you do overclocking, reduce
|
|
the settings to the most conservative ones available and try with
|
|
that.
|
|
|
|
|
|
5. Security Aspects
|
|
|
|
|
|
* 5.1 How long is a secure passphrase ?
|
|
|
|
This is just the short answer. For more info and explanation of
|
|
some of the terms used in this item, read the rest of Section 5.
|
|
The actual recommendation is at the end of this item.
|
|
|
|
First, passphrase length is not really the right measure,
|
|
passphrase entropy is. For example, a random lowercase letter (a-z)
|
|
gives you 4.7 bit of entropy, one element of a-z0-9 gives you 5.2
|
|
bits of entropy, an element of a-zA-Z0-9 gives you 5.9 bits and
|
|
a-zA-Z0-9!@#$%^&:-+ gives you 6.2 bits. On the other hand, a random
|
|
English word only gives you 0.6...1.3 bits of entropy per
|
|
character. Using sentences that make sense gives lower entropy,
|
|
series of random words gives higher entropy. Do not use sentences
|
|
that can be tied to you or found on your computer. This type of
|
|
attack is done routinely today.
|
|
|
|
That said, it does not matter too much what scheme you use, but it
|
|
does matter how much entropy your passphrase contains, because an
|
|
attacker has to try on average
|
|
|
|
1/2 * 2^(bits of entropy in passphrase)
|
|
|
|
different passphrases to guess correctly.
|
|
|
|
Historically, estimations tended to use computing time estimates,
|
|
but more modern approaches try to estimate cost of guessing a
|
|
passphrase.
|
|
|
|
As an example, I will try to get an estimate from the numbers in
|
|
http://it.slashdot.org/story/12/12/05/0623215/new-25-gpu-monster-devours-strong-passwords-in-minutes
|
|
More references can be found a the end of this document. Note that
|
|
these are estimates from the defender side, so assuming something
|
|
is easier than it actually is is fine. An attacker may still have
|
|
vastly higher cost than estimated here.
|
|
|
|
LUKS uses SHA1 for hashing per default. The claim in the reference
|
|
is 63 billion tries/second for SHA1. We will leave aside the check
|
|
whether a try actually decrypts a key-slot. Now, the machine has 25
|
|
GPUs, which I will estimate at an overall lifetime cost of USD/EUR
|
|
1000 each, and an useful lifetime of 2 years. (This is on the low
|
|
side.) Disregarding downtime, the machine can then break
|
|
|
|
N = 63*10^9 * 3600 * 24 * 365 * 2 ~ 4*10^18
|
|
|
|
passphrases for EUR/USD 25k. That is one 62 bit passphrase hashed
|
|
once with SHA1 for EUR/USD 25k. Note that as this can be
|
|
parallelized, it can be done faster than 2 years with several of
|
|
these machines.
|
|
|
|
For plain dm-crypt (no hash iteration) this is it. This gives (with
|
|
SHA1, plain dm-crypt default is ripemd160 which seems to be
|
|
slightly slower than SHA1):
|
|
|
|
Passphrase entropy Cost to break
|
|
60 bit EUR/USD 6k
|
|
65 bit EUR/USD 200K
|
|
70 bit EUR/USD 6M
|
|
75 bit EUR/USD 200M
|
|
80 bit EUR/USD 6B
|
|
85 bit EUR/USD 200B
|
|
... ...
|
|
|
|
For LUKS, you have to take into account hash iteration in PBKDF2.
|
|
For a current CPU, there are about 100k iterations (as can be
|
|
queried with ''cryptsetup luksDump''.
|
|
|
|
The table above then becomes:
|
|
|
|
Passphrase entropy Cost to break
|
|
50 bit EUR/USD 600k
|
|
55 bit EUR/USD 20M
|
|
60 bit EUR/USD 600M
|
|
65 bit EUR/USD 20B
|
|
70 bit EUR/USD 600B
|
|
75 bit EUR/USD 20T
|
|
... ...
|
|
|
|
Recommendation:
|
|
|
|
To get reasonable security for the next 10 years, it is a good idea
|
|
to overestimate by a factor of at least 1000.
|
|
|
|
Then there is the question of how much the attacker is willing to
|
|
spend. That is up to your own security evaluation. For general use,
|
|
I will assume the attacker is willing to spend up to 1 million
|
|
EUR/USD. Then we get the following recommendations:
|
|
|
|
Plain dm-crypt: Use > 80 bit. That is e.g. 17 random chars from a-z
|
|
or a random English sentence of > 135 characters length.
|
|
|
|
LUKS: Use > 65 bit. That is e.g. 14 random chars from a-z or a
|
|
random English sentence of > 108 characters length.
|
|
|
|
If paranoid, add at least 20 bit. That is roughly four additional
|
|
characters for random passphrases and roughly 32 characters for a
|
|
random English sentence.
|
|
|
|
|
|
* 5.2 Is LUKS insecure? Everybody can see I have encrypted data!
|
|
|
|
In practice it does not really matter. In most civilized countries
|
|
you can just refuse to hand over the keys, no harm done. In some
|
|
countries they can force you to hand over the keys, if they suspect
|
|
encryption. However the suspicion is enough, they do not have to
|
|
prove anything. This is for practical reasons, as even the presence
|
|
of a header (like the LUKS header) is not enough to prove that you
|
|
have any keys. It might have been an experiment, for example. Or it
|
|
was used as encrypted swap with a key from /dev/random. So they
|
|
make you prove you do not have encrypted data. Of course that is
|
|
just as impossible as the other way round.
|
|
|
|
This means that if you have a large set of random-looking data,
|
|
they can already lock you up. Hidden containers (encryption hidden
|
|
within encryption), as possible with Truecrypt, do not help
|
|
either. They will just assume the hidden container is there and
|
|
unless you hand over the key, you will stay locked up. Don't have
|
|
a hidden container? Though luck. Anybody could claim that.
|
|
|
|
Still, if you are concerned about the LUKS header, use plain
|
|
dm-crypt with a good passphrase. See also Section 2, "What is the
|
|
difference between "plain" and LUKS format?"
|
|
|
|
|
|
* 5.3 Should I initialize (overwrite) a new LUKS/dm-crypt partition?
|
|
|
|
If you just create a filesystem on it, most of the old data will
|
|
still be there. If the old data is sensitive, you should overwrite
|
|
it before encrypting. In any case, not initializing will leave the
|
|
old data there until the specific sector gets written. That may
|
|
enable an attacker to determine how much and where on the
|
|
partition data was written. If you think this is a risk, you can
|
|
prevent this by overwriting the encrypted device (here assumed to
|
|
be named "e1") with zeros like this:
|
|
|
|
dd_rescue -w /dev/zero /dev/mapper/e1
|
|
|
|
or alternatively with one of the following more standard commands:
|
|
|
|
cat /dev/zero > /dev/mapper/e1
|
|
dd if=/dev/zero of=/dev/mapper/e1
|
|
|
|
|
|
* 5.4 How do I securely erase a LUKS (or other) partition?
|
|
|
|
For LUKS, if you are in a desperate hurry, overwrite the LUKS
|
|
header and key-slot area. This means overwriting the first
|
|
(keyslots x stripes x keysize) + offset bytes. For the default
|
|
parameters, this is the 1'052'672 bytes, i.e. 1MiB + 4096 of the
|
|
LUKS partition. For 512 bit key length (e.g. for aes-xts-plain with
|
|
512 bit key) this is 2MiB. (The different offset stems from
|
|
differences in the sector alignment of the key-slots.) If in doubt,
|
|
just be generous and overwrite the first 10MB or so, it will likely
|
|
still be fast enough. A single overwrite with zeros should be
|
|
enough. If you anticipate being in a desperate hurry, prepare the
|
|
command beforehand. Example with /dev/sde1 as the LUKS partition
|
|
and default parameters:
|
|
|
|
head -c 1052672 /dev/zero > /dev/sde1; sync
|
|
|
|
A LUKS header backup or full backup will still grant access to
|
|
most or all data, so make sure that an attacker does not have
|
|
access to backups or destroy them as well.
|
|
|
|
If you have time, overwrite the whole LUKS partition with a single
|
|
pass of zeros. This is enough for current HDDs. For SSDs or FLASH
|
|
(USB sticks) you may want to overwrite the whole drive several
|
|
times to be sure data is not retained by wear leveling. This is
|
|
possibly still insecure as SSD technology is not fully understood
|
|
in this regard. Still, due to the anti-forensic properties of the
|
|
LUKS key-slots, a single overwrite of an SSD or FLASH drive could
|
|
be enough. If in doubt, use physical destruction in addition. Here
|
|
is a link to some current research results on erasing SSDs and
|
|
FLASH drives:
|
|
http://www.usenix.org/events/fast11/tech/full_papers/Wei.pdf
|
|
|
|
Keep in mind to also erase all backups.
|
|
|
|
Example for a zero-overwrite erase of partition sde1 done with
|
|
dd_rescue:
|
|
|
|
dd_rescue -w /dev/zero /dev/sde1
|
|
|
|
|
|
* 5.5 How do I securely erase a backup of a LUKS partition or header?
|
|
|
|
That depends on the medium it is stored on. For HDD and SSD, use
|
|
overwrite with zeros. For an SSD or FLASH drive (USB stick), you
|
|
may want to overwrite the complete SSD several times and use
|
|
physical destruction in addition, see last item. For re-writable
|
|
CD/DVD, a single overwrite should also be enough, due to the
|
|
anti-forensic properties of the LUKS keyslots. For write-once
|
|
media, use physical destruction. For low security requirements,
|
|
just cut the CD/DVD into several parts. For high security needs,
|
|
shred or burn the medium. If your backup is on magnetic tape, I
|
|
advise physical destruction by shredding or burning, after
|
|
overwriting . The problem with magnetic tape is that it has a
|
|
higher dynamic range than HDDs and older data may well be
|
|
recoverable after overwrites. Also write-head alignment issues can
|
|
lead to data not actually being deleted at all during overwrites.
|
|
|
|
|
|
* 5.6 What about backup? Does it compromise security?
|
|
|
|
That depends. See item 6.7.
|
|
|
|
|
|
* 5.7 Why is all my data permanently gone if I overwrite the LUKS
|
|
header?
|
|
|
|
Overwriting the LUKS header in part or in full is the most common
|
|
reason why access to LUKS containers is lost permanently.
|
|
Overwriting can be done in a number of fashions, like creating a
|
|
new filesystem on the raw LUKS partition, making the raw partition
|
|
part of a raid array and just writing to the raw partition.
|
|
|
|
The LUKS header contains a 256 bit "salt" per key-slot and without
|
|
that no decryption is possible. While the salts are not secret,
|
|
they are key-grade material and cannot be reconstructed. This is a
|
|
cryptographically strong "cannot". From observations on the
|
|
cryptsetup mailing-list, people typically go though the usual
|
|
stages of grief (Denial, Anger, Bargaining, Depression, Acceptance)
|
|
when this happens to them. Observed times vary between 1 day and 2
|
|
weeks to complete the cycle. Seeking help on the mailing-list is
|
|
fine. Even if we usually cannot help with getting back your data,
|
|
most people found the feedback comforting.
|
|
|
|
If your header does not contain an intact key-slot salt, best go
|
|
directly to the last stage ("Acceptance") and think about what to
|
|
do now. There is one exception that I know of: If your LUKS
|
|
container is still open, then it may be possible to extract the
|
|
master key from the running system. See Item "How do I recover the
|
|
master key from a mapped LUKS container?" in Section "Backup and
|
|
Data Recovery".
|
|
|
|
|
|
* 5.8 What is a "salt"?
|
|
|
|
A salt is a random key-grade value added to the passphrase before
|
|
it is processed. It is not kept secret. The reason for using salts
|
|
is as follows: If an attacker wants to crack the password for a
|
|
single LUKS container, then every possible passphrase has to be
|
|
tried. Typically an attacker will not try every binary value, but
|
|
will try words and sentences from a dictionary.
|
|
|
|
If an attacker wants to attack several LUKS containers with the
|
|
same dictionary, then a different approach makes sense: Compute the
|
|
resulting slot-key for each dictionary element and store it on
|
|
disk. Then the test for each entry is just the slow unlocking with
|
|
the slot key (say 0.00001 sec) instead of calculating the slot-key
|
|
first (1 sec). For a single attack, this does not help. But if you
|
|
have more than one container to attack, this helps tremendously,
|
|
also because you can prepare your table before you even have the
|
|
container to attack! The calculation is also very simple to
|
|
parallelize. You could, for example, use the night-time unused CPU
|
|
power of your desktop PCs for this.
|
|
|
|
This is where the salt comes in. If the salt is combined with the
|
|
passphrase (in the simplest form, just appended to it), you
|
|
suddenly need a separate table for each salt value. With a
|
|
reasonably-sized salt value (256 bit, e.g.) this is quite
|
|
infeasible.
|
|
|
|
|
|
* 5.9 Is LUKS secure with a low-entropy (bad) passphrase?
|
|
|
|
Note: You should only use the 94 printable characters from 7 bit
|
|
ASCII code to prevent your passphrase from failing when the
|
|
character encoding changes, e.g. because of a system upgrade, see
|
|
also the note at the very start of this FAQ under "WARNINGS".
|
|
|
|
This needs a bit of theory. The quality of your passphrase is
|
|
directly related to its entropy (information theoretic, not
|
|
thermodynamic). The entropy says how many bits of "uncertainty" or
|
|
"randomness" are in you passphrase. In other words, that is how
|
|
difficult guessing the passphrase is.
|
|
|
|
Example: A random English sentence has about 1 bit of entropy per
|
|
character. A random lowercase (or uppercase) character has about
|
|
4.7 bit of entropy.
|
|
|
|
Now, if n is the number of bits of entropy in your passphrase and t
|
|
is the time it takes to process a passphrase in order to open the
|
|
LUKS container, then an attacker has to spend at maximum
|
|
|
|
attack_time_max = 2^n * t
|
|
|
|
time for a successful attack and on average half that. There is no
|
|
way getting around that relationship. However, there is one thing
|
|
that does help, namely increasing t, the time it takes to use a
|
|
passphrase, see next FAQ item.
|
|
|
|
Still, if you want good security, a high-entropy passphrase is the
|
|
only option. For example, a low-entropy passphrase can never be
|
|
considered secure against a TLA-level (Three Letter Agency level,
|
|
i.e. government-level) attacker, no matter what tricks are used in
|
|
the key-derivation function. Use at least 64 bits for secret stuff.
|
|
That is 64 characters of English text (but only if randomly chosen)
|
|
or a combination of 12 truly random letters and digits.
|
|
|
|
For passphrase generation, do not use lines from very well-known
|
|
texts (religious texts, Harry potter, etc.) as they are to easy to
|
|
guess. For example, the total Harry Potter has about 1'500'000
|
|
words (my estimation). Trying every 64 character sequence starting
|
|
and ending at a word boundary would take only something like 20
|
|
days on a single CPU and is entirely feasible. To put that into
|
|
perspective, using a number of Amazon EC2 High-CPU Extra Large
|
|
instances (each gives about 8 real cores), this test costs
|
|
currently about 50USD/EUR, but can be made to run arbitrarily fast.
|
|
|
|
On the other hand, choosing 1.5 lines from, say, the Wheel of Time
|
|
is in itself not more secure, but the book selection adds quite a
|
|
bit of entropy. (Now that I have mentioned it here, don't use tWoT
|
|
either!) If you add 2 or 3 typos or switch some words around, then
|
|
this is good passphrase material.
|
|
|
|
|
|
* 5.10 What is "iteration count" and why is decreasing it a bad idea?
|
|
|
|
Iteration count is the number of PBKDF2 iterations a passphrase is
|
|
put through before it is used to unlock a key-slot. Iterations are
|
|
done with the explicit purpose to increase the time that it takes
|
|
to unlock a key-slot. This provides some protection against use of
|
|
low-entropy passphrases.
|
|
|
|
The idea is that an attacker has to try all possible passphrases.
|
|
Even if the attacker knows the passphrase is low-entropy (see last
|
|
item), it is possible to make each individual try take longer. The
|
|
way to do this is to repeatedly hash the passphrase for a certain
|
|
time. The attacker then has to spend the same time (given the same
|
|
computing power) as the user per try. With LUKS, the default is 1
|
|
second of PBKDF2 hashing.
|
|
|
|
Example 1: Lets assume we have a really bad passphrase (e.g. a
|
|
girlfriends name) with 10 bits of entropy. With the same CPU, an
|
|
attacker would need to spend around 500 seconds on average to
|
|
break that passphrase. Without iteration, it would be more like
|
|
0.0001 seconds on a modern CPU.
|
|
|
|
Example 2: The user did a bit better and has 32 chars of English
|
|
text. That would be about 32 bits of entropy. With 1 second
|
|
iteration, that means an attacker on the same CPU needs around 136
|
|
years. That is pretty impressive for such a weak passphrase.
|
|
Without the iterations, it would be more like 50 days on a modern
|
|
CPU, and possibly far less.
|
|
|
|
In addition, the attacker can both parallelize and use special
|
|
hardware like GPUs or FPGAs to speed up the attack. The attack can
|
|
also happen quite some time after the luksFormat operation and CPUs
|
|
can have become faster and cheaper. For that reason you want a
|
|
bit of extra security. Anyways, in Example 1 your are screwed.
|
|
In example 2, not necessarily. Even if the attack is faster, it
|
|
still has a certain cost associated with it, say 10000 EUR/USD
|
|
with iteration and 1 EUR/USD without iteration. The first can be
|
|
prohibitively expensive, while the second is something you try
|
|
even without solid proof that the decryption will yield something
|
|
useful.
|
|
|
|
The numbers above are mostly made up, but show the idea. Of course
|
|
the best thing is to have a high-entropy passphrase.
|
|
|
|
Would a 100 sec iteration time be even better? Yes and no.
|
|
Cryptographically it would be a lot better, namely 100 times better.
|
|
However, usability is a very important factor for security
|
|
technology and one that gets overlooked surprisingly often. For
|
|
LUKS, if you have to wait 2 minutes to unlock the LUKS container,
|
|
most people will not bother and use less secure storage instead. It
|
|
is better to have less protection against low-entropy passphrases
|
|
and people actually use LUKS, than having them do without
|
|
encryption altogether.
|
|
|
|
Now, what about decreasing the iteration time? This is generally a
|
|
very bad idea, unless you know and can enforce that the users only
|
|
use high-entropy passphrases. If you decrease the iteration time
|
|
without ensuring that, then you put your users at increased risk,
|
|
and considering how rarely LUKS containers are unlocked in a
|
|
typical work-flow, you do so without a good reason. Don't do it.
|
|
The iteration time is already low enough that users with entropy
|
|
low passphrases are vulnerable. Lowering it even further increases
|
|
this danger significantly.
|
|
|
|
|
|
* 5.11 Some people say PBKDF2 is insecure?
|
|
|
|
There is some discussion that a hash-function should have a "large
|
|
memory" property, i.e. that it should require a lot of memory to be
|
|
computed. This serves to prevent attacks using special programmable
|
|
circuits, like FPGAs, and attacks using graphics cards. PBKDF2
|
|
does not need a lot of memory and is vulnerable to these attacks.
|
|
However, the publication usually referred in these discussions is
|
|
not very convincing in proving that the presented hash really is
|
|
"large memory" (that may change, email the FAQ maintainer when it
|
|
does) and it is of limited usefulness anyways. Attackers that use
|
|
clusters of normal PCs will not be affected at all by a "large
|
|
memory" property. For example the US Secret Service is known to
|
|
use the off-hour time of all the office PCs of the Treasury for
|
|
password breaking. The Treasury has about 110'000 employees.
|
|
Assuming every one has an office PC, that is significant computing
|
|
power, all of it with plenty of memory for computing "large
|
|
memory" hashes. Bot-net operators also have all the memory they
|
|
want. The only protection against a resourceful attacker is a
|
|
high-entropy passphrase, see items 5.9 and 5.10.
|
|
|
|
|
|
* 5.12 What about iteration count with plain dm-crypt?
|
|
|
|
Simple: There is none. There is also no salting. If you use plain
|
|
dm-crypt, the only way to be secure is to use a high entropy
|
|
passphrase. If in doubt, use LUKS instead.
|
|
|
|
|
|
* 5.13 Is LUKS with default parameters less secure on a slow CPU?
|
|
|
|
Unfortunately, yes. However the only aspect affected is the
|
|
protection for low-entropy passphrase or master-key. All other
|
|
security aspects are independent of CPU speed.
|
|
|
|
The master key is less critical, as you really have to work at it
|
|
to give it low entropy. One possibility is to supply the master key
|
|
yourself. If that key is low-entropy, then you get what you
|
|
deserve. The other known possibility is to use /dev/urandom for
|
|
key generation in an entropy-starved situation (e.g. automatic
|
|
installation on an embedded device without network and other entropy
|
|
sources).
|
|
|
|
For the passphrase, don't use a low-entropy passphrase. If your
|
|
passphrase is good, then a slow CPU will not matter. If you insist
|
|
on a low-entropy passphrase on a slow CPU, use something like
|
|
"--iter-time=10" or higher and wait a long time on each LUKS unlock
|
|
and pray that the attacker does not find out in which way exactly
|
|
your passphrase is low entropy. This also applies to low-entropy
|
|
passphrases on fast CPUs. Technology can do only so much to
|
|
compensate for problems in front of the keyboard.
|
|
|
|
|
|
* 5.14 Why was the default aes-cbc-plain replaced with aes-cbc-essiv?
|
|
|
|
Note: This item applies both to plain dm-crypt and to LUKS
|
|
|
|
The problem is that cbc-plain has a fingerprint vulnerability, where
|
|
a specially crafted file placed into the crypto-container can be
|
|
recognized from the outside. The issue here is that for cbc-plain
|
|
the initialization vector (IV) is the sector number. The IV gets
|
|
XORed to the first data chunk of the sector to be encrypted. If you
|
|
make sure that the first data block to be stored in a sector
|
|
contains the sector number as well, the first data block to be
|
|
encrypted is all zeros and always encrypted to the same ciphertext.
|
|
This also works if the first data chunk just has a constant XOR
|
|
with the sector number. By having several shifted patterns you can
|
|
take care of the case of a non-power-of-two start sector number of
|
|
the file.
|
|
|
|
This mechanism allows you to create a pattern of sectors that have
|
|
the same first ciphertext block and signal one bit per sector to the
|
|
outside, allowing you to e.g. mark media files that way for
|
|
recognition without decryption. For large files this is a
|
|
practical attack. For small ones, you do not have enough blocks to
|
|
signal and take care of different file starting offsets.
|
|
|
|
In order to prevent this attack, the default was changed to
|
|
cbc-essiv. ESSIV uses a keyed hash of the sector number, with the
|
|
encryption key as key. This makes the IV unpredictable without
|
|
knowing the encryption key and the watermarking attack fails.
|
|
|
|
|
|
* 5.15 Are there any problems with "plain" IV? What is "plain64"?
|
|
|
|
First, "plain" and "plain64" are both not secure to use with CBC,
|
|
see previous FAQ item.
|
|
|
|
However there are modes, like XTS, that are secure with "plain" IV.
|
|
The next limit is that "plain" is 64 bit, with the upper 32 bit set
|
|
to zero. This means that on volumes larger than 2TiB, the IV
|
|
repeats, creating a vulnerability that potentially leaks some
|
|
data. To avoid this, use "plain64", which uses the full sector
|
|
number up to 64 bit. Note that "plain64" requires a kernel >=
|
|
2.6.33. Also note that "plain64" is backwards compatible for
|
|
volume sizes <= 2TiB, but not for those > 2TiB. Finally, "plain64"
|
|
does not cause any performance penalty compared to "plain".
|
|
|
|
|
|
* 5.16 What about XTS mode?
|
|
|
|
XTS mode is potentially even more secure than cbc-essiv (but only if
|
|
cbc-essiv is insecure in your scenario). It is a NIST standard and
|
|
used, e.g. in Truecrypt. From version 1.6.0 of cryptsetup onwards,
|
|
aes-xts-plain64 is the default for LUKS. If you want to use it
|
|
with a cryptsetup before version 1.6.0 or with plain dm-crypt, you
|
|
have to specify it manually as "aes-xts-plain", i.e.
|
|
|
|
cryptsetup -c aes-xts-plain luksFormat <device>
|
|
|
|
For volumes >2TiB and kernels >= 2.6.33 use "plain64" (see FAQ
|
|
item on "plain" and "plain64"):
|
|
|
|
cryptsetup -c aes-xts-plain64 luksFormat <device>
|
|
|
|
There is a potential security issue with XTS mode and large blocks.
|
|
LUKS and dm-crypt always use 512B blocks and the issue does not
|
|
apply.
|
|
|
|
|
|
* 5.17 Is LUKS FIPS-140-2 certified?
|
|
|
|
No. But that is more a problem of FIPS-140-2 than of LUKS. From a
|
|
technical point-of-view, LUKS with the right parameters would be
|
|
FIPS-140-2 compliant, but in order to make it certified, somebody
|
|
has to pay real money for that. And then, whenever cryptsetup is
|
|
changed or extended, the certification lapses and has to be
|
|
obtained again.
|
|
|
|
From the aspect of actual security, LUKS with default parameters
|
|
should be as good as most things that are FIPS-140-2 certified,
|
|
although you may want to make sure to use /dev/random (by
|
|
specifying --use-random on luksFormat) as randomness source for
|
|
the master key to avoid being potentially insecure in an
|
|
entropy-starved situation.
|
|
|
|
|
|
* 5.18 What about Plausible Deniability?
|
|
|
|
First let me attempt a definition for the case of encrypted
|
|
filesystems: Plausible deniability is when you hide encrypted data
|
|
inside an encrypted container and it is not possible to prove it is
|
|
there. The idea is compelling and on first glance it seems
|
|
possible to do it. And from a cryptographic point of view, it
|
|
actually is possible.
|
|
|
|
So, does it work in practice? No, unfortunately. The reasoning used
|
|
by its proponents is fundamentally flawed in several ways and the
|
|
cryptographic properties fail fatally when colliding with the real
|
|
world.
|
|
|
|
First, why should "I do not have a hidden partition" be any more
|
|
plausible than "I forgot my crypto key" or "I wiped that partition
|
|
with random data, nothing in there"? I do not see any reason.
|
|
|
|
Second, there are two types of situations: Either they cannot force
|
|
you to give them the key (then you simply do not) or the can. In
|
|
the second case, they can always do bad things to you, because they
|
|
cannot prove that you have the key in the first place! This means
|
|
they do not have to prove you have the key, or that this random
|
|
looking data on your disk is actually encrypted data. So the
|
|
situation will allow them to waterboard/lock-up/deport you
|
|
anyways, regardless of how "plausible" your deniability is. Do not
|
|
have a hidden partition you could show to them, but there are
|
|
indications you may? Too bad for you. Unfortunately "plausible
|
|
deniability" also means you cannot prove there is no hidden data.
|
|
|
|
Third, hidden partitions are not that hidden. There are basically
|
|
just two possibilities: a) Make a large crypto container, but put a
|
|
smaller filesystem in there and put the hidden partition into the
|
|
free space. Unfortunately this is glaringly obvious and can be
|
|
detected in an automated fashion. This means that the initial
|
|
suspicion to put you under duress in order to make you reveal you
|
|
hidden data is given. b) Make a filesystem that spans the whole
|
|
encrypted partition, and put the hidden partition into space not
|
|
currently used by that filesystem. Unfortunately that is also
|
|
glaringly obvious, as you then cannot write to the filesystem
|
|
without a high risk of destroying data in the hidden container.
|
|
Have not written anything to the encrypted filesystem in a while?
|
|
Too bad, they have the suspicion they need to do unpleasant things
|
|
to you.
|
|
|
|
To be fair, if you prepare option b) carefully and directly before
|
|
going into danger, it may work. But then, the mere presence of
|
|
encrypted data may already be enough to get you into trouble in
|
|
those places were they can demand encryption keys.
|
|
|
|
Here is an additional reference for some problems with plausible
|
|
deniability: http://www.schneier.com/paper-truecrypt-dfs.pdf I
|
|
strongly suggest you read it.
|
|
|
|
So, no, I will not provide any instructions on how to do it with
|
|
plain dm-crypt or LUKS. If you insist on shooting yourself in the
|
|
foot, you can figure out how to do it yourself.
|
|
|
|
|
|
* 5.19 What about SSDs, Flash and Hybrid Drives?
|
|
|
|
The problem is that you cannot reliably erase parts of these
|
|
devices, mainly due to wear-leveling and possibly defect
|
|
management.
|
|
|
|
Basically, when overwriting a sector (of 512B), what the device
|
|
does is to move an internal sector (may be 128kB or even larger) to
|
|
some pool of discarded, not-yet erased unused sectors, take a
|
|
fresh empty sector from the empty-sector pool and copy the old
|
|
sector over with the changes to the small part you wrote. This is
|
|
done in some fashion so that larger writes do not cause a lot of
|
|
small internal updates.
|
|
|
|
The thing is that the mappings between outside-addressable sectors
|
|
and inside sectors is arbitrary (and the vendors are not talking).
|
|
Also the discarded sectors are not necessarily erased immediately.
|
|
They may linger a long time.
|
|
|
|
For plain dm-crypt, the consequences are that older encrypted data
|
|
may be lying around in some internal pools of the device. Thus may
|
|
or may not be a problem and depends on the application. Remember
|
|
the same can happen with a filesystem if consecutive writes to the
|
|
same area of a file can go to different sectors.
|
|
|
|
However, for LUKS, the worst case is that key-slots and LUKS
|
|
header may end up in these internal pools. This means that password
|
|
management functionality is compromised (the old passwords may
|
|
still be around, potentially for a very long time) and that fast
|
|
erase by overwriting the header and key-slot area is insecure.
|
|
|
|
Also keep in mind that the discarded/used pool may be large. For
|
|
example, a 240GB SSD has about 16GB of spare area in the chips that
|
|
it is free to do with as it likes. You would need to make each
|
|
individual key-slot larger than that to allow reliable overwriting.
|
|
And that assumes the disk thinks all other space is in use.
|
|
Reading the internal pools using forensic tools is not that hard,
|
|
but may involve some soldering.
|
|
|
|
What to do?
|
|
|
|
If you trust the device vendor (you probably should not...) you can
|
|
try an ATA "secure erase" command for SSDs. That does not work for
|
|
USB keys though and may or may not be secure for a hybrid drive. If
|
|
it finishes on an SSD after a few seconds, it was possibly faked.
|
|
Unfortunately, for hybrid drives that indicator does not work, as
|
|
the drive may well take the time to truly erase the magnetic part,
|
|
but only mark the SSD/Flash part as erased while data is still in
|
|
there.
|
|
|
|
If you can do without password management and are fine with doing
|
|
physical destruction for permanently deleting data (always after
|
|
one or several full overwrites!), you can use plain dm-crypt or
|
|
LUKS.
|
|
|
|
If you want or need all the original LUKS security features to work,
|
|
you can use a detached LUKS header and put that on a conventional,
|
|
magnetic disk. That leaves potentially old encrypted data in the
|
|
pools on the disk, but otherwise you get LUKS with the same
|
|
security as on a magnetic disk.
|
|
|
|
If you are concerned about your laptop being stolen, you are likely
|
|
fine using LUKS on an SSD or hybrid drive. An attacker would need
|
|
to have access to an old passphrase (and the key-slot for this old
|
|
passphrase would actually need to still be somewhere in the SSD)
|
|
for your data to be at risk. So unless you pasted your old
|
|
passphrase all over the Internet or the attacker has knowledge of
|
|
it from some other source and does a targeted laptop theft to get
|
|
at your data, you should be fine.
|
|
|
|
|
|
* 5.20 LUKS is broken! It uses SHA-1!
|
|
|
|
No, it is not. SHA-1 is (academically) broken for finding
|
|
collisions, but not for using it in a key-derivation function. And
|
|
that collision vulnerability is for non-iterated use only. And you
|
|
need the hash-value in verbatim.
|
|
|
|
This basically means that if you already have a slot-key, and you
|
|
have set the PBKDF2 iteration count to 1 (it is > 10'000 normally),
|
|
you could (maybe) derive a different passphrase that gives you the
|
|
the same slot-key. But if you have the slot-key, you can already
|
|
unlock the key-slot and get the master key, breaking everything. So
|
|
basically, this SHA-1 vulnerability allows you to open a LUKS
|
|
container with high effort when you already have it open.
|
|
|
|
The real problem here is people that do not understand crypto and
|
|
claim things are broken just because some mechanism is used that
|
|
has been broken for a specific different use. The way the mechanism
|
|
is used matters very much. A hash that is broken for one use can be
|
|
completely secure for other uses and here it is.
|
|
|
|
|
|
* 5.21 Why is there no "Nuke-Option"?
|
|
|
|
A "Nuke-Option" or "Kill-switch" is a password that when entered
|
|
upon unlocking instead wipes the header and all passwords. So when
|
|
somebody forces you to enter your password, you can destroy the
|
|
data instead.
|
|
|
|
While this sounds attractive at first glance, it does not make sense
|
|
once a real security analysis is done. One problem is that you have
|
|
to have some kind of HSM (Hardware Security Module) in order to
|
|
implement it securely. In the movies, a HSM starts to smoke and
|
|
melt once the Nuke-Option has been activated. In reality, it just
|
|
wipes some battery-backed RAM cells. A proper HSM costs something
|
|
like 20'000...100'000 EUR/USD and there a Nuke-Option may make some
|
|
sense. BTW, a chipcard or a TPM is not a HSM, although some
|
|
vendors are promoting that myth.
|
|
|
|
Now, a proper HSMs will have a wipe option but not a Nuke-Option,
|
|
i.e. you can explicitly wipe the HSM, but by a different process
|
|
than unlocking it takes. Why is that? Simple: If somebody can force
|
|
you to reveal passwords, then they can also do bad things to you if
|
|
you do not or if you enter a nuke password instead. Think locking
|
|
you up for a few years for "destroying evidence" or for far longer
|
|
and without trial for being a "terrorist suspect". No HSM maker
|
|
will want to expose its customers to that risk.
|
|
|
|
Now think of the typical LUKS application scenario, i.e. disk
|
|
encryption. Usually the ones forcing you to hand over your password
|
|
will have access to the disk as well, and, if they have any real
|
|
suspicion, they will mirror your disk before entering anything
|
|
supplied by you. This neatly negates any Nuke-Option. If they have
|
|
no suspicion (just harassing people that cross some border for
|
|
example), the Nuke-Option would work, but see above about likely
|
|
negative consequences and remember that a Nuke-Option may not work
|
|
reliably on SSD and hybrid drives anyways.
|
|
|
|
Hence my advice is to never take data that you do not want to reveal
|
|
into any such situation in the first place. There is no need to
|
|
transfer data on physical carriers today. The Internet makes it
|
|
quite possible to transfer data between arbitrary places and modern
|
|
encryption makes it secure. If you do it right, nobody will even be
|
|
able to identify source or destination. (How to do that is out of
|
|
scope of this document. It does require advanced skills in this age
|
|
of pervasive surveillance.)
|
|
|
|
Hence, LUKS has not kill option because it would do much more harm
|
|
than good.
|
|
|
|
Still, if you have a good use-case (i.e. non-abstract real-world
|
|
situation) where a Nuke-Option would actually be beneficial, please
|
|
let me know.
|
|
|
|
|
|
6. Backup and Data Recovery
|
|
|
|
|
|
* 6.1 Why do I need Backup?
|
|
|
|
First, disks die. The rate for well-treated (!) disk is about 5%
|
|
per year, which is high enough to worry about. There is some
|
|
indication that this may be even worse for some SSDs. This applies
|
|
both to LUKS and plain dm-crypt partitions.
|
|
|
|
Second, for LUKS, if anything damages the LUKS header or the
|
|
key-stripe area then decrypting the LUKS device can become
|
|
impossible. This is a frequent occurrence. For example an
|
|
accidental format as FAT or some software overwriting the first
|
|
sector where it suspects a partition boot sector typically makes a
|
|
LUKS partition permanently inaccessible. See more below on LUKS
|
|
header damage.
|
|
|
|
So, data-backup in some form is non-optional. For LUKS, you may
|
|
also want to store a header backup in some secure location. This
|
|
only needs an update if you change passphrases.
|
|
|
|
|
|
* 6.2 How do I backup a LUKS header?
|
|
|
|
While you could just copy the appropriate number of bytes from the
|
|
start of the LUKS partition, the best way is to use command option
|
|
"luksHeaderBackup" of cryptsetup. This protects also against
|
|
errors when non-standard parameters have been used in LUKS
|
|
partition creation. Example:
|
|
|
|
|
|
cryptsetup luksHeaderBackup --header-backup-file <file> <device>
|
|
|
|
To restore, use the inverse command, i.e.
|
|
|
|
cryptsetup luksHeaderRestore --header-backup-file <file> <device>
|
|
|
|
If you are unsure about a header to be restored, make a backup of
|
|
the current one first! You can also test the header-file without
|
|
restoring it by using the --header option for a detached header
|
|
like this:
|
|
|
|
cryptsetup --header <file> luksOpen <device> </dev/mapper/ -name>
|
|
|
|
If that unlocks your keys-lot, you are good. Do not forget to close
|
|
the device again.
|
|
|
|
|
|
* 6.3 How do I test a LUKS header?
|
|
|
|
Use
|
|
|
|
cryptsetup -v isLuks <device>
|
|
|
|
on the device. Without the "-v" it just signals its result via
|
|
exit-status. You can also use the more general test
|
|
|
|
blkid -p <device>
|
|
|
|
which will also detect other types and give some more info. Omit
|
|
"-p" for old versions of blkid that do not support it.
|
|
|
|
|
|
* 6.4 How do I backup a LUKS or dm-crypt partition?
|
|
|
|
There are two options, a sector-image and a plain file or
|
|
filesystem backup of the contents of the partition. The sector
|
|
image is already encrypted, but cannot be compressed and contains
|
|
all empty space. The filesystem backup can be compressed, can
|
|
contain only part of the encrypted device, but needs to be
|
|
encrypted separately if so desired.
|
|
|
|
A sector-image will contain the whole partition in encrypted form,
|
|
for LUKS the LUKS header, the keys-slots and the data area. It can
|
|
be done under Linux e.g. with dd_rescue (for a direct image copy)
|
|
and with "cat" or "dd". Example:
|
|
|
|
cat /dev/sda10 > sda10.img
|
|
dd_rescue /dev/sda10 sda10.img
|
|
|
|
You can also use any other backup software that is capable of making
|
|
a sector image of a partition. Note that compression is
|
|
ineffective for encrypted data, hence it does not make sense to
|
|
use it.
|
|
|
|
For a filesystem backup, you decrypt and mount the encrypted
|
|
partition and back it up as you would a normal filesystem. In this
|
|
case the backup is not encrypted, unless your encryption method
|
|
does that. For example you can encrypt a backup with "tar" as
|
|
follows with GnuPG:
|
|
|
|
tar cjf - <path> | gpg --cipher-algo AES -c - > backup.tbz2.gpg
|
|
|
|
And verify the backup like this if you are at "path":
|
|
|
|
cat backup.tbz2.gpg | gpg - | tar djf -
|
|
|
|
Note: Always verify backups, especially encrypted ones!
|
|
|
|
There is one problem with verifying like this: The kernel may still
|
|
have some files cached and in fact verify them against RAM or may
|
|
even verify RAM against RAM, which defeats the purpose of the
|
|
exercise. The following command empties the kernel caches:
|
|
|
|
echo 3 > /proc/sys/vm/drop_caches
|
|
|
|
Run it after backup and before verify.
|
|
|
|
In both cases GnuPG will ask you interactively for your symmetric
|
|
key. The verify will only output errors. Use "tar dvjf -" to get
|
|
all comparison results. To make sure no data is written to disk
|
|
unencrypted, turn off swap if it is not encrypted before doing the
|
|
backup.
|
|
|
|
Restore works like certification with the 'd' ('difference')
|
|
replaced by 'x' ('eXtract'). Refer to the man-page of tar for more
|
|
explanations and instructions. Note that with default options tar
|
|
will overwrite already existing files without warning. If you are
|
|
unsure about how to use tar, experiment with it in a location
|
|
where you cannot do damage.
|
|
|
|
You can of course use different or no compression and you can use
|
|
an asymmetric key if you have one and have a backup of the secret
|
|
key that belongs to it.
|
|
|
|
A second option for a filesystem-level backup that can be used when
|
|
the backup is also on local disk (e.g. an external USB drive) is
|
|
to use a LUKS container there and copy the files to be backed up
|
|
between both mounted containers. Also see next item.
|
|
|
|
|
|
* 6.5 Do I need a backup of the full partition? Would the header and
|
|
key-slots not be enough?
|
|
|
|
Backup protects you against two things: Disk loss or corruption
|
|
and user error. By far the most questions on the dm-crypt mailing
|
|
list about how to recover a damaged LUKS partition are related
|
|
to user error. For example, if you create a new filesystem on a
|
|
LUKS partition, chances are good that all data is lost
|
|
permanently.
|
|
|
|
For this case, a header+key-slot backup would often be enough. But
|
|
keep in mind that a well-treated (!) HDD has roughly a failure
|
|
risk of 5% per year. It is highly advisable to have a complete
|
|
backup to protect against this case.
|
|
|
|
|
|
* *6.6 What do I need to backup if I use "decrypt_derived"?
|
|
|
|
This is a script in Debian, intended for mounting /tmp or swap with
|
|
a key derived from the master key of an already decrypted device.
|
|
If you use this for an device with data that should be persistent,
|
|
you need to make sure you either do not lose access to that master
|
|
key or have a backup of the data. If you derive from a LUKS
|
|
device, a header backup of that device would cover backing up the
|
|
master key. Keep in mind that this does not protect against disk
|
|
loss.
|
|
|
|
Note: If you recreate the LUKS header of the device you derive from
|
|
(using luksFormat), the master key changes even if you use the same
|
|
passphrase(s) and you will not be able to decrypt the derived
|
|
device with the new LUKS header.
|
|
|
|
|
|
* 6.7 Does a backup compromise security?
|
|
|
|
Depends on how you do it. However if you do not have one, you are
|
|
going to eventually lose your encrypted data.
|
|
|
|
There are risks introduced by backups. For example if you
|
|
change/disable a key-slot in LUKS, a binary backup of the partition
|
|
will still have the old key-slot. To deal with this, you have to
|
|
be able to change the key-slot on the backup as well, securely
|
|
erase the backup or do a filesystem-level backup instead of a binary
|
|
one.
|
|
|
|
If you use dm-crypt, backup is simpler: As there is no key
|
|
management, the main risk is that you cannot wipe the backup when
|
|
wiping the original. However wiping the original for dm-crypt
|
|
should consist of forgetting the passphrase and that you can do
|
|
without actual access to the backup.
|
|
|
|
In both cases, there is an additional (usually small) risk with
|
|
binary backups: An attacker can see how many sectors and which
|
|
ones have been changed since the backup. To prevent this, use a
|
|
filesystem level backup method that encrypts the whole backup in
|
|
one go, e.g. as described above with tar and GnuPG.
|
|
|
|
My personal advice is to use one USB disk (low value data) or
|
|
three disks (high value data) in rotating order for backups, and
|
|
either use independent LUKS partitions on them, or use encrypted
|
|
backup with tar and GnuPG.
|
|
|
|
If you do network-backup or tape-backup, I strongly recommend to
|
|
go the filesystem backup path with independent encryption, as you
|
|
typically cannot reliably delete data in these scenarios,
|
|
especially in a cloud setting. (Well, you can burn the tape if it
|
|
is under your control...)
|
|
|
|
|
|
* 6.8 What happens if I overwrite the start of a LUKS partition or
|
|
damage the LUKS header or key-slots?
|
|
|
|
There are two critical components for decryption: The salt values
|
|
in the key-slot descriptors of the header and the key-slots. If the
|
|
salt values are overwritten or changed, nothing (in the
|
|
cryptographically strong sense) can be done to access the data,
|
|
unless there is a backup of the LUKS header. If a key-slot is
|
|
damaged, the data can still be read with a different key-slot, if
|
|
there is a remaining undamaged and used key-slot. Note that in
|
|
order to make a key-slot unrecoverable in a cryptographically
|
|
strong sense, changing about 4-6 bits in random locations of its
|
|
128kiB size is quite enough.
|
|
|
|
|
|
* 6.9 What happens if I (quick) format a LUKS partition?
|
|
|
|
I have not tried the different ways to do this, but very likely you
|
|
will have written a new boot-sector, which in turn overwrites the
|
|
LUKS header, including the salts, making your data permanently
|
|
irretrievable, unless you have a LUKS header backup. You may also
|
|
damage the key-slots in part or in full. See also last item.
|
|
|
|
|
|
* 6.10 How do I recover the master key from a mapped LUKS container?
|
|
|
|
This is typically only needed if you managed to damage your LUKS
|
|
header, but the container is still mapped, i.e. "luksOpen"ed. It
|
|
also helps if you have a mapped container that you forgot or do not
|
|
know a passphrase for (e.g. on a long running server.)
|
|
|
|
WARNING: Things go wrong, do a full backup before trying this!
|
|
|
|
WARNING: This exposes the master key of the LUKS container. Note
|
|
that both ways to recreate a LUKS header with the old master key
|
|
described below will write the master key to disk. Unless you are
|
|
sure you have securely erased it afterwards, e.g. by writing it to
|
|
an encrypted partition, RAM disk or by erasing the filesystem you
|
|
wrote it to by a complete overwrite, you should change the master
|
|
key afterwards. Changing the master key requires a full data
|
|
backup, luksFormat and then restore of the backup.
|
|
|
|
First, there is a script by Milan that automates the whole
|
|
process, except generating a new LUKS header with the old master
|
|
key (it prints the command for that though):
|
|
|
|
https://gitlab.com/cryptsetup/cryptsetup/blob/master/misc/luks-header-from-active
|
|
|
|
You can also do this manually. Here is how:
|
|
|
|
- Get the master key from the device mapper. This is done by the
|
|
following command. Substitute c5 for whatever you mapped to:
|
|
|
|
# dmsetup table --target crypt --showkey /dev/mapper/c5
|
|
Result:
|
|
0 200704 crypt aes-cbc-essiv:sha256
|
|
a1704d9715f73a1bb4db581dcacadaf405e700d591e93e2eaade13ba653d0d09
|
|
0 7:0 4096
|
|
|
|
The result is actually one line, wrapped here for clarity. The long
|
|
hex string is the master key.
|
|
|
|
- Convert the master key to a binary file representation. You can
|
|
do this manually, e.g. with hexedit. You can also use the tool
|
|
"xxd" from vim like this:
|
|
|
|
echo "a1704d9....53d0d09" | xxd -r -p > <master-key-file>
|
|
|
|
- Do a luksFormat to create a new LUKS header.
|
|
|
|
NOTE: If your header is intact and you just forgot the
|
|
passphrase, you can just set a new passphrase, see next
|
|
sub-item.
|
|
|
|
Unmap the device before you do that (luksClose). Then do
|
|
|
|
cryptsetup luksFormat --master-key-file=<master-key-file> <luks device>
|
|
|
|
Note that if the container was created with other than the default
|
|
settings of the cryptsetup version you are using, you need to give
|
|
additional parameters specifying the deviations. If in doubt, try
|
|
the script by Milan. It does recover the other parameters as well.
|
|
|
|
Side note: This is the way the decrypt_derived script gets at the
|
|
master key. It just omits the conversion and hashes the master key
|
|
string.
|
|
|
|
- If the header is intact and you just forgot the passphrase, just
|
|
set a new passphrase like this:
|
|
|
|
cryptsetup luksAddKey --master-key-file=<master-key-file> <luks device>
|
|
|
|
You may want to disable the old one afterwards.
|
|
|
|
|
|
* 6.11 What does the on-disk structure of dm-crypt look like?
|
|
|
|
There is none. dm-crypt takes a block device and gives encrypted
|
|
access to each of its blocks with a key derived from the passphrase
|
|
given. If you use a cipher different than the default, you have to
|
|
specify that as a parameter to cryptsetup too. If you want to
|
|
change the password, you basically have to create a second
|
|
encrypted device with the new passphrase and copy your data over.
|
|
On the plus side, if you accidentally overwrite any part of a
|
|
dm-crypt device, the damage will be limited to the area you
|
|
overwrote.
|
|
|
|
|
|
* 6.12 What does the on-disk structure of LUKS look like?
|
|
|
|
A LUKS partition consists of a header, followed by 8 key-slot
|
|
descriptors, followed by 8 key slots, followed by the encrypted
|
|
data area.
|
|
|
|
Header and key-slot descriptors fill the first 592 bytes. The
|
|
key-slot size depends on the creation parameters, namely on the
|
|
number of anti-forensic stripes, key material offset and master
|
|
key size.
|
|
|
|
With the default parameters, each key-slot is a bit less than
|
|
128kiB in size. Due to sector alignment of the key-slot start,
|
|
that means the key block 0 is at offset 0x1000-0x20400, key
|
|
block 1 at offset 0x21000-0x40400, and key block 7 at offset
|
|
0xc1000-0xe0400. The space to the next full sector address is
|
|
padded with zeros. Never used key-slots are filled with what the
|
|
disk originally contained there, a key-slot removed with
|
|
"luksRemoveKey" or "luksKillSlot" gets filled with 0xff. Due to
|
|
2MiB default alignment, start of the data area for cryptsetup 1.3
|
|
and later is at 2MiB, i.e. at 0x200000. For older versions, it is
|
|
at 0x101000, i.e. at 1'052'672 bytes, i.e. at 1MiB + 4096 bytes
|
|
from the start of the partition. Incidentally, "luksHeaderBackup"
|
|
for a LUKS container created with default parameters dumps exactly
|
|
the first 2MiB (or 1'052'672 bytes for headers created with
|
|
cryptsetup versions < 1.3) to file and "luksHeaderRestore" restores
|
|
them.
|
|
|
|
For non-default parameters, you have to figure out placement
|
|
yourself. "luksDump" helps. See also next item. For the most common
|
|
non-default settings, namely aes-xts-plain with 512 bit key, the
|
|
offsets are: 1st keyslot 0x1000-0x3f800, 2nd keyslot
|
|
0x40000-0x7e000, 3rd keyslot 0x7e000-0xbd800, ..., and start of
|
|
bulk data at 0x200000.
|
|
|
|
The exact specification of the format is here:
|
|
https://gitlab.com/cryptsetup/cryptsetup/wikis/Specification
|
|
|
|
For your convenience, here is the LUKS header with hex offsets.
|
|
NOTE: The spec counts key-slots from 1 to 8, but the cryptsetup
|
|
tool counts from 0 to 7. The numbers here refer to the cryptsetup
|
|
numbers.
|
|
|
|
Refers to LUKS On-Disk Format Specification Version 1.2.1
|
|
LUKS header:
|
|
offset length name data type description
|
|
-----------------------------------------------------------------------
|
|
0x0000 0x06 magic byte[] 'L','U','K','S', 0xba, 0xbe
|
|
0 6
|
|
0x0006 0x02 version uint16_t LUKS version
|
|
6 3
|
|
0x0008 0x20 cipher-name char[] cipher name spec.
|
|
8 32
|
|
0x0028 0x20 cipher-mode char[] cipher mode spec.
|
|
40 32
|
|
0x0048 0x20 hash-spec char[] hash spec.
|
|
72 32
|
|
0x0068 0x04 payload-offset uint32_t bulk data offset in sectors
|
|
104 4 (512 bytes per sector)
|
|
0x006c 0x04 key-bytes uint32_t number of bytes in key
|
|
108 4
|
|
0x0070 0x14 mk-digest byte[] master key checksum
|
|
112 20 calculated with PBKDF2
|
|
0x0084 0x20 mk-digest-salt byte[] salt for PBKDF2 when
|
|
132 32 calculating mk-digest
|
|
0x00a4 0x04 mk-digest-iter uint32_t iteration count for PBKDF2
|
|
164 4 when calculating mk-digest
|
|
0x00a8 0x28 uuid char[] partition UUID
|
|
168 40
|
|
0x00d0 0x30 key-slot-0 key slot key slot 0
|
|
208 48
|
|
0x0100 0x30 key-slot-1 key slot key slot 1
|
|
256 48
|
|
0x0130 0x30 key-slot-2 key slot key slot 2
|
|
304 48
|
|
0x0160 0x30 key-slot-3 key slot key slot 3
|
|
352 48
|
|
0x0190 0x30 key-slot-4 key slot key slot 4
|
|
400 48
|
|
0x01c0 0x30 key-slot-5 key slot key slot 5
|
|
448 48
|
|
0x01f0 0x30 key-slot-6 key slot key slot 6
|
|
496 48
|
|
0x0220 0x30 key-slot-7 key slot key slot 7
|
|
544 48
|
|
Key slot:
|
|
offset length name data type description
|
|
-------------------------------------------------------------------------
|
|
0x0000 0x04 active uint32_t key slot enabled/disabled
|
|
0 4
|
|
0x0004 0x04 iterations uint32_t PBKDF2 iteration count
|
|
4 4
|
|
0x0008 0x20 salt byte[] PBKDF2 salt
|
|
8 32
|
|
0x0028 0x04 key-material-offset uint32_t key start sector
|
|
40 4 (512 bytes/sector)
|
|
0x002c 0x04 stripes uint32_t number of anti-forensic
|
|
44 4 stripes
|
|
|
|
|
|
* 6.13 What is the smallest possible LUKS container?
|
|
|
|
Note: From cryptsetup 1.3 onwards, alignment is set to 1MB. With
|
|
modern Linux partitioning tools that also align to 1MB, this will
|
|
result in alignment to 2k sectors and typical Flash/SSD sectors,
|
|
which is highly desirable for a number of reasons. Changing the
|
|
alignment is not recommended.
|
|
|
|
That said, with default parameters, the data area starts at
|
|
exactly 2MB offset (at 0x101000 for cryptsetup versions before
|
|
1.3). The smallest data area you can have is one sector of 512
|
|
bytes. Data areas of 0 bytes can be created, but fail on mapping.
|
|
|
|
While you cannot put a filesystem into something this small, it may
|
|
still be used to contain, for example, key. Note that with current
|
|
formatting tools, a partition for a container this size will be
|
|
3MiB anyways. If you put the LUKS container into a file (via
|
|
losetup and a loopback device), the file needs to be 2097664 bytes
|
|
in size, i.e. 2MiB + 512B.
|
|
|
|
There two ways to influence the start of the data area are key-size
|
|
and alignment.
|
|
|
|
For alignment, you can go down to 1 on the parameter. This will
|
|
still leave you with a data-area starting at 0x101000, i.e.
|
|
1MiB+4096B (default parameters) as alignment will be rounded up to
|
|
the next multiple of 8 (i.e. 4096 bytes) If in doubt, do a dry-run
|
|
on a larger file and dump the LUKS header to get actual
|
|
information.
|
|
|
|
For key-size, you can use 128 bit (e.g. AES-128 with CBC), 256 bit
|
|
(e.g. AES-256 with CBC) or 512 bit (e.g. AES-256 with XTS mode).
|
|
You can do 64 bit (e.g. blowfish-64 with CBC), but anything below
|
|
128 bit has to be considered insecure today.
|
|
|
|
Example 1 - AES 128 bit with CBC:
|
|
|
|
cryptsetup luksFormat -s 128 --align-payload=8 <device>
|
|
|
|
This results in a data offset of 0x81000, i.e. 516KiB or 528384
|
|
bytes. Add one 512 byte sector and the smallest LUKS container size
|
|
with these parameters is 516KiB + 512B or 528896 bytes.
|
|
|
|
Example 2 - Blowfish 64 bit with CBC (WARNING: insecure):
|
|
|
|
cryptsetup luksFormat -c blowfish -s 64 --align-payload=8 /dev/loop0
|
|
|
|
This results in a data offset of 0x41000, i.e. 260kiB or 266240
|
|
bytes, with a minimal LUKS container size of 260kiB + 512B or
|
|
266752 bytes.
|
|
|
|
|
|
* 6.14 I think this is overly complicated. Is there an alternative?
|
|
|
|
Not really. Encryption comes at a price. You can use plain
|
|
dm-crypt to simplify things a bit. It does not allow multiple
|
|
passphrases, but on the plus side, it has zero on disk description
|
|
and if you overwrite some part of a plain dm-crypt partition,
|
|
exactly the overwritten parts are lost (rounded up to sector
|
|
borders).
|
|
|
|
|
|
* 6.15 Can I clone a LUKS container?
|
|
|
|
You can, but it breaks security, because the cloned container has
|
|
the same header and hence the same master key. You cannot change
|
|
the master key on a LUKS container, even if you change the
|
|
passphrase(s), the master key stays the same. That means whoever
|
|
has access to one of the clones can decrypt them all, completely
|
|
bypassing the passphrases.
|
|
|
|
The right way to do this is to first luksFormat the target
|
|
container, then to clone the contents of the source container, with
|
|
both containers mapped, i.e. decrypted. You can clone the decrypted
|
|
contents of a LUKS container in binary mode, although you may run
|
|
into secondary issues with GUIDs in filesystems, partition tables,
|
|
RAID-components and the like. These are just the normal problems
|
|
binary cloning causes.
|
|
|
|
Note that if you need to ship (e.g.) cloned LUKS containers with a
|
|
default passphrase, that is fine as long as each container was
|
|
individually created (and hence has its own master key). In this
|
|
case, changing the default passphrase will make it secure again.
|
|
|
|
|
|
7. Interoperability with other Disk Encryption Tools
|
|
|
|
|
|
* 7.1 What is this section about?
|
|
|
|
Cryptsetup for plain dm-crypt can be used to access a number of
|
|
on-disk formats created by tools like loop-aes patched into
|
|
losetup. This sometimes works and sometimes does not. This
|
|
section collects insights into what works, what does not and where
|
|
more information is required.
|
|
|
|
Additional information may be found in the mailing-list archives,
|
|
mentioned at the start of this FAQ document. If you have a
|
|
solution working that is not yet documented here and think a wider
|
|
audience may be interested, please email the FAQ maintainer.
|
|
|
|
|
|
* 7.2 loop-aes: General observations.
|
|
|
|
One problem is that there are different versions of losetup around.
|
|
loop-aes is a patch for losetup. Possible problems and deviations
|
|
from cryptsetup option syntax include:
|
|
|
|
- Offsets specified in bytes (cryptsetup: 512 byte sectors)
|
|
|
|
- The need to specify an IV offset
|
|
|
|
- Encryption mode needs specifying (e.g. "-c twofish-cbc-plain")
|
|
|
|
- Key size needs specifying (e.g. "-s 128" for 128 bit keys)
|
|
|
|
- Passphrase hash algorithm needs specifying
|
|
|
|
Also note that because plain dm-crypt and loop-aes format does not
|
|
have metadata, and while the loopAES extension for cryptsetup tries
|
|
autodetection (see command loopaesOpen), it may not always work.
|
|
If you still have the old set-up, using a verbosity option (-v)
|
|
on mapping with the old tool or having a look into the system logs
|
|
after setup could give you the information you need. Below, there
|
|
are also some things that worked for somebody.
|
|
|
|
|
|
* 7.3 loop-aes patched into losetup on Debian 5.x, kernel 2.6.32
|
|
|
|
In this case, the main problem seems to be that this variant of
|
|
losetup takes the offset (-o option) in bytes, while cryptsetup
|
|
takes it in sectors of 512 bytes each. Example: The losetup command
|
|
|
|
losetup -e twofish -o 2560 /dev/loop0 /dev/sdb1
|
|
mount /dev/loop0 mount-point
|
|
|
|
translates to
|
|
|
|
cryptsetup create -c twofish -o 5 --skip 5 e1 /dev/sdb1
|
|
mount /dev/mapper/e1 mount-point
|
|
|
|
|
|
* 7.4 loop-aes with 160 bit key
|
|
|
|
This seems to be sometimes used with twofish and blowfish and
|
|
represents a 160 bit ripemed160 hash output padded to 196 bit key
|
|
length. It seems the corresponding options for cryptsetup are
|
|
|
|
--cipher twofish-cbc-null -s 192 -h ripemd160:20
|
|
|
|
|
|
* 7.5 loop-aes v1 format OpenSUSE
|
|
|
|
Apparently this is done by older OpenSUSE distros and stopped
|
|
working from OpenSUSE 12.1 to 12.2. One user had success with the
|
|
following:
|
|
|
|
cryptsetup create <target> <device> -c aes -s 128 -h sha256
|
|
|
|
|
|
* 7.6 Kernel encrypted loop device (cryptoloop)
|
|
|
|
There are a number of different losetup implementations for using
|
|
encrypted loop devices so getting this to work may need a bit of
|
|
experimentation.
|
|
|
|
NOTE: Do NOT use this for new containers! Some of the existing
|
|
implementations are insecure and future support is uncertain.
|
|
|
|
Example for a compatible mapping:
|
|
|
|
losetup -e twofish -N /dev/loop0 /image.img
|
|
|
|
translates to
|
|
|
|
cryptsetup create image_plain /image.img -c twofish-cbc-plain -H plain
|
|
|
|
with the mapping being done to /dev/mapper/image_plain instead of
|
|
to /dev/loop0.
|
|
|
|
More details:
|
|
|
|
Cipher, mode and pasword hash (or no hash):
|
|
|
|
-e cipher [-N] => -c cipher-cbc-plain -H plain [-s 256]
|
|
-e cipher => -c cipher-cbc-plain -H ripemd160 [-s 256]
|
|
|
|
Key size and offsets (losetup: bytes, cryptsetuop: sectors of 512
|
|
bytes):
|
|
|
|
-k 128 => -s 128
|
|
-o 2560 => -o 5 -p 5 # 2560/512 = 5
|
|
|
|
There is no replacement for --pass-fd, it has to be emulated using
|
|
keyfiles, see the cryptsetup man-page.
|
|
|
|
|
|
8. Issues with Specific Versions of cryptsetup
|
|
|
|
|
|
* 8.1 When using the create command for plain dm-crypt with
|
|
cryptsetup 1.1.x, the mapping is incompatible and my data is not
|
|
accessible anymore!
|
|
|
|
With cryptsetup 1.1.x, the distro maintainer can define different
|
|
default encryption modes. You can check the compiled-in defaults
|
|
using "cryptsetup --help". Moreover, the plain device default
|
|
changed because the old IV mode was vulnerable to a watermarking
|
|
attack.
|
|
|
|
If you are using a plain device and you need a compatible mode, just
|
|
specify cipher, key size and hash algorithm explicitly. For
|
|
compatibility with cryptsetup 1.0.x defaults, simple use the
|
|
following:
|
|
|
|
cryptsetup create -c aes-cbc-plain -s 256 -h ripemd160 <name> <dev>
|
|
|
|
LUKS stores cipher and mode in the metadata on disk, avoiding this
|
|
problem.
|
|
|
|
|
|
* 8.2 cryptsetup on SLED 10 has problems...
|
|
|
|
SLED 10 is missing an essential kernel patch for dm-crypt, which
|
|
is broken in its kernel as a result. There may be a very old
|
|
version of cryptsetup (1.0.x) provided by SLED, which should also
|
|
not be used anymore as well. My advice would be to drop SLED 10.
|
|
|
|
|
|
* 8.3 Gcrypt after 1.5.3 breaks Whirlpool
|
|
|
|
It is the other way round: In gcrypt 1.5.3 and before Whirlpool is
|
|
broken and it was fixed in the next version. If you selected
|
|
whirlpool as hash on creation of a LUKS container, it does not work
|
|
anymore with the fixed library. This shows one serious risk of
|
|
using rarely used settings.
|
|
|
|
The only two ways to deal with this are either to decrypt with an
|
|
old gcrypt version that has the flaw or to use a compatibility
|
|
feature introduced in cryptsetup 1.6.4 and gcrypt 1.6.1 or later.
|
|
Versions of gcrypt between 1.5.4 and 1.6.0 cannot be used.
|
|
|
|
Steps:
|
|
|
|
- Make a least a header backup or better, refresh your full
|
|
backup. (You have a full backup, right? See Item 6.1 and
|
|
following.)
|
|
|
|
- Make sure you have cryptsetup 1.6.4 or later and check the gcrypt
|
|
version:
|
|
|
|
|
|
cryptsetup luksDump <your luks device> --debug | grep backend
|
|
|
|
If gcrypt is at version 1.5.3 or before:
|
|
|
|
- Reencrypt the LUKS header with a different hash. (Requires
|
|
entering all keyslot passphrases. If you do not have all, remove
|
|
the ones you do not have before.):
|
|
|
|
cryptsetup-reencrypt --keep-key --hash sha256 <your luks device>
|
|
|
|
If gcrypt is at version 1.6.1 or later:
|
|
|
|
- Patch the hash name in the LUKS header from "whirlpool" to
|
|
"whirlpool_gcryptbug". This activates the broken implementation.
|
|
The detailed header layout is in Item 6.12 of this FAQ and in the
|
|
LUKS on-disk format specification. One way to change the hash is
|
|
with the following command:
|
|
|
|
echo -n -e 'whirlpool_gcryptbug\0' | dd of=<luks device> bs=1 seek=72 conv=notrunc
|
|
|
|
- You can now open the device again. It is highly advisable to
|
|
change the hash now with cryptsetup-reencrypt as described above.
|
|
While you can reencrypt to use the fixed whirlpool, that may not
|
|
be a good idea as almost nobody seems to use it and hence the long
|
|
time until the bug was discovered.
|
|
|
|
|
|
9. References and Further Reading
|
|
|
|
|
|
* Purpose of this Section
|
|
|
|
The purpose of this section is to collect references to all
|
|
materials that do not fit the FAQ but are relevant in some fashion.
|
|
This can be core topics like the LUKS spec or disk encryption, but
|
|
it can also be more tangential, like secure storage management or
|
|
cryptography used in LUKS. It should still have relevance to
|
|
cryptsetup and its applications.
|
|
|
|
If you wan to see something added here, send email to the
|
|
maintainer (or the cryptsetup mailing list) giving an URL, a
|
|
description (1-3 lines preferred) and a section to put it in. You
|
|
can also propose new sections.
|
|
|
|
At this time I would like to limit the references to things that
|
|
are available on the web.
|
|
|
|
|
|
* Specifications
|
|
|
|
- LUKS on-disk format spec:
|
|
https://gitlab.com/cryptsetup/cryptsetup/wikis/Specification
|
|
|
|
* Code Examples
|
|
|
|
- Some code examples are in the source package under docs/examples
|
|
|
|
|
|
* Brute-forcing passphrases
|
|
|
|
-
|
|
http://news.electricalchemy.net/2009/10/password-cracking-in-cloud-part-5.html
|
|
|
|
-
|
|
http://it.slashdot.org/story/12/12/05/0623215/new-25-gpu-monster-devours-strong-passwords-in-minutes
|
|
|
|
|
|
* Tools
|
|
|
|
|
|
* SSD and Flash Disk Related
|
|
|
|
|
|
* Disk Encryption
|
|
|
|
|
|
* Attacks Against Disk Encryption
|
|
|
|
|
|
* Risk Management as Relevant for Disk Encryption
|
|
|
|
|
|
* Cryptography
|
|
|
|
|
|
* Secure Storage
|
|
|
|
A. Contributors In no particular order:
|
|
|
|
- Arno Wagner
|
|
|
|
- Milan Broz
|
|
|