Portál AbcLinuxu, 12. listopadu 2025 22:00
Pracuji v jedné firmě, jejíž bezpečnostní politika vyžaduje, aby byla veškerá firemní data v počítači zašifrovaná. K tomuto účelu je v celé firmě využíván TrueCrypt (kvůli multiplatformosti - máme jak pracovní stanice jak s Linuxem, tak s Windows). Výměna dat mezi stanicemi probíhá v mnoha případech taky v podobě souborových "disků" zašifrovaných pomocí TrueCrypt. Protože jsem člověk v jistém smyslu líný a nechci si pamatovat až 200-bitová (až 40 alfanumerických znaků + specialní znaky) hesla, vytvořil jsem si sadu skriptů pro práci se zašifrovanými oddíly.
Moje řešení se skládá z vytvoření bezpečnostního tokenu na SD kartě (bohužel nemám na svém notebooku k dispozici ani čtečku SMART karet ani snímač otisku prstu). Na této SD kartě je Truecrypt oddíl, na kterém jsou uloýženy soubory s klíčem a hesly k šifrovaným oddílům (ať už fyzickým nebo souborovým). Protože jsou všechna data na kartě šifrovaná, nemyslím si, že by tím bezpečnost dat příliš trpěla. (Přesto doporučuji nastavit přístupová práva ke všem souborům na SD kartě pouze pro uživatele root)
Nejprve je třeba si připravit "token", na který pak uložíme soubory s klíčem k šifrovaným oddílům. Nejlepším řešením je samozřejmě pravý token podporující PKCS11. Bohužel můj notebook není vybaven žádným takovým zařízením, tak jsem se rozhodl použít obyčejnou SD kartu. Stejným způsob se da použít také u USB flash disku.
/etc/fstab (osobně preferuji připojení pomocí UUID).# Security SD card UUID=B5C5-D927 /mnt/security/sd_card vfat rw,noauto,noexec,nodev,nosuid,noatime,uid=chearius,gid=chearius,fmask=0177,dmask=0077
truecrypt -t --encryption=AES --hash=SHA-512 --size=52428800 --volume-type=normal --filesystem=none -c /mnt/security/truecrypt.tc
Pro připojování a odpojování šifrovaných oddílů, ať už fyzických nebo souborových, jsem vytvořil několik shellových skriptů. Moje požadavky na jednoduchost připojování či odpojování oddílu jsou následující:
Celé řešení využívá dva konfigurační soubory. Jeden v adresáři /etc - /etc/truecrypttab a druhý v kořenovém adresáři šifrovaného oddílu na SD kartě, např. /mnt/security/truecrypttab. V prvním konfiguračním souboru jsou uvedeny veškeré udaje nutné pro připojení šifrovaného oddílu na SD kartě, v druhém jsou pak informace o jednotlivých šifrovaných oddílech v počítači.
/etc/truecrypttab# Typ šifrovaného oddílu na SD kartě - soubor (f), zařízení (d) SECURITY_TYPE=f # Adresář, kam je připojena SD kartam popř. šifrovaný oddíl SECURITY_DEVICE=/mnt/security/sd_card # TrueCrypt oddíl na SD kartě (nepoužívá se, pokud $SECURITY_TYPE = f) SECURITY_CONTAINER=chearius-laptop.tc # Kam se má TrueCrypt oddíl na SD kartě připojit SECURITY_MOUNTPOINT=/mnt/security/truecrypt # Umístění druhého konfiguračního souboru TRUECRYPT_TAB=$SECURITY_MOUNTPOINT/truecrypttab # Automaticky připojit oddíly nastavené v $TRUECRYPT_TAB AUTOMOUNT=1 # V případě selhání vypnout (restartovat) počítač? REBOOT_ON_FAIL=0 # V případě selhání se zobrazí obsah souboru MESSAGE_ON_FAIL=/etc/truecrypt.message
truecrypttab na SD kartě# Automaticky připojit oddíly s názvem MOUNT="data ka" # Typ oddílu - soubor (f), zařízení (d) MOUNT_home_TYPE=d # Zařízení MOUNT_home_DEVICE=/dev/sda7 # Kam připojit MOUNT_home_MOUNTPOINT=/home # Kde jsou umístěny soubory s klíči MOUNT_home_KEYFILES=$SECURITY_MOUNTPOINT/Truecrypt/home.key # Kde je umístěno heslo - pokud není vyplněno, bude uživatel při připojení dotázán MOUNT_home_PASSWORD=$SECURITY_MOUNTPOINT/Truecrypt/home.pwd MOUNT_ka_TYPE=f # Soubor MOUNT_ka_FILE=/mnt/data/truecrypt/ka.tc MOUNT_ka_MOUNTPOINT=/home/data/truecrypt/ka MOUNT_ka_KEYFILES=$SECURITY_MOUNTPOINT/Truecrypt/ka.key MOUNT_ka_PASSWORD=$SECURITY_MOUNTPOINT/Truecrypt/ka.pwd MOUNT_data_TYPE=d MOUNT_data_DEVICE=/dev/sda3 MOUNT_data_MOUNTPOINT=/mnt/data MOUNT_data_KEYFILES=$SECURITY_MOUNTPOINT/Truecrypt/sda3.key MOUNT_data_PASSWORD=$SECURITY_MOUNTPOINT/Truecrypt/sda3.pwd
O jednoduché připojování a odpojování nakonfigurovaných šifrovaných oddílů se stará skript /sbin/mount.truecrypt se symlinkem na /sbin/umount.truecrypt.
#!/bin/bash
. /etc/truecrypttab
. $TRUECRYPT_TAB
automount() {
for mount in $MOUNT; do
mount $mount
done
}
autoumount() {
mounts=`/usr/bin/truecrypt -t -l | awk '{ print $2 }'`
for mount in $mounts; do
mountname=`grep $mount $TRUECRYPT_TAB | awk -F_ '/MOUNT_(.*)_(FILE|DEVICE)/ { print $2 }'`
if [[ $mountname ]]; then
umount $mountname
fi
done
}
mount() {
echo "Mounting device: $1"
var=MOUNT_$1_TYPE
type=${!var}
if [[ $type == "d" ]]; then
var=MOUNT_$1_DEVICE
device=${!var}
elif [[ $type == "f" ]]; then
var=MOUNT_$1_FILE
device=${!var}
else
echo "Unknown type for mount $1. Check your configuration"
return 1
fi
var=MOUNT_$1_MOUNTPOINT
mountpoint=${!var}
var=MOUNT_$1_KEYFILES
keyfiles=${!var}
var=MOUNT_$1_PASSWORD
if [ -f ${!var} ]; then
password=`cat ${!var}`
else
password=${!var}
fi
params="-t --keyfiles=$keyfiles --protect-hidden=no"
if [[ $password ]]; then
params="${params} --password=$password"
fi
/usr/bin/truecrypt $params $device $mountpoint
}
list() {
mounts=`/usr/bin/truecrypt -t -l | awk '{ print $2 }'`
for mount in $mounts; do
mountname=`grep $mount $TRUECRYPT_TAB | awk -F_ '/MOUNT_(.*)_(FILE|DEVICE)/ { print $2 }'`
if [[ $mountname ]]; then
echo "$mountname (${mount})"
fi
done
}
umount() {
echo "Unmounting device: $1"
var=MOUNT_$1_TYPE
type=${!var}
if [[ $type == "d" ]]; then
var=MOUNT_$1_DEVICE
device=${!var}
elif [[ $type == "f" ]]; then
var=MOUNT_$1_FILE
device=${!var}
else
echo "Unknown type for mount $1. Check your configuration"
return 1
fi
var=MOUNT_$1_MOUNTPOINT
mountpoint=${!var}
mounted=`/usr/bin/truecrypt -t -l | grep "${device}.*${mountpoint}"`
if [[ $mounted ]]; then
/usr/bin/truecrypt -t -d $device
else
echo "$1 is not mounted!"
fi
}
script=`basename $0`
if [[ $script == "mount.truecrypt" ]]; then
if [ $# -eq 0 ]; then
list
elif [ $# -gt 1 ]; then
echo "Usage: $0 [-a]|[mount]"
else
if [[ $1 == "-a" ]]; then
automount
else
mount $1
fi
fi
else
if [ $# -eq 0 ]; then
list
elif [ $# -gt 1 ]; then
echo "Usage: $0 [-a]|[mount-point]"
else
if [[ $1 == "-a" ]]; then
autoumount
else
umount $1
fi
fi
fi
Použití skriptu je velmi jednoduché. Skript spuštěný bez parametru zobrazí aktualně připojené, skriptem spravované oddíly. Skript spuštěný s parametrem -a připojí automaticky všechny oddíly nakonfigurované v proměnné $MOUNT, resp. odpojí všechny aktuálně připojené, skriptem spravované oddíly. Pokud je jako první parametr uveden název konfigurace oddílu, bude tento připojen, resp. odpojen.
O automatické připojení "tokenu" a vybraných šifrovaných oddílů se starají dva skripty: /etc/rc.truecrypt a /etc/rc.truecrypt.shutdown. Oba skripty používají některé funkce z inicializačních skriptů distribuce ArchLinux, jmenovitě soubor /etc/rc.d/functions (funkce stat_busy, stat_done a stat_fail). Pro použití skriptů v jiných distribucích bude zřejmě nutné nahradit, příp. odstranit tyto funkce.
/etc/rc.truecryptTento skript se spouští ze skriptu /etc/rc.sysinit tesně po té, co byly připojeny lokální souborové systémy a aktivován swap (v mém systému řadek 299).
#!/bin/bash
. /etc/truecrypttab
. /etc/rc.d/functions
test_result() {
if [ $1 -eq 0 ]; then
stat_done;
else
stat_fail
if [ $2 -eq 1 ]; then
if [ $MESSAGE_ON_FAIL -o -f $MESSAGE_ON_FAIL ]; then
cat $MESSAGE_ON_FAIL
echo ""
echo "Press any key to continue ..."
read -n 1 response
fi
if [ $REBOOT_ON_FAIL -eq 1 ]; then
echo "Shutting down ..."
/sbin/shutdown -h now
else
echo "Exiting ..."
exit
fi
fi
fi
}
retry() {
echo "Serious problems occured. Do you want to retry? Press Y to retry or N to exit."
read -n 1 response
if [[ $response =~ [nN] ]]; then
return 1
else
return 0
fi
}
mount_security() {
stat_busy "Mounting security device"
/usr/bin/truecrypt -t --keyfiles="" --protect-hidden=no $SECURITY_DEVICE $SECURITY_MOUNTPOINT
exit_code=$?
if [ $exit_code -ne 0 ]; then
retry
if [ $? -eq 0 ]; then
mount_security
exit_code=0
fi
fi
test_result $exit_code 1
}
mount_security_device() {
SECURITY=`grep $SECURITY_DEVICE /etc/mtab`
if [[ !($SECURITY =~ $SECURITY_DEVICE) ]]; then
stat_busy "Mounting security device"
/bin/mount /mnt/security/sd_card
exit_code=$?
if [ $exit_code -ne 0 ]; then
retry
if [ $? -eq 0 ]; then
mount_security_device
exit_code=0
fi
fi
test_result $exit_code 1
fi
}
mount_security_container() {
stat_busy "Mounting security container"
if [ -f $SECURITY_DEVICE/$SECURITY_CONTAINER ]; then
/usr/bin/truecrypt -t --keyfiles="" --protect-hidden=no $SECURITY_DEVICE/$SECURITY_CONTAINER $SECURITY_MOUNTPOINT
exit_code=$?
if [ $exit_code -ne 0 ]; then
retry
if [ $? -eq 0 ]; then
mount_security_container
exit_code=0
fi
fi
test_result $exit_code 1
else
echo "File $SECURITY_DEVICE/$SECURITY_CONTAINER not found!"
exit_code=1
retry
if [ $? -eq 0 ]; then
mount_security_container
exit_code=0
fi
test_result $exit_code 1
fi
}
automount() {
if [ $AUTOMOUNT -eq 1 ]; then
stat_busy "Automounting encrypted volumes"
/sbin/mount.truecrypt -a
test_result $? 0
fi
}
if [[ $SECURITY_TYPE == "d" ]]; then
mount_security
else
mount_security_device
mount_security_container
fi
automount
/etc/rc.truecrypt.shutdownTento skript se spouští ze skriptu /etc/rc.shutdown tesně před tím, než je všem procesům zaslán signál SIGTERM (v mém systému řadek 42).
#!/bin/bash
. /etc/truecrypttab
. /etc/rc.d/functions
test_result() {
if [ $? -eq 0 ]; then
stat_done;
else
stat_fail
if [ $REBOOT_ON_FAIL -eq 1 ]; then
echo "Serious problems occured - rebooting ..."
/sbin/shutdown -r now
else
exit
fi
fi
}
stat_busy "Unmounting encrypted volumes"
/sbin/umount.truecrypt -a
test_result
stat_busy "Unmounting security container"
/usr/bin/truecrypt -t -d $SECURITY_DEVICE/$SECURITY_CONTAINER
test_result
stat_busy "Unmounting security device"
/bin/umount $SECURITY_DEVICE
test_result
/etc/mkinitcpio.conf chybět mezi HOOKS parametry usb a encrypt. Jinak se může stát, že nebude možné při startu systému připojit SD kartu (token).V tomto článku jsem nastínil postup, jak spravovat několik šifrovaných disků pomocí TrueCrypt a sady shell skriptů. Doufám, že se někomu budou hodit / poslouží jako zdroj inspirace. Skripty jsou poskytovány bez jakékoliv záruky, testoval jsem je pouze na svém notebooku (kde fungují bez nejmenších problémů). Pokud máte nějaké připomínky, navrhy na vylepšení, ... podělte se o ně, prosím, v diskusi.
Tiskni
Sdílej:
Hesla generujeme pomocí programu KeePass a taky jsou v KeePass databázi uložené (hesla jsou ukládána v zašifrované podobě).
Jinak jsem si vědom, že moje řešení jistým způsobem snižuje bezpečnost; na druhou stranu si nemyslím, že by jí to snižovalo nějakým podstatným způsobem ... hesla jsou (ale nemusí být) sice uložena v textových souborech, ovšem na zašifrovaném oddílu a nečitelná pro jiného uživatele, než root ... při ztrátě notebooku se nikdo k datům nedostane.
Díky za inspiraci, dostal jsem teď v práci nový NB, tak možná něco využiji. Tu SD kartu tam necháváš, nebo ji pokaždé vytáhneš?
SD kartu po vypnutí notebooku vždycky vytáhnu. Většinu času ji nosím v pouzdře v kapse, aby nebyla u notebooku.
Co si poridit nejaky regulerni (USB?) token?
I o této možnosti jsem uvažoval. Nakonec jsem tuto možnost nezvolil jednak kvůli pořizovací ceně tokenu (SD kartu jsem měl k dispozici) a druhak z důvodu velikosti tokenu. Často pracuju s notebookem i na cestách a zastrčený token v notebooku (podobně jako USB flash disk) mi prostě překáží.
Ještě jedna poznámka: docela by mne zajímalo, o kolik je odbobné řešení za použití regulérního tokenu bezpečnější oproti mnou zvolenému řešení. Největší rozdíl oproti tokenu je asi ten, že moje SD karta je připojená po celou dobu běhu systému (ale přístup k ní má pouze root). Jinak mě další velké rozdíly v bezpečnosti nenapadají ... Ale rád se nechám poučit od někoho, kdo této problematice lépe rozumí.
Samozrejme jde, ale tady uz zalezi na urovni daneho cipu. Pochopitelne, pokud si koupite blbou eepromku, tak si moc nepomuzete, ale rozumna cipova karta je navrzena i s ohledem na fyzickou bezpecnost (treba rozbrouseni atp.).
S TPM je to taky tak, že jeho bezpečnost byla v mnoha případech zpochybněna.. Je to celé otázka toho, co ještě je a co není pro daného člověka bezpečné. Co se výkonu čipových karet týče, tak jejich výkon není až tak žalostný, ale problém bývá s rozhraním. Nicméně i to se řeší -- Remotely Keyed Encryption je něco, co by se dalo použít. U TrueCryptu ale stačí mít na kartě uloženou třeba jen hlavičku šifrovaného svazku, protože bez ní se případný útočník stejně moc daleko nedostane..
S TPM je to taky tak, že jeho bezpečnost byla v mnoha případech zpochybněna..
Tomu bych i věřil. Ale ještě jsem se o to nezajímal, neb takový stroj nevlastním. Máte tip na zajímavé čtení?
U TrueCryptu ale stačí mít na kartě uloženou třeba jen hlavičku šifrovaného svazku, protože bez ní se případný útočník stejně moc daleko nedostane..
Myslím, že smyslem karty je, že ji klíč neopustí. Nikoliv, že si tam odložím klíč, který pak za běhu vrátím do systému.
Na to čtení o TPM se podívám během příštího týdne, bude-li to stačit. Někde ty prameny mám..
A ke smyslu karty -- ono to tak pochopitelně má být, ale ještě dost záleží na tom, co o útočníkovi předpokládáme. Problém s TrueCryptem je v tom, že když už se útočník dostane k počítači tak, že tam má vlastní proces, nejlépe na úrovní oprávnění kernelu, tak stejně může přečíst celý disk -- heslo/data mu poskytne ať už karta, nebo sám uživatel. K tomu, aby se to záškodníkovi nepodařilo (nebo to měl alespoň stížené a uživatel začal tušit nějakou nepravost), by každou operaci se souborem v TrueCryptu musel uživatel nějak explicitně potvrzovat, a to nejlépe na té čipové kartě nebo krypto tokenu (tedy v zařízení, které útočník nemůže jednoduše dostat pod svoji kontrolu).. A to zase nebude úplně pohodlné.
Takže v tomhle ohledu je asi lepší předpokládat, že obrana je proti takovému útočníkovi, který se dostane ke svazku nebo čipovce, možná k obojímu, ale určitě není schopen zjistit PIN a tedy ani vyčíst data z čipovky.
(uff, snad jsem se do toho moc nezamotal)
Slo by neco udelat s tim "probýhá"? Diky.
Díky, opraveno.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.