i wasn't ever fond of spamd trusting the User supplied by spamc -- and
while identd is an OK hack for folks who run spamd on a network, it seems
overkill for someone running spamd on localhost only. using unix domain
sockets there are two ways to increase the paranoia -- one would be to
pass credentials over the socket, the other is to use a setgid spamc and a
group-restricted unix domain socket. credential passing isn't easily
portable, so being lazy i've been using setgid spamc.
in my setup i have group spamc, and the socket is in /var/run/spamd, and i
set perms like so:
-r-xr-s--x 1 root spamc 22164 Oct 26 23:21 /usr/bin/spamc
drwxr-x--- 2 root spamc 4096 Oct 26 23:22 /var/run/spamd
srw-rw-rw- 1 root root 0 Oct 26 23:22 /var/run/spamd/sock
i stick the sock in a subdirectory which is group protected for historical
reasons ... it's more portable -- older unixen didn't respect unix domain
socket permissions... and prior to SA 3.0.0 i would have had to patch
spamd to get perms on the socket correct.
anyhow there's two more things to be done -- patch spamc to disable -u,
and make it default to this socket (so my users don't need to know these
details).
the patch i use is below, but i'd like to get something accepted upstream
so that i could eventually use a pre-built .deb rather than building my
own. the only part which needs generalizing is setting the default
transport ... i suppose a config file or shell wrapper would solve it.
(i don't like the shell wrapper because it messes with pre-packaged SA.)
suggestions?
-dean
--- spamassassin-3.0.1/spamc/spamc.c.orig 2004-10-22 18:39:18.000000000
-0700
+++ spamassassin-3.0.1/spamc/spamc.c 2004-10-27 11:53:58.000000000 -0700
@@ -277,6 +277,10 @@
}
case 'u':
{
+ if (getuid() && getgid() != getegid()) {
+ printf("you are running setgid, and -u is permitted only
when root\n");
+ ret = EX_USAGE;
+ }
*username = optarg;
break;
}
--- spamassassin-3.0.1/spamc/libspamc.c.orig 2004-10-22 18:39:18.000000000
-0700
+++ spamassassin-3.0.1/spamc/libspamc.c 2004-10-27 11:53:58.000000000 -0700
@@ -1124,8 +1124,13 @@
memset(tp, 0, sizeof *tp);
+#if 0
tp->type = TRANSPORT_LOCALHOST;
tp->port = 783;
+#else
+ tp->type = TRANSPORT_UNIX;
+ tp->socketpath = "/var/run/spamd/sock";
+#endif
tp->flags = 0;
}