| +380(66)433-69-36 |
|
+380(66)433-69-36 |
| +380(66)433-69-36 |
- BitLocker с GUI под linux
- Ищем вирус elTest
- Работаем с бесплатным SSL сертификатом Letsencrypt с помощью certbot
- Синхронизация ресурсов с удаленного сервера локально
- Применение нестандартного SEO и статус 404
- MySQL синхронизируем права с разных серверов
- IPSec VPN соединение между офисами.
- "Зеркало" сайта на стороне. Донастраиваем nginx
- Дефрагментация таблиц всех баз MySQL
- Месяц в родительном падеже strftime PHP
- INIT скрипт для Dropbox
- osCommerce VAM Edition 226. Ошибки
- PositiveSSL порядок сертификатов
- osCommerce. Создаем модуль доставки
- Восстановление mySQL баз данных
- osCommerce.Перенос магазина в другой домен
- osCommerce.Прячем адмику
- osCommerce. Продление жизни сессий
- osCommerce. Создаем платежный модуль
- 10 причин выбрать нас
- GRUB2 восстановление
- osCommerce не пересчитывает общую сумму заказа
- Список потенциально опасных скриптов
- Отправка файлов из Dropbox по e-mail
- "Черный список" почтовых доменов
- Боремся с назойливыми иностранцами
- Яндекс-Диск, и стоит ли им пользоваться.
- Обновление модуля Интеркассы для osCommerce
- Веб-почта на сайте хостинга
- Подключение Outlook Express к хостингу
Статьи
Linux(Debian)
BitLocker с GUI под linux
BitLocker с GUI под linux
Давненько я сюда не писал, но когда сделана хорошая работа и хочется оставить ее результаты на будущее - то это как раз тот случай. И так, что мы имеем. Все началось с того, что мне пришлось искать решение под Linux которое могло бы подключать внешние носители зашифрованные bitLocker-ом и давать возможность пользователю, не root-у работать с этими дисками. При этом хотелось бы иметь хоть какую-то GUI версию, чтобы этим мог пользоваться не только я. Решение было найдено довольно быстро здесь. Но. во-первых исходный материал на сейчас не корректно считал размер диска, поскольку использовал bc - не всегда установленную на linux, во-вторых не монтировал диски под пользователем, в-третьих не распозновал внешние устройства сформатированные в формате FAT и совместимом с ним, только NTFS. В целом кажется вполне достаточно причин чтобы уже заняться переделкой - поскольку доделать всегда легче, чем разработать с нуля. Сразу скажу, что решение в своей работе использует zenity и dislocker. Утилита проверяет их наличие и ругается если что не так. Поэтому это просто замечание. Уже исправленный вариант утилиты можно загрузить здесь. Теперь как с ней работать.
1. Распаковываем архив.
2. Запускаем install.sh. Фактически установщик просто скопирует файлы из папки app в /opt/dislocker-gui
3. Из папки shortcut файл dislocker-gui.desktop бросаем на рабочий стол или в меню, кому как нравится.
Собственно говоря все. Запускаем, выбираем диск на котором есть bitLocker, вводим пароль и все. Утилита проверяет диски - есть ли там bitLocker или нет, поэтому мусор из полного списка всех дисков не выдается, только то что нужно.
В заключение приведу ниже содержимое файлов - вдруг кто захочет разобраться, а грузить арчив не хочется.
1. install.sh
#!/bin/bash
#sudo rule to permit non-root users to use the dislocker-gui without being admin users
LINE_SUDOERS="ALL ALL=NOPASSWD: /opt/dislocker-gui/util-root.sh"
mkdir -p /opt/dislocker-gui
cp -r app/* /opt/dislocker-gui/
cp shortcut/dislocker-gui.desktop /usr/share/applications/
#check if the line already exists in the /etc/sudoers file
LINE_SUDOERS_EXISTS=$(cat /etc/sudoers | grep -q "$LINE_SUDOERS"; echo $?)
#if line does not exist yet... append it by the end of the file
if [ $LINE_SUDOERS_EXISTS ]
then
echo $LINE_SUDOERS >> /etc/sudoers
fi
2. Файл утилит util-root.sh выполняемый через sudo и выполняющий основную работу
#!/bin/bash
#dislocker-gui-zenity
#This util-root.sh script contains the commands used by the dislocker-gui.sh
#that need to be run as root user
DFILE_LOCATION="/tmp/DFILE"
ACTION=$1
case $ACTION in
"clearTMP")
rm -f /tmp/fdisk.txt
rm -f /tmp/drive_selection_list.txt
;;
"checkBitLockerDriveMounted")
DRIVE_MOUNTPOINT=$2
echo $(mount | grep -q "$DRIVE_MOUNTPOINT\|$DFILE_LOCATION"; echo $?)
;;
"isBitlockerDrive")
DRIVE=$2
echo $(dislocker-fuse -r -V "/dev/$DRIVE" | grep -q "None of the provided decryption mean is decrypting the keys."; echo $?)
;;
"createMountDir")
DRIVE_MOUNTPOINT=$2
mkdir -p $DRIVE_MOUNTPOINT
mkdir -p $DFILE_LOCATION
;;
"decrypt")
DRIVE_SELECTED=$2
DRIVE_PASSWORD=$3
DRIVE_UID=$4
DRIVE_GID=$5
#if the output contains the string "Can't decrypt correctly the VMK." it means the password supplied is wrong
echo $(dislocker-fuse -v -V /dev/"$DRIVE_SELECTED" -u$DRIVE_PASSWORD -- $DFILE_LOCATION -o uid=$DRIVE_UID,gid=$DRIVE_GID | grep -q "Can't decrypt correctly the VMK."; echo $?)
;;
"mount")
DRIVE_MOUNTPOINT=$2
DRIVE_UID=$3
DRIVE_GID=$4
if [ -f $DFILE_LOCATION/dislocker-file ];
then
mount -o loop,rw,uid=$DRIVE_UID,gid=$DRIVE_GID $DFILE_LOCATION/dislocker-file $DRIVE_MOUNTPOINT
else
zenity --error --title="Error" --no-wrap --text="bitLock mount error"
umount $DRIVE_MOUNTPOINT 2>/dev/null
umount $DFILE_LOCATION 2>/dev/null
exit 1
fi
;;
"umount")
DRIVE_MOUNTPOINT=$2
umount $DRIVE_MOUNTPOINT
umount $DFILE_LOCATION
;;
"getListNTFSDrives")
#get list of NTFS/exFAT/HPFS drives and saves the list to the temp file
# fdisk -l | grep NTFS | cut -c6-9 > /tmp/fdisk.txt
lsblk -l -n > /tmp/fdisk.txt
;;
esac
3. Файл dislocker-gui.sh который выполняет графическую красоту.
#!/bin/bash
DRIVE_MOUNTPOINT="/media/BitLockerDrive"
d_uid=`id -u`
d_gid=`id -g`
function openFileBrowser
{
if type nautilus 2> /dev/null
then
FILE_BROWSER="nautilus"
elif type dolphin 2> /dev/null
then
FILE_BROWSER="dolphin"
elif type thunar 2> /dev/null
then
FILE_BROWSER="thunar"
else
zenity --info --title="File Browser Not Found"
--text="Nautilus/Dolphin/Thunar not found\n\nOpen your file browser at $DRIVE_MOUNTPOINT"
exit
fi
$($FILE_BROWSER $DRIVE_MOUNTPOINT)
}
function checkDependencies
{
if ! type zenity > /dev/null
then
echo "Missing dependency 'Zenity'. Please install it before using this script.
\n\nFor Ubuntu: sudo apt install zenity
\n\nFor Fedora: sudo dnf install zenity";
exit;
fi
if ! type dislocker-fuse > /dev/null
then
zenity --error --title="Dislocker Not Found" --no-wrap --text="Missing dependency 'Dislocker'. Please install it before using this script.
\n\nFor Ubuntu: sudo apt install dislocker
\n\nFor Fedora: sudo dnf install fuse-dislocker"
exit;
fi
}
function clearTMPFiles
{
sudo /opt/dislocker-gui/util-root.sh "clearTMP"
}
function errorMessage
{
MESSAGE=$1
zenity --error --title="Error" --no-wrap --text="$1"
}
function getListNTFSDrives
{
sudo /opt/dislocker-gui/util-root.sh "getListNTFSDrives"
}
function getSelectionListBitlockerDrive
{
#get list of NTFS/exFAT/HPFS drives and saves the list to the temp file
getListNTFSDrives
#if there are any ntfs/exFAT/HPFS drives attached
if [ -f "/tmp/fdisk.txt" ]
then
#for each candidate drive test if it is a bitlocker drive
for drive in $(cat /tmp/fdisk.txt)
do
#if it is a valid bitlocker drive
if [ $(isBitlockerDrive $drive) = "0" ]
then
size=$(getDiskSizeGB $drive)
brandNModel=$(getDiskBrandNModel $drive)
#creates a table for the drive selection interface. FALSE indicates that the option is by default not selected on the gui
echo "FALSE $drive $brandNModel $size" >> /tmp/drive_selection_list.txt
fi
done
else
errorBitlockerDriveNotFound
exit 1
fi
}
function errorBitlockerDriveNotFound
{
errorMessage "No Bitlocker drives found!"
}
function getDiskFromPartition
{
PARTITION=$1
echo $(echo $PARTITION | cut -c1-3)
}
function getDiskSizeGB
{
PARTITION=$1
lsblk /dev/$PARTITION -n -o SIZE
}
function getDiskBrandNModel
{
PARTITION=$1
DISK=$(getDiskFromPartition $PARTITION)
#the disk vendor and model info are located after the 8th char on the output of the command
#sed command replace spaces with underscores
# echo $(lsblk -o NAME,VENDOR,MODEL --nodeps | grep $DISK | grep -v $PARTITION | cut -c8- | sed -e 's/ /_/g')
echo $(lsblk -o NAME,VENDOR,MODEL --nodeps | grep $DISK | grep -v $PARTITION | cut -d ' ' -s -f 2- | sed -r 's/\s{2,}/ /g'|sed -e 's/ /_/g')
}
function isBitlockerDrive
{
DRIVE=$1
#return 0 if true
#return 1 if false
echo $(sudo /opt/dislocker-gui/util-root.sh "isBitlockerDrive" $DRIVE)
}
function mountDrive
{
DRIVE=$1
sudo /opt/dislocker-gui/util-root.sh "createMountDir" $DRIVE_MOUNTPOINT
#loop until the user supplies a valid password
PASSWORD_WRONG=0
while [ "$PASSWORD_WRONG" = "0" ]
do
DRIVE_PASSWORD=$(zenity --password --title="Locked Drive" --text="Please type the password for the BitLocker drive")
#if the password field is not empty
if [ -n "$DRIVE_PASSWORD" ]
then
#try to unlock the drive
PASSWORD_WRONG=$(sudo /opt/dislocker-gui/util-root.sh "decrypt" $DRIVE $DRIVE_PASSWORD $d_uid $d_gid)
#if the output contains the string "Can't decrypt correctly the VMK." it means the password supplied is wrong
if [ "$PASSWORD_WRONG" = "0" ]
then
errorMessage "Wrong Bitlocker password! Please try again."
fi
else
errorMessage "No password supplied!"
fi
done
sudo /opt/dislocker-gui/util-root.sh "mount" $DRIVE_MOUNTPOINT $d_uid $d_gid
#open the file browser on the mount point directory
openFileBrowser
}
function actionMountDrive
{
clearTMPFiles
getSelectionListBitlockerDrive
#if there is any valid bitlocker drive
if [ -f "/tmp/drive_selection_list.txt" ]
then
DRIVE_SELECT_LIST=$(cat /tmp/drive_selection_list.txt)
DRIVE_SELECTED=$(zenity --list --title="BitLocker Drive List" \
--text="Select the Bitlocker drive to be mounted:" \
--radiolist --multiple \
--width="450" \
--column ' ' --column 'Drive' --column 'Brand/Model' --column 'Size' \
$DRIVE_SELECT_LIST)
#if a drive was selected
if [ -n "$DRIVE_SELECTED" ]
then
mountDrive $DRIVE_SELECTED
else
errorMessage "No Bitlocker drive selected!"
fi
clearTMPFiles
else
errorBitlockerDriveNotFound
fi
}
function actionUmountDrive
{
sudo /opt/dislocker-gui/util-root.sh "umount" $DRIVE_MOUNTPOINT
}
function checkBitlockerDriveMounted
{
echo $(sudo /opt/dislocker-gui/util-root.sh "checkBitLockerDriveMounted" $DRIVE_MOUNTPOINT)
}
checkDependencies
#check if there is any bitlocker drive currently mounted
if [ "$(checkBitlockerDriveMounted)" = "0" ]
then
zenity --question --title="Bitlocker Drive already mounted" --no-wrap \
--text="There is a Bitlocker drive currently mounted.\n\nWhat would you like to do?" \
--ok-label="Remove it safely" --cancel-label="Nothing"
#if the user clicked the ok button (Remove it Safely)
if [ "$?" = "0" ]
then
actionUmountDrive
fi
else
actionMountDrive
fi
