freedombone-app-keyserver 33KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # SKS Keyserver
  12. #
  13. # License
  14. # =======
  15. #
  16. # Copyright (C) 2017 Bob Mottram <bob@freedombone.net>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU Affero General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU Affero General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU Affero General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. VARIANTS='full full-vim'
  31. IN_DEFAULT_INSTALL=0
  32. SHOW_ON_ABOUT=1
  33. KEYSERVER_WEB_REPO="https://github.com/mattrude/pgpkeyserver-lite"
  34. KEYSERVER_WEB_COMMIT='a038cb79b927c99bf7da62f20d2c6a2f20374339'
  35. KEYSERVER_PORT=11371
  36. KEYSERVER_ONION_PORT=8122
  37. KEYSERVER_DOMAIN_NAME=
  38. KEYSERVER_CODE=
  39. keyserver_variables=(ONION_ONLY
  40. MY_USERNAME
  41. DEFAULT_DOMAIN_NAME
  42. KEYSERVER_DOMAIN_NAME
  43. KEYSERVER_CODE)
  44. function check_keyserver_directory_size {
  45. dirsize=$(du /var/lib/sks/DB | awk -F ' ' '{print $1}')
  46. # 500M
  47. if [ $dirsize -gt 500000 ]; then
  48. echo "1"
  49. return
  50. fi
  51. echo "0"
  52. }
  53. function keyserver_watchdog {
  54. ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | awk -F ':' '{print $2}')
  55. ADMIN_EMAIL_ADDRESS=${ADMIN_USERNAME}@${HOSTNAME}
  56. keyserver_size_warning=$"The SKS keyserver database is getting large. Check that you aren't being spammed"
  57. keyserver_disabled_warning=$"The SKS keyserver has been disabled because it is getting too large. This is to prevent flooding attacks from crashing the server. You may need to restore the keyserver from backup."
  58. keyserver_mail_subject_line=$"${PROJECT_NAME} keyserver warning"
  59. keyserver_mail_subject_line_disabled=$"${PROJECT_NAME} keyserver disabled"
  60. read_config_param KEYSERVER_DOMAIN_NAME
  61. # check database size hourly
  62. keyserver_watchdog_script=/tmp/keyserver-watchdog
  63. echo '#!/bin/bash' > $keyserver_watchdog_script
  64. echo "dirsize=\$(du /var/lib/sks/DB | awk -F ' ' '{print \$1}')" >> $keyserver_watchdog_script
  65. echo 'if [ $dirsize -gt 450000 ]; then' >> $keyserver_watchdog_script
  66. echo " echo \"$keyserver_size_warning\" | mail -s \"$keyserver_mail_subject_line\" $ADMIN_EMAIL_ADDRESS" >> $keyserver_watchdog_script
  67. echo ' if [ $dirsize -gt 500000 ]; then' >> $keyserver_watchdog_script
  68. echo " nginx_dissite $KEYSERVER_DOMAIN_NAME" >> $keyserver_watchdog_script
  69. echo ' systemctl stop sks' >> $keyserver_watchdog_script
  70. echo ' systemctl disable sks' >> $keyserver_watchdog_script
  71. echo " echo \"$keyserver_disabled_warning\" | mail -s \"$keyserver_mail_subject_line_disabled\" $ADMIN_EMAIL_ADDRESS" >> $keyserver_watchdog_script
  72. echo ' fi' >> $keyserver_watchdog_script
  73. echo 'fi' >> $keyserver_watchdog_script
  74. chmod +x $keyserver_watchdog_script
  75. if [ ! -f /etc/cron.hourly/keyserver-watchdog ]; then
  76. cp $keyserver_watchdog_script /etc/cron.hourly/keyserver-watchdog
  77. else
  78. HASH1=$(sha256sum $keyserver_watchdog_script | awk -F ' ' '{print $1}')
  79. HASH2=$(sha256sum /etc/cron.hourly/keyserver-watchdog | awk -F ' ' '{print $1}')
  80. if [[ "$HASH1" != "$HASH2" ]]; then
  81. cp $keyserver_watchdog_script /etc/cron.hourly/keyserver-watchdog
  82. fi
  83. fi
  84. rm $keyserver_watchdog_script
  85. }
  86. function configure_firewall_for_keyserver {
  87. if [[ $ONION_ONLY != "no" ]]; then
  88. return
  89. fi
  90. firewall_add keyserver 11370 tcp
  91. firewall_add keyserver 11371 tcp
  92. firewall_add keyserver 11372 tcp
  93. mark_completed $FUNCNAME
  94. }
  95. function keyserver_reset_database {
  96. if [ -d /var/lib/sks/DB ]; then
  97. rm -rf /var/lib/sks/DB
  98. fi
  99. sks build
  100. chown -Rc debian-sks: /var/lib/sks
  101. systemctl restart sks
  102. }
  103. function logging_on_keyserver {
  104. echo -n ''
  105. }
  106. function logging_off_keyserver {
  107. echo -n ''
  108. }
  109. function reconfigure_keyserver {
  110. echo -n ''
  111. }
  112. function upgrade_keyserver {
  113. keyserver_watchdog
  114. CURR_KEYSERVER_WEB_COMMIT=$(get_completion_param "keyserver web commit")
  115. if [[ "$CURR_KEYSERVER_WEB_COMMIT" == "$KEYSERVER_WEB_COMMIT" ]]; then
  116. return
  117. fi
  118. if grep -q "keyserver domain" $COMPLETION_FILE; then
  119. KEYSERVER_DOMAIN_NAME=$(get_completion_param "keyserver domain")
  120. fi
  121. # update to the next commit
  122. function_check set_repo_commit
  123. set_repo_commit /var/www/$KEYSERVER_DOMAIN_NAME/htdocs "keyserver web commit" "$KEYSERVER_WEB_COMMIT" $KEYSERVER_WEB_REPO
  124. read_config_param MY_USERNAME
  125. USER_EMAIL_ADDRESS=$MY_USERNAME@$HOSTNAME
  126. GPG_ID=$(su -m root -c "gpg --list-keys $USER_EMAIL_ADDRESS | sed -n '2p' | sed 's/^[ \t]*//'" - $MY_USERNAME)
  127. if [ ! $GPG_ID ]; then
  128. echo $'No GPG ID for admin user'
  129. exit 846336
  130. fi
  131. if [ ${#GPG_ID} -lt 5 ]; then
  132. echo $'GPG ID not retrieved for admin user'
  133. exit 835292
  134. fi
  135. if [[ "$GPG_ID" == *"error"* ]]; then
  136. echo $'GPG ID not retrieved for admin user due to error'
  137. exit 74825
  138. fi
  139. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  140. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  141. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  142. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  143. chown -R www-data:www-data /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  144. }
  145. function backup_local_keyserver {
  146. # remove any unused log files
  147. cd /var/lib/sks/DB
  148. db_archive -d
  149. source_directory=/etc/sks
  150. if [ -d $source_directory ]; then
  151. systemctl stop sks
  152. dest_directory=keyserverconfig
  153. function_check backup_directory_to_usb
  154. backup_directory_to_usb $source_directory $dest_directory
  155. systemctl start sks
  156. fi
  157. if [[ "$(check_keyserver_directory_size)" != "0" ]]; then
  158. echo $'WARNING: Keyserver database size is too large to backup'
  159. return
  160. fi
  161. source_directory=/var/lib/sks/DB
  162. if [ -d $source_directory ]; then
  163. systemctl stop sks
  164. dest_directory=keyserver
  165. function_check backup_directory_to_usb
  166. backup_directory_to_usb $source_directory $dest_directory
  167. systemctl start sks
  168. fi
  169. }
  170. function restore_local_keyserver {
  171. if [ ! -d /var/lib/sks/DB ]; then
  172. return
  173. fi
  174. echo $"Restoring SKS Keyserver"
  175. systemctl stop sks
  176. temp_restore_dir=/root/tempkeyserverconfig
  177. function_check restore_directory_from_usb
  178. restore_directory_from_usb $temp_restore_dir keyserverconfig
  179. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  180. rm -rf $temp_restore_dir
  181. chown -Rc debian-sks: /etc/sks/sksconf
  182. chown -Rc debian-sks: /etc/sks/mailsync
  183. temp_restore_dir=/root/tempkeyserver
  184. function_check restore_directory_from_usb
  185. restore_directory_from_usb $temp_restore_dir keyserver
  186. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  187. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  188. if [ ! "$?" = "0" ]; then
  189. # restore the old database
  190. rm -rf /var/lib/sks/DB
  191. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  192. rm -rf $temp_restore_dir
  193. function_check set_user_permissions
  194. set_user_permissions
  195. function_check backup_unmount_drive
  196. backup_unmount_drive
  197. exit 5627294
  198. fi
  199. rm -rf $temp_restore_dir
  200. chown -Rc debian-sks: /var/lib/sks
  201. # remove the old database
  202. rm -rf /var/lib/sks/DB_prev
  203. systemctl enable sks
  204. systemctl start sks
  205. nginx_ensite $KEYSERVER_DOMAIN_NAME
  206. }
  207. function backup_remote_keyserver {
  208. # remove any unused log files
  209. cd /var/lib/sks/DB
  210. db_archive -d
  211. source_directory=/etc/sks
  212. if [ -d $source_directory ]; then
  213. systemctl stop sks
  214. dest_directory=keyserverconfig
  215. function_check backup_directory_to_friend
  216. backup_directory_to_friend $source_directory $dest_directory
  217. systemctl start sks
  218. fi
  219. if [[ "$(check_keyserver_directory_size)" != "0" ]]; then
  220. echo $'WARNING: Keyserver database size is too large to backup'
  221. return
  222. fi
  223. source_directory=/var/lib/sks/DB
  224. if [ -d $source_directory ]; then
  225. systemctl stop sks
  226. dest_directory=keyserver
  227. function_check backup_directory_to_friend
  228. backup_directory_to_friend $source_directory $dest_directory
  229. systemctl start sks
  230. fi
  231. }
  232. function restore_remote_keyserver {
  233. if [ ! -d /var/lib/sks/DB ]; then
  234. return
  235. fi
  236. echo $"Restoring SKS Keyserver"
  237. systemctl stop sks
  238. temp_restore_dir=/root/tempkeyserverconfig
  239. function_check restore_directory_from_friend
  240. restore_directory_from_friend $temp_restore_dir keyserverconfig
  241. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  242. rm -rf $temp_restore_dir
  243. chown -Rc debian-sks: /etc/sks/sksconf
  244. chown -Rc debian-sks: /etc/sks/mailsync
  245. temp_restore_dir=/root/tempkeyserver
  246. function_check restore_directory_from_friend
  247. restore_directory_from_friend $temp_restore_dir keyserver
  248. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  249. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  250. if [ ! "$?" = "0" ]; then
  251. # restore the old database
  252. rm -rf /var/lib/sks/DB
  253. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  254. rm -rf $temp_restore_dir
  255. function_check set_user_permissions
  256. set_user_permissions
  257. return
  258. fi
  259. rm -rf $temp_restore_dir
  260. chown -Rc debian-sks: /var/lib/sks
  261. # remove the old database
  262. rm -rf /var/lib/sks/DB_prev
  263. systemctl enable sks
  264. systemctl start sks
  265. nginx_ensite $KEYSERVER_DOMAIN_NAME
  266. }
  267. function remove_keyserver {
  268. systemctl stop sks
  269. if [ -f /etc/cron.hourly/keyserver-watchdog ]; then
  270. rm /etc/cron.hourly/keyserver-watchdog
  271. fi
  272. apt-get -qy remove sks dirmngr
  273. read_config_param "KEYSERVER_DOMAIN_NAME"
  274. nginx_dissite $KEYSERVER_DOMAIN_NAME
  275. remove_certs ${KEYSERVER_DOMAIN_NAME}
  276. if [ -f /etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME ]; then
  277. rm -f /etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME
  278. fi
  279. if [ -d /var/www/$KEYSERVER_DOMAIN_NAME ]; then
  280. rm -rf /var/www/$KEYSERVER_DOMAIN_NAME
  281. fi
  282. function_check remove_ddns_domain
  283. remove_ddns_domain $KEYSERVER_DOMAIN_NAME
  284. remove_config_param KEYSERVER_DOMAIN_NAME
  285. remove_config_param KEYSERVER_CODE
  286. function_check remove_onion_service
  287. remove_onion_service keyserver ${KEYSERVER_ONION_PORT}
  288. remove_onion_service sks 11370 11371 11372
  289. remove_completion_param "install_keyserver"
  290. firewall_remove 11370 tcp
  291. firewall_remove 11371 tcp
  292. firewall_remove 11372 tcp
  293. sed -i '/keyserver/d' $COMPLETION_FILE
  294. sed -i '/sks onion/d' $COMPLETION_FILE
  295. if [ -d /var/lib/sks ]; then
  296. rm -rf /var/lib/sks
  297. fi
  298. }
  299. function install_interactive_keyserver {
  300. if [ ! $ONION_ONLY ]; then
  301. ONION_ONLY='no'
  302. fi
  303. if [[ $ONION_ONLY != "no" ]]; then
  304. KEYSERVER_DOMAIN_NAME='keyserver.local'
  305. write_config_param "KEYSERVER_DOMAIN_NAME" "$KEYSERVER_DOMAIN_NAME"
  306. else
  307. function_check interactive_site_details
  308. interactive_site_details "keyserver" "KEYSERVER_DOMAIN_NAME" "KEYSERVER_CODE"
  309. fi
  310. APP_INSTALLED=1
  311. }
  312. function keyserver_create_mailsync {
  313. echo $"# List of email addresses which submitted keys will be forwarded to" > /etc/sks/mailsync
  314. echo '' >> /etc/sks/mailsync
  315. chown -Rc debian-sks: /etc/sks/mailsync
  316. }
  317. function keyserver_create_membership {
  318. if [ -f /etc/sks/membership ]; then
  319. return
  320. fi
  321. systemctl stop sks
  322. echo $"# List of other $PROJECT_NAME SKS Keyservers to sync with." > /etc/sks/membership
  323. echo '#' >> /etc/sks/membership
  324. echo $"# Don't add major keyservers here, because it will take an" >> /etc/sks/membership
  325. echo $'# Infeasible amount of time to sync and backups will become' >> /etc/sks/membership
  326. echo $'# absurdly long and probably break your system. You have been warned.' >> /etc/sks/membership
  327. echo '' >> /etc/sks/membership
  328. chown -Rc debian-sks: /etc/sks/membership
  329. systemctl start sks
  330. }
  331. function keyserver_import_keys {
  332. # NOTE: this function isn't used, but kept for reference
  333. dialog --title $"Import public keys database" \
  334. --backtitle $"Freedombone Control Panel" \
  335. --defaultno \
  336. --yesno $"\nThis will download many gigabytes of data and so depending on your bandwidth it could take several days.\n\nContinue?" 10 60
  337. sel=$?
  338. case $sel in
  339. 1) return;;
  340. 255) return;;
  341. esac
  342. if [ ! -d /var/lib/sks/dump ]; then
  343. mkdir -p /var/lib/sks/dump
  344. fi
  345. cd /var/lib/sks/dump
  346. echo $'Getting keyserver dump. This may take a few days or longer, so be patient.'
  347. rm -rf /var/lib/sks/dump/*
  348. KEYSERVER_DUMP_URL="https://keyserver.mattrude.com/dump/$(date +%F)/"
  349. wget -crp -e robots=off --level=1 --cut-dirs=3 -nH \
  350. -A pgp,txt $KEYSERVER_DUMP_URL
  351. cd /var/lib/sks
  352. echo $'Building the keyserver database from the downloaded dump'
  353. keyserver_reset_database
  354. }
  355. function keyserver_sync {
  356. data=$(tempfile 2>/dev/null)
  357. trap "rm -f $data" 0 1 2 5 15
  358. dialog --backtitle $"Freedombone Control Panel" \
  359. --title $"Sync with other keyserver" \
  360. --form $"\nEnter details for the other server. Please be aware that it's not a good idea to sync with major keyservers which have exceptionally large databases. This is intended to sync with other $PROJECT_NAME systems each having a small database for a particular community." 16 60 3 \
  361. $"Domain:" 1 1 "" 1 25 32 64 \
  362. $"Port:" 2 1 "11370" 2 25 6 6 \
  363. $"Sync Email (optional):" 3 1 "pgp-public-keys@" 3 25 32 64 \
  364. 2> $data
  365. sel=$?
  366. case $sel in
  367. 1) return;;
  368. 255) return;;
  369. esac
  370. other_keyserver_domain=$(cat $data | sed -n 1p)
  371. other_keyserver_port=$(cat $data | sed -n 2p)
  372. other_keyserver_email=$(cat $data | sed -n 3p)
  373. if [[ "$other_keyserver_domain" != *'.'* ]]; then
  374. return
  375. fi
  376. if [[ "$other_keyserver_domain" == *' '* ]]; then
  377. return
  378. fi
  379. if [[ "$other_keyserver_port" == *'.'* ]]; then
  380. return
  381. fi
  382. if [[ "$other_keyserver_port" == *' '* ]]; then
  383. return
  384. fi
  385. if [ ${#other_keyserver_domain} -lt 4 ]; then
  386. return
  387. fi
  388. if [ ${#other_keyserver_port} -lt 4 ]; then
  389. return
  390. fi
  391. # Warn if trying to sync
  392. if [[ "$other_keyserver_domain" == *"sks-keyservers.net" || "$other_keyserver_domain" == *"gnupg.net" || "$other_keyserver_domain" == *"pgp.com" || "$other_keyserver_domain" == *"pgp.mit.edu" || "$other_keyserver_domain" == *"the.earth.li" || "$other_keyserver_domain" == *"mayfirst.org" || "$other_keyserver_domain" == *"ubuntu.com" ]]; then
  393. dialog --title $"Sync with other keyserver" \
  394. --msgbox $"\nDon't try to sync with the major keyservers. Your system will be overloaded with an infeasible database size." 8 60
  395. return
  396. fi
  397. if [[ "$other_keyserver_email" != "pgp-public-keys@" ]]; then
  398. if [[ "$other_keyserver_email" == *"@"* ]]; then
  399. if [[ "$other_keyserver_email" == *"."* ]]; then
  400. keyserver_create_mailsync
  401. if ! grep -q "$other_keyserver_email" /etc/sks/mailsync; then
  402. echo "$other_keyserver_email" >> /etc/sks/mailsync
  403. chown -Rc debian-sks: /etc/sks/mailsync
  404. fi
  405. else
  406. dialog --title $"Sync with other keyserver" \
  407. --msgbox $"Email doesn't look right: $other_keyserver_email" 6 60
  408. return
  409. fi
  410. fi
  411. fi
  412. keyserver_create_membership
  413. if grep -q "$other_keyserver_domain $other_keyserver_port" /etc/sks/membership; then
  414. return
  415. fi
  416. if grep -q "$other_keyserver_domain " /etc/sks/membership; then
  417. sed -i "s|$other_keyserver_domain .*|$other_keyserver_domain $other_keyserver_port|g" /etc/sks/membership
  418. else
  419. echo "$other_keyserver_domain $other_keyserver_port" >> /etc/sks/membership
  420. fi
  421. chown -Rc debian-sks: /etc/sks/membership
  422. systemctl restart sks
  423. dialog --title $"Sync with other keyserver" \
  424. --msgbox $"Keyserver added" 6 40
  425. }
  426. function keyserver_edit {
  427. if [ ! -f /etc/sks/membership ]; then
  428. return
  429. fi
  430. editor /etc/sks/membership
  431. chown -Rc debian-sks: /etc/sks/membership
  432. systemctl restart sks
  433. }
  434. function keyserver_remove_key {
  435. data=$(tempfile 2>/dev/null)
  436. trap "rm -f $data" 0 1 2 5 15
  437. dialog --title $"Remove a key" \
  438. --backtitle $"Freedombone Control Panel" \
  439. --inputbox $"Enter the ID of the key which you wish to remove:" 12 60 2>$data
  440. sel=$?
  441. case $sel in
  442. 0)
  443. remove_key_id=$(<$data)
  444. if [ ${#remove_key_id} -gt 8 ]; then
  445. sks drop $remove_key_id
  446. dialog --title $"Remove a key" \
  447. --msgbox $"The key was removed" 6 40
  448. fi
  449. ;;
  450. esac
  451. }
  452. function configure_interactive_keyserver {
  453. while true
  454. do
  455. data=$(tempfile 2>/dev/null)
  456. trap "rm -f $data" 0 1 2 5 15
  457. dialog --backtitle $"Freedombone Control Panel" \
  458. --title $"SKS Keyserver" \
  459. --radiolist $"Choose an operation:" 12 70 4 \
  460. 1 $"Remove a key" off \
  461. 2 $"Sync with other keyserver" off \
  462. 3 $"Edit sync keyservers" off \
  463. 4 $"Exit" on 2> $data
  464. sel=$?
  465. case $sel in
  466. 1) return;;
  467. 255) return;;
  468. esac
  469. case $(cat $data) in
  470. 1) keyserver_remove_key;;
  471. 2) keyserver_sync;;
  472. 3) keyserver_edit;;
  473. 4) break;;
  474. esac
  475. done
  476. }
  477. function install_keyserver {
  478. apt-get -qy install build-essential gcc ocaml libdb-dev wget sks
  479. keyserver_reset_database
  480. sed -i 's|initstart=.*|initstart=yes|g' /etc/default/sks
  481. apt-get -qy install dirmngr
  482. systemctl restart sks
  483. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME ]; then
  484. mkdir /var/www/$KEYSERVER_DOMAIN_NAME
  485. fi
  486. cd /var/www/$KEYSERVER_DOMAIN_NAME
  487. if [ -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  488. rm -rf /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  489. fi
  490. if [ -d /repos/keyserverweb ]; then
  491. mkdir htdocs
  492. cp -r -p /repos/keyserverweb/. htdocs
  493. cd htdocs
  494. git pull
  495. else
  496. git_clone $KEYSERVER_WEB_REPO htdocs
  497. fi
  498. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  499. echo $"/var/www/$KEYSERVER_DOMAIN_NAME/htdocs not found"
  500. exit 6539230
  501. fi
  502. cd /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  503. git checkout $KEYSERVER_WEB_COMMIT -b $KEYSERVER_WEB_COMMIT
  504. set_completion_param "keyserver web commit" "$KEYSERVER_WEB_COMMIT"
  505. USER_EMAIL_ADDRESS=$MY_USERNAME@$HOSTNAME
  506. GPG_ID=$(su -m root -c "gpg --list-keys $USER_EMAIL_ADDRESS | sed -n '2p' | sed 's/^[ \t]*//'" - $MY_USERNAME)
  507. if [ ! $GPG_ID ]; then
  508. echo $'No GPG ID for admin user'
  509. exit 846336
  510. fi
  511. if [ ${#GPG_ID} -lt 5 ]; then
  512. echo $'GPG ID not retrieved for admin user'
  513. exit 835292
  514. fi
  515. if [[ "$GPG_ID" == *"error"* ]]; then
  516. echo $'GPG ID not retrieved for admin user due to error'
  517. exit 74825
  518. fi
  519. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  520. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  521. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  522. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  523. sksconf_file=/etc/sks/sksconf
  524. sed -i "s|#hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  525. sed -i "s|hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  526. sed -i "s|#hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  527. sed -i "s|hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  528. sed -i "s|#recon_port:.*|recon_port: 11370|g" $sksconf_file
  529. sed -i "s|recon_port:.*|recon_port: 11370|g" $sksconf_file
  530. sed -i "s|#recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  531. sed -i "s|recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  532. sed -i 's|#hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  533. sed -i 's|hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  534. sed -i "s|#from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  535. sed -i "s|from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  536. sed -i 's|#sendmail_cmd:|sendmail_cmd:|g' $sksconf_file
  537. if ! grep -q "#disable_mailsync" $sksconf_file; then
  538. echo '#disable_mailsync:' >> $sksconf_file
  539. else
  540. sed -i 's|disable_mailsync:|#disable_mailsync:|g' $sksconf_file
  541. fi
  542. if ! grep -q "membership_reload_interval:" $sksconf_file; then
  543. echo 'membership_reload_interval: 1' >> $sksconf_file
  544. else
  545. sed -i 's|#membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  546. sed -i 's|membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  547. fi
  548. if ! grep -q "max_matches:" $sksconf_file; then
  549. echo 'max_matches: 50' >> $sksconf_file
  550. else
  551. sed -i 's|#max_matches:.*|max_matches: 50|g' $sksconf_file
  552. sed -i 's|max_matches:.*|max_matches: 50|g' $sksconf_file
  553. fi
  554. if ! grep -q "stat_hour:" $sksconf_file; then
  555. echo "stat_hour: $((1 + RANDOM % 8))" >> $sksconf_file
  556. else
  557. sed -i "s|#stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  558. sed -i "s|stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  559. fi
  560. if ! grep -q "disable_log_diffs:" $sksconf_file; then
  561. echo "disable_log_diffs:" >> $sksconf_file
  562. else
  563. sed -i "s|#disable_log_diffs:.*|disable_log_diffs:|g" $sksconf_file
  564. sed -i "s|disable_log_diffs:.*|disable_log_diffs:|g" $sksconf_file
  565. fi
  566. if ! grep -q "debuglevel:" $sksconf_file; then
  567. echo "debuglevel: 0" >> $sksconf_file
  568. else
  569. sed -i "s|#debuglevel:.*|debuglevel: 0|g" $sksconf_file
  570. sed -i "s|debuglevel:.*|debuglevel: 0|g" $sksconf_file
  571. fi
  572. chown debian-sks: $sksconf_file
  573. if ! grep -q "hidden_service_sks" /etc/tor/torrc; then
  574. echo 'HiddenServiceDir /var/lib/tor/hidden_service_sks/' >> /etc/tor/torrc
  575. echo "HiddenServicePort 11370 127.0.0.1:11370" >> /etc/tor/torrc
  576. echo "HiddenServicePort 11373 127.0.0.1:11371" >> /etc/tor/torrc
  577. echo "HiddenServicePort 11372 127.0.0.1:11372" >> /etc/tor/torrc
  578. echo $'Added onion site for sks'
  579. fi
  580. onion_update
  581. wait_for_onion_service 'sks'
  582. if [ ! -f /var/lib/tor/hidden_service_sks/hostname ]; then
  583. echo $'sks onion site hostname not found'
  584. exit 8352982
  585. fi
  586. SKS_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_sks/hostname)
  587. KEYSERVER_ONION_HOSTNAME=$(add_onion_service keyserver 80 ${KEYSERVER_ONION_PORT})
  588. keyserver_nginx_site=/etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME
  589. if [[ $ONION_ONLY == "no" ]]; then
  590. # NOTE: without http active on port 80 the keyserver doesn't work
  591. # from the commandline
  592. echo 'server {' > $keyserver_nginx_site
  593. echo ' listen 80;' >> $keyserver_nginx_site
  594. echo ' listen 0.0.0.0:11371;' >> $keyserver_nginx_site
  595. echo ' listen [::]:80;' >> $keyserver_nginx_site
  596. echo " server_name $KEYSERVER_DOMAIN_NAME;" >> $keyserver_nginx_site
  597. echo '' >> $keyserver_nginx_site
  598. echo ' # Logs' >> $keyserver_nginx_site
  599. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  600. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  601. echo '' >> $keyserver_nginx_site
  602. echo ' # Root' >> $keyserver_nginx_site
  603. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;" >> $keyserver_nginx_site
  604. echo '' >> $keyserver_nginx_site
  605. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  606. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  607. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  608. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  609. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  610. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  611. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  612. echo '' >> $keyserver_nginx_site
  613. echo ' location / {' >> $keyserver_nginx_site
  614. function_check nginx_limits
  615. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  616. echo ' }' >> $keyserver_nginx_site
  617. echo '' >> $keyserver_nginx_site
  618. echo ' location /pks {' >> $keyserver_nginx_site
  619. echo ' proxy_pass http://127.0.0.1:11373;' >> $keyserver_nginx_site
  620. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  621. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11371 (nginx)\";" >> $keyserver_nginx_site
  622. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  623. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  624. echo ' client_body_buffer_size 128k;' >> $keyserver_nginx_site
  625. echo ' }' >> $keyserver_nginx_site
  626. echo '}' >> $keyserver_nginx_site
  627. echo '' >> $keyserver_nginx_site
  628. echo 'server {' >> $keyserver_nginx_site
  629. echo ' listen 443 ssl;' >> $keyserver_nginx_site
  630. echo ' listen 0.0.0.0:11372 ssl;' >> $keyserver_nginx_site
  631. echo ' listen [::]:443 ssl;' >> $keyserver_nginx_site
  632. echo " server_name $KEYSERVER_DOMAIN_NAME;" >> $keyserver_nginx_site
  633. echo '' >> $keyserver_nginx_site
  634. echo ' error_page 404 /404.html;' >> $keyserver_nginx_site
  635. echo '' >> $keyserver_nginx_site
  636. echo ' location ~ (.git|LICENSE|readme.md) {' >> $keyserver_nginx_site
  637. echo ' deny all;' >> $keyserver_nginx_site
  638. echo ' return 404;' >> $keyserver_nginx_site
  639. echo ' }' >> $keyserver_nginx_site
  640. echo '' >> $keyserver_nginx_site
  641. echo ' # Security' >> $keyserver_nginx_site
  642. function_check nginx_ssl
  643. nginx_ssl $KEYSERVER_DOMAIN_NAME
  644. function_check nginx_disable_sniffing
  645. nginx_disable_sniffing $KEYSERVER_DOMAIN_NAME
  646. echo ' add_header Strict-Transport-Security max-age=15768000;' >> $keyserver_nginx_site
  647. echo '' >> $keyserver_nginx_site
  648. echo ' # Logs' >> $keyserver_nginx_site
  649. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  650. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  651. echo '' >> $keyserver_nginx_site
  652. echo ' # Root' >> $keyserver_nginx_site
  653. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;" >> $keyserver_nginx_site
  654. echo '' >> $keyserver_nginx_site
  655. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  656. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  657. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  658. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  659. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  660. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  661. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  662. echo '' >> $keyserver_nginx_site
  663. echo ' location / {' >> $keyserver_nginx_site
  664. function_check nginx_limits
  665. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  666. echo ' }' >> $keyserver_nginx_site
  667. echo '' >> $keyserver_nginx_site
  668. echo ' location /pks {' >> $keyserver_nginx_site
  669. echo " proxy_pass http://127.0.0.1:11373;" >> $keyserver_nginx_site
  670. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  671. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11372 (nginx)\";" >> $keyserver_nginx_site
  672. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  673. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  674. echo ' client_body_buffer_size 128k;' >> $keyserver_nginx_site
  675. echo ' }' >> $keyserver_nginx_site
  676. echo '}' >> $keyserver_nginx_site
  677. echo '' >> $keyserver_nginx_site
  678. else
  679. echo -n '' > $keyserver_nginx_site
  680. fi
  681. echo 'server {' >> $keyserver_nginx_site
  682. echo " listen 127.0.0.1:$KEYSERVER_ONION_PORT default_server;" >> $keyserver_nginx_site
  683. echo " server_name $KEYSERVER_ONION_HOSTNAME;" >> $keyserver_nginx_site
  684. echo '' >> $keyserver_nginx_site
  685. echo ' error_page 404 /404.html;' >> $keyserver_nginx_site
  686. echo '' >> $keyserver_nginx_site
  687. echo ' location ~ (.git|LICENSE|readme.md) {' >> $keyserver_nginx_site
  688. echo ' deny all;' >> $keyserver_nginx_site
  689. echo ' return 404;' >> $keyserver_nginx_site
  690. echo ' }' >> $keyserver_nginx_site
  691. echo '' >> $keyserver_nginx_site
  692. function_check nginx_disable_sniffing
  693. nginx_disable_sniffing $KEYSERVER_DOMAIN_NAME
  694. echo '' >> $keyserver_nginx_site
  695. echo ' # Logs' >> $keyserver_nginx_site
  696. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  697. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  698. echo '' >> $keyserver_nginx_site
  699. echo ' # Root' >> $keyserver_nginx_site
  700. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/mail;" >> $keyserver_nginx_site
  701. echo '' >> $keyserver_nginx_site
  702. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  703. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  704. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  705. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  706. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  707. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  708. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  709. echo '' >> $keyserver_nginx_site
  710. echo ' location / {' >> $keyserver_nginx_site
  711. function_check nginx_limits
  712. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  713. echo ' }' >> $keyserver_nginx_site
  714. echo '' >> $keyserver_nginx_site
  715. echo ' location /pks {' >> $keyserver_nginx_site
  716. echo " proxy_pass http://127.0.0.1:11373;" >> $keyserver_nginx_site
  717. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  718. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:$KEYSERVER_ONION_PORT (nginx)\";" >> $keyserver_nginx_site
  719. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  720. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  721. echo ' client_body_buffer_size 128k;' >> $keyserver_nginx_site
  722. echo ' }' >> $keyserver_nginx_site
  723. echo '}' >> $keyserver_nginx_site
  724. function_check create_site_certificate
  725. if [ ! -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  726. create_site_certificate $KEYSERVER_DOMAIN_NAME 'yes'
  727. fi
  728. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt ]; then
  729. mv /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  730. fi
  731. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  732. chown root:root /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  733. sed -i "s|.crt|.pem|g" /etc/nginx/sites-available/${KEYSERVER_DOMAIN_NAME}
  734. fi
  735. if [ -f /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key ]; then
  736. chown root:root /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key
  737. fi
  738. chown -R www-data:www-data /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  739. function_check nginx_ensite
  740. nginx_ensite $KEYSERVER_DOMAIN_NAME
  741. configure_firewall_for_keyserver
  742. # remove membership file - don't try to sync with other keyservers
  743. if [ -f /etc/sks/membership ]; then
  744. rm /etc/sks/membership
  745. fi
  746. if ! grep -q "pgp-public-keys" /etc/aliases; then
  747. echo 'pgp-public-keys: "|/usr/lib/sks/sks_add_mail /etc/sks"' >> /etc/aliases
  748. fi
  749. chown -Rc debian-sks: /etc/sks/mailsync
  750. systemctl enable sks
  751. systemctl restart sks
  752. systemctl restart nginx
  753. set_completion_param "keyserver domain" "$KEYSERVER_DOMAIN_NAME"
  754. set_completion_param "keyserver onion domain" "$KEYSERVER_ONION_HOSTNAME"
  755. set_completion_param "sks onion domain" "$SKS_ONION_HOSTNAME"
  756. keyserver_watchdog
  757. APP_INSTALLED=1
  758. }
  759. # NOTE: deliberately no exit 0