Browse Source

Continuing with 'unforgettable key' implementation

Bob Mottram 9 years ago
parent
commit
5e862cdc35
4 changed files with 178 additions and 27 deletions
  1. BIN
      man/freedombone-recoverkey.1.gz
  2. 50
    15
      src/freedombone
  3. 66
    11
      src/freedombone-config
  4. 62
    1
      src/freedombone-recoverkey

BIN
man/freedombone-recoverkey.1.gz View File


+ 50
- 15
src/freedombone View File

@@ -3782,7 +3782,6 @@ function backup_to_friends_servers {
3782 3782
   # we just need to rsync it to each friend
3783 3783
 
3784 3784
   echo '# For each remote server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3785
-  echo 'ctr_share=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3786 3785
   echo 'while read remote_server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3787 3786
   echo 'do' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3788 3787
   echo '  # Get the server and its password' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
@@ -3793,6 +3792,12 @@ function backup_to_friends_servers {
3793 3792
   echo -n '$1' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3794 3793
   echo "}')" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3795 3794
   echo '  if [ $REMOTE_SERVER ]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3795
+  echo -n '    REMOTE_DOMAIN=$(echo "${remote_server}" | ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3796
+  echo -n "awk -F ':' '{print " >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3797
+  echo -n '$1' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3798
+  echo -n "}' | awk -F '@' '{print " >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3799
+  echo -n '$2' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3800
+  echo "}')" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3796 3801
   echo -n '    REMOTE_SSH_PORT=$(echo "${remote_server}" | ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3797 3802
   echo -n "awk -F ' ' '{print " >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3798 3803
   echo -n '$2' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
@@ -3808,27 +3813,49 @@ function backup_to_friends_servers {
3808 3813
   echo "$REMOTE_BACKUPS_LOG" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3809 3814
 
3810 3815
   if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
3816
+      echo '' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3817
+      echo '    # Social key management' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3811 3818
       echo "    if [ -d /home/$MY_USERNAME/.gnupg_fragments ]; then" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3812
-      echo "        cd /home/$MY_USERNAME/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3813
-      echo '        no_of_shares=$(ls -afq keyshare* | wc -l)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3814
-      echo '        no_of_shares=$((no_of_fragments - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3815
-      echo '        if [[ ${no_of_shares} > 0 ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3816
-      echo '            share_files=(/home/$MY_USERNAME/.gnupg_fragments/keyshare*)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3817
-      echo '            share_filename=${key_files[ctr_share]}' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3818
-      echo "            mkdir -p /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3819
-      echo "            cp $share_filename /home/$MY_USERNAME/tempkey/.gnupg_fragments/data" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3820
-      echo -n '            /usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3819
+      echo '        if [ $REMOTE_DOMAIN ]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3820
+      echo "            cd /home/$MY_USERNAME/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3821
+      echo '            no_of_shares=$(ls -afq keyshare* | wc -l)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3822
+      echo '            no_of_shares=$((no_of_fragments - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3823
+      echo '            if [[ ${no_of_shares} > 0 ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3824
+      echo '                # Pick a share index based on the domain name' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3825
+      echo '                # This ensures that the same share is always given to the same domain' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3826
+      echo '                sharenumstr=$(md5sum <<< "$REMOTE_DOMAIN")' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3827
+      echo '                share_index=$(echo $((0x${sharenumstr%% *} % ${no_of_shares})) | tr -d -)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3828
+      echo '' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3829
+      echo '                # get the share filename' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3830
+      echo '                share_files=(/home/$MY_USERNAME/.gnupg_fragments/keyshare*)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3831
+      echo '                share_filename=${share_files[share_index]}' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3832
+      echo '' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3833
+      echo '                # create a temp directory containing the share' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3834
+      echo "                mkdir -p /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3835
+      echo "                cp $share_filename /home/$MY_USERNAME/tempkey/.gnupg_fragments/" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3836
+      echo '' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3837
+      echo '                # copy the fragments directory to the remote server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3838
+      echo -n '                /usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3821 3839
       echo "scp -r -P $REMOTE_SSH_PORT /home/$MY_USERNAME/tempkey/.gnupg_fragments $REMOTE_SERVER" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3822
-      echo "            shred -zu /home/$MY_USERNAME/tempkey/.gnupg_fragments/*" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3823
-      echo "            rm -rf /home/$MY_USERNAME/tempkey" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3824
-      echo '            ctr_share=$((ctr_share + 1))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3825
-      echo '            if [[ ${ctr_share} >= ${no_of_shares} ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3826
-      echo '                ctr_share=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3840
+      echo '                if [ ! "$?" = "0" ]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3841
+      echo '                    # Send a warning email' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3842
+      echo -n '                    echo "Key share to $REMOTE_SERVER failed" | mail -s "Freedombone social key management" ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3843
+      echo "$MY_EMAIL_ADDRESS" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3844
+      echo '                fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3845
+      echo '' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3846
+      echo '                # remove the temp file/directory' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3847
+      echo "                shred -zu /home/$MY_USERNAME/tempkey/.gnupg_fragments/*" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3848
+      echo "                rm -rf /home/$MY_USERNAME/tempkey" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3849
+      echo '' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3850
+      echo '                # Send a confirmation email' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3851
+      echo -n '                echo "Key shared to $REMOTE_SERVER" | mail -s "Freedombone social key management" ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3852
+      echo "$MY_EMAIL_ADDRESS" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3827 3853
       echo '            fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3828 3854
       echo '        fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3829 3855
       echo '    fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3830 3856
   fi
3831 3857
 
3858
+  echo '' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3832 3859
   echo -n '    rsync -ratlzv --rsh="/usr/bin/sshpass -p $REMOTE_PASSWORD ssh -p $REMOTE_SSH_PORT -o StrictHostKeyChecking=no" ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3833 3860
   echo '$SERVER_DIRECTORY/backup $REMOTE_SERVER' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3834 3861
   echo '    if [ ! "$?" = "0" ]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
@@ -4480,6 +4507,14 @@ function restore_from_friend {
4480 4507
   echo '    rm -rf /root/tempdlna' >> /usr/bin/$RESTORE_FROM_FRIEND_SCRIPT_NAME
4481 4508
   echo '  fi' >> /usr/bin/$RESTORE_FROM_FRIEND_SCRIPT_NAME
4482 4509
   echo 'fi' >> /usr/bin/$RESTORE_FROM_FRIEND_SCRIPT_NAME
4510
+
4511
+  if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
4512
+      echo '' >> /usr/bin/$RESTORE_FROM_FRIENDS_SCRIPT_NAME
4513
+      echo '# Retrieve key fragments' >> /usr/bin/$RESTORE_FROM_FRIENDS_SCRIPT_NAME
4514
+      echo -n '/usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$RESTORE_FROM_FRIENDS_SCRIPT_NAME
4515
+      echo "scp -r -P $REMOTE_SSH_PORT $REMOTE_SERVER/.gnupg_fragments /home/$MY_USERNAME/" >> /usr/bin/$RESTORE_FROM_FRIENDS_SCRIPT_NAME
4516
+  fi
4517
+
4483 4518
   echo '' >> /usr/bin/$RESTORE_FROM_FRIEND_SCRIPT_NAME
4484 4519
   echo 'echo "*** Remote restore was successful ***"' >> /usr/bin/$RESTORE_FROM_FRIEND_SCRIPT_NAME
4485 4520
   echo '' >> /usr/bin/$RESTORE_FROM_FRIEND_SCRIPT_NAME

+ 66
- 11
src/freedombone-config View File

@@ -224,7 +224,7 @@ function save_configuration_file {
224 224
       echo "HWRNG=$HWRNG" >> $CONFIGURATION_FILE
225 225
   fi
226 226
   if [ $ENABLE_SOCIAL_KEY_MANAGEMENT ]; then
227
-	  echo "ENABLE_SOCIAL_KEY_MANAGEMENT=$ENABLE_SOCIAL_KEY_MANAGEMENT" >> $CONFIGURATION_FILE
227
+      echo "ENABLE_SOCIAL_KEY_MANAGEMENT=$ENABLE_SOCIAL_KEY_MANAGEMENT" >> $CONFIGURATION_FILE
228 228
   fi
229 229
 }
230 230
 
@@ -241,17 +241,43 @@ function validate_domain_name {
241 241
   fi
242 242
 }
243 243
 
244
-function interactive_gpg {
245
-  dialog --title "Encryption keys" \
246
-         --backtitle "Freedombone Configuration" \
247
-         --defaultno \
248
-         --yesno "\nDo you have existing GPG/PGP/ssh keys that you wish to install?" 7 60
249
-  sel=$?
250
-  case $sel in
251
-      1) return;;
252
-      255) exit 0;;
253
-  esac
244
+function interactive_gpg_from_remote {
245
+  REMOTE_SERVERS_LIST=/home/$MY_USERNAME/keyshareservers.txt
246
+
247
+  # get a list of remote servers
248
+  freedombone-remote -u $MY_USERNAME -l $REMOTE_SERVERS_LIST
249
+  if [ ! "$?" = "0" ]; then
250
+      echo "1"
251
+      return
252
+  fi
253
+
254
+  if [ ! -f $REMOTE_SERVERS_LIST ]; then
255
+      echo "2"
256
+      return
257
+  fi
258
+  
259
+  # check the number of entries in the file
260
+  no_of_servers=$(cat $REMOTE_SERVERS_LIST | wc -l)
261
+  if [[ ${no_of_servers} < 3 ]]; then
262
+      dialog --title "Encryption keys" --msgbox 'There must be at least three servers to recover the key' 6 70
263
+      echo "3"
264
+      return
265
+  fi
266
+  
267
+  # try to recover the key from the servers
268
+  freedombone-recoverkey -u $MY_USERNAME -l $REMOTE_SERVERS_LIST
269
+  if [ ! "$?" = "0" ]; then
270
+      dialog --title "Encryption keys" --msgbox 'Your key could not be recovered' 6 70
271
+      echo "4"
272
+      return
273
+  fi
274
+
275
+  dialog --title "Encryption keys" --msgbox 'Your key has been recovered' 6 70
276
+
277
+  echo '0'
278
+}
254 279
 
280
+function interactive_gpg_from_usb {
255 281
   dialog --title "Encryption keys" --msgbox 'Plug in a USB drive containing a copy of your .gnupg directory' 6 70
256 282
 
257 283
   if [[ $INSTALLING_ON_BBB == "yes" ]]; then
@@ -312,6 +338,35 @@ function interactive_gpg {
312 338
   rm -rf $GPG_USB_MOUNT
313 339
 }
314 340
 
341
+function interactive_gpg {
342
+  GPG_CONFIGURED="no"
343
+  while [[ $GPG_CONFIGURED != "yes" ]]
344
+  do
345
+      GPG_CONFIGURED="yes"
346
+      data=$(tempfile 2>/dev/null)
347
+      trap "rm -f $data" 0 1 2 5 15
348
+      dialog --backtitle "Freedombone Configuration" \
349
+          --radiolist "GPG/PGP keys for your system:" 17 40 3 \
350
+          1 "Generate new keys (new user)" on \
351
+          2 "Import keys from a USB drive" off \
352
+          3 "Retrieve keys from friends servers" off 2> $data
353
+      sel=$?
354
+      case $sel in
355
+          1) exit 0;;
356
+          255) exit 0;;
357
+      esac
358
+      case $(cat $data) in
359
+          1) return;;
360
+          2) interactive_gpg_from_usb
361
+             return;;
362
+          3) retval=interactive_gpg_from_remote
363
+             if [[ retval != '0' ]]; then
364
+                 GPG_CONFIGURED="no"
365
+             fi;;
366
+      esac
367
+  done
368
+}
369
+
315 370
 function interactive_configuration {
316 371
   # create a temporary copy of the configuration file
317 372
   # which can be used to pre-populate selections

+ 62
- 1
src/freedombone-recoverkey View File

@@ -28,9 +28,12 @@
28 28
 # You should have received a copy of the GNU General Public License
29 29
 # along with this program. If not, see <http://www.gnu.org/licenses/>.
30 30
 
31
+FRIENDS_SERVERS_LIST=
32
+MY_USERNAME=
33
+
31 34
 function show_help {
32 35
     echo ''
33
-    echo 'freedombone-recoverkey -u [username]'
36
+    echo 'freedombone-recoverkey -u [username] -l [friends servers list filename]'
34 37
     echo ''
35 38
     exit 0
36 39
 }
@@ -47,6 +50,12 @@ case $key in
47 50
     shift
48 51
     MY_USERNAME="$1"
49 52
     ;;
53
+    # backup list filename
54
+    # typically /home/$USER/backup.list
55
+    -l|--list)
56
+    shift
57
+    FRIENDS_SERVERS_LIST="$1"
58
+    ;;
50 59
     *)
51 60
     # unknown option
52 61
     ;;
@@ -70,12 +79,64 @@ if [ ! -d /home/$MY_USERNAME ]; then
70 79
     echo "User $MY_USERNAME does not exist on the system"
71 80
     exit 7270
72 81
 fi
82
+
73 83
 FRAGMENTS_DIR=/home/$MY_USERNAME/.gnupg_fragments
84
+
85
+# find the remote backup list
86
+if [ ! $FRIENDS_SERVERS_LIST ]; then
87
+    if [ -f /home/$MY_USERNAME/backup.list ]; then
88
+        FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
89
+    fi
90
+fi
91
+
92
+# obtain shares/fragments from remote locations
93
+if [ $FRIENDS_SERVERS_LIST ]; then
94
+    # For each remote server
95
+    while read remote_server
96
+    do
97
+        # Get the server and its password
98
+        # Format is:
99
+        #   username@domain:/home/username <port number> <ssh password>
100
+        REMOTE_SERVER=$(echo "${remote_server}" | awk -F ' ' '{print $1}')
101
+        if [ $REMOTE_SERVER ]; then
102
+            REMOTE_SSH_PORT=$(echo "${remote_server}" | awk -F ' ' '{print $2}')
103
+            REMOTE_PASSWORD=$(echo "${remote_server}" | awk -F ' ' '{print $3}')
104
+
105
+            # create a directory if it doesn't exist
106
+            if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
107
+                mkdir -p /home/$MY_USERNAME/.gnupg_fragments
108
+            fi
109
+
110
+            echo -n "Starting key retrieval from $REMOTE_SERVER..."
111
+            /usr/bin/sshpass -p $REMOTE_PASSWORD \
112
+                scp -r -P $REMOTE_SSH_PORT $REMOTE_SERVER/.gnupg_fragments/* /home/$MY_USERNAME/.gnupg_fragments
113
+            if [ ! "$?" = "0" ]; then
114
+                echo 'FAILED'
115
+            else
116
+                echo 'Ok'
117
+            fi
118
+        fi
119
+    done < $FRIENDS_SERVERS_LIST
120
+fi   
121
+
122
+# was a directory created?
74 123
 if [ ! -d $FRAGMENTS_DIR ]; then
75 124
     echo 'No fragments have been recovered, so the key cannot be recovered'
76 125
     exit 7483
77 126
 fi
78 127
 
128
+# was anything downloaded?
129
+cd $FRAGMENTS_DIR
130
+no_of_shares=$(ls -afq keyshare* | wc -l)
131
+no_of_shares=$((no_of_shares - 2))
132
+if [[ ${no_of_shares} == 0 ]]; then
133
+    echo 'No key fragments were retrieved'
134
+    exit 76882
135
+fi
136
+
137
+# set permissions on the fragments
138
+chown -R $MY_USERNAME:$MY_USERNAME /home/$MY_USERNAME/.gnupg_fragments
139
+
79 140
 # decrypt the file
80 141
 KEYS_FILE=$FRAGMENTS_DIR/keyshare.asc
81 142
 cd $FRAGMENTS_DIR