+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 к хостингу
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