freedombone-app-keyserver 34KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  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. if [ -d $temp_restore_dir/etc/sks ]; then
  180. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  181. else
  182. cp -r $temp_restore_dir/* /etc/sks/
  183. fi
  184. rm -rf $temp_restore_dir
  185. chown -Rc debian-sks: /etc/sks/sksconf
  186. chown -Rc debian-sks: /etc/sks/mailsync
  187. temp_restore_dir=/root/tempkeyserver
  188. function_check restore_directory_from_usb
  189. restore_directory_from_usb $temp_restore_dir keyserver
  190. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  191. if [ -d $temp_restore_dir/var/lib/sks/DB ]; then
  192. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  193. else
  194. if [ ! -d /var/lib/sks/DB ]; then
  195. mkdir /var/lib/sks/DB
  196. fi
  197. cp -r $temp_restore_dir/* /var/lib/sks/DB
  198. fi
  199. if [ ! "$?" = "0" ]; then
  200. # restore the old database
  201. rm -rf /var/lib/sks/DB
  202. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  203. rm -rf $temp_restore_dir
  204. function_check set_user_permissions
  205. set_user_permissions
  206. function_check backup_unmount_drive
  207. backup_unmount_drive
  208. exit 5627294
  209. fi
  210. rm -rf $temp_restore_dir
  211. chown -Rc debian-sks: /var/lib/sks
  212. # remove the old database
  213. rm -rf /var/lib/sks/DB_prev
  214. systemctl enable sks
  215. systemctl start sks
  216. nginx_ensite $KEYSERVER_DOMAIN_NAME
  217. }
  218. function backup_remote_keyserver {
  219. # remove any unused log files
  220. cd /var/lib/sks/DB
  221. db_archive -d
  222. source_directory=/etc/sks
  223. if [ -d $source_directory ]; then
  224. systemctl stop sks
  225. dest_directory=keyserverconfig
  226. function_check backup_directory_to_friend
  227. backup_directory_to_friend $source_directory $dest_directory
  228. systemctl start sks
  229. fi
  230. if [[ "$(check_keyserver_directory_size)" != "0" ]]; then
  231. echo $'WARNING: Keyserver database size is too large to backup'
  232. return
  233. fi
  234. source_directory=/var/lib/sks/DB
  235. if [ -d $source_directory ]; then
  236. systemctl stop sks
  237. dest_directory=keyserver
  238. function_check backup_directory_to_friend
  239. backup_directory_to_friend $source_directory $dest_directory
  240. systemctl start sks
  241. fi
  242. }
  243. function restore_remote_keyserver {
  244. if [ ! -d /var/lib/sks/DB ]; then
  245. return
  246. fi
  247. echo $"Restoring SKS Keyserver"
  248. systemctl stop sks
  249. temp_restore_dir=/root/tempkeyserverconfig
  250. function_check restore_directory_from_friend
  251. restore_directory_from_friend $temp_restore_dir keyserverconfig
  252. if [ -d $temp_restore_dir/etc/sks ]; then
  253. cp -r $temp_restore_dir/etc/sks/* /etc/sks/
  254. else
  255. cp -r $temp_restore_dir/* /etc/sks/
  256. fi
  257. rm -rf $temp_restore_dir
  258. chown -Rc debian-sks: /etc/sks/sksconf
  259. chown -Rc debian-sks: /etc/sks/mailsync
  260. temp_restore_dir=/root/tempkeyserver
  261. function_check restore_directory_from_friend
  262. restore_directory_from_friend $temp_restore_dir keyserver
  263. mv /var/lib/sks/DB /var/lib/sks/DB_prev
  264. if [ -d $temp_restore_dir/var/lib/sks/DB ]; then
  265. cp -r $temp_restore_dir/var/lib/sks/DB /var/lib/sks/DB
  266. else
  267. if [ ! -d /var/lib/sks/DB ]; then
  268. mkdir /var/lib/sks/DB
  269. fi
  270. cp -r $temp_restore_dir/* /var/lib/sks/DB
  271. fi
  272. if [ ! "$?" = "0" ]; then
  273. # restore the old database
  274. rm -rf /var/lib/sks/DB
  275. mv /var/lib/sks/DB_prev /var/lib/sks/DB
  276. rm -rf $temp_restore_dir
  277. function_check set_user_permissions
  278. set_user_permissions
  279. return
  280. fi
  281. rm -rf $temp_restore_dir
  282. chown -Rc debian-sks: /var/lib/sks
  283. # remove the old database
  284. rm -rf /var/lib/sks/DB_prev
  285. systemctl enable sks
  286. systemctl start sks
  287. nginx_ensite $KEYSERVER_DOMAIN_NAME
  288. }
  289. function remove_keyserver {
  290. systemctl stop sks
  291. if [ -f /etc/cron.hourly/keyserver-watchdog ]; then
  292. rm /etc/cron.hourly/keyserver-watchdog
  293. fi
  294. apt-get -qy remove sks dirmngr
  295. read_config_param "KEYSERVER_DOMAIN_NAME"
  296. nginx_dissite $KEYSERVER_DOMAIN_NAME
  297. remove_certs ${KEYSERVER_DOMAIN_NAME}
  298. if [ -f /etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME ]; then
  299. rm -f /etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME
  300. fi
  301. if [ -d /var/www/$KEYSERVER_DOMAIN_NAME ]; then
  302. rm -rf /var/www/$KEYSERVER_DOMAIN_NAME
  303. fi
  304. function_check remove_ddns_domain
  305. remove_ddns_domain $KEYSERVER_DOMAIN_NAME
  306. remove_config_param KEYSERVER_DOMAIN_NAME
  307. remove_config_param KEYSERVER_CODE
  308. function_check remove_onion_service
  309. remove_onion_service keyserver ${KEYSERVER_ONION_PORT}
  310. remove_onion_service sks 11370 11371 11372
  311. remove_completion_param "install_keyserver"
  312. firewall_remove 11370 tcp
  313. firewall_remove 11371 tcp
  314. firewall_remove 11372 tcp
  315. sed -i '/keyserver/d' $COMPLETION_FILE
  316. sed -i '/sks onion/d' $COMPLETION_FILE
  317. if [ -d /var/lib/sks ]; then
  318. rm -rf /var/lib/sks
  319. fi
  320. }
  321. function install_interactive_keyserver {
  322. if [ ! $ONION_ONLY ]; then
  323. ONION_ONLY='no'
  324. fi
  325. if [[ $ONION_ONLY != "no" ]]; then
  326. KEYSERVER_DOMAIN_NAME='keyserver.local'
  327. write_config_param "KEYSERVER_DOMAIN_NAME" "$KEYSERVER_DOMAIN_NAME"
  328. else
  329. function_check interactive_site_details
  330. interactive_site_details "keyserver" "KEYSERVER_DOMAIN_NAME" "KEYSERVER_CODE"
  331. fi
  332. APP_INSTALLED=1
  333. }
  334. function keyserver_create_mailsync {
  335. echo $"# List of email addresses which submitted keys will be forwarded to" > /etc/sks/mailsync
  336. echo '' >> /etc/sks/mailsync
  337. chown -Rc debian-sks: /etc/sks/mailsync
  338. }
  339. function keyserver_create_membership {
  340. if [ -f /etc/sks/membership ]; then
  341. return
  342. fi
  343. systemctl stop sks
  344. echo $"# List of other $PROJECT_NAME SKS Keyservers to sync with." > /etc/sks/membership
  345. echo '#' >> /etc/sks/membership
  346. echo $"# Don't add major keyservers here, because it will take an" >> /etc/sks/membership
  347. echo $'# Infeasible amount of time to sync and backups will become' >> /etc/sks/membership
  348. echo $'# absurdly long and probably break your system. You have been warned.' >> /etc/sks/membership
  349. echo '' >> /etc/sks/membership
  350. chown -Rc debian-sks: /etc/sks/membership
  351. systemctl start sks
  352. }
  353. function keyserver_import_keys {
  354. # NOTE: this function isn't used, but kept for reference
  355. dialog --title $"Import public keys database" \
  356. --backtitle $"Freedombone Control Panel" \
  357. --defaultno \
  358. --yesno $"\nThis will download many gigabytes of data and so depending on your bandwidth it could take several days.\n\nContinue?" 10 60
  359. sel=$?
  360. case $sel in
  361. 1) return;;
  362. 255) return;;
  363. esac
  364. if [ ! -d /var/lib/sks/dump ]; then
  365. mkdir -p /var/lib/sks/dump
  366. fi
  367. cd /var/lib/sks/dump
  368. echo $'Getting keyserver dump. This may take a few days or longer, so be patient.'
  369. rm -rf /var/lib/sks/dump/*
  370. KEYSERVER_DUMP_URL="https://keyserver.mattrude.com/dump/$(date +%F)/"
  371. wget -crp -e robots=off --level=1 --cut-dirs=3 -nH \
  372. -A pgp,txt $KEYSERVER_DUMP_URL
  373. cd /var/lib/sks
  374. echo $'Building the keyserver database from the downloaded dump'
  375. keyserver_reset_database
  376. }
  377. function keyserver_sync {
  378. data=$(tempfile 2>/dev/null)
  379. trap "rm -f $data" 0 1 2 5 15
  380. dialog --backtitle $"Freedombone Control Panel" \
  381. --title $"Sync with other keyserver" \
  382. --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 \
  383. $"Domain:" 1 1 "" 1 25 32 64 \
  384. $"Port:" 2 1 "11370" 2 25 6 6 \
  385. $"Sync Email (optional):" 3 1 "pgp-public-keys@" 3 25 32 64 \
  386. 2> $data
  387. sel=$?
  388. case $sel in
  389. 1) return;;
  390. 255) return;;
  391. esac
  392. other_keyserver_domain=$(cat $data | sed -n 1p)
  393. other_keyserver_port=$(cat $data | sed -n 2p)
  394. other_keyserver_email=$(cat $data | sed -n 3p)
  395. if [[ "$other_keyserver_domain" != *'.'* ]]; then
  396. return
  397. fi
  398. if [[ "$other_keyserver_domain" == *' '* ]]; then
  399. return
  400. fi
  401. if [[ "$other_keyserver_port" == *'.'* ]]; then
  402. return
  403. fi
  404. if [[ "$other_keyserver_port" == *' '* ]]; then
  405. return
  406. fi
  407. if [ ${#other_keyserver_domain} -lt 4 ]; then
  408. return
  409. fi
  410. if [ ${#other_keyserver_port} -lt 4 ]; then
  411. return
  412. fi
  413. # Warn if trying to sync
  414. 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
  415. dialog --title $"Sync with other keyserver" \
  416. --msgbox $"\nDon't try to sync with the major keyservers. Your system will be overloaded with an infeasible database size." 8 60
  417. return
  418. fi
  419. if [[ "$other_keyserver_email" != "pgp-public-keys@" ]]; then
  420. if [[ "$other_keyserver_email" == *"@"* ]]; then
  421. if [[ "$other_keyserver_email" == *"."* ]]; then
  422. keyserver_create_mailsync
  423. if ! grep -q "$other_keyserver_email" /etc/sks/mailsync; then
  424. echo "$other_keyserver_email" >> /etc/sks/mailsync
  425. chown -Rc debian-sks: /etc/sks/mailsync
  426. fi
  427. else
  428. dialog --title $"Sync with other keyserver" \
  429. --msgbox $"Email doesn't look right: $other_keyserver_email" 6 60
  430. return
  431. fi
  432. fi
  433. fi
  434. keyserver_create_membership
  435. if grep -q "$other_keyserver_domain $other_keyserver_port" /etc/sks/membership; then
  436. return
  437. fi
  438. if grep -q "$other_keyserver_domain " /etc/sks/membership; then
  439. sed -i "s|$other_keyserver_domain .*|$other_keyserver_domain $other_keyserver_port|g" /etc/sks/membership
  440. else
  441. echo "$other_keyserver_domain $other_keyserver_port" >> /etc/sks/membership
  442. fi
  443. chown -Rc debian-sks: /etc/sks/membership
  444. systemctl restart sks
  445. dialog --title $"Sync with other keyserver" \
  446. --msgbox $"Keyserver added" 6 40
  447. }
  448. function keyserver_edit {
  449. if [ ! -f /etc/sks/membership ]; then
  450. return
  451. fi
  452. editor /etc/sks/membership
  453. chown -Rc debian-sks: /etc/sks/membership
  454. systemctl restart sks
  455. }
  456. function keyserver_remove_key {
  457. data=$(tempfile 2>/dev/null)
  458. trap "rm -f $data" 0 1 2 5 15
  459. dialog --title $"Remove a key" \
  460. --backtitle $"Freedombone Control Panel" \
  461. --inputbox $"Enter the ID of the key which you wish to remove:" 12 60 2>$data
  462. sel=$?
  463. case $sel in
  464. 0)
  465. remove_key_id=$(<$data)
  466. if [ ${#remove_key_id} -gt 8 ]; then
  467. sks drop $remove_key_id
  468. dialog --title $"Remove a key" \
  469. --msgbox $"The key was removed" 6 40
  470. fi
  471. ;;
  472. esac
  473. }
  474. function configure_interactive_keyserver {
  475. while true
  476. do
  477. data=$(tempfile 2>/dev/null)
  478. trap "rm -f $data" 0 1 2 5 15
  479. dialog --backtitle $"Freedombone Control Panel" \
  480. --title $"SKS Keyserver" \
  481. --radiolist $"Choose an operation:" 12 70 4 \
  482. 1 $"Remove a key" off \
  483. 2 $"Sync with other keyserver" off \
  484. 3 $"Edit sync keyservers" off \
  485. 4 $"Exit" on 2> $data
  486. sel=$?
  487. case $sel in
  488. 1) return;;
  489. 255) return;;
  490. esac
  491. case $(cat $data) in
  492. 1) keyserver_remove_key;;
  493. 2) keyserver_sync;;
  494. 3) keyserver_edit;;
  495. 4) break;;
  496. esac
  497. done
  498. }
  499. function install_keyserver {
  500. apt-get -qy install build-essential gcc ocaml libdb-dev wget sks
  501. keyserver_reset_database
  502. sed -i 's|initstart=.*|initstart=yes|g' /etc/default/sks
  503. apt-get -qy install dirmngr
  504. systemctl restart sks
  505. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME ]; then
  506. mkdir /var/www/$KEYSERVER_DOMAIN_NAME
  507. fi
  508. cd /var/www/$KEYSERVER_DOMAIN_NAME
  509. if [ -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  510. rm -rf /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  511. fi
  512. if [ -d /repos/keyserverweb ]; then
  513. mkdir htdocs
  514. cp -r -p /repos/keyserverweb/. htdocs
  515. cd htdocs
  516. git pull
  517. else
  518. git_clone $KEYSERVER_WEB_REPO htdocs
  519. fi
  520. if [ ! -d /var/www/$KEYSERVER_DOMAIN_NAME/htdocs ]; then
  521. echo $"/var/www/$KEYSERVER_DOMAIN_NAME/htdocs not found"
  522. exit 6539230
  523. fi
  524. cd /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  525. git checkout $KEYSERVER_WEB_COMMIT -b $KEYSERVER_WEB_COMMIT
  526. set_completion_param "keyserver web commit" "$KEYSERVER_WEB_COMMIT"
  527. USER_EMAIL_ADDRESS=$MY_USERNAME@$HOSTNAME
  528. GPG_ID=$(su -m root -c "gpg --list-keys $USER_EMAIL_ADDRESS | sed -n '2p' | sed 's/^[ \t]*//'" - $MY_USERNAME)
  529. if [ ! $GPG_ID ]; then
  530. echo $'No GPG ID for admin user'
  531. exit 846336
  532. fi
  533. if [ ${#GPG_ID} -lt 5 ]; then
  534. echo $'GPG ID not retrieved for admin user'
  535. exit 835292
  536. fi
  537. if [[ "$GPG_ID" == *"error"* ]]; then
  538. echo $'GPG ID not retrieved for admin user due to error'
  539. exit 74825
  540. fi
  541. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  542. sed -i "s|###ENTERPUBLICKEYHERE###|$GPG_ID|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  543. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/404.html
  544. sed -i "s|###ENTERNAMEHERE###|$USER_EMAIL_ADDRESS|g" /var/www/$KEYSERVER_DOMAIN_NAME/htdocs/index.html
  545. sksconf_file=/etc/sks/sksconf
  546. sed -i "s|#hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  547. sed -i "s|hostname:.*|hostname: $KEYSERVER_DOMAIN_NAME|g" $sksconf_file
  548. sed -i "s|#hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  549. sed -i "s|hkp_port:.*|hkp_port: 11373|g" $sksconf_file
  550. sed -i "s|#recon_port:.*|recon_port: 11370|g" $sksconf_file
  551. sed -i "s|recon_port:.*|recon_port: 11370|g" $sksconf_file
  552. sed -i "s|#recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  553. sed -i "s|recon_address:.*|recon_address: 0.0.0.0|g" $sksconf_file
  554. sed -i 's|#hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  555. sed -i 's|hkp_address:.*|hkp_address: 127.0.0.1|g' $sksconf_file
  556. sed -i "s|#from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  557. sed -i "s|from_addr:.*|from_addr: \"pgp-public-keys@$DEFAULT_DOMAIN_NAME\"|g" $sksconf_file
  558. sed -i 's|#sendmail_cmd:|sendmail_cmd:|g' $sksconf_file
  559. if ! grep -q "#disable_mailsync" $sksconf_file; then
  560. echo '#disable_mailsync:' >> $sksconf_file
  561. else
  562. sed -i 's|disable_mailsync:|#disable_mailsync:|g' $sksconf_file
  563. fi
  564. if ! grep -q "membership_reload_interval:" $sksconf_file; then
  565. echo 'membership_reload_interval: 1' >> $sksconf_file
  566. else
  567. sed -i 's|#membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  568. sed -i 's|membership_reload_interval:.*|membership_reload_interval: 1|g' $sksconf_file
  569. fi
  570. if ! grep -q "max_matches:" $sksconf_file; then
  571. echo 'max_matches: 50' >> $sksconf_file
  572. else
  573. sed -i 's|#max_matches:.*|max_matches: 50|g' $sksconf_file
  574. sed -i 's|max_matches:.*|max_matches: 50|g' $sksconf_file
  575. fi
  576. if ! grep -q "stat_hour:" $sksconf_file; then
  577. echo "stat_hour: $((1 + RANDOM % 8))" >> $sksconf_file
  578. else
  579. sed -i "s|#stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  580. sed -i "s|stat_hour:.*|stat_hour: $((1 + RANDOM % 8))|g" $sksconf_file
  581. fi
  582. if ! grep -q "disable_log_diffs:" $sksconf_file; then
  583. echo "disable_log_diffs:" >> $sksconf_file
  584. else
  585. sed -i "s|#disable_log_diffs:.*|disable_log_diffs:|g" $sksconf_file
  586. sed -i "s|disable_log_diffs:.*|disable_log_diffs:|g" $sksconf_file
  587. fi
  588. if ! grep -q "debuglevel:" $sksconf_file; then
  589. echo "debuglevel: 0" >> $sksconf_file
  590. else
  591. sed -i "s|#debuglevel:.*|debuglevel: 0|g" $sksconf_file
  592. sed -i "s|debuglevel:.*|debuglevel: 0|g" $sksconf_file
  593. fi
  594. chown debian-sks: $sksconf_file
  595. if ! grep -q "hidden_service_sks" /etc/tor/torrc; then
  596. echo 'HiddenServiceDir /var/lib/tor/hidden_service_sks/' >> /etc/tor/torrc
  597. echo "HiddenServicePort 11370 127.0.0.1:11370" >> /etc/tor/torrc
  598. echo "HiddenServicePort 11373 127.0.0.1:11371" >> /etc/tor/torrc
  599. echo "HiddenServicePort 11372 127.0.0.1:11372" >> /etc/tor/torrc
  600. echo $'Added onion site for sks'
  601. fi
  602. onion_update
  603. wait_for_onion_service 'sks'
  604. if [ ! -f /var/lib/tor/hidden_service_sks/hostname ]; then
  605. echo $'sks onion site hostname not found'
  606. exit 8352982
  607. fi
  608. SKS_ONION_HOSTNAME=$(cat /var/lib/tor/hidden_service_sks/hostname)
  609. KEYSERVER_ONION_HOSTNAME=$(add_onion_service keyserver 80 ${KEYSERVER_ONION_PORT})
  610. keyserver_nginx_site=/etc/nginx/sites-available/$KEYSERVER_DOMAIN_NAME
  611. if [[ $ONION_ONLY == "no" ]]; then
  612. # NOTE: without http active on port 80 the keyserver doesn't work
  613. # from the commandline
  614. echo 'server {' > $keyserver_nginx_site
  615. echo ' listen 80;' >> $keyserver_nginx_site
  616. echo ' listen 0.0.0.0:11371;' >> $keyserver_nginx_site
  617. echo ' listen [::]:80;' >> $keyserver_nginx_site
  618. echo " server_name $KEYSERVER_DOMAIN_NAME;" >> $keyserver_nginx_site
  619. echo '' >> $keyserver_nginx_site
  620. echo ' # Logs' >> $keyserver_nginx_site
  621. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  622. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  623. echo '' >> $keyserver_nginx_site
  624. echo ' # Root' >> $keyserver_nginx_site
  625. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;" >> $keyserver_nginx_site
  626. echo '' >> $keyserver_nginx_site
  627. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  628. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  629. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  630. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  631. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  632. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  633. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  634. echo '' >> $keyserver_nginx_site
  635. echo ' location / {' >> $keyserver_nginx_site
  636. function_check nginx_limits
  637. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  638. echo ' }' >> $keyserver_nginx_site
  639. echo '' >> $keyserver_nginx_site
  640. echo ' location /pks {' >> $keyserver_nginx_site
  641. echo ' proxy_pass http://127.0.0.1:11373;' >> $keyserver_nginx_site
  642. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  643. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11371 (nginx)\";" >> $keyserver_nginx_site
  644. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  645. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  646. echo ' client_body_buffer_size 128k;' >> $keyserver_nginx_site
  647. echo ' }' >> $keyserver_nginx_site
  648. echo '}' >> $keyserver_nginx_site
  649. echo '' >> $keyserver_nginx_site
  650. echo 'server {' >> $keyserver_nginx_site
  651. echo ' listen 443 ssl;' >> $keyserver_nginx_site
  652. echo ' listen 0.0.0.0:11372 ssl;' >> $keyserver_nginx_site
  653. echo ' listen [::]:443 ssl;' >> $keyserver_nginx_site
  654. echo " server_name $KEYSERVER_DOMAIN_NAME;" >> $keyserver_nginx_site
  655. echo '' >> $keyserver_nginx_site
  656. echo ' error_page 404 /404.html;' >> $keyserver_nginx_site
  657. echo '' >> $keyserver_nginx_site
  658. echo ' location ~ (.git|LICENSE|readme.md) {' >> $keyserver_nginx_site
  659. echo ' deny all;' >> $keyserver_nginx_site
  660. echo ' return 404;' >> $keyserver_nginx_site
  661. echo ' }' >> $keyserver_nginx_site
  662. echo '' >> $keyserver_nginx_site
  663. echo ' # Security' >> $keyserver_nginx_site
  664. function_check nginx_ssl
  665. nginx_ssl $KEYSERVER_DOMAIN_NAME
  666. function_check nginx_disable_sniffing
  667. nginx_disable_sniffing $KEYSERVER_DOMAIN_NAME
  668. echo ' add_header Strict-Transport-Security max-age=15768000;' >> $keyserver_nginx_site
  669. echo '' >> $keyserver_nginx_site
  670. echo ' # Logs' >> $keyserver_nginx_site
  671. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  672. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  673. echo '' >> $keyserver_nginx_site
  674. echo ' # Root' >> $keyserver_nginx_site
  675. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/htdocs;" >> $keyserver_nginx_site
  676. echo '' >> $keyserver_nginx_site
  677. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  678. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  679. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  680. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  681. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  682. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  683. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  684. echo '' >> $keyserver_nginx_site
  685. echo ' location / {' >> $keyserver_nginx_site
  686. function_check nginx_limits
  687. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  688. echo ' }' >> $keyserver_nginx_site
  689. echo '' >> $keyserver_nginx_site
  690. echo ' location /pks {' >> $keyserver_nginx_site
  691. echo " proxy_pass http://127.0.0.1:11373;" >> $keyserver_nginx_site
  692. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  693. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:11372 (nginx)\";" >> $keyserver_nginx_site
  694. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  695. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  696. echo ' client_body_buffer_size 128k;' >> $keyserver_nginx_site
  697. echo ' }' >> $keyserver_nginx_site
  698. echo '}' >> $keyserver_nginx_site
  699. echo '' >> $keyserver_nginx_site
  700. else
  701. echo -n '' > $keyserver_nginx_site
  702. fi
  703. echo 'server {' >> $keyserver_nginx_site
  704. echo " listen 127.0.0.1:$KEYSERVER_ONION_PORT default_server;" >> $keyserver_nginx_site
  705. echo " server_name $KEYSERVER_ONION_HOSTNAME;" >> $keyserver_nginx_site
  706. echo '' >> $keyserver_nginx_site
  707. echo ' error_page 404 /404.html;' >> $keyserver_nginx_site
  708. echo '' >> $keyserver_nginx_site
  709. echo ' location ~ (.git|LICENSE|readme.md) {' >> $keyserver_nginx_site
  710. echo ' deny all;' >> $keyserver_nginx_site
  711. echo ' return 404;' >> $keyserver_nginx_site
  712. echo ' }' >> $keyserver_nginx_site
  713. echo '' >> $keyserver_nginx_site
  714. function_check nginx_disable_sniffing
  715. nginx_disable_sniffing $KEYSERVER_DOMAIN_NAME
  716. echo '' >> $keyserver_nginx_site
  717. echo ' # Logs' >> $keyserver_nginx_site
  718. echo ' access_log /dev/null;' >> $keyserver_nginx_site
  719. echo ' error_log /dev/null;' >> $keyserver_nginx_site
  720. echo '' >> $keyserver_nginx_site
  721. echo ' # Root' >> $keyserver_nginx_site
  722. echo " root /var/www/$KEYSERVER_DOMAIN_NAME/mail;" >> $keyserver_nginx_site
  723. echo '' >> $keyserver_nginx_site
  724. echo ' rewrite ^/stats /pks/lookup?op=stats;' >> $keyserver_nginx_site
  725. echo ' rewrite ^/s/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  726. echo ' rewrite ^/search/(.*) /pks/lookup?search=$1;' >> $keyserver_nginx_site
  727. echo ' rewrite ^/g/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  728. echo ' rewrite ^/get/(.*) /pks/lookup?op=get&search=$1;' >> $keyserver_nginx_site
  729. echo ' rewrite ^/d/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  730. echo ' rewrite ^/download/(.*) /pks/lookup?op=get&options=mr&search=$1;' >> $keyserver_nginx_site
  731. echo '' >> $keyserver_nginx_site
  732. echo ' location / {' >> $keyserver_nginx_site
  733. function_check nginx_limits
  734. nginx_limits $KEYSERVER_DOMAIN_NAME '128k'
  735. echo ' }' >> $keyserver_nginx_site
  736. echo '' >> $keyserver_nginx_site
  737. echo ' location /pks {' >> $keyserver_nginx_site
  738. echo " proxy_pass http://127.0.0.1:11373;" >> $keyserver_nginx_site
  739. echo ' proxy_pass_header Server;' >> $keyserver_nginx_site
  740. echo " add_header Via \"1.1 $KEYSERVER_DOMAIN_NAME:$KEYSERVER_ONION_PORT (nginx)\";" >> $keyserver_nginx_site
  741. echo ' proxy_ignore_client_abort on;' >> $keyserver_nginx_site
  742. echo ' client_max_body_size 8m;' >> $keyserver_nginx_site
  743. echo ' client_body_buffer_size 128k;' >> $keyserver_nginx_site
  744. echo ' }' >> $keyserver_nginx_site
  745. echo '}' >> $keyserver_nginx_site
  746. function_check create_site_certificate
  747. if [ ! -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  748. create_site_certificate $KEYSERVER_DOMAIN_NAME 'yes'
  749. fi
  750. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt ]; then
  751. mv /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.crt /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  752. fi
  753. if [ -f /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem ]; then
  754. chown root:root /etc/ssl/certs/${KEYSERVER_DOMAIN_NAME}.pem
  755. sed -i "s|.crt|.pem|g" /etc/nginx/sites-available/${KEYSERVER_DOMAIN_NAME}
  756. fi
  757. if [ -f /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key ]; then
  758. chown root:root /etc/ssl/private/${KEYSERVER_DOMAIN_NAME}.key
  759. fi
  760. chown -R www-data:www-data /var/www/$KEYSERVER_DOMAIN_NAME/htdocs
  761. function_check nginx_ensite
  762. nginx_ensite $KEYSERVER_DOMAIN_NAME
  763. configure_firewall_for_keyserver
  764. # remove membership file - don't try to sync with other keyservers
  765. if [ -f /etc/sks/membership ]; then
  766. rm /etc/sks/membership
  767. fi
  768. if ! grep -q "pgp-public-keys" /etc/aliases; then
  769. echo 'pgp-public-keys: "|/usr/lib/sks/sks_add_mail /etc/sks"' >> /etc/aliases
  770. fi
  771. chown -Rc debian-sks: /etc/sks/mailsync
  772. systemctl enable sks
  773. systemctl restart sks
  774. systemctl restart nginx
  775. set_completion_param "keyserver domain" "$KEYSERVER_DOMAIN_NAME"
  776. set_completion_param "keyserver onion domain" "$KEYSERVER_ONION_HOSTNAME"
  777. set_completion_param "sks onion domain" "$SKS_ONION_HOSTNAME"
  778. keyserver_watchdog
  779. APP_INSTALLED=1
  780. }
  781. # NOTE: deliberately no exit 0