Mercurial > notdcc
view misc/hackmc @ 5:0a7a5940ee3a
Change description per license
author | Peter Gervai <grin@grin.hu> |
---|---|
date | Tue, 10 Mar 2009 15:03:24 +0100 |
parents | c7f6b056b673 |
children |
line wrap: on
line source
#! /bin/sh -e # This kludge of a shell script warps a sendmail.cf produced from a .mc file # to report some spam to the Distributed Checksum Clearinghouse (DCC) # in addition to rejecting it. # # Mail that is rejected by a sendmail access_db is reported via dccm to # a DCC server as extremely bulky. Error messages in the access_db # file must start with "DCC:" or they will be ignored by this mechanism. # This script should be run in the sendmail cf/cf directory, and given a list # of .mc files, as in # cd cf/cf # .../misc/hackmc -AROT ../m4/cf.m4 local.mc > local.cf # It seems to work on sendmail.cf generated for sendmail versions 8.11 # through 8.14.3. There is no guarantee that it will work with other # versions. You must compare the result of this script with the unmodified # sendmail.cf. # This script "denatures" RCS keywords in its output so that revisions of # the resulting sendmail.cf can be archived with RCS without losing # the original RCS lines from the Sendmail organization. # In addition to sending mail blacklisted by the sendmail access_db to # the DCC, the following can also be turned on: # -x turn on debugging # -A send mail with bogus Mail_From domain names to the DCC instead of # only rejecting it. # -R silently discard unauthorized relay attempts after reporting them # to the DCC. This mechanism also implies -f to ensure that relay # attempts do not leak if dccm is not running. # -r reject unauthorized relay attempts after reporting them # to the DCC. This mechanism also implies -f to ensure that relayed # attempts do not leak if dccm is not running. # -D add a local rule that rejects mail from SMTP clients without reverse # DNS and reports the mail as spam to the DCC. # This has a fairly high false positive rate. # -O modify the sendmail rules to treat access_db "OK" and "RELAY" # or "Spam:...FRIEND" entries as whitelisting the message. # -M modify the sendmail rules generated by FEATURE(badmx), FEATURE(dnsbl), # and Feature(enhdnsbl) so that mail that is rejected by sendmail # is reported via dccm to a DCC server as extremely bulky. # -T modify the sendmail rules to trust (whitelist) mail from users # authenticated with an SMTP AUTH TRUST_AUTH_MECH() mechanism or from # SMTP clients with certificates verified with START TLS. # If STMP-AUTH used, TRUST_AUTH_MECH must be set in the .mc file and # sendmail must be built with SASL or otherwise have working SMTP auth. # FEATURE(`delay_checks') must NOT be used. # -f if dccm fails, reject mail with a temporary failure status code # instead of passing it. This changes the default FEATURE(dcc) # parameters. See dcc.m4. # -m m4 # specifies the path to the m4 program as well as any m4 args # such as `hackmc -m4 "/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/"` # Copyright (c) 2008 by Rhyolite Software, LLC # # This agreement is not applicable to any entity which sells anti-spam # solutions to others or provides an anti-spam solution as part of a # security solution sold to other entities, or to a private network # which employs the DCC or uses data provided by operation of the DCC # but does not provide corresponding data to other users. # # Permission to use, copy, modify, and distribute this software without # changes for any purpose with or without fee is hereby granted, provided # that the above copyright notice and this permission notice appear in all # copies and any distributed versions or copies are either unchanged # or not called anything similar to "DCC" or "Distributed Checksum # Clearinghouse". # # Parties not eligible to receive a license under this agreement can # obtain a commercial license to use DCC by contacting Rhyolite Software # at sales@rhyolite.com. # # A commercial license would be for Distributed Checksum and Reputation # Clearinghouse software. That software includes additional features. This # free license for Distributed ChecksumClearinghouse Software does not in any # way grant permision to use Distributed Checksum and Reputation Clearinghouse # software # # THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC # BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS # SOFTWARE. # Rhyolite Software DCC 1.3.103-1.43 $Revision$ USAGE="`basename $0`: [-xfARrDOMT] [-m m4] file1.mc file2.mc ..." M4=m4 DNS1='#' DNS2='#' RELAY='#' NOTSPAM='#' AUTH='#' # fail temporarily if dccm is not running. # Add F=T to reject mail when dccm is dead, # but only if there is not already an F=x setting TEMPFAIL='#' TEMPFAIL0='/F=/!s/S=[^ ,]*/&, F=T/' RDNS='#' DNSBL1='#' DNSBL2='#' while getopts "xm:fARrDOMT" c; do case $c in x) set -x;; m) M4="$OPTARG";; f) TEMPFAIL=$TEMPFAIL0;; A) DNS1='s/$#error $@ \([.0-9]*\) $: "\(5.*[Dd]omain name required.*\)/$# $(macro {dcc_isspam} $@ "\1 \2" Sent to DCC" $) TODCC/' DNS2='s/$#error $@ \([.0-9]*\) $: "\(5.*Domain of sender.*\)/$# $(macro {dcc_isspam} $@ "\1 \2" Sent to DCC" $) TODCC/' ;; R) RELAY='s/$#error $@ [.0-9]* $: "5[.0-9 ]*\(Relaying denied.*\)/$# $(macro {dcc_isspam} $@ "DISCARD: \1" Sent to DCC" $) TODCC/' TEMPFAIL=$TEMPFAIL0 ;; r) RELAY='s/$#error $@ [.0-9]* $: "5[.0-9 ]*\(Relaying denied.*\)/$# $(macro {dcc_isspam} $@ "REJECT: \1" Sent to DCC" $) TODCC/' TEMPFAIL=$TEMPFAIL0 ;; D) RDNS= ;; M) DNSBL1='/^# DNS based IP address spam list/,/^$/s/$#error .* $: *"\(.*\)/$@ $(macro {dcc_isspam} $@ "\1" Sent to DCC" $) TODCC/' DNSBL2='s/$#error .* $: *"\(.*MX record.*\)/$@ $(macro {dcc_isspam} $@ "\1" Sent to DCC" $) TODCC/' ;; T) AUTH= ;; O) NOTSPAM='s/^R<\$={Accept}> *<*\$\*>* *[^ ]*/& $(macro {dcc_notspam} $@ $1 $)/' ;; *) echo 1>&2 "$USAGE"; exit 1;; esac done shift `expr $OPTIND - 1 || true` ( # work hard to have only one Local_check_mail or Local_check_relay definition # by prepending our rules to the first definitions echo LOCAL_RULESETS if test -z "$RDNS"; then if test `$M4 $* 2>/dev/null| grep '^SLocal_check_relay' | wc -l` -lt 2; then echo SLocal_check_relay fi fi if test -z "$AUTH"; then if test `$M4 $* 2>/dev/null| grep '^SLocal_check_mail' | wc -l` -lt 2; then echo SLocal_check_mail fi fi ) | $M4 $* - \ | sed -e 's/\$\(Id:.*\)\$/\1/' -e 's/\$\(Revision:.*\)\$/\1/' \ -e "${DNS1}" -e "${DNS2}" -e "${RELAY}" -e "${NOTSPAM}" \ -e "${DNSBL1}" -e "${DNSBL2}" \ \ -e '/^Xdcc/{' -e "$TEMPFAIL" -e '}' \ \ -e '# add the access.db hook' \ -e '/^R<$={Accept}>/a\ R<DCC:$*> $* $# $(macro {dcc_isspam} $@ $1": Sent to DCC" $) TODCC' \ \ -e "# remove extra quotes" -e'/TODCC/s/""//' \ \ -e "/^S${RDNS}check_relay/,/^SLocal_check_relay/{" \ -e '/^SLocal_check_relay/a\ # reject mail from clients without reverse DNS and report it as spam to the DCC\ R$* $: <$&{client_resolve}> $1\ R<FAIL> $* $# $(macro {dcc_isspam} $@ "SMTP client "$&{client_addr}" has no reverse DNS name" $) TODCC\ R<$*> $* $: $2\ \ ' \ -e '}' \ \ -e "/^S${AUTH}check_mail/,/^SLocal_check_mail/{" \ -e '/^SLocal_check_mail/a\ # mail from an SMTP client with a verified TLS cert is not spam for dccm\ R$* $: <$&{verify}> $1\ R<OK> $* $: $(macro {dcc_notspam} $@ STARTTLS verified $) <> $1\ # mail authenticated with SMTP AUTH for relaying is also not spam for dccm\ R<$*> $* $: <$&{auth_type}> $2\ R<$={TrustAuthMech}> $* $: $(macro {dcc_notspam} $@ authenticated $) <> $2\ R<$*> $* $: $2\ \ ' \ -e '}'