On 2016-08-22 03:19, Steffen Kaiser wrote:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On Fri, 19 Aug 2016, [email protected] wrote:
On 2016-08-19 12:17, [email protected] wrote:
Aha! Clearly, the vmail user cannot read from nor write to /tmp. (Why
that is, I have no idea, as the /tmp directory's permissions certainly

Thank you very much for taking the time to investigate my use-case and help me work through this, Steffen. I really appreciate it.


Do you have SELinux active?
See almost at the end of
http://wiki2.dovecot.org/WhyDoesItNotWork?highlight=%28selinux%29


No.

# apparmor_status
The program 'apparmor_status' is currently not installed. You can install it by typing:
apt install apparmor

# sestatus
The program 'sestatus' is currently not installed. You can install it by typing:
apt install policycoreutils

allow for both; maybe Dovecot implements this as a security measure.)

No. Dovecot does not implement anything like that.
Do you chroot ?


No. Certainly not intentionally, anyway.

The strace output that I'm capturing in the pipe script pinpointed the problem:

open("/root/~/tmp/sendmail-msg-26272.txt", O_RDONLY) = -1 EACCES (Permission denied)

Er, '/root/~/tmp/' ??


I know. It's weird. Presumably, Bash is responsible for this "unusual" expansion. The raw script source has ~/tmp, so why would Bash prepend it with "/root/", especially when the script is executed as the "vmail" user? Perhaps it's academic at this point, because I've changed all paths to be absolute and they are now resolved correctly.


First: check the SELinux thing.
Second: Do you run in a chrooted environment?
Third: Enclose all your script with logging, e.g.:

#!/bin/bash
(
date
echo "$@"
id
id -a
echo environment
env
set
# check for chroot
echo stat /
stat /
echo /proc/1/mountinfo
awk '$5=="/" {print}' </proc/1/mountinfo
echo /proc/$$/mountinfo
awk '$5=="/" {print}' </proc/$$/mountinfo
# enable bash tracing
set -vx

... # old script
) >> /var/tmp/antispam.$$.log 2>&1

Make sure /var/tmp/antispam.$$.log is writeable, maybe create a new
directory with owner vmail.
Make sure you have 2>&1 at the end. Your log misses all the error messages.
Also, you will now have a log file for each run of the script.

To check for chroot:
stat / should print inode 2, but any mountpoint has inode 2.
/proc/$$/mountinfo displays the physical information of a mount, if
both differ, the current process is chrooted. "1" should be the init
process.

In your script:

for opt; do
        if [[ "$*" =~ .*ham.* ]]

This makes no sense, either use for loop and test "$opt" here, or do
not use for, but use "$*"; .*ham.* should be quoted anyway.

Nice catch. I am by no means a Bash wizard, and I cobbled this together 3-4 years ago. I have no idea what I was thinking at the time.

I removed the "for" loop, leaving only the regex check, and it seems to work as intended. (FWIW, if I add quotes around the test expression, e.g., ".*ham.*", a match is never found and the check fails.)

cat<&0 >> /tmp/sendmail-msg-$$.txt
Well, if for any reason this file exists, ..
cat - >/tmp/sendmail-msg-$$.txt


/usr/lib/dovecot/deliver -d "[email protected]" -m "Training.$mode"
You've already scraped the message from stdin into a file, so add:
< /tmp/sendmail-msg-$$.txt

Yes, but I uncomment that line only for debugging purposes. Normally, I do not take the interim step of saving the message contents to disk, in which case I want dovecot-lda to read from stdin.

About the '-p' switch present in the strace-variant:
Please scan the mailing list for the status of it, IMHO, there had
been lots of trouble in certain cases.

The strace variant should use -oLogfile.strace.$$.log in order to
separate the output of the command and strace logging.

- -- Steffen Kaiser

Good to know; I have made that adjustment, too.

Bash issues aside, I've taken a step back and attempted to make the reproducible test-case as simple as possible, whittling-down the script to only the following, and dovecot-lda still segfaults:

http://pastebin.com/zXzBDcvG

I've added a couple of things to Dovecot's configuration, but they don't make any difference:

# Required for "vmail" user to be able to call dovecot-lda/deliver.
# See: http://wiki.dovecot.org/LDA ("Logging" section)
service config {
  unix_listener config {
    mode = 0600
    user = vmail
    group = vmail
  }
}

protocol lda {
  # Enable logging for dovecot-lda.
  info_log_path = /var/log/dovecot-lda.log
  log_path = /var/log/dovecot-lda-errors.log
  mail_plugins = sieve quota
}

Yet, nothing is logged to either of these files when the pipe script is called.

The permissions on these files look reasonable to me:

-rw-rw---- 1 vmail vmail 0 Aug 23 12:02 dovecot-lda-errors.log
-rw-rw----   1 vmail  vmail              0 Aug 23 12:01 dovecot-lda.log

Here is my current "doveconf -n" output:

http://pastebin.com/hCgpA009

At this point, this seems obvious, but the problem is definitely with using dovecot-lda to send the mail.

If I simply write the contents of the spam/ham message to disk in the pipe script, it works fine. But that approach feels "hackish" to me, as it doesn't account for sieve, quota, etc. And I want the delivery to be logged.

Again, this works fine:

# su vmail
$ /usr/lib/dovecot/deliver -d "[email protected]" -m "Training.HAM" -p /var/vmail/gtube.txt

Here's the output from the logging that we added:

http://pastebin.com/rz2f4S4G

Does anything jump-out?

Thanks again for all your help with this!

--Ben

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1

iQEVAwUBV7qnd3z1H7kL/d9rAQJXWQf9E/ucaEXMy10IE5f7JY3tbZVlROGrz+wk
5rA0/Xe/aFwgNvCzyTX+MV7BblHH//aDwlNs3L4P+bZatCjAVCmoDdQ/WDZ7wr51
mBq/vOjcullnzz8NHv2+gQgRCKhGGd8M+mVjGUlyK6jXEFjwAaivEnRA86AudZi4
ybK0CZKw+Pg+VzDcfGjvO4PHZWAxvbqktqVOUhQwEL/+A/CZ7FNSsBuuZug42TGK
tmghQmAKuwY96djSV/vFax8J8WyVnGKBVLpONP9iMllGkZ7MHGacpfm0MSgsIgPv
DTTdjdk1P6FIQ615rp6BRg0JKaTn7COC6YxMnuaNtlXJ2t/M5zoCNA==
=/xgA
-----END PGP SIGNATURE-----

Reply via email to