選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

emailwiz.sh 13 KiB

5年前
5年前
5年前
5年前
2年前
2年前
5年前
2年前
2年前
2年前
2年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
2年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
5年前
2年前
5年前
5年前
5年前
2年前
1年前
2年前
4年前
4年前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #!/bin/sh
  2. # BEFORE INSTALLING
  3. # Have a Debian or Ubuntu server with a static IP and DNS records (usually
  4. # A/AAAA) that point your domain name to it.
  5. # NOTE WHILE INSTALLING
  6. # On installation of Postfix, select "Internet Site" and put in TLD (without
  7. # `mail.` before it).
  8. # AFTER INSTALLING
  9. # More DNS records will be given to you to install. One of them will be
  10. # different for every installation and is uniquely generated on your machine.
  11. umask 0022
  12. apt-get install -y postfix postfix-pcre dovecot-imapd dovecot-sieve opendkim opendkim-tools spamassassin spamc net-tools fail2ban
  13. domain="$(cat /etc/mailname)"
  14. subdom=${MAIL_SUBDOM:-mail}
  15. maildomain="$subdom.$domain"
  16. certdir="/etc/letsencrypt/live/$maildomain"
  17. # Open required mail ports, and 80, for Certbot.
  18. for port in 80 993 465 25 587; do
  19. ufw allow "$port" 2>/dev/null
  20. done
  21. [ ! -d "$certdir" ] &&
  22. possiblecert="$(certbot certificates 2>/dev/null | grep "Domains:\.* \(\*\.$domain\|$maildomain\)\(\s\|$\)" -A 2 | awk '/Certificate Path/ {print $3}' | head -n1)" &&
  23. certdir="${possiblecert%/*}"
  24. [ ! -d "$certdir" ] &&
  25. certdir="/etc/letsencrypt/live/$maildomain" &&
  26. case "$(netstat -tulpn | grep ":80\s")" in
  27. *nginx*)
  28. apt install -y python3-certbot-nginx
  29. certbot -d "$maildomain" certonly --nginx --register-unsafely-without-email --agree-tos
  30. ;;
  31. *apache*)
  32. apt install -y python3-certbot-apache
  33. certbot -d "$maildomain" certonly --apache --register-unsafely-without-email --agree-tos
  34. ;;
  35. *)
  36. apt install -y python3-certbot
  37. certbot -d "$maildomain" certonly --standalone --register-unsafely-without-email --agree-tos
  38. ;;
  39. esac
  40. [ ! -d "$certdir" ] && echo "Error locating or installing SSL certificate." && exit 1
  41. echo "Configuring Postfix's main.cf..."
  42. # Change the cert/key files to the default locations of the Let's Encrypt cert/key
  43. postconf -e "smtpd_tls_key_file=$certdir/privkey.pem"
  44. postconf -e "smtpd_tls_cert_file=$certdir/fullchain.pem"
  45. postconf -e "smtp_tls_CAfile=$certdir/cert.pem"
  46. # Enable, but do not require TLS. Requiring it with other server would cause
  47. # mail delivery problems and requiring it locally would cause many other
  48. # issues.
  49. postconf -e 'smtpd_tls_security_level = may'
  50. postconf -e 'smtp_tls_security_level = may'
  51. # TLS required for authentication.
  52. postconf -e 'smtpd_tls_auth_only = yes'
  53. # Exclude obsolete, insecure and obsolete encryption protocols.
  54. postconf -e 'smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1'
  55. postconf -e 'smtp_tls_mandatory_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1'
  56. postconf -e 'smtpd_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1'
  57. postconf -e 'smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1'
  58. # Exclude suboptimal ciphers.
  59. postconf -e 'tls_preempt_cipherlist = yes'
  60. postconf -e 'smtpd_tls_exclude_ciphers = aNULL, LOW, EXP, MEDIUM, ADH, AECDH, MD5, DSS, ECDSA, CAMELLIA128, 3DES, CAMELLIA256, RSA+AES, eNULL'
  61. # Here we tell Postfix to look to Dovecot for authenticating users/passwords.
  62. # Dovecot will be putting an authentication socket in /var/spool/postfix/private/auth
  63. postconf -e 'smtpd_sasl_auth_enable = yes'
  64. postconf -e 'smtpd_sasl_type = dovecot'
  65. postconf -e 'smtpd_sasl_path = private/auth'
  66. # helo, sender, relay and recipient restrictions
  67. postconf -e "smtpd_sender_login_maps = pcre:/etc/postfix/login_maps.pcre"
  68. postconf -e 'smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_sender_login_mismatch, reject_unknown_reverse_client_hostname, reject_unknown_sender_domain'
  69. postconf -e 'smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, reject_unknown_recipient_domain'
  70. postconf -e 'smtpd_relay_restrictions = permit_sasl_authenticated, reject_unauth_destination'
  71. postconf -e 'smtpd_helo_required = yes'
  72. postconf -e 'smtpd_helo_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_invalid_helo_hostname, reject_non_fqdn_helo_hostname, reject_unknown_helo_hostname'
  73. # NOTE: the trailing slash here, or for any directory name in the home_mailbox
  74. # command, is necessary as it distinguishes a maildir (which is the actual
  75. # directories that what we want) from a spoolfile (which is what old unix
  76. # boomers want and no one else).
  77. postconf -e 'home_mailbox = Mail/Inbox/'
  78. # Prevent "Received From:" header in sent emails in order to prevent leakage of public ip addresses
  79. postconf -e "header_checks = regexp:/etc/postfix/header_checks"
  80. # strips "Received From:" in sent emails
  81. echo "/^Received:.*/ IGNORE
  82. /^X-Originating-IP:/ IGNORE" >> /etc/postfix/header_checks
  83. # Create a login map file that ensures that if a sender wants to send a mail from a user at our local
  84. # domain, they must be authenticated as that user
  85. echo "/^(.*)@$(sh -c "echo $domain | sed 's/\./\\\./'")$/ \${1}" > /etc/postfix/login_maps.pcre
  86. # master.cf
  87. echo "Configuring Postfix's master.cf..."
  88. sed -i '/^\s*-o/d;/^\s*submission/d;/^\s*smtp/d' /etc/postfix/master.cf
  89. echo "smtp unix - - n - - smtp
  90. smtp inet n - y - - smtpd
  91. -o content_filter=spamassassin
  92. submission inet n - y - - smtpd
  93. -o syslog_name=postfix/submission
  94. -o smtpd_tls_security_level=encrypt
  95. -o smtpd_sasl_auth_enable=yes
  96. -o smtpd_tls_auth_only=yes
  97. smtps inet n - y - - smtpd
  98. -o syslog_name=postfix/smtps
  99. -o smtpd_tls_wrappermode=yes
  100. -o smtpd_sasl_auth_enable=yes
  101. spamassassin unix - n n - - pipe
  102. user=debian-spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f \${sender} \${recipient}" >> /etc/postfix/master.cf
  103. # By default, dovecot has a bunch of configs in /etc/dovecot/conf.d/ These
  104. # files have nice documentation if you want to read it, but it's a huge pain to
  105. # go through them to organize. Instead, we simply overwrite
  106. # /etc/dovecot/dovecot.conf because it's easier to manage. You can get a backup
  107. # of the original in /usr/share/dovecot if you want.
  108. mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.backup.conf
  109. echo "Creating Dovecot config..."
  110. echo "# Dovecot config
  111. # Note that in the dovecot conf, you can use:
  112. # %u for username
  113. # %n for the name in name@domain.tld
  114. # %d for the domain
  115. # %h the user's home directory
  116. ssl = required
  117. ssl_cert = <$certdir/fullchain.pem
  118. ssl_key = <$certdir/privkey.pem
  119. ssl_min_protocol = TLSv1.2
  120. ssl_cipher_list = "'EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED'"
  121. ssl_prefer_server_ciphers = yes
  122. ssl_dh = </usr/share/dovecot/dh.pem
  123. auth_mechanisms = plain login
  124. auth_username_format = %n
  125. protocols = \$protocols imap
  126. # Search for valid users in /etc/passwd
  127. userdb {
  128. driver = passwd
  129. }
  130. #Fallback: Use plain old PAM to find user passwords
  131. passdb {
  132. driver = pam
  133. }
  134. # Our mail for each user will be in ~/Mail, and the inbox will be ~/Mail/Inbox
  135. # The LAYOUT option is also important because otherwise, the boxes will be \`.Sent\` instead of \`Sent\`.
  136. mail_location = maildir:~/Mail:INBOX=~/Mail/Inbox:LAYOUT=fs
  137. namespace inbox {
  138. inbox = yes
  139. mailbox Drafts {
  140. special_use = \\Drafts
  141. auto = subscribe
  142. }
  143. mailbox Junk {
  144. special_use = \\Junk
  145. auto = subscribe
  146. autoexpunge = 30d
  147. }
  148. mailbox Sent {
  149. special_use = \\Sent
  150. auto = subscribe
  151. }
  152. mailbox Trash {
  153. special_use = \\Trash
  154. }
  155. mailbox Archive {
  156. special_use = \\Archive
  157. }
  158. }
  159. # Here we let Postfix use Dovecot's authetication system.
  160. service auth {
  161. unix_listener /var/spool/postfix/private/auth {
  162. mode = 0660
  163. user = postfix
  164. group = postfix
  165. }
  166. }
  167. protocol lda {
  168. mail_plugins = \$mail_plugins sieve
  169. }
  170. protocol lmtp {
  171. mail_plugins = \$mail_plugins sieve
  172. }
  173. plugin {
  174. sieve = ~/.dovecot.sieve
  175. sieve_default = /var/lib/dovecot/sieve/default.sieve
  176. #sieve_global_path = /var/lib/dovecot/sieve/default.sieve
  177. sieve_dir = ~/.sieve
  178. sieve_global_dir = /var/lib/dovecot/sieve/
  179. }
  180. " > /etc/dovecot/dovecot.conf
  181. # If using an old version of Dovecot, remove the ssl_dl line.
  182. case "$(dovecot --version)" in
  183. 1|2.1*|2.2*) sed -i '/^ssl_dh/d' /etc/dovecot/dovecot.conf ;;
  184. esac
  185. mkdir /var/lib/dovecot/sieve/
  186. echo "require [\"fileinto\", \"mailbox\"];
  187. if header :contains \"X-Spam-Flag\" \"YES\"
  188. {
  189. fileinto \"Junk\";
  190. }" > /var/lib/dovecot/sieve/default.sieve
  191. grep -q '^vmail:' /etc/passwd || useradd vmail
  192. chown -R vmail:vmail /var/lib/dovecot
  193. sievec /var/lib/dovecot/sieve/default.sieve
  194. echo 'Preparing user authentication...'
  195. grep -q nullok /etc/pam.d/dovecot ||
  196. echo 'auth required pam_unix.so nullok
  197. account required pam_unix.so' >> /etc/pam.d/dovecot
  198. # OpenDKIM
  199. # A lot of the big name email services, like Google, will automatically reject
  200. # as spam unfamiliar and unauthenticated email addresses. As in, the server
  201. # will flatly reject the email, not even delivering it to someone's Spam
  202. # folder.
  203. # OpenDKIM is a way to authenticate your email so you can send to such services
  204. # without a problem.
  205. # Create an OpenDKIM key in the proper place with proper permissions.
  206. echo 'Generating OpenDKIM keys...'
  207. mkdir -p "/etc/postfix/dkim/$domain"
  208. opendkim-genkey -D "/etc/postfix/dkim/$domain" -d "$domain" -s "$subdom"
  209. chgrp -R opendkim /etc/postfix/dkim/*
  210. chmod -R g+r /etc/postfix/dkim/*
  211. # Generate the OpenDKIM info:
  212. echo 'Configuring OpenDKIM...'
  213. grep -q "$domain" /etc/postfix/dkim/keytable 2>/dev/null ||
  214. echo "$subdom._domainkey.$domain $domain:$subdom:/etc/postfix/dkim/$domain/$subdom.private" >> /etc/postfix/dkim/keytable
  215. grep -q "$domain" /etc/postfix/dkim/signingtable 2>/dev/null ||
  216. echo "*@$domain $subdom._domainkey.$domain" >> /etc/postfix/dkim/signingtable
  217. grep -q '127.0.0.1' /etc/postfix/dkim/trustedhosts 2>/dev/null ||
  218. echo '127.0.0.1
  219. 10.1.0.0/16' >> /etc/postfix/dkim/trustedhosts
  220. # ...and source it from opendkim.conf
  221. grep -q '^KeyTable' /etc/opendkim.conf 2>/dev/null || echo 'KeyTable file:/etc/postfix/dkim/keytable
  222. SigningTable refile:/etc/postfix/dkim/signingtable
  223. InternalHosts refile:/etc/postfix/dkim/trustedhosts' >> /etc/opendkim.conf
  224. sed -i '/^#Canonicalization/s/simple/relaxed\/simple/' /etc/opendkim.conf
  225. sed -i '/^#Canonicalization/s/^#//' /etc/opendkim.conf
  226. sed -i '/Socket/s/^#*/#/' /etc/opendkim.conf
  227. grep -q '^Socket\s*inet:12301@localhost' /etc/opendkim.conf || echo 'Socket inet:12301@localhost' >> /etc/opendkim.conf
  228. # OpenDKIM daemon settings, removing previously activated socket.
  229. sed -i '/^SOCKET/d' /etc/default/opendkim && echo "SOCKET=\"inet:12301@localhost\"" >> /etc/default/opendkim
  230. # Here we add to postconf the needed settings for working with OpenDKIM
  231. echo 'Configuring Postfix with OpenDKIM settings...'
  232. postconf -e 'smtpd_sasl_security_options = noanonymous, noplaintext'
  233. postconf -e 'smtpd_sasl_tls_security_options = noanonymous'
  234. postconf -e "myhostname = $maildomain"
  235. postconf -e 'milter_default_action = accept'
  236. postconf -e 'milter_protocol = 6'
  237. postconf -e 'smtpd_milters = inet:localhost:12301'
  238. postconf -e 'non_smtpd_milters = inet:localhost:12301'
  239. postconf -e 'mailbox_command = /usr/lib/dovecot/deliver'
  240. # A fix for "Opendkim won't start: can't open PID file?", as specified here: https://serverfault.com/a/847442
  241. /lib/opendkim/opendkim.service.generate
  242. systemctl daemon-reload
  243. # Enable fail2ban security for dovecot and postfix.
  244. [ ! -f /etc/fail2ban/jail.d/emailwiz.local ] && echo "[postfix]
  245. enabled = true
  246. [postfix-sasl]
  247. enabled = true
  248. [sieve]
  249. enabled = true
  250. [dovecot]
  251. enabled = true" > /etc/fail2ban/jail.d/emailwiz.local
  252. for x in spamassassin opendkim dovecot postfix fail2ban; do
  253. printf "Restarting %s..." "$x"
  254. service "$x" restart && printf " ...done\\n"
  255. systemctl enable "$x"
  256. done
  257. pval="$(tr -d '\n' <"/etc/postfix/dkim/$domain/$subdom.txt" | sed "s/k=rsa.* \"p=/k=rsa; p=/;s/\"\s*\"//;s/\"\s*).*//" | grep -o 'p=.*')"
  258. dkimentry="$subdom._domainkey.$domain TXT v=DKIM1; k=rsa; $pval"
  259. dmarcentry="_dmarc.$domain TXT v=DMARC1; p=reject; rua=mailto:dmarc@$domain; fo=1"
  260. spfentry="$domain TXT v=spf1 mx a:$maildomain -all"
  261. mxentry="$domain MX 10 $maildomain 300"
  262. useradd -m -G mail dmarc
  263. # Create a cronjob that deletes month-old dmarc feedback:
  264. cat <<EOF > /etc/cron.weekly/dmarc-clean
  265. #!/bin/sh
  266. find /home/dmarc/Mail -type f -mtime +30 -name '*.mail*' -delete
  267. EOF
  268. chmod 755 /etc/cron.weekly/dmarc-clean
  269. grep -q '^deploy-hook = echo "$RENEWED_DOMAINS" | grep -q' /etc/letsencrypt/cli.ini ||
  270. echo "
  271. deploy-hook = echo \"\$RENEWED_DOMAINS\" | grep -q '$maildomain' && service postfix reload && service dovecot reload" >> /etc/letsencrypt/cli.ini
  272. echo "NOTE: Elements in the entries might appear in a different order in your registrar's DNS settings.
  273. $dkimentry
  274. $dmarcentry
  275. $spfentry
  276. $mxentry" > "$HOME/dns_emailwizard"
  277. printf "\033[31m
  278. _ _
  279. | \ | | _____ ___
  280. | \| |/ _ \ \ /\ / (_)
  281. | |\ | (_) \ V V / _
  282. |_| \_|\___/ \_/\_/ (_)\033[0m
  283. Add these three records to your DNS TXT records on either your registrar's site
  284. or your DNS server:
  285. \033[32m
  286. $dkimentry
  287. $dmarcentry
  288. $spfentry
  289. $mxentry
  290. \033[0m
  291. NOTE: You may need to omit the \`.$domain\` portion at the beginning if
  292. inputting them in a registrar's web interface.
  293. Also, these are now saved to \033[34m~/dns_emailwizard\033[0m in case you want them in a file.
  294. Once you do that, you're done! Check the README for how to add users/accounts
  295. and how to log in.\n"