Tips en Trucs 2011

Bestanden versleutelen

De beste methode om de inhoud van bestanden te beveiligen is de bestanden te versleutelen. Het gebruik van toegangsrechten kan omzeild worden door rootkits, het opstarten van de computer met een Live distributie, enz. Met andere woorden, eenmaal de aanvaller root-rechten heeft verworven kunnen alle bestanden op het systeem door de aanvaller gelezen en aangepast worden. Bij versleutelde bestanden is de inhoud van de bestanden onleesbaar gemaakt. Als je het wachtwoord van de versleuteling niet kent, kun je de inhoud van een versleuteld bestand niet lezen, ook niet als je root bent. TrueCrypt is het bekendste versleutelingssysteem voor bestanden en kan op alle besturingssystemen gebruikt worden. Bij beveiligingen is het volgens mij niet altijd verstandig de meest gebruikte methode te gebruiken. De meest gebruikte methode krijgt ook meer aandacht van aanvallers en is door hen ook beter herkenbaar. Encfs is niet zo bekend en werkt eveneens op alle besturingssysteem.

Installeren

De meeste distributies bieden het pakket encfs standaard aan. Je kunt dan ook uw favoriet softwarebeheerprogramma starten en encfs installeren zoals je dat gewoon bent. Het pakket encfs bevat enkel de opdrachten om versleutelde bestanden in een map te gebruiken. Een introductie om met de encfs opdrachten te werken, kun je vinden op de site van encfs. Na de introductie kun je de complete handleiding met alle mogelijkheden raadplegen op de klassieke man pagina. Naast de terminal opdrachten bestaan er voor encfs grafische omgevingen (vb: GEncFS).

EncFS in KDE integreren

Naast het gebruik van grafische omgevingen in programmavorm, kun je opteren om EncFS of andere hulpmiddelen in KDE op te nemen. De hier gebruikte methode zorgt ervoor dat de EncFS functies opgenomen worden in de Service-menu's die je in Dolphin kunt openen door rechts te klikken op een map of bestand. Service-menu's in KDE worden op dezelfde manier opgebouwd als Koppelingen naar programma's, m.a.w. met behulp van .desktop bestanden. Indien je .desktop bestanden in de map ~/.kde4/share/kde4/services/ServiceMenus/ plaatst, worden ze door KDE herkent als service-menu's. Hieronder de inhoud van het bestand ~/.kde4/share/kde4/services/ServiceMenus/encfs.desktop. Dit .desktop bestand van Giuseppe Benigno heb ik aangevuld met Nederlandse vertalingen ([nl]).
#
# 	Part of servicemenu-encfs Version 0.3
# 	Copyright (C) 2010 Giuseppe Benigno <giuseppe.benigno(at)egregorion.net>
#
# 	This program is free software: you can redistribute it and/or modify
# 	it under the terms of the GNU General Public License as published by
# 	the Free Software Foundation, either version 3 of the License, or
# 	(at your option) any later version.
#
# 	This program is distributed in the hope that it will be useful,
# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# 	GNU General Public License for more details.
#
# 	You should have received a copy of the GNU General Public License
# 	along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
MimeType=inode/directory;
Icon=folder-locked
TryExec=encfs_kmenu.sh
Actions=mount_umount_create;_SEPARATOR_;change;info;
Name=encfs service menu
X-KDE-Priority=TopLevel
X-KDE-Submenu=&encFS

[Desktop Action mount_umount_create]
Icon=preferences-desktop-cryptography
Name=Mount, unmount or encrypt
Name[it]=Monta, smonta o cifra
Name[nl]=Koppelen, afkoppelen of versleutelen
Exec=encfs_kmenu.sh en encMountUmountCreate "%f"
Exec[it]=encfs_kmenu.sh it encMountUmountCreate "%f"
Exec[nl]=encfs_kmenu.sh nl encMountUmountCreate "%f"

################################################################################

[Desktop Action change]
Icon=dialog-password
Name=Change password
Name[it]=Cambia password
Name[nl]=Wachtwoord wijzigen
Exec=encfs_kmenu.sh en change "%f"
Exec[it]=encfs_kmenu.sh it change "%f"
Exec[nl]=encfs_kmenu.sh nl change "%f"

[Desktop Action info]
Icon=help-about
Name=Informations
Name[it]=Informazioni
Name[nl]=Informatie
Exec=encfs_kmenu.sh en info "%f"
Exec[it]=encfs_kmenu.sh it info "%f"
Exec[nl]=encfs_kmenu.sh nl info "%f"
De opdrachten van de Service-menu's worden uitgevoerd door het script encfs_kmenu.sh. Opdat KDE het script steeds zou terugvinden, plaats je het script met uitvoerrechten in de map ~/bin/. Het onderstaande script heb ik aangevuld met Nederlandstalige dialoogvensters, distributie-onafhankelijker gemaakt en bij het aanmaken van een versleutelde map het wachtwoord een tweede maal te laten ingeven zodat typfouten uitgesloten worden. Dit script kan naar alle waarschijnlijkheid nog verder verbeterd worden (een voordeel van open source).
#! /bin/sh
#
# 	Part of servicemenu-encfs Version 0.4
# 	Copyright (C) 2010 Giuseppe Benigno <giuseppe.benigno(at)egregorion.net>
# 	Copyright (C) 2011 Dany Pinoy
#
# 	This program is free software: you can redistribute it and/or modify
# 	it under the terms of the GNU General Public License as published by
# 	the Free Software Foundation, either version 3 of the License, or
# 	(at your option) any later version.
#
# 	This program is distributed in the hope that it will be useful,
# 	but WITHOUT ANY WARRANTY; without even the implied warranty of
# 	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# 	GNU General Public License for more details.
#
# 	You should have received a copy of the GNU General Public License
# 	along with this program.  If not, see <http://www.gnu.org/licenses/>.
#

lang=`echo "${1}" | sed -e "s/@//g"`
shift
action="${1}"
shift
encryptedDir="${1}"
encryptedDirName="${encryptedDir##*/}" # basename is same? maybe yes
destDir="$HOME/_encfs_${encryptedDirName}"
destDirName="${destDir##*/}"

KDIALOG="$(which kdialog)"
FILEMANAGER="$(which dolphin)"
FUSERMOUNT="$(which fusermount)"

#### languages strings messages #################
# Sintax for strings name is: msg_[$action]_$window_[$section]
# For languages as sr@Latn use srLatn

load_language_en () {
	msg_checkFuseModule_title="Fuse module error"
	msg_checkFuseModule_text="Check fuse module is loaded"

	msg_checkFusePermission_title="Fuse group error"
	msg_checkFusePermission_text="Check: you need are in fuse group. From console you can digit: \"sudo adduser $USER fuse\""

	msg_checkDestDir_title="Warning!"
	msg_checkDestDir_text="Sorry, destination directory \"${destDir}\" already exist!."

	msg_mkDestDir_title="Creating directory error!"
	msg_mkDestDir_text="Can't create the destination directory \"${destDir}\""

	msg_askpassword_title="encFS: enter passphrase ..."
	msg_askpassword_text="Enter passphrase for \"${encryptedDirName}\""
	msg_askpasswordcheck_title="encFS: verify passphrase ..."
	msg_askpasswordcheck_text="Re-enter passphrase for \"${encryptedDirName}\""
	msg_paswordVerifyError_title="encFS: Warning"
	msg_paswordVerifyError_text="Passphrase and Verify passphrase don't match."

	msg_mount_mountError_title="Mount directory error!"
	msg_mount_mountError_text="Can't mount the destination directory \"${destDir}\""

	msg_mount_finish_title="Mounting ... done"
	msg_mount_finish_text="Directory \"${encryptedDirName}\" mounted in \"${destDir}\""

	msg_umount_finish_title="Unmounting ... done"
	msg_umount_finish_text="Directory \"${destDir}\" umounted and removed"

	msg_preCreate_warning_title="Warning!"
	msg_preCreate_warning_text="The directory appear not encrypted, do you want do it?"
	msg_preCreate_cancel_title="Operation aborted"
	msg_preCreate_cancel_text="Encrypted directory creation aborted."

	msg_create_error_alreadyMounted="Destination directory already mounted!"
	msg_create_error_alreadyExist="Destination directory Exists!"

	msg_create_finish_title="Creating ... done"
	msg_create_finish_text="Creating and mounting encrypted directory done."

	msg_change_konsole_title="Changing password of \"${encryptedDirName}\""

	msg_info_error="Problem getting informations of \"${encryptedDirName}\"."
	msg_info_title="Information of \"${encryptedDirName}\""

}

load_language_it () {
	msg_checkFuseModule_title="Errore modulo fuse"
	msg_checkFuseModule_text="Controllare che il modulo fuse sia caricato"

	msg_checkFusePermission_title="Errore gruppo fuse"
	msg_checkFusePermission_text="Controllare di appartenere al gruppo fuse. Dal terminale puoi digitare: \"sudo adduser $USER fuse\""

	msg_checkDestDir_title="Atttenzione!"
	msg_checkDestDir_text="Spiacente, la directory di destinazione \"${destDir}\" esiste già!."

	msg_mkDestDir_title="Errore nella creazione della directory!"
	msg_mkDestDir_text="Non è possibile creare la directory di destinazione \"${destDir}\"."

	msg_askpassword_title="encFS: digita la password ..."
	msg_askpassword_text="Digita la password per \"${encryptedDirName}\""
	msg_askpasswordcheck_title="encFS: verify passphrase ..."
	msg_askpasswordcheck_text="Re-enter passphrase for \"${encryptedDirName}\""
	msg_paswordVerifyError_title="encFS: Warning"
	msg_paswordVerifyError_text="Passphrase and Verify passphrase don't match."

	msg_mount_mountError_title="Errore di montaggio directory!"
	msg_mount_mountError_text="Si è verificato un errore durante il montaggio della directory \"${destDir}\""

	msg_mount_finish_title="Montaggio ... finito"
	msg_mount_finish_text="Directory \"${encryptedDirName}\" montata in \"${destDir}\""

	msg_umount_finish_title="Smontaggio ... finito"
	msg_umount_finish_text="Directory \"${destDir}\" smontata e rimossa."

	msg_preCreate_warning_title="Attenzione!"
	msg_preCreate_warning_text="Sembra che la cartella non sia cifrata, vuoi cifrarla?"
	msg_preCreate_cancel_title="Operazione annullata"
	msg_preCreate_cancel_text="La creazione della cartella cifrata è stata annullata."

	msg_create_error_alreadyMounted="La directory di destinazione è già montata!"
	msg_create_error_alreadyExist="La directory di destinazione esiste già!"

	msg_create_finish_title="Creazione ... terminata"
	msg_create_finish_text="Creazione e montaggio directory cifrata terminati."

	msg_change_konsole_title="Cambio password di \"${encryptedDirName}\""

	msg_info_error="Problema nel caricamento delle informazioni.\nAssicurati che \"${encryptedDirName}\" sia una directory cifrata con encfs."
	msg_info_title="Informazioni su \"${encryptedDirName}\""

}

load_language_nl () {
	msg_checkFuseModule_title="Fuse module fout"
	msg_checkFuseModule_text="Controleer of de fuse module geladen is"

	msg_checkFusePermission_title="Fuse groep fout"
	msg_checkFusePermission_text="Controleer of je lid bent van de fuse groep. Gebruik daarvoor in de terminal de opdracht: \"sudo adduser $USER fuse\""

	msg_checkDestDir_title="Waarschuwing!"
	msg_checkDestDir_text="Sorry, de doelmap \"${destDir}\" bestaat reeds!."

	msg_mkDestDir_title="Fout bij het aanmaken van een map!"
	msg_mkDestDir_text="Kan de doelmap \"${destDir}\" niet aanmaken"

	msg_askpassword_title="encFS: wachtwoord ingeven ..."
	msg_askpassword_text="Voer het wachtwoord voor \"${encryptedDirName}\" in"
	msg_askpasswordcheck_title="encFS: controle wachtwoord ..."
	msg_askpasswordcheck_text="Voer het wachtwoord voor \"${encryptedDirName}\" nogmaals in"
	msg_paswordVerifyError_title="encFS: Waarschuwing"
	msg_paswordVerifyError_text="Wachtwoord en Wachtwoordcontrole komen niet overeen."

	msg_mount_mountError_title="Fout bij het koppelen aan een map!"
	msg_mount_mountError_text="Kan de doelmap \"${destDir}\" niet koppelen"

	msg_mount_finish_title="Koppelen ... klaar"
	msg_mount_finish_text="De versleutelde map \"${encryptedDirName}\" is gekoppeld aan de map \"${destDir}\""

	msg_umount_finish_title="Afkoppelen ... klaar"
	msg_umount_finish_text="De map \"${destDir}\" is afgekoppeld en verwijderd"

	msg_preCreate_warning_title="Waarschuwing!"
	msg_preCreate_warning_text="De map lijkt niet versleuteld, mag ze versleuteld worden?"
	msg_preCreate_cancel_title="Opdracht afgebroken"
	msg_preCreate_cancel_text="Aanmaken versleutelde map afgebroken."

	msg_create_error_alreadyMounted="Doelmap reeds gekoppeld!"
	msg_create_error_alreadyExist="Doelmap bestaat reeds!"

	msg_create_finish_title="Aanmaken ... klaar"
	msg_create_finish_text="Aanmaken en koppelen versleutelde map is klaar."

	msg_change_konsole_title="Wachtwoord van \"${encryptedDirName}\" wijzigen"

	msg_info_error="Problemen bij het opvragen van informatie over \"${encryptedDirName}\"."
	msg_info_title="Informatie over \"${encryptedDirName}\""

}

################################################

checkFuseModule () {
	if [ "$(cat /proc/mounts | grep fusectl)" = "" ]; then
		#echo "${msg_checkFuseModule_text}" #DEBUG
		"${KDIALOG}" --title "${msg_checkFuseModule_title}" --caption "${msg_checkFuseModule_title}" --icon dialog-cancel --sorry "${msg_checkFuseModule_text}"
		exit
	fi
}

checkFusePermission () {
	if [ "$(groups | grep fuse)" = "" ] && [ ! -u $FUSERMOUNT ]; then
		#echo "${msg_checkFusePermission_text}" #DEBUG
		"${KDIALOG}" --title "${msg_checkFusePermission_title}" --caption "${msg_checkFusePermission_title}" --icon dialog-cancel --sorry "${msg_checkFusePermission_text}"
		exit
	fi
}

checkDestDir () {
	if [ -e "${destDir}" ]; then
		#echo "${msg_checkDestDir_text}" #DEBUG
		"${KDIALOG}" --title "${msg_checkDestDir_title}" --caption "${msg_checkDestDir_title}" --icon dialog-cancel --sorry "${msg_checkDestDir_text}"
		exit
	fi
}

mkDestDir () {
	mkdir "${destDir}"
	if [ $? != 0 ]; then
		#echo "${msg_mkDestDir_text}" #DEBUG
		"${KDIALOG}" --title "${msg_mkDestDir_title}" --caption "${msg_mkDestDir_title}" --icon dialog-cancel --error "${msg_mkDestDir_text}"
		exit
	fi
}

askpassword () {
	encPasswd=`"${KDIALOG}" --title "${msg_askpassword_title}" --caption "${msg_askpassword_title}" --password "${msg_askpassword_text}"`
	if [ ! -e "$encryptedDir"/.encfs*.xml ]; then # verify passphrase
		verifyPasswd=`"${KDIALOG}" --title "${msg_askpasswordcheck_title}" --caption "${msg_askpasswordcheck_title}" --password "${msg_askpasswordcheck_text}"`
		if [ "$encPasswd" != "$verifyPasswd" ]; then
			"${KDIALOG}" --title "${msg_paswordVerifyError_title}" --caption "${msg_paswordVerifyError_title}" --icon dialog-cancel --error "${msg_paswordVerifyError_text}"
			exit
		fi
	fi
	echo $encPasswd
}

encMount () {
	encfsPasswd=$(askpassword)

	checkDestDir
	mkDestDir

	encfs --extpass="echo $encfsPasswd" "${encryptedDir}" "${destDir}"
	if [ $? != 0 ]; then
		#echo "${msg_mount_mountError_text}" #DEBUG
		"${KDIALOG}" --title "${msg_mount_mountError_title}" --caption "${msg_mount_mountError_title}" --icon dialog-cancel --error "${msg_mount_mountError_text}"
		rm -r "${destDir}"
		exit
	fi

	"${FILEMANAGER}" "${destDir}"
	"${KDIALOG}" --title "${msg_mount_finish_title}" --passivepopup "${msg_mount_finish_text}" 5
}

encMountUmountCreate () {
	if [ "$(cat /proc/mounts | grep fuse | grep "${encryptedDir}")" != "" ]
		then fusermount -u "${encryptedDir}" && rm -r "${encryptedDir}" && "${KDIALOG}" --title "${msg_umount_finish_title}" --passivepopup "${msg_umount_finish_text}" 5
		else if [ "$(cat /proc/mounts | grep fuse | grep "${destDir}")" != "" ]
				then fusermount -u "${destDir}" && rm -r "${destDir}" && "${KDIALOG}" --title "${msg_umount_finish_title}" --passivepopup "${msg_umount_finish_text}" 5
				else encfsctl info "${encryptedDir}" && encMount "${@}" || preCreate "${@}"
			fi
	fi
}

preCreate () {
	"${KDIALOG}" --title "${msg_preCreate_warning_title}" --caption "${msg_preCreate_warning_title}" --icon preferences-desktop-cryptography --warningyesno "${msg_preCreate_warning_text}" && create "${@}" || "${KDIALOG}" --title "${msg_preCreate_cancel_title}" --passivepopup "${msg_preCreate_cancel_text}" 5
}

create () {
	encfsPasswd=$(askpassword)

	checkDestDir
	mkDestDir

	echo p | encfs --extpass="echo $encfsPasswd" "${encryptedDir}" "${destDir}" --
	if [ $? != 0 ]; then
		#echo "${msg_mount_mountError_text}" #DEBUG
		"${KDIALOG}" --title "${msg_mount_mountError_title}" --caption "${msg_mount_mountError_title}" --icon dialog-cancel --error "${msg_mount_mountError_text}"
		rm -r "${destDir}"
		exit
	fi

	"${FILEMANAGER}" "${destDir}"
	"${KDIALOG}" --title "${msg_create_finish_title}" --passivepopup "${msg_create_finish_text}" 5
}

change () {
	konsole --title "${msg_change_konsole_title}" --caption "${msg_change_konsole_title}" --icon dialog-password -e encfsctl passwd "${encryptedDir}"
}

info () {
	info=`encfsctl info "${encryptedDir}"` || info="${msg_info_error}"
	kdialog --title "${msg_info_title}" --caption "${msg_info_title}" --icon help-about --msgbox "${info}"
}

################################################ main

"load_language_${lang}" || load_language_en
checkFuseModule
checkFusePermission
"${action}" "${@}"
De bovenstaande bestanden kun je hier downloaden.

EncFS met KDE gebruiken

Servicemenu
Maak een map aan waar de versleutelde bestanden in terecht zullen komen. Geef deze map een onopvallende naam (dus niet Encrypted, Versleuteld, Secrets of Geheim, zulke namen trekken de aandacht van aanvallers). Klik met rechtermuisknop op de pas aangemaakte map en voer de opdracht encFS > Koppelen, afkoppelen of versleutelen uit. De opdracht merkt dat de map niet versleuteld is en onderneemt de nodige stappen om de map te versleutelen (tweemaal hetzelfde veilige wachtwoord ingeven) en maakt zelf een tweede map aan waar de versleutelde map bereikbaar wordt. Deze map krijgt als naam _encfs_ gevolgd door de naam van de versleutelde map. Alle bestanden die je naar de _encfs_map verplaatst, worden versleuteld in de door jouw aangemaakte map opgeslagen. Als je de map met de versleutelde bestanden opent, zie je bestanden met versleutelde namen en inhoud. Op de afbeelding zie je de inhoud van de map crypt met een versleuteld bestand dat enkel kan bekeken worden in de map _encfs_crypt. Het bestand README werd rechtstreeks naar de map crypt verplaatst, waardoor het niet versleuteld is.
Map
Met het snelmenu van een versleutelde map kun je de map terug afkoppelen (waardoor de map met de zichtbare versleutelde bestandsnamen en -inhoud verdwijnt). Door een afgekoppelde map terug te Koppelen (door het opgeven van het correcte wachtwoord) worden de namen en de inhoud van de versleutelde bestanden terug leesbaar. Als afsluiter nog een belangrijke opmerking: als je het wachtwoord vergeet, kun je de inhoud van versleutelde bestanden nooit meer gebruiken.