X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mail-setup;h=86464f1aaf3ca337bb9ef2ede0d7e94f32826550;hb=12cab163424e3a7b0815646d1d4407f9b5839bcb;hp=4ce604b0eed1011908505728dcfd71f1911ce84a;hpb=aa9cb10514e29340a6d6a194ee189fa4364f1f2e;p=distro-setup diff --git a/mail-setup b/mail-setup index 4ce604b..86464f1 100755 --- a/mail-setup +++ b/mail-setup @@ -3,6 +3,22 @@ # Copyright (C) 2019 Ian Kelling # SPDX-License-Identifier: AGPL-3.0-or-later +# todo: sandbox / harden exim: +# 1. stop it from running as root. how? +# https://www.exim.org/exim-html-current/doc/html/spec_html/ch-security_considerations.html +# * avoid using .forward files, remove that router +# * set deliver_drop_privilege +# * set user to run as Debian-exim in systemd +# * set port to something like 2500, and forward 25 to 2500 with iptables. same for 587. +# https://superuser.com/questions/710253/allow-non-root-process-to-bind-to-port-80-and-443/1334552#1334552 +# * consider whether other routers like postmaster need modification / removal. +# 2. restrict its filesystem access from within systemd + +# todo: harden dovecot. need to do some research. one way is for it to only listen on a wireguard vpn interface, so only clients that are on the vpn can access it. +# todo: consider hardening cups listening on 0.0.0.0 +# todo: stop/disable local apache, and rpc.mountd, and kdeconnect when not in use. +# todo: check that spamd and unbound only listen locally. + # todo: hosts should only allow external mail that is authed and # destined for backup route. it is a minor issue since traffic is # limited to the wghole network. @@ -310,11 +326,6 @@ sre() { m systemctl enable $service; done } -sstart() { - for service; do - m systemctl enable --now $service; - done -} mailhost() { [[ $HOSTNAME == "$MAIL_HOST" ]] } @@ -407,21 +418,6 @@ fi # our nostart pi fails to avoid enabling -# * user forward file -case $HOSTNAME in - $MAIL_HOST) - # afaik, these will get ignored on MAIL_HOST because they are routing to my own - # machine, but rm them is safer - rm -fv $uhome/.forward /root/.forward - ;; - *) - # this can\'t be a symlink and has permission restrictions - # it might work in /etc/aliases, but this seems more proper. - e setting $uhome/.forward to $forward - install -m 644 {-o,-g}$u <(e $forward) $uhome/.forward - ;; -esac - # * Mail clean cronjob i /etc/systemd/system/mailclean.timer <<'EOF' @@ -584,6 +580,24 @@ ExecStart=/bin/sleep infinity WantedBy=multi-user.target EOF +i /etc/systemd/system/mailbindwatchdog.service <>/etc/exim4/update-exim4.conf.conf <>/etc/exim4/update-exim4.conf.conf <>/etc/exim4/update-exim4.conf.conf <>/etc/exim4/conf.d/main/000_local-nn <<'EOF' +# spool_directory = /var/spool/myexim4 +# EOF cat >>/etc/myexim4/update-exim4.conf.conf <<'EOF' dc_eximconfig_configtype='smarthost' dc_smarthost='nn.b8.nz' @@ -2747,7 +2791,7 @@ if $reload; then m systemctl daemon-reload fi -sstart epanicclean.timer +m systemctl --now enable epanicclean.timer case $HOSTNAME in je) @@ -2768,14 +2812,14 @@ case $HOSTNAME in ln -sf 127.0.0.1-resolv/stub-resolv.conf /etc/resolv.conf ;;& $MAIL_HOST|bk) - sstart mailnn mailnnroute + m systemctl --now enable mailnn mailnnroute ;;& $MAIL_HOST) # we use dns to start wg if $reload; then sre unbound else - sstart unbound + m systemctl --now enable unbound fi ;;& $MAIL_HOST|bk) @@ -2784,10 +2828,10 @@ case $HOSTNAME in if $reload; then sre $vpnser else - sstart $vpnser + m systemctl --now enable $vpnser fi if ! systemctl is-active clamav-daemon >/dev/null; then - sstart clamav-daemon + m systemctl --now enable clamav-daemon out=$(rsync -aiSAX --chown=root:root --chmod=g-s /a/bin/ds/filesystem/etc/systemd/system/epanicclean.{timer,service} /etc/systemd/system) if [[ $out ]]; then reload=true @@ -2804,13 +2848,13 @@ case $HOSTNAME in # need to wait a bit before restarting exim, else I # get a paniclog entry like: spam acl condition: all spamd servers failed sleep 3 - sstart mailclean.timer + m systemctl --now enable mailclean.timer ;;& $MAIL_HOST) # < 2.1 (eg: in t9), uses a different data format which required manual # migration. dont start if we are running an old version. if dpkg --compare-versions $(dpkg -s radicale | awk '$1 == "Version:" { print $2 }') ge 2.1; then - sstart radicale + m systemctl --now enable radicale fi ;;& esac @@ -2828,6 +2872,16 @@ esac sre exim4 +case $HOSTNAME in + $MAIL_HOST) + m systemctl --now enable mailbindwatchdog + ;; + *) + soff mailbindwatchdog + ;; +esac + + case $HOSTNAME in bk) sre exim4in ;; esac @@ -2862,7 +2916,7 @@ EOF test_to="testignore@expertpathologyreview.com, testignore@je.b8.nz, testignore@amnimal.ninja, jtuttle@gnu.org" cat >>/etc/cron.d/mailtest </usr/local/bin/send-test-forward <<'EOF' #!/bin/bash olds=( -/sbin/exiqgrep -o 260 -i -r '^(testignore@(iankelling\.org|zroe\.org|expertpathologyreview\.com|amnimal\.ninja|je\.b8\.nz)|jtuttle@gnu\.org)$') +$(/sbin/exiqgrep -o 260 -i -r '^(testignore@(iankelling\.org|zroe\.org|expertpathologyreview\.com|amnimal\.ninja|je\.b8\.nz)|jtuttle@gnu\.org)$') +) if (( ${#olds[@]} )); then /sbin/exim -Mrm "${olds[@]}" >/dev/null fi