freedombone-app-keyserver 33KB

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