暗号化バイク、またはサーバーからのUSBキー

多くのシステム管理者は、一見非常に些細なタスクを実行するために「自転車を発明」しました。 サーバーの保守を妨げるようになったサーバーのログに触発され、これらの自転車の1つに関する発明に関する公式文書から回復した詳細なストーリーを伝えたいと思います。 たくさんの文字と(h)コンソールに注意してください!





約2年前、私の仕事のために、GNU / linuxオペレーティングシステム(かなり古いubuntuを読んでください)を含むラックマウントサーバーと、16ギガバイトの容量を持つ2台のトランセンドUSBフラッシュドライブ(そのようなボリュームが必要な理由はわかりません)が提供されましたキーキャリア。

タスクが設定されました:サーバー上にあるデータベースでパーティションを暗号化して、不正アクセスを防ぎます。

タスクを達成するために、 LUKSパーティション暗号化テクノロジーが選択されました。

次のツールも必要でした。



当初は、暗号化されたファイルシステムのマウントと接続に組み込みの配布アルゴリズムを使用することを計画していましたが、経験の不足または他の何らかの理由により停止に至りました。 まあ、まず最初に。



もちろん、最初は外部メディアから起動し、サーバーのすべてのデータの完全バックアップを作成しました。同時に/ etc / fstabファイルを調べました。 バックアップを削除した直後は誰もスーパーユーザーのパスワードを知らなかったため、ルートユーザーの行に知っているパスワードのハッシュを書き込むことで/ etc / shadowファイルを変更しました。 このようにしてインストールされたシステムへのアクセスを取得したので、私は働くように設定しました:

ネットワークに接続:

# dhclient
      
      



LUKS暗号化システムを操作するためのツールを含むcryptsetupユーティリティをインストールしました。
 # apt-get update # apt-get install cryptsetup
      
      



ファイル「/ tmp / key」に書き込まれた256文字の擬似ランダムシーケンスを生成しました。
 # dd if=/dev/random of=/tmp/key bs=1 count=256
      
      



ところで、tmpは工作員にマウントされました。 最初のボリュームの2番目のパーティションのタイプをcrypto_LUKSに設定し、LUKSアルゴリズムを使用して暗号化された実際のパーティションにマッピングされる仮想パーティション「/ dev / mapper / dtb」を作成しました。

 # cryptsetup luksFormat /dev/sdb2 /tmp/key # cryptsetup luksOpen /dev/sdb2 dtb
      
      



暗号化にマップされた仮想パーティションで、彼は新しいext4ファイルシステムを作成し、/ mntディレクトリにマウントしました。

 # mkfs.ext4 /dev/mapper/dtb # mount /dev/mapper/dtb /mnt
      
      





次のコマンドを使用して、データ転送を実行します。
 # /etc/init.d/postgresql stop
      
      



postgresqlデーモンを停止し、Midnight Commanderプログラムを使用して、すべてのファイルを/ var / lib / pgsqlから/ mntにコピーし、その後/ var / lib / pgsqlディレクトリをクリアしました。 最初のボリュームの暗号化された2番目のセクションは、/ var / lib / pgsqlディレクトリにマウント解除されました。

 # umount /dev/mapper/dtb # mount /dev/mapper/dtb /var/lib/pgsql
      
      







パーティション暗号化キーとして使用されるファイル「/ tmp / key」は、フラッシュドライブの1つに送信されました。

フラッシュドライブを調理する方法
フラッシュドライブがパッケージに直接持ち込まれます。 フラッシュドライブの1つをコンピューターに挿入すると、フォーマットされているかどうか、およびどのファイルシステムにあるかを確認するために、メインセクションの前に7メガバイトの空き領域があることがわかりました。 すぐに、誤ってキーを削除することからユーザーを保護する方法が発生しました! ext2でフォーマットされたセクションを先に作成しました。 Windowsでは、ユーザーがフラッシュドライブのメインセクションをフォーマットしても、サーバーの起動機能が失われることはありません。


Midnight Commanderプログラムとコマンドラインユーティリティを使用して、暗号化されたパーティションの構成が/ etc / cryptsetupファイルに追加されました。 ただし、テストリブート中に、オペレーティングシステムのロードの特性により、/ etc / cryptsetupファイルの処理が発生するまで/ etc / fstabからキーメディアをマウントできないことがわかりました。その結果、暗号化されたパーティションはマウントされません。キーファイルなしではマウントできません。



適切なコマンドを使用して、必要な指示(キーメディアのマウント、暗号化パーティションのアクティブ化、キーパーティションのアンマウント、暗号化パーティションのマウント)が/etc/rc.localファイルに入力されました



このアクションは肯定的な結果をもたらしました(ダウンロードが完了した後、パーティションが適切な場所にマウントされました)。しかし、rc.localファイルはpostgresqlデーモンよりもずっと遅れて起動され、デーモンの操作中にデータベースファイルがマウントされたため、予期しない結果を招く可能性がありました



現在の状況を分析し、バックアップセクションとスワップパーティションを暗号化する必要性を考慮に入れた後、データベースからの情報およびスワップスペースにある可能性があるキーへの不正アクセスを防ぐために、特別な起動スクリプトを作成することにしました。 ロードの初期段階で、postgresqlデーモンが起動してスワップが必要になるまで、キーデバイスと暗号化パーティションをマウントします。



その結果、上記のすべての機能を実行する特別な開始bashスクリプトが作成されました。

  1. キーデバイスを検索してマウントしました
  2. キーデバイスが検出され、正常にマウントされた場合、暗号化されたパーティションに接続してマウントします
  3. 安全に取り外すためのマウントされていないキーデバイス
  4. 以前の操作の結果に関係なく、スワップパーティションが暗号化されたパーティションにマウントされるようにします


また、スクリプトの作成とデバッグの過程で、次の機能を実装することができました。



スクリプトを作成する過程で、ubuntuリポジトリに古いバージョンのcryptsetupパッケージが含まれていることがわかりました(指定されたUUIDでセクションを生成できませんでした)。したがって、プログラムの現在のバージョンはソースコードからコンパイルされ、標準のubuntuパッケージの代わりにインストールされました。

bashスクリプトは/etc/init.d/encryptdbにインストールされました。 スクリプトをインストールした後、システムの一般的な状態を変更しないさまざまなデバッグアクションが実行されました。 デバッグ後、update-rc.d encryptdb defaultsコマンドを使用したスクリプトがアクティブ化され、自動モードで実行されました。 スクリプトとともに、設定ファイル/ etc / keycrypt / keycryptabおよび/ etc / keycrypt / keydrvがインストールされました。



アプリケーション:

  1. ロシア語のコメント付きEncryptdbスクリプト
     #!/bin/bash ### BEGIN INIT INFO # Provides: cryptdisks # Required-Start: checkroot cryptdisks-early # Required-Stop: umountroot cryptdisks-early # Should-Start: udev mdadm-raid lvm2 # Should-Stop: udev mdadm-raid lvm2 # X-Start-Before: checkfs # X-Interactive: true # Default-Start: 2 3 4 5 # Default-Stop: 0 6 # Short-Description: Setup remaining encrypted block devices. # Description: ### END INIT INFO #     ,   , #          KEYCRYPTAB_DIR=/etc/keycrypt #   KEYCRYPTAB_FILE=$KEYCRYPTAB_DIR/keycryptab #        #       #              # : # <uuid > <  > <   links> < > #          "swap". #          2 : "none"  "random" # Use the option "none" is not recommended. # Examples: # 11111111-2222-3333-4444-555555555555 random swap1 swap # #safety swap partition. It no need any keyfile, but must be encrypted # 12345678-1234-4321-1234-567890123456 harry.key harry /home/harry # #home directory for Harry, Harry have the "harry.key" in his flash drive # 66666666-9999-8888-7777-000000000000 ntldr public "/var/ftp" # #publuc directory, all staff have the "ntldr" file in flash drives KEYDRIVER_FILE=$KEYCRYPTAB_DIR/keydrv #       #              # : # <uuid> <timeout> <dotmount> # Examples: # kkkkkkkk-kkkk-kkkk-kkkk-kkkkkkkkkkkk 20 /media/keys SWAPCLEAN_FILE=$KEYCRYPTAB_DIR/swapclean.flg # NOTE!!! If u are not using the encription swap # u need to run "dd if=/dev/urandom of=/u/swap/partition". # Otherwise encryption will not make sense. # I was include this functional on the skript, but # it will take a very long time to load OS. #=====================Begin of script===================== # Do not edit next if you are not sure what you are doing! #DBG="on" #       UMOUNT_FLAG="" #       #   ,     , 6  ( !     ) DEBUG() { if [ "$DBG" = "on" ] then echo -e "\E[33;40m$1 $2 $3 $4 $5 $6"; tput sgr0 fi } #           SetStruct() { str=`echo $1 | sed 's/#.*/ /g'` n=0 for arg in $str do let "n+=1" case "$n" in 1) CRYPT_UUID=$arg ;; 2) KEY_FILENAME=$arg ;; 3) CRYPT_NAME=$arg ;; 4) CRYPT_MOUNTPOINT=$arg return 0 ;; *) DEBUG "too many arguments: $arg" ;; esac done return 1 } #            SetKey() { nk=0 str=`echo $1 | sed 's/#.*/ /g'` for arg in $str do let "nk+=1" case "$nk" in 1) KEY_UUID=$arg ;; 2) KEY_TIMEOUT=$arg if (( KEY_TIMEOUT < 0 )) then echo "Invalid key timeout for $KEY_UUID" KEY_TIMEOUT=1 fi if (( KEY_TIMEOUT > 60 )) then echo "Invalid key timeout for $KEY_UUID" KEY_TIMEOUT=60 fi DEBUG "KEY_TIMEOUT=$KEY_TIMEOUT" ;; 3) KEY_MOUNTPOINT=$arg return 0 ;; *) DEBUG "too many arguments: $arg" ;; esac done return 1 } #     PrepareKeyDrv() { if [ ! -e "/dev/disk/by-uuid/$KEY_UUID" ] then #     echo -en "Waiting $KEY_TIMEOUT seconds for the key device \r" #    for (( n = ++KEY_TIMEOUT; n ; n-- )) do if [ ! -e "/dev/disk/by-uuid/$KEY_UUID" ] then (( KEY_TIMEOUT-- )) echo -en "Waiting $KEY_TIMEOUT seconds for the key device \r" else echo echo "Key device was found!" DEBUG $KEY_UUID break fi if [ "$n" = "1" ] then echo echo "Not found a key device!" DEBUG "Now completing PrepareKeyDrv()" # ,  return 1 fi sleep 1 # it is not a debug! Do not comment it! done fi #, ,     uuid DEBUG "Mounting the key device" if [ ! -d "$KEY_MOUNTPOINT" ]; then RM_KMP=1 mkdir $KEY_MOUNTPOINT fi uuid_l=`echo $KEY_UUID | wc -m` case "$uuid_l" in 10) mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -t vfat -o ro DEBUG "fat detected" ;; 17) mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -t ntfs-3g -o force,ro DEBUG "ntfs detected" ;; 37) mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -o ro DEBUG `mount | grep $KEY_MOUNTPOINT ` ;; *) DEBUG "Can not identify type of the file system on the specified uuid:" DEBUG "$KEY_UUID" mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -o ro ;; esac } #       UmountKey() { DEBUG "Unmounting the key device" umount $1 /dev/disk/by-uuid/$KEY_UUID if [ "$RM_KMP" = "1" ]; then rmdir $KEY_MOUNTPOINT fi } #      PrepareSwap() { if [ "$KEY_FILENAME" = "random" ] then #      if [ ! -e "/dev/disk/by-uuid/$CRYPT_UUID" ] then #    #  echo "Not found any partition for swap with UUID:" echo "$CRYPT_UUID" ###              else #   echo "Prepare to encripting swap" DEBUG "Disable all swaps" #    (,     ?) swapoff -a DEBUG "Regenerating new temporary key" #      mkdir /tmp/key ###                  #       (   ?     ?) mount -t ramfs none /tmp/key -o maxsize=1 #   dd if=/dev/urandom of=/tmp/key/swapkey$CRYPT_UUID bs=1 count=256 &> /dev/null DEBUG "Configuring encrypt on the swap partition" #      echo "YES"|cryptsetup luksFormat /dev/disk/by-uuid/$CRYPT_UUID /tmp/key/swapkey$CRYPT_UUID --uuid=$CRYPT_UUID #   DEBUG "Openinig swap partition for operations" cryptsetup luksOpen /dev/disk/by-uuid/$CRYPT_UUID $CRYPT_NAME --key-file /tmp/key/swapkey$CRYPT_UUID #   DEBUG "Erasing temporary key" rm -r -f /tmp/key/swapkey$CRYPT_UUID #   umount none #   UUID   (   uuid luks    ) DEBUG "Regenerating swapfs uuid" FS_CRYPT_UUID=`uuidgen` #echo $FS_CRYPT_UUID > $KEYCRYPTAB_DIR/swaps/$CRYPT_UUID DEBUG "Creating swap format" if [ -e "$SWAPCLEAN_FILE" ] then #     -            ###            ,   ,            . echo "Swap partition was mounted unsafe, cleaning..." echo -e 'It may take a long time. \e[31;40mDo not halt the computer! \e[0m' S=`fdisk -s /dev/mapper/$CRYPT_NAME` let "S *= 1024" dd if=/dev/urandom | pv -s $S | dd of=/dev/mapper/$CRYPT_NAME 2> /dev/null rm -r -f $SWAPCLEAN_FILE fi #  swapfs mkswap -f -U $FS_CRYPT_UUID /dev/mapper/$CRYPT_NAME &> /dev/null #   DEBUG "Activating swap" swapon -U $FS_CRYPT_UUID fi else #  ,           - if [ ! -e "/dev/disk/by-uuid/$CRYPT_UUID" ] then echo "Not found any partition for swap with UUID:" echo "$CRYPT_UUID" else chkswapt=`cat /proc/swaps | grep "$CRYPT_NAME"` if [ ! "$chkswapt" = "" ] then echo "Oops! \e[31;40mYou already have the swap! \e[0m" cat /proc/swaps echo "heck your 'fstab', 'cryptab' and '$KEYCRYPTAB_FILE'" echo "files for duplicate entries for swap partition" echo "In future use only one of these files to manage swaps" return 0 else echo -e '\e[31;40mWARNING!!! \e[0mThe system uses the unface way to manage swap!' echo 'You need to use value "random" of <key filename> on the' echo "$KEYCRYPTAB_FILE file for all swap partition!" fi swapoff -a mkswap -f -U $CRYPT_UUID /dev/disk/by-uuid/$CRYPT_UUID &> /dev/null swapon -U $CRYPT_UUID && echo "Remoove this file for disable cleaning swap on boot time" > $SWAPCLEAN_FILE # echo $CRYPT_UUID > $KEYCRYPTAB_DIR/swaps/$CRYPT_UUID fi fi } #       PrepareVolumes() { cat $KEYCRYPTAB_FILE | while read line; do #        if SetStruct "$line" then #     if [ ! -e "/dev/disk/by-uuid/$CRYPT_UUID" ] then #     # ,    echo "Not found encrypted partition with UUID:" echo "$CRYPT_UUID" else #    if [[ "$CRYPT_MOUNTPOINT" = "swap" && "$1" = "swaps" ]] then #          "swaps" #        PrepareSwap else #     if [[ "$CRYPT_MOUNTPOINT" != "swap" && "$1" != "swaps" ]] ###   ,  !                 ,            . then #        "swaps" #    echo "Opening encrypted volume" cryptsetup luksOpen /dev/disk/by-uuid/$CRYPT_UUID $CRYPT_NAME --key-file $KEY_MOUNTPOINT/$KEY_FILENAME if [ -e "/dev/mapper/$CRYPT_NAME" ] then #   #      echo "Mounting encrypted volume" if [ ! -d "$CRYPT_MOUNTPOINT" ]; then mkdir $CRYPT_MOUNTPOINT fi mount /dev/mapper/$CRYPT_NAME $CRYPT_MOUNTPOINT fi fi fi fi fi done } case "$1" in start) #         start #     # if [ -d "$KEYCRYPTAB_DIR/swaps/" ] # then # rm -r -f $KEYCRYPTAB_DIR/swaps/*.* # else # mkdir --parents $KEYCRYPTAB_DIR/swaps/ # fi cat $KEYDRIVER_FILE | while read line; do #      if SetKey "$line" then #     if PrepareKeyDrv then #      #    PrepareVolumes #    UmountKey fi fi done #   PrepareVolumes swaps DEBUG "Now comleting" ;; stop) #         st #    OS cat $KEYCRYPTAB_FILE | while read line; do #        if SetStruct "$line" then #     if [ "$CRYPT_MOUNTPOINT" = "swap" ] then #       DEBUG "Deactivating swap /dev/mapper/$CRYPT_NAME" #      swapoff /dev/mapper/$CRYPT_NAME # swapoff -UUID=`cat $KEYCRYPTAB_DIR/swaps/$CRYPT_UUID` else #  (    ) #      chkmnt=`mount | grep "$CRYPT_NAME"` if [ "$chkmnt" != "" ] then #   #  echo "Unmounting encrypted volume" DEBUG "/dev/mapper/$CRYPT_NAME" umount $UMOUNT_FLAG /dev/mapper/$CRYPT_NAME fi fi if [ -e "/dev/mapper/$CRYPT_NAME" ] then #     echo "Closing encrypted volume" DEBUG "/dev/mapper/$CRYPT_NAME" #  cryptsetup luksClose $CRYPT_NAME fi fi done ;; restart|reload) do_stop do_start ;; force-reload) UMOUNT_FLAG="-f" do_stop do_start ;; *) echo "Usage: $1 {start|stop|restart|reload|force-reload}" echo "Actions 'stop', 'restart', 'reload' and 'force-reload' will unmount" echo "all encrypted disk partitions, including partition containing swap" echo "To mount the additional partitions without unount already mounted," echo "run $1 script with the parameter 'start' again" exit 1 ;; esac
          
          



  2. Keycryptabファイル
     #All swap partition is required for the mount point "swap" #key file name for swap can take only 2 values: #"none" (is strongly not recommended) and "random" example: #11111111-2222-3333-4444-555555555555 random swap1 swap #<uuid> <key filename> <luks name> <dotmount> 0cf1c420-09a0-4338-85b4-df6aed780425 random swap1 swap 4ebecf51-4a5a-4aaf-ba97-3523129e567c keyfile.key dtb /var/lib/pgsql 0feb764f-195e-487d-a0ed-1de525fb3282 bacup.key bkp /media/old #this file MUST contain final newline or final comment
          
          



  3. keydrvファイル
     # Syntax: # <uuid> <timeout> <dotmount> # Example: # kkkkkkkk-kkkk-kkkk-kkkk-kkkkkkkkkkkk 20 /media/keys # <uuid> <timeout> <dotmount> 609e85b7-5fa8-4434-9210-b8df1d4c0a66 20 /media/keys bc5e202a-1523-46bc-95f4-3c89f10edd27 120 /media/keys #bacup user #this file MUST contain final newline or final comment
          
          







現在、このソリューションはすでにいくつかのサーバーで実行されており、Debianおよび
ArchLinux
 #!/bin/bash #Keycrypt 1.1 2012  ArchLinux #     ,   , #          #         . /etc/rc.conf . /etc/rc.d/functions KEYCRYPTAB_DIR=/etc/keycrypt #   KEYCRYPTAB_FILE=$KEYCRYPTAB_DIR/keycryptab #    #        #       #              # : # <uuid > <  > <   links> < > #          "swap". #          2 : "none"  "random" # Use the option "none" is not recommended. # Examples: # 11111111-2222-3333-4444-555555555555 random swap1 swap # #safety swap partition. It no need any keyfile, but must be encrypted # 12345678-1234-4321-1234-567890123456 harry.key harry /home/harry # #home directory for Harry, Harry have the "harry.key" in his flash drive # 66666666-9999-8888-7777-000000000000 ntldr public "/var/ftp" # #publuc directory, all staff have the "ntldr" file in flash drives KEYDRIVER_FILE=$KEYCRYPTAB_DIR/keydrv #     #       #              # : # <uuid> <timeout> <dotmount> # Examples: # kkkkkkkk-kkkk-kkkk-kkkk-kkkkkkkkkkkk 20 /media/keys SWAPCLEAN_FILE=$KEYCRYPTAB_DIR/swapclean.flg # NOTE!!! If u are not using the encription swap # u need to run "dd if=/dev/urandom of=/u/swap/partition". # Otherwise encryption will not make sense. # I was include this functional on  sript, but # it will take a very long time to load OS. DBG="on" #       #=====================Begin of script===================== # Do not edit next if you are not sure what you are doing! UMOUNT_FLAG="" #       #   ,     , 6  ( !     ) DEBUG() { if [ "$DBG" = "on" ] then echo -e "\E[33;40m$1 $2 $3 $4 $5 $6"; tput sgr0 fi } #           SetStruct() { str=`echo $1 | sed 's/#.*/ /g'` n=0 for arg in $str do let "n+=1" case "$n" in 1) CRYPT_UUID=$arg ;; 2) KEY_FILENAME=$arg ;; 3) CRYPT_NAME=$arg ;; 4) CRYPT_MOUNTPOINT=$arg return 0 ;; *) DEBUG "too many arguments: $arg" ;; esac done return 1 } #            SetKey() { nk=0 str=`echo $1 | sed 's/#.*/ /g'` for arg in $str do let "nk+=1" case "$nk" in 1) KEY_UUID=$arg ;; 2) KEY_TIMEOUT=$arg if (( KEY_TIMEOUT < 0 )) then echo "Invalid key timeout for $KEY_UUID" KEY_TIMEOUT=1 fi if (( KEY_TIMEOUT > 60 )) then echo "Invalid key timeout for $KEY_UUID" KEY_TIMEOUT=60 fi DEBUG "KEY_TIMEOUT=$KEY_TIMEOUT" ;; 3) KEY_MOUNTPOINT=$arg return 0 ;; *) DEBUG "too many arguments: $arg" ;; esac done return 1 } #     PrepareKeyDrv() { if [ ! -e "/dev/disk/by-uuid/$KEY_UUID" ] then #     echo -en "Waiting $KEY_TIMEOUT seconds for the key device \r" #    for (( n = ++KEY_TIMEOUT; n ; n-- )) do if [ ! -e "/dev/disk/by-uuid/$KEY_UUID" ] then (( KEY_TIMEOUT-- )) echo -en "Waiting $KEY_TIMEOUT seconds for the key device \r" else DEBUG "Key device was found!" DEBUG $KEY_UUID break fi if [ "$n" = "1" ] then DEBUG "Not found a key device!" DEBUG "Now completing PrepareKeyDrv()" # ,  return 1 fi sleep 1 # it is not a debug! Do not comment it! done fi #, ,     uuid DEBUG "Mounting the key device" if [ ! -d "$KEY_MOUNTPOINT" ]; then RM_KMP=1 mkdir $KEY_MOUNTPOINT fi uuid_l=`echo $KEY_UUID | wc -m` case "$uuid_l" in 10) mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -t vfat -o ro DEBUG "fat detected" ;; 17) mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -t ntfs-3g -o force,ro DEBUG "ntfs detected" ;; 37) mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -o ro DEBUG `mount | grep $KEY_MOUNTPOINT ` ;; *) DEBUG "Can not identify type of the file system on the specified uuid:" DEBUG "$KEY_UUID" mount /dev/disk/by-uuid/$KEY_UUID $KEY_MOUNTPOINT -o ro ;; esac } #       UmountKey() { DEBUG "Unmounting the key device" umount $1 /dev/disk/by-uuid/$KEY_UUID if [ "$RM_KMP" = "1" ]; then rmdir $KEY_MOUNTPOINT fi } #      PrepareSwap() { if [ "$KEY_FILENAME" = "random" ] then #      if [ ! -e "/dev/disk/by-uuid/$CRYPT_UUID" ] then #    #  DEBUG "Not found any partition for swap with UUID:" DEBUG "$CRYPT_UUID" ###              else #   DEBUG "Prepare to encripting swap" DEBUG "Disable all swaps" #    (,     ?) swapoff -a DEBUG "Regenerating new temporary key" #      mkdir /tmp/key ###                  #       (   ?     ?) mount -t ramfs none /tmp/key -o maxsize=1 #   dd if=/dev/urandom of=/tmp/key/swapkey$CRYPT_UUID bs=1 count=256 &> /dev/null DEBUG "Configuring encrypt on the swap partition" #      echo "YES"|cryptsetup luksFormat /dev/disk/by-uuid/$CRYPT_UUID /tmp/key/swapkey$CRYPT_UUID --uuid=$CRYPT_UUID #   DEBUG "Openinig swap partition for operations" cryptsetup luksOpen /dev/disk/by-uuid/$CRYPT_UUID $CRYPT_NAME --key-file /tmp/key/swapkey$CRYPT_UUID #   DEBUG "Erasing temporary key" rm -r -f /tmp/key/swapkey$CRYPT_UUID #   umount none #   UUID   (   uuid luks    ) DEBUG "Regenerating swapfs uuid" FS_CRYPT_UUID=`uuidgen` #echo $FS_CRYPT_UUID > $KEYCRYPTAB_DIR/swaps/$CRYPT_UUID DEBUG "Creating swap format" if [ -e "$SWAPCLEAN_FILE" ] then #     -            ###            ,   ,            . echo "Swap partition was mounted unsafe, cleaning..." echo -e 'It may take a long time. \e[31;40mDo not halt the computer! \e[0m' S=`fdisk -s /dev/mapper/$CRYPT_NAME` let "S *= 1024" dd if=/dev/urandom | pv -s $S | dd of=/dev/mapper/$CRYPT_NAME 2> /dev/null rm -r -f $SWAPCLEAN_FILE fi #  swapfs mkswap -f -U $FS_CRYPT_UUID /dev/mapper/$CRYPT_NAME &> /dev/null #   DEBUG "Activating swap" swapon -U $FS_CRYPT_UUID fi else #  ,           - if [ ! -e "/dev/disk/by-uuid/$CRYPT_UUID" ] then DEBUG "Not found any partition for swap with UUID:" DEBUG "$CRYPT_UUID" else chkswapt=`cat /proc/swaps | grep "$CRYPT_NAME"` if [ ! "$chkswapt" = "" ] then echo "Oops! \e[31;40mYou already have the swap! \e[0m" cat /proc/swaps echo "heck your 'fstab', 'cryptab' and '$KEYCRYPTAB_FILE'" echo "files for duplicate entries for swap partition" echo "In future use only one of these files to manage swaps" return 0 else echo -e '\e[31;40mWARNING!!! \e[0mThe system uses the unface way to manage swap!' echo 'You need to use value "random" of <key filename> on the' echo "$KEYCRYPTAB_FILE file for all swap partition!" fi swapoff -a mkswap -f -U $CRYPT_UUID /dev/disk/by-uuid/$CRYPT_UUID &> /dev/null swapon -U $CRYPT_UUID && echo "Remoove this file for disable cleaning swap on boot time" > $SWAPCLEAN_FILE # echo $CRYPT_UUID > $KEYCRYPTAB_DIR/swaps/$CRYPT_UUID fi fi } #       PrepareVolumes() { cat $KEYCRYPTAB_FILE | while read line; do #        if SetStruct "$line" then #     if [ ! -e "/dev/disk/by-uuid/$CRYPT_UUID" ] then #     # ,    DEBUG "Not found encrypted partition with UUID:" DEBUG "$CRYPT_UUID" else #    if [[ "$CRYPT_MOUNTPOINT" = "swap" && "$1" = "swaps" ]] then #          "swaps" #        PrepareSwap else #     if [[ "$CRYPT_MOUNTPOINT" != "swap" && "$1" != "swaps" ]] ###   ,  !                 ,            . then #        "swaps" #    DEBUG "Opening encrypted volume" cryptsetup luksOpen /dev/disk/by-uuid/$CRYPT_UUID $CRYPT_NAME --key-file $KEY_MOUNTPOINT/$KEY_FILENAME if [ -e "/dev/mapper/$CRYPT_NAME" ] then #   #      DEBUG "Mounting encrypted volume" if [ ! -d "$CRYPT_MOUNTPOINT" ]; then mkdir $CRYPT_MOUNTPOINT fi mount /dev/mapper/$CRYPT_NAME $CRYPT_MOUNTPOINT fi fi fi fi fi done } case "$1" in start) #         start #     stat_busy "Preparing encrypted partitions" # if [ -d "$KEYCRYPTAB_DIR/swaps/" ] # then # rm -r -f $KEYCRYPTAB_DIR/swaps/*.* # else # mkdir --parents $KEYCRYPTAB_DIR/swaps/ # fi cat $KEYDRIVER_FILE | while read line; do #      if SetKey "$line" then #     if PrepareKeyDrv then #      #    PrepareVolumes #    UmountKey fi fi done #   PrepareVolumes swaps DEBUG "Now comleting" if [ $? -gt 0 ]; then stat_fail else stat_done fi add_daemon internet ;; stop) #         st #    OS cat $KEYCRYPTAB_FILE | while read line; do #        if SetStruct "$line" then #     if [ "$CRYPT_MOUNTPOINT" = "swap" ] then #       DEBUG "Deactivating swap /dev/mapper/$CRYPT_NAME" #      swapoff /dev/mapper/$CRYPT_NAME # swapoff -UUID=`cat $KEYCRYPTAB_DIR/swaps/$CRYPT_UUID` else #  (    ) #      chkmnt=`mount | grep "$CRYPT_NAME"` if [ "$chkmnt" != "" ] then #   #  DEBUG "Unmounting encrypted volume" DEBUG "/dev/mapper/$CRYPT_NAME" umount $UMOUNT_FLAG /dev/mapper/$CRYPT_NAME fi fi if [ -e "/dev/mapper/$CRYPT_NAME" ] then #     DEBUG "Closing encrypted volume" DEBUG "/dev/mapper/$CRYPT_NAME" #  cryptsetup luksClose $CRYPT_NAME fi fi done rm_daemon internet if [ $? -gt 0 ]; then stat_fail else stat_done fi ;; restart|reload) do_stop do_start ;; force-reload) UMOUNT_FLAG="-f" do_stop do_start ;; *) echo "Usage: $1 {start|stop|restart|reload|force-reload}" echo "Actions 'stop', 'restart', 'reload' and 'force-reload' will unmount" echo "all encrypted disk partitions, including partition containing swap" echo "To mount the additional partitions without unount already mounted," echo "run $1 script with the parameter 'start' again" exit 1 ;; esac
      
      



(彼がsystemdを取得する前でも)。



All Articles