diff misc/hackmc @ 0:c7f6b056b673

First import of vendor version
author Peter Gervai <grin@grin.hu>
date Tue, 10 Mar 2009 13:49:58 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/hackmc	Tue Mar 10 13:49:58 2009 +0100
@@ -0,0 +1,201 @@
+#! /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 '}'