Linux debian'da disk şifreleme. Linux için LUKS, EncFS ve CryptoFS veri şifreleme sistemleri

Linux debian'da disk şifreleme.  Linux için LUKS, EncFS ve CryptoFS veri şifreleme sistemleri
Linux debian'da disk şifreleme. Linux için LUKS, EncFS ve CryptoFS veri şifreleme sistemleri

Bu yazımda sizlere nasıl gizli kripto container oluşturacağınızı anlatacağım. standart araçlar Linux işletim sistemi (LUKS ve cryptsetup). LUKS'un yerleşik özellikleri (harici başlıkları kullanmak ve gerçek verileri belirli bir uzaklığa yerleştirmek gibi), kullanıcının mevcut bir kapsayıcının içinde gizlenmiş verilere erişmesine ve bu tür verilerin varlığını reddetmesine olanak tanır.

güncelleme: Bu gönderi bir ay önce hazır olduğundan, projenin bu kadar garip ve beklenmedik bir şekilde ölümünü hayal bile edemezdim. Evet, henüz tamamen ölmemiş olabilir, bakalım ... Yine de bu metinde TrueCrypt'e yapılan tüm referansları olduğu gibi bırakmaya karar verdim.

"Makul inkar edilebilirlik" nedir?

Bu kavramın çok uzun ve ayrıntılı bir tanımını Wikipedia'da bulabilirsiniz: http://en.wikipedia.org/wiki/Plausible_deniability . Kısacası, bu, varlığından kimsenin şüphelenemeyeceği veya kanıtlayamayacağı bir şeye sahip olabileceğiniz (veya bir şey yapmış olabileceğiniz) anlamına gelir (tabii ki kendiniz kabul etmediğiniz sürece). Ve daha sonra, biri sizi suçlamak isterse, bunun varlığını (veya yapıldığını) inkar edebilirsiniz, çünkü (tekrar ediyorum) bu gerçek kanıtlanamaz. Peki, örneğin bir çocuk küçük kardeşinin kıçına tekme atsa ve erkek kardeş anne babasından adalet istemeye gitse bu durumda ne olur?

Şey... Sanki hiçbir şey olmuyormuş gibi. Çünkü bu adam reddedecek ve resmi olarak konuşan ebeveynler onu elinden yakalayamayacak (çünkü, birincisi, aptalca tanık yok ve ikincisi, küçük erkek kardeş kirli oyununu oynayabilir). Böylece kimse cezalandırılmayacak. Ya da her itfaiyeci için ikisini birden cezalandıracaklar. Bu, saldırganlığa yatkın bir çocuğun makul inkar olasılığını kullanmasına sadece bir örnekti. Ama sen ve ben elbette beyazız ve kabarıkız ve gizli kapları yalnızca kişisel verilerimizi kötü adamlardan korumak için kullanacağız. Çok doğru? Elbette “neyin “iyi” neyin “kötü” olduğu ayrı bir konu… Ancak daha da önemlisi.

Genel uygulama fikri

Bazı önemli verileri şifrelenmiş bir dosyada saklamak istediğimizi varsayalım. Genel olarak, bizim için tüm kirli işleri yapacak bir tür kripto koruma programı kullanacağız. Şifrelenmiş dosyaya sanal bir diskmiş gibi davranmak isteyebiliriz ve bu, potansiyel aday sayısını önemli ölçüde azaltır. Ancak, bir "ama" var. Bu tür programların hemen hemen tümü, tek parça şifrelenmiş veriler gibi bir dosyayla çalışır. Açıklamama izin verin: kullanıcı genellikle bir için şifre (ve belki birkaç "yedek") Tümü kapsayıcı içindeki veriler. Bu, en az bir zayıf bağlantı olduğu anlamına gelir: kapsayıcı parolası. Parolanın kriptografik olarak güçlü olması gerektiğinden bahsetmek istemiyorum çünkü bu ortak bir gerçek. Demek istediğim, kullanıcı herhangi bir nedenle (örneğin baskı altında) bu şifreden vazgeçerse, tüm veriler okunacaktır. Ve bu gerçek bana üzücü ve tamamen yanlış geliyor ...

Ancak, genellikle umut vardır. :) Mesela , oldukça akıllı bir program var. Kullanıcı bir dosyada iki kap oluşturabilir: biri belirli sayıda "yasak", ancak nispeten güvenli dosyalara sahip "sahte" bir kapsayıcı ve diğeri hiçbir koşulda ifşa edilmemesi gereken veriler içeren gerçek bir kapsayıcıdır. Bu nedenle TrueCrypt, bir kullanıcı böyle bir "çift" kapsayıcı oluşturmak istediğinde iki farklı parola ister. İşlem sırasında kullanıcı "gerçek" kısım için yalnızca bir şifre girer ve onunla çalışır. Dış koşulların baskısı altında, kullanıcının kabın içeriğini üçüncü taraflara ifşa etmesi durumunda, yalnızca farklı bir şifre girer ve TrueCrypt "sahte" açar. Araştırmacı ilgili şifreyi bilmiyorsa, gizli kısmın varlığını kanıtlamanın hiçbir yolu olmadığını vurguluyorum (ve bu gerçekten önemli).

Ve şimdi bu hurdalığın nasıl çalıştığını hızlıca anlayalım ... Aslında her şey çok basit. Yazılım, kapsayıcı dosyasını iki (genel anlamda, eşit olmayan) parçaya böler. Nispeten küçük olabilecek ilk bölüm, özel olarak hazırlanmış verileri içerir; ikincisi gerçek. Buna göre, program iki farklı başlık (konfigürasyon) ile çalışabilmelidir. farklı parçalar, kullanıcı tarafından girilen parolaya bağlı olarak hangi bölümün şifresinin çözüleceğini seçebilmenin yanı sıra. Ve bu, söylemeliyim ki, işin en önemsiz kısmı değil. Eh, "resmi olarak" yalnızca bir "sahte" konfigürasyonun görünür olması gerektiği için: kapsayıcının standart bir başlığı varsa, bu yalnızca "sahte" bir başlık olmalıdır; kapsayıcı parametreleri ayrı bir yapılandırmada depolanıyorsa, bu yapılandırma yalnızca "sahte" bölümün şifresinin çözülmesine izin vermelidir. Ve "sahte" kısmı deşifre ettikten sonra, gerçeğin varlığına dair tek bir ipucu kalmamalıdır. Kesinlikle bağımsız olmalıdırlar. Üstelik “sahte” kısım açıldığında yazılım, bu kısmın hacmi çok daha küçük olsa bile kripto konteynerinin tam kapasitesini göstermelidir.

Peki ya LUKS?

Pekala, burada iyi haberlerimiz var ve… ee… daha da iyi haberlerimiz var.

İyi haber şu ki, cryptsetup TrueCrypt " tarafından oluşturulan birimlerin şifresini çözebilir ve bağlayabilir. Ancak salt okunur, ancak bu saçmalık. Daha iyi haberler olduğu için. Yani, yalnızca kullanarak "gizli" kaplar oluşturabiliriz. Ayrıca, bu yardımcı program, istediğiniz sayıda "gizli" parça oluşturmanıza olanak tanır. Doğal olarak, makul sınırlar içinde. Ve işte nasıl yapılabileceği.

Ama devam etmeden önce,

KOCAMAN KORKUNÇ UYARI!!!

  • Aşağıda açıklanan herhangi bir şey, geri dönüşü olmayan veri kaybına neden olabilir.
  • Ülkenizde güçlü kriptografi kullanımı yasaklanmış olabilir, bu nedenle gerçek bilgi için değil, sadece vidanızda bulunacak bir kripto kabı bulundurduğunuz için hapsedilebilirsiniz.
  • Kriptografi verilerinizi koruyabilir, ancak sizi işkenceden korumaz. Gizli bir kap, değerli bilgilerin saklanmasına yardımcı olabilir, ancak ihanet veya ihbar durumunda varlığını inkar edemezsiniz.
  • Şifrelenmiş verilerinizle ilgilenen adamlar beklediğiniz kadar aptal olmayabilir. Konteynerin gizli bir kısmının varlığını kanıtlayamasalar bile, sizi tecrübeli suçlularla aynı hücreye kilitleyebilirler ve birkaç gün içinde tüm gizli verilerin tüm şifrelerini hatırlayacaksınız.
  • Yakınlarınız varsa (kız arkadaş / erkek arkadaş, akrabalar, arkadaşlar), onlar da sert baskının hedefi haline gelebilirler. Ve bu kesinlikle, bilmedikleriniz de dahil olmak üzere genel olarak her şeyi çok daha hızlı hatırlamanıza yardımcı olacaktır.

Bu nedenle, ne kadar bilginin sizin ve sevdiklerinizin hayatından daha değerli olduğunu iki kez düşünmek daha iyidir. Ve bir yedekleme yapın. Her ihtimale karşı.

Man cryptsetup bize bu yardımcı programın komut satırı parametreleri hakkında pek çok ilginç ayrıntı anlatabilir. Örneğin, --header seçeneğine bakalım:

İyi tamam. Bu, artık kesinlikle hiçbir anlamlı imza içermeyen rastgele çöplerle dolu bir veri hacmine sahip olabileceğimiz anlamına gelir. Bu seçeneğin açıklaması biraz daha fazla bilgi, uyarılar ve uyarılar içerir, ancak sonuçta, gereken tek şey budur. Ancak, bu mükemmel kılavuzu okumanızı şiddetle tavsiye ederim.

Diğer bir çok kullanışlı seçenek ise --align-payload , gerçek verileri birimin başlangıcına göre belirli bir ofsette konumlandırmanıza izin verir:

Ve bu da harika, çünkü artık verilerimizi birimin herhangi bir yerine serbestçe kaydırabiliyoruz. Fikri anladın, değil mi?

  1. Birimi şifreleme için başlatıyoruz: rastgele verilerle tamamen üzerine yazıyoruz.
  2. "Resmi" şifreli bir cilt oluşturuyoruz ve biraz düşürüyoruz enfekte varese, sarmal namlu, pron faydalı ücretsiz yazılımlar, amatör rock grubunuzdan kayıtlar, aşk filmleri vb. bunlar için size iki yıldan fazla deneme süresi verilmez.
  3. Yukarıdaki ezoterik kript kurulum seçeneklerini kullanarak, gizli bir birim ("resmi" içinde) oluşturuyoruz ve başlığını harici ortama aktarıyoruz. Burada gerçekten tehlikeli bilgileri (anaokulu fotoğraflarınız veya dünyayı fethetme planlarınız gibi) depolayabilirsiniz.

Aslında millet, hepsi bu. Sihir yok. Doğal olarak, "resmi" şifrelenmiş diski, alanının bir kısmının gizli bir konteynere verilmesi gibi basit bir nedenden dolayı tam kapasite dolduramazsınız. Ve başta da söylediğim gibi, isterseniz aynı mantıkla birden çok gizli sürücü oluşturabilirsiniz.

İşte ... Ve hala ayrıntılara ihtiyacınız varsa, o zaman özellikle sizin için -

izlenecek yol

Dikkat!

Aşağıdaki komutlar, beyinler açılmadan yürütülürse verilerinizi yok edecektir. dd gibi yardımcı programlar düşük düzeyde (yani, dosya sistemi düzeyinin altında) çalıştığından, kaybolan bilgiler kurtarılamaz. Bu nedenle, başlattıktan hemen sonra iptal etseniz bile değişiklikleri geri almak veya etkilerini geri almak mümkün olmayacaktır.

Kısacası, her adımın hedeflerinizle nasıl ilişkili olduğuna dair anlamlı bir açıklama düşünemiyorsanız bunu yapmayın. Ve bir yedekleme yapın. Şimdi.

Diyelim ki birden fazla bölümü olan bir cihazımız var. Örneğin, /dev/sdb olsun. Ve /dev/sdb1'in şifrelemeye adanmış nispeten küçük (8GB) bir bölüm olmasına izin verin. 5'e 3'e böleceğiz, burada 5 GB'lık kısım "resmi" olacak ve 3 GB'lık kısım gizlenecek. Ayrıca /media/user/ExtUSBStick içine mount edeceğimiz harici bir USB sürücüde sırasıyla /etc/keys içinde şifreli diskin anahtarını, gizli container'ın başlığını da tutacağımızı varsayalım. Anahtar deposunda hangi izinleri ayarlamanız gerektiğini, encfs / ecryptfs'yi güvenli olmayan cihazlarda güvenli bir şekilde saklamak için nasıl yapılandıracağınızı ve gerçek gizli anahtarları kopyalayıp bunları coğrafi olarak ayrılmış birkaç kasada saklamanın mantıklı olduğunu zaten bildiğinizi varsayıyorum.

Tamam, homurdanmayı bağlayıp konunun özüne geçiyorum.

    Cihaz başlatma /dev/sdb1:

    Dd if=/dev/urandom of=/dev/sdb1 bs=16M

    Şifreli bir birim için bir anahtar yapıyoruz. Amaçlarımız için çatıdan 512 bit (64 bayt):

    Dd if=/dev/urandom bs=64 count=1 >/etc/keys/secret.key 2>/dev/null

    Yeni oluşturulan anahtarı kullanarak birimi şifreleyin:

    Cryptsetup luksFormat /dev/sdb1 /etc/keys/secret.key

    Şifrelenmiş cihazı açın ve eşleştirmeyi secretdata'da yapılandırın:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key \ /dev/sdb1 secretdata

    Şifrelenmiş bir birimde oluşturun dosya sistemi(ör. btrfs):

    Mkfs.btrfs -L SecretData /dev/mapper/secretdata

    ... ve monte edin:

    /dev/mapper/secretdata /var/secretdata/ bağla

    5 gig sınırını akılda tutarak, alt hacim kotasını ayarlayın:

    Btrfs kotası etkinleştirme /var/secretdata/

    btrfs kotaları yalnızca alt hacimler için geçerli olduğundan, böyle bir şey oluşturalım:

    brfs alt hacmi /var/secretdata/çalışma hacmi oluştur

    ... ve belirtilen kotayı ona uygulayın (btrfs alt birimlerinin normal dosya sistemleri gibi bağlanabileceğini unutmayın, bu nedenle daha sonra tüm fs yerine bu belirli alt birimi bağlamanız sizin için daha uygun olabilir):

    btrfs qgroup sınırı 5G /var/secretdata/çalışma hacmi

    Bazı verilerle dolduruyoruz:

    debootstrap --variant=yapı testi /var/secretdata/workingvolume

    Hepsi bu kadar, şimdi bu kısmı unutabilirsiniz:

    Umount /var/secretdata cryptsetup luksClose secretdata

    Şimdi başlık için bir "balık" oluşturalım ve içine rastgele çöpler dolduralım:

    Dd if=/dev/urandom of=/media/user/ExtUSBStick/hidden.head bs=4M sayım=1

    Ve şimdi gerçek sihrin başladığı an geliyor. (Ne? Sihir olmadığını söyledim mi? Bu yüzden yalan söyledim.) Bununla birlikte, aynı gizli anahtarı tamamen değil, yalnızca yarısını (32 baytlık bir ofsetten) kullanıyoruz. Bununla birlikte, kalan 256 rasgele bit, iyi bir anahtar oluşturma yeteneğine sahiptir. Ardından başlığı ayırıp flash sürücüye koyacağız. Son olarak, cryptsetup "y"ye gizli kapsayıcımızı birimin başından itibaren 5 GB (yani 10485760 512 baytlık bloklar) kaydırmak istediğimizi söylüyoruz:

    Cryptsetup --keyfile-offset 32 ​​--header /media/user/ExtUSBStick/hidden.head \ --align-payload 10485760 luksFormat /dev/sdb1 /etc/keys/secret.key

    Evet, bu kadar basit. Şimdi yeni bir şifreli cihaz açalım:

    Cryptsetup luksOpen --key-file /etc/keys/secret.key --keyfile-offset 32 ​​\ --header /media/user/ExtUSBStick/hidden.head /dev/sdb1 realsecretdata

    İstediğimiz herhangi bir fs atalım:

    Mkfs.btrfs /dev/mapper/realsecretdata

kullanışlı bağlantılar

Biraz daha fazla bilgi edinmek isteyenler için, işte bazı ek kaynaklar bilgi:

  • disk şifreleme, disk şifreleme hakkında genel bilgiler: https://wiki.archlinux.org/index.php/Disk_encryption
  • Reddedilen Şifreleme, kavram "makul inkar edilebilirlik"ten biraz daha dardır ve yalnızca kriptografi alanına atıfta bulunur: https://en.wikipedia.org/wiki/Deniable_encryption
  • TrueCrypt

Bu yazıda linux altında çeşitli şifreleme sistemlerinin performanslarını karşılaştırmaya çalışacağım. Teorik olarak elbette hangi sistemin daha verimli olduğu biliniyor ve performansı hesaplanmaya çalışılıyor. farklı sistemler idi (). Truecrypt yerleşik bir kıyaslama bile içerir (ancak RAM'deki performansı gösterir, yalnızca farklı şifreleme algoritmalarının hızını değerlendirmek için kullanılabilir). Farklı bir şey yapacağım - Çeşitli yollarla şifrelenmiş bir dosya sisteminin hızını, geleneksel şifrelenmemiş bir dosya sistemine kıyasla yüzde olarak ölçeceğim.


Her özel durumda varsayılan olarak kullanılan algoritma ile kök dosya sistemi içermeyen ayrı bir HDD'deki ayrı bir bölümü şifreleyeceğiz. Nasıl sıradan kullanıcı, Şifreleme standartlarının nüanslarını anlamıyorum (örneğin, RIPEMD-160 hashing'in Whirpool'dan ne kadar farklı olduğu, bu modlardan hangisinin daha hızlı olduğu ve daha yüksek koruma sağladığı), bu yüzden her birinin üreticisinin olduğu gerçeğine güveniyoruz. yazılım ürünü yeterince kriptoya dayanıklı varsayılan parametreleri seçti. Belki de bu tamamen doğru değildir çünkü çeşitli şifreleme algoritmalarının performansı aynı değildir. İstenirse, elbette şifreleme türünü değiştirebilirsiniz, ancak test edilen tüm ürünlerde kesinlikle aynı algoritmalar olduğundan emin değilim. Test edeceğiz:

3) eCryptfs, ev dizinlerini şifrelemek için Ubuntu kullanıcılarına sunulan varsayılan sistemdir, bu yüzden bu teste dahil edilmiştir. Mevcut bir dosya sisteminin üzerinde çalışır. Her dosyayı ayrı ayrı şifreler, böylece herkes hakları, değişiklik tarihlerini, şifrelenmiş dosyaların sayısını görebilir; varsayılan olarak dosya adları da görünür, ancak bunları şifrelemek için bir seçenek vardır. Şimdiye kadarki en az işlevsel araç.

4) EncFS - eCryptfs'in yaklaşık bir analogu, ancak FUSE kullanır.

Bu nedenle, aşağıdaki yapılandırmadaki testler için oldukça ileri yaşta ayrı bir makine seçildi: CPU - Intel Celeron 2000Mhz, RAM - 512 Mb DDR PC2700, sistem HDD'si - WD Caviar SE 5400 RPM 80Gb, test HDD'si - WD Caviar SE 7200 RPM 80Gb.
İşletim Sistemi - Ubuntu 12.04 LTS, tüm yazılımların sürümleri, bu yazının yazıldığı tarihte bu işletim sisteminin depolarıyla ilgilidir (Truecrypt 7.1a-linux-x86, depolardan değildir).

Çoğu dağıtım için varsayılan ext4 dosya sistemini test edeceğiz. Performans testi için, testlerdeki yüzde farkını ölçmek için iozone3 yardımcı programını ve "diz üzerine" yazılmış bir kabuk betiğini kullanacağız.

Sayma komut dosyası. Kodun temizliğine özel bir dikkat gösterilmedi, yazmak için tek kriter doğru sonucun varlığıydı.

#!/bin/sh gendifffile() ( #işlem, ayrıştırma için uygun bir dosya oluşturur. İlk olarak, ayrıştırılamayan satırlar kesilir; ikinci olarak, her satırdaki ilk iki sayı kesilerek #dosya boyutunu ve kaydı belirtir boyut, sırasıyla ; üçüncüsü, tüm dosya satır satır çıkar - satır başına #bir test sonucu cat $1 | LINE okunurken ; do echo $LINE| grep "^[[:space:]]*[[:digit:] ]" | awk "((i=3;i için)<=NF;i++) {print $i}}" done > > $2 ) getline() ( #procedure $1 dosyasının $2 satır numarasını verir head -n $2 "$1" | tail -n 1 ) Compare () ( #procedure $1 ve $2 dosyasını satır satır karşılaştırır, her birinin yüzde farkını hesaplar test çifti #sonra aritmetik ortalamayı yüzde olarak daha hızlı veya daha yavaş hesaplar #ilk test grubunu içeren dosya, ikinci grubu içeren dosya P=0 MAX=0 L1=`cat "$1" | wc -l` #number L2=`cat "$2" | wc -l` if [ $L1 -ne $L2 ]; o zaman #eğer dosyalar farklı sayıda test içeriyorsa, onları karşılaştırmayacağız echo error return fi ADIM =$(($L1*5/100)) `sıra 1'deki I için J=0 $L1`; eğer [ $J -eş $ADIM ] ise J=$(($J+1)) yapın; sonra J= 0 echo "$((100*$I/$ L1))% tamamlandı ($I of $L1)" fi A=`getline "$1" $I` B=`getline "$2" $I` if [ `echo $A \> $B|bc -l` - eq 1 ]; sonra D=`echo "100-($B*100/$A)"|bc -l` if [ `echo $D \> $MAX| bc -l` -eq "1" ]; sonra MAX=$D uyku 5 fi else D=`echo "100-($A*100/$B)"|bc -l` if [ `echo $D \> $MAX| bc -l` -eq "1" ]; sonra MAX=$D uyku 5 fi D="-$D" #değer "-" işaretine sahipse bu test ikinci dosyada daha hızlı çalıştırılır ilk fi P=`echo "$P+ $D"| bc -l`done P=`echo $P/$L1| bc -l` #aritmetik ortalamayı hesapla echo PERCENT=$P MAX_PERCENT=$MAX ) genaverage() ( #her satırı tüm raporun karşılık gelen satırlarının #aritmetik ortalaması olan, analiz için hazırlanmış bir dosya oluşturma prosedürü analiz edilen dizinde bulunan dosyalar AVG=` mktemp` F=`ls "$1"|wc -l` #belirtilen dizinde raporları olan dosya sayısı #yalnızca bu tür dosyaların burada saklanması ve başka hiçbir şeyin kontrol edilmemesi koşuluyla #kontrol etmeyeceğiz bu varsayımın doğruluğu if [ ! -d " $1" -o $F -lt 2 ]; ardından echo error >/dev/stderr #bu prosedürde, #stdout bir başkasıyla değiştirildiği için tüm mesajları stderr'e çıkaracağız prosedür rm -f $AVG çıkış fi TMP=` mktemp` DOSYA okunurken "$1" -f yazın; verilen dizindeki her iozone rapor dosyası için # yapın I=`mktemp` #gendifffile "$FILE" "$I " #names tüm bu dosyaları "TMP"ye satır satır yazar echo "$I">>$TMP done L=`cat \`getline "$TMP" 1\`|wc -l` cat "$TMP"| SATIR okunurken; #biraz kontrol etmek iyidir L1=`cat "$LINE"| wc -l` #do tüm dosyalar aynı sayıda test içerir if [ $L -ne $L1 ]; sonra yankı hatası >/dev/stderr çıkış fi tamamlandı ADIM=$(($L*5/100)) J=0 `seq 1 $L`; do J=$(($J+1)) if [ $J -eq $ADIM ]; sonra J=0 echo "$((100*$I/$L))% done ($I of $L)" >/dev/stderr fi SUMFILE=`mktemp` #bu şekilde SUM değişkeninin değerini alıyorum iç içe geçmiş döngüden SUM=0 cat "$TMP"| SATIR okunurken; do SUM=$((`getline "$LINE" $I`+$SUM)) echo $SUM > "$SUMFILE" done echo `tail -n 1 "$SUMFILE"`/$F|bc -l >> $ AVG #aritmetik ortalamayı al #ve AVG dosyasının uygun konumuna yaz rm -f "$SUMFILE" done cat "$TMP"| SATIR okunurken; do #delete geçici dosyalar rm -f "$LINE" done rm -f "$TMP" echo $AVG ) printf %b "\\033)