Ver código fonte

Beginning of social key management

Bob Mottram 9 anos atrás
pai
commit
a87f61c756
2 arquivos alterados com 56 adições e 22 exclusões
  1. 30
    20
      src/freedombone
  2. 26
    2
      src/freedombone-splitkey

+ 30
- 20
src/freedombone Ver arquivo

@@ -381,6 +381,9 @@ CJDNS_PORT=
381 381
 ENABLE_BATMAN="no"
382 382
 BATMAN_IPV6=
383 383
 
384
+# social key management
385
+ENABLE_SOCIAL_KEY_MANAGEMENT="no"
386
+
384 387
 function show_help {
385 388
   echo ''
386 389
   echo 'freedombone -c [configuration file]'
@@ -716,6 +719,9 @@ function read_configuration {
716 719
   fi
717 720
 
718 721
   if [ -f $CONFIGURATION_FILE ]; then
722
+      if grep -q "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE; then
723
+          ENABLE_SOCIAL_KEY_MANAGEMENT=$(grep "ENABLE_SOCIAL_KEY_MANAGEMENT" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
724
+      fi
719 725
       if grep -q "IPV6_NETWORK" $CONFIGURATION_FILE; then
720 726
           IPV6_NETWORK=$(grep "IPV6_NETWORK" $CONFIGURATION_FILE | awk -F '=' '{print $2}')
721 727
       fi
@@ -1696,7 +1702,7 @@ function create_backup_script {
1696 1702
   if grep -Fxq "create_backup_script" $COMPLETION_FILE; then
1697 1703
       return
1698 1704
   fi
1699
-  apt-get -y install rsyncrypto cryptsetup
1705
+  apt-get -y install rsyncrypto cryptsetup ssss
1700 1706
 
1701 1707
   get_mariadb_password
1702 1708
   get_mariadb_gnusocial_admin_password
@@ -3801,25 +3807,29 @@ function backup_to_friends_servers {
3801 3807
   echo -n '    echo "$NOW Starting backup to $REMOTE_SERVER" >> ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3802 3808
   echo "$REMOTE_BACKUPS_LOG" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3803 3809
 
3804
-  echo "    if [ -d /home/$MY_USERNAME/.gnupg_fragments ]; then" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3805
-  echo "        cd /home/$MY_USERNAME/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3806
-  echo '        no_of_fragments=$(ls -afq | wc -l)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3807
-  echo '        no_of_fragments=$((no_of_fragments - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3808
-  echo '        if [[ ${no_of_fragments} > 0 ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3809
-  echo '            key_files=(/home/$MY_USERNAME/.gnupg_fragments/data*)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3810
-  echo '            key_filename=${key_files[ctr]}' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3811
-  echo "            mkdir -p /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3812
-  echo "            cp $key_filename /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3813
-  echo -n '            /usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3814
-  echo "scp -r -P $REMOTE_SSH_PORT /home/$MY_USERNAME/tempkey/.gnupg_fragments $REMOTE_SERVER" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3815
-  echo "            shred -zu /home/$MY_USERNAME/tempkey/.gnupg_fragments/*" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3816
-  echo "            rm -rf /home/$MY_USERNAME/tempkey" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3817
-  echo '            ctr=$((ctr + 1))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3818
-  echo '            if [[ ${ctr} >= ${no_of_fragments} ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3819
-  echo '                ctr=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3820
-  echo '            fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3821
-  echo '        fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3822
-  echo '    fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3810
+  if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
3811
+      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_fragments=$(ls -afq data* | wc -l)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3814
+      echo '        no_of_fragments=$((no_of_fragments - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3815
+      echo '        if [[ ${no_of_fragments} > 0 ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3816
+      echo '            key_files=(/home/$MY_USERNAME/.gnupg_fragments/data*)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3817
+      echo '            key_filename=${key_files[ctr]}' >> /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 '            ctrb=$((ctr + 1))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3820
+      echo "            sed \"$ctrbq;d\" /home/$MY_USERNAME/.gnupg_fragments/shares.txt > /home/$MY_USERNAME/tempkey/.gnupg_fragments/share.txt" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3821
+      echo "            cp $key_filename /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3822
+      echo -n '            /usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3823
+      echo "scp -r -P $REMOTE_SSH_PORT /home/$MY_USERNAME/tempkey/.gnupg_fragments $REMOTE_SERVER" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3824
+      echo "            shred -zu /home/$MY_USERNAME/tempkey/.gnupg_fragments/*" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3825
+      echo "            rm -rf /home/$MY_USERNAME/tempkey" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3826
+      echo '            ctr=$((ctr + 1))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3827
+      echo '            if [[ ${ctr} >= ${no_of_fragments} ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3828
+      echo '                ctr=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3829
+      echo '            fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3830
+      echo '        fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3831
+      echo '    fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3832
+  fi
3823 3833
 
3824 3834
   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
3825 3835
   echo '$SERVER_DIRECTORY/backup $REMOTE_SERVER' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME

+ 26
- 2
src/freedombone-splitkey Ver arquivo

@@ -37,10 +37,11 @@
37 37
 KEY_FRAGMENTS=3
38 38
 MY_USERNAME=
39 39
 MY_EMAIL_ADDRESS=
40
+PASSPHRASE=
40 41
 
41 42
 function show_help {
42 43
     echo ''
43
-    echo 'freedombone-splitkey -u [username] -n [number of fragments] -e [email address]'
44
+    echo 'freedombone-splitkey -u [username] -n [number of fragments] -e [email address] -p [passphrase]'
44 45
     echo ''
45 46
     exit 0
46 47
 }
@@ -65,6 +66,10 @@ case $key in
65 66
     shift
66 67
     MY_EMAIL_ADDRESS=$1
67 68
     ;;
69
+    -p|--passphrase)
70
+    shift
71
+    PASSPHRASE=$1
72
+    ;;
68 73
     *)
69 74
     # unknown option
70 75
     ;;
@@ -113,14 +118,33 @@ cat /home/$MY_USERNAME/pubkey.txt /home/$MY_USERNAME/privkey.txt > $KEYS_FILE
113 118
 shred -zu /home/$MY_USERNAME/privkey.txt
114 119
 shred -zu /home/$MY_USERNAME/pubkey.txt
115 120
 
121
+# generate a random passphrase if one isn't supplied
122
+if [ ! $PASSPHRASE ]; then
123
+    PASSPHRASE=$(openssl rand -base64 64)
124
+fi
125
+
116 126
 # encrypt the keys file with a passphrase
117
-gpg --output $KEYS_FILE.gpg --symmetric $KEYS_FILE
127
+echo "$PASSPHRASE" | gpg --passphrase-fd 0 --output $KEYS_FILE.gpg --symmetric $KEYS_FILE
118 128
 if [ ! "$?" = "0" ]; then
119 129
     echo "Unable to encrypt the data prior to splitting"
120 130
     exit 7352
121 131
 fi
122 132
 shred -zu $KEYS_FILE
123 133
 
134
+# split the passphrase into shares
135
+echo "$PASSPHRASE" | ssss-split -q -t $KEY_FRAGMENTS -n $KEY_FRAGMENTS > \
136
+                                /home/$MY_USERNAME/.gnupg_fragments/shares.txt
137
+
138
+# (maybe) overwrite passphrase after use
139
+PASSPHRASE=$(openssl rand -base64 64)
140
+
141
+# check that passphrase shares were created
142
+if [ ! -f /home/$MY_USERNAME/.gnupg_fragments/shares.txt ]; then
143
+    echo 'Passphrase for key fragments could not be split'
144
+    shred -zu $KEYS_FILE.gpg
145
+    exit 74549
146
+fi
147
+
124 148
 # generate fragments
125 149
 GPG_KEYS_SIZE_BYTES=$(wc -c <"$KEYS_FILE.gpg")
126 150
 GPG_BYTES_PER_FRAGMENT=$((GPG_KEYS_SIZE_BYTES / KEY_FRAGMENTS))