comparison 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
comparison
equal deleted inserted replaced
-1:000000000000 0:c7f6b056b673
1 #! /bin/sh -e
2
3 # This kludge of a shell script warps a sendmail.cf produced from a .mc file
4 # to report some spam to the Distributed Checksum Clearinghouse (DCC)
5 # in addition to rejecting it.
6 #
7 # Mail that is rejected by a sendmail access_db is reported via dccm to
8 # a DCC server as extremely bulky. Error messages in the access_db
9 # file must start with "DCC:" or they will be ignored by this mechanism.
10
11 # This script should be run in the sendmail cf/cf directory, and given a list
12 # of .mc files, as in
13 # cd cf/cf
14 # .../misc/hackmc -AROT ../m4/cf.m4 local.mc > local.cf
15
16 # It seems to work on sendmail.cf generated for sendmail versions 8.11
17 # through 8.14.3. There is no guarantee that it will work with other
18 # versions. You must compare the result of this script with the unmodified
19 # sendmail.cf.
20
21
22 # This script "denatures" RCS keywords in its output so that revisions of
23 # the resulting sendmail.cf can be archived with RCS without losing
24 # the original RCS lines from the Sendmail organization.
25
26 # In addition to sending mail blacklisted by the sendmail access_db to
27 # the DCC, the following can also be turned on:
28
29 # -x turn on debugging
30
31 # -A send mail with bogus Mail_From domain names to the DCC instead of
32 # only rejecting it.
33
34 # -R silently discard unauthorized relay attempts after reporting them
35 # to the DCC. This mechanism also implies -f to ensure that relay
36 # attempts do not leak if dccm is not running.
37
38 # -r reject unauthorized relay attempts after reporting them
39 # to the DCC. This mechanism also implies -f to ensure that relayed
40 # attempts do not leak if dccm is not running.
41
42 # -D add a local rule that rejects mail from SMTP clients without reverse
43 # DNS and reports the mail as spam to the DCC.
44 # This has a fairly high false positive rate.
45
46 # -O modify the sendmail rules to treat access_db "OK" and "RELAY"
47 # or "Spam:...FRIEND" entries as whitelisting the message.
48
49 # -M modify the sendmail rules generated by FEATURE(badmx), FEATURE(dnsbl),
50 # and Feature(enhdnsbl) so that mail that is rejected by sendmail
51 # is reported via dccm to a DCC server as extremely bulky.
52
53 # -T modify the sendmail rules to trust (whitelist) mail from users
54 # authenticated with an SMTP AUTH TRUST_AUTH_MECH() mechanism or from
55 # SMTP clients with certificates verified with START TLS.
56 # If STMP-AUTH used, TRUST_AUTH_MECH must be set in the .mc file and
57 # sendmail must be built with SASL or otherwise have working SMTP auth.
58 # FEATURE(`delay_checks') must NOT be used.
59
60 # -f if dccm fails, reject mail with a temporary failure status code
61 # instead of passing it. This changes the default FEATURE(dcc)
62 # parameters. See dcc.m4.
63
64 # -m m4
65 # specifies the path to the m4 program as well as any m4 args
66 # such as `hackmc -m4 "/usr/bin/m4 -D_CF_DIR_=/usr/share/sendmail/cf/"`
67
68
69
70 # Copyright (c) 2008 by Rhyolite Software, LLC
71 #
72 # This agreement is not applicable to any entity which sells anti-spam
73 # solutions to others or provides an anti-spam solution as part of a
74 # security solution sold to other entities, or to a private network
75 # which employs the DCC or uses data provided by operation of the DCC
76 # but does not provide corresponding data to other users.
77 #
78 # Permission to use, copy, modify, and distribute this software without
79 # changes for any purpose with or without fee is hereby granted, provided
80 # that the above copyright notice and this permission notice appear in all
81 # copies and any distributed versions or copies are either unchanged
82 # or not called anything similar to "DCC" or "Distributed Checksum
83 # Clearinghouse".
84 #
85 # Parties not eligible to receive a license under this agreement can
86 # obtain a commercial license to use DCC by contacting Rhyolite Software
87 # at sales@rhyolite.com.
88 #
89 # A commercial license would be for Distributed Checksum and Reputation
90 # Clearinghouse software. That software includes additional features. This
91 # free license for Distributed ChecksumClearinghouse Software does not in any
92 # way grant permision to use Distributed Checksum and Reputation Clearinghouse
93 # software
94 #
95 # THE SOFTWARE IS PROVIDED "AS IS" AND RHYOLITE SOFTWARE, LLC DISCLAIMS ALL
96 # WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
97 # OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL RHYOLITE SOFTWARE, LLC
98 # BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
99 # OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
100 # WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
101 # ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
102 # SOFTWARE.
103 # Rhyolite Software DCC 1.3.103-1.43 $Revision$
104
105 USAGE="`basename $0`: [-xfARrDOMT] [-m m4] file1.mc file2.mc ..."
106 M4=m4
107 DNS1='#'
108 DNS2='#'
109 RELAY='#'
110 NOTSPAM='#'
111 AUTH='#'
112 # fail temporarily if dccm is not running.
113 # Add F=T to reject mail when dccm is dead,
114 # but only if there is not already an F=x setting
115 TEMPFAIL='#'
116 TEMPFAIL0='/F=/!s/S=[^ ,]*/&, F=T/'
117 RDNS='#'
118 DNSBL1='#'
119 DNSBL2='#'
120
121 while getopts "xm:fARrDOMT" c; do
122 case $c in
123 x) set -x;;
124 m) M4="$OPTARG";;
125 f) TEMPFAIL=$TEMPFAIL0;;
126 A)
127 DNS1='s/$#error $@ \([.0-9]*\) $: "\(5.*[Dd]omain name required.*\)/$# $(macro {dcc_isspam} $@ "\1 \2" Sent to DCC" $) TODCC/'
128 DNS2='s/$#error $@ \([.0-9]*\) $: "\(5.*Domain of sender.*\)/$# $(macro {dcc_isspam} $@ "\1 \2" Sent to DCC" $) TODCC/'
129 ;;
130 R)
131 RELAY='s/$#error $@ [.0-9]* $: "5[.0-9 ]*\(Relaying denied.*\)/$# $(macro {dcc_isspam} $@ "DISCARD: \1" Sent to DCC" $) TODCC/'
132 TEMPFAIL=$TEMPFAIL0
133 ;;
134 r)
135 RELAY='s/$#error $@ [.0-9]* $: "5[.0-9 ]*\(Relaying denied.*\)/$# $(macro {dcc_isspam} $@ "REJECT: \1" Sent to DCC" $) TODCC/'
136 TEMPFAIL=$TEMPFAIL0
137 ;;
138 D) RDNS=
139 ;;
140 M)
141 DNSBL1='/^# DNS based IP address spam list/,/^$/s/$#error .* $: *"\(.*\)/$@ $(macro {dcc_isspam} $@ "\1" Sent to DCC" $) TODCC/'
142 DNSBL2='s/$#error .* $: *"\(.*MX record.*\)/$@ $(macro {dcc_isspam} $@ "\1" Sent to DCC" $) TODCC/'
143 ;;
144 T) AUTH=
145 ;;
146 O) NOTSPAM='s/^R<\$={Accept}> *<*\$\*>* *[^ ]*/& $(macro {dcc_notspam} $@ $1 $)/'
147 ;;
148 *) echo 1>&2 "$USAGE"; exit 1;;
149 esac
150 done
151 shift `expr $OPTIND - 1 || true`
152
153 (
154 # work hard to have only one Local_check_mail or Local_check_relay definition
155 # by prepending our rules to the first definitions
156 echo LOCAL_RULESETS
157 if test -z "$RDNS"; then
158 if test `$M4 $* 2>/dev/null| grep '^SLocal_check_relay' | wc -l` -lt 2; then
159 echo SLocal_check_relay
160 fi
161 fi
162 if test -z "$AUTH"; then
163 if test `$M4 $* 2>/dev/null| grep '^SLocal_check_mail' | wc -l` -lt 2; then
164 echo SLocal_check_mail
165 fi
166 fi
167 ) | $M4 $* - \
168 | sed -e 's/\$\(Id:.*\)\$/\1/' -e 's/\$\(Revision:.*\)\$/\1/' \
169 -e "${DNS1}" -e "${DNS2}" -e "${RELAY}" -e "${NOTSPAM}" \
170 -e "${DNSBL1}" -e "${DNSBL2}" \
171 \
172 -e '/^Xdcc/{' -e "$TEMPFAIL" -e '}' \
173 \
174 -e '# add the access.db hook' \
175 -e '/^R<$={Accept}>/a\
176 R<DCC:$*> $* $# $(macro {dcc_isspam} $@ $1": Sent to DCC" $) TODCC' \
177 \
178 -e "# remove extra quotes" -e'/TODCC/s/""//' \
179 \
180 -e "/^S${RDNS}check_relay/,/^SLocal_check_relay/{" \
181 -e '/^SLocal_check_relay/a\
182 # reject mail from clients without reverse DNS and report it as spam to the DCC\
183 R$* $: <$&{client_resolve}> $1\
184 R<FAIL> $* $# $(macro {dcc_isspam} $@ "SMTP client "$&{client_addr}" has no reverse DNS name" $) TODCC\
185 R<$*> $* $: $2\
186 \
187 ' \
188 -e '}' \
189 \
190 -e "/^S${AUTH}check_mail/,/^SLocal_check_mail/{" \
191 -e '/^SLocal_check_mail/a\
192 # mail from an SMTP client with a verified TLS cert is not spam for dccm\
193 R$* $: <$&{verify}> $1\
194 R<OK> $* $: $(macro {dcc_notspam} $@ STARTTLS verified $) <> $1\
195 # mail authenticated with SMTP AUTH for relaying is also not spam for dccm\
196 R<$*> $* $: <$&{auth_type}> $2\
197 R<$={TrustAuthMech}> $* $: $(macro {dcc_notspam} $@ authenticated $) <> $2\
198 R<$*> $* $: $2\
199 \
200 ' \
201 -e '}'