110 lines
6.3 KiB
Markdown
110 lines
6.3 KiB
Markdown
# Spam and malware scanning
|
|
|
|
Bongo uses two independent scanners. `bongoantispam` sends mail to a standard
|
|
SpamAssassin `spamd` service for content classification. `bongoavirus` uses
|
|
ClamAV for malware detection. Neither service replaces the other.
|
|
|
|
The antispam agent is fail-open: a connection failure, malformed response or
|
|
configured size limit leaves the original message available for normal
|
|
delivery and records the problem in the log. It never sends a rejection or
|
|
bounce to the apparent sender. A successful SpamAssassin `PROCESS` response
|
|
replaces the queued copy with the processed message containing the normal
|
|
`X-Spam-*` headers and marks the envelope as already checked.
|
|
|
|
The default `antispam` JSON configuration is:
|
|
|
|
```json
|
|
{
|
|
"version": 1,
|
|
"enabled": false,
|
|
"timeout": 15,
|
|
"maximum_message_size": 52428800,
|
|
"maximum_response_size": 53477376,
|
|
"hosts": ["127.0.0.1"]
|
|
}
|
|
```
|
|
|
|
`hosts` accepts the existing `host:port:weight` syntax and can list several
|
|
`spamd` servers. Port 783 is used when no port is specified. The response limit
|
|
must be at least as large as the input limit because SpamAssassin adds headers.
|
|
Both scanner agents are disabled in the distribution defaults. `bongo-setup`
|
|
probes each matching local service with a protocol `PING`. It can explicitly
|
|
enable an unreachable endpoint without touching the scanner package, or—with
|
|
a second opt-in—safely edit a detected local scanner configuration, enable and
|
|
restart its service, and require the expected `PONG`. The local editor uses
|
|
loopback-only listeners, preserves unrelated options, writes an adjacent
|
|
`.bongo-setup.bak`, and rolls files and service state back on failure.
|
|
On systemd installations where clamd receives sockets from
|
|
`clamav-daemon.socket`, setup adds a drop-in for the loopback TCP socket while
|
|
preserving the distribution's Unix socket.
|
|
If SpamAssassin is installed without an initial rule set, setup shows this in
|
|
the preview, downloads the official Apache update key over HTTPS, verifies its
|
|
complete fingerprint `5E541DC959CB8BAC7C78DFDC4056A61A5244EC45`, imports it
|
|
into the `sa-update` keyring, and runs the distribution's `sa-update` before
|
|
touching scanner configuration. The downloaded channel is signature-checked
|
|
by SpamAssassin and must pass `spamassassin --lint`; otherwise setup stops
|
|
before editing files or services. Rule data installed successfully by
|
|
`sa-update` is retained like an antivirus signature update even if a later,
|
|
unrelated setup step is rolled back.
|
|
|
|
The scanner wizard also offers two independent third-party channels:
|
|
|
|
- the signed KAM channel `kam.sa-channels.mcgrail.com`; setup downloads its
|
|
public key over HTTPS and checks the complete fingerprint
|
|
`21D97142272C9066FCAA792B4A156DA524C063D8` before importing it;
|
|
- `spamassassin.heinlein-support.de`, which is unsigned and therefore remains
|
|
an explicit, warned opt-in using `sa-update --nogpg`.
|
|
|
|
Third-party channels are disabled by default. Setup never enables
|
|
`sa-update --allowplugins` for downloaded rules. Every selected update must
|
|
pass `spamassassin --lint` before spamd is restarted. Selection is persisted
|
|
in `/etc/bongo/spamassassin.d/channels`, and setup enables the
|
|
`bongo-spamassassin-update.timer`. The timer runs hourly with a small random
|
|
delay. It invokes KAM with its pinned signing key and Heinlein in a separate,
|
|
explicit `--nogpg` process, so the unsigned-channel exception can never
|
|
disable verification for KAM. If rules changed and passed lint, the active
|
|
`spamassassin.service` or `spamd.service` is reloaded or restarted.
|
|
If an official or KAM signing key changes, setup reports both fingerprints and
|
|
stops before editing or restarting the scanner. Existing rules and the running
|
|
service remain active until an administrator verifies the upstream rotation
|
|
and installs a Bongo update containing the new trust anchor. The difference is
|
|
also recorded below the Bongo state directory and displayed on every
|
|
`bongo-admin config` TUI start until a matching trusted key is imported.
|
|
`bongo-admin config` can configure remote endpoints explicitly; setup never
|
|
attempts to edit a remote scanner.
|
|
|
|
Run `bongo-setup scanners` to repeat only the local scanner editor after a
|
|
package update or service change. This maintenance mode does not rerun initial
|
|
Bongo setup. After each selected endpoint returns the expected `PONG`, it sets
|
|
the loopback endpoint in Bongo's `antispam` or `antivirus` document, enables
|
|
`bongoantispam` or `bongoavirus` in the manager document, synchronizes the
|
|
files with the Store, and reloads the manager. Scanner files, service state,
|
|
and Bongo documents are rolled back together if activation fails. An edited
|
|
but unverified endpoint remains disabled in Bongo.
|
|
|
|
Spam folder rules should match SpamAssassin's `X-Spam-Status` header. A high
|
|
score quarantine is deliberately not implemented through the historical
|
|
global quarantine queue: quarantine state belongs to the recipient and must be
|
|
visible and releasable through that user's task list. Until that per-user path
|
|
is active, mail is tagged and can be filed by Sieve without being destroyed.
|
|
|
|
The Bongo systemd unit only orders Bongo after common ClamAV and SpamAssassin
|
|
unit names when those services are present. It does not pull either scanner in,
|
|
so remote scanners and installations without one of the optional services
|
|
remain supported. The opt-in setup editor understands systemd and OpenRC; it
|
|
does not make scanner packages unconditional Bongo dependencies.
|
|
|
|
The enabled `scanner-health` worker runs every six hours. It checks the age and
|
|
availability of ClamAV daily signatures and the availability of compiled
|
|
SpamAssassin rule files. It also runs Bongo's extra-channel helper in
|
|
`--checkonly` mode, where `sa-update` compares the DNS serial numbers without
|
|
installing data. SpamAssassin rules deliberately have no age limit because a
|
|
valid channel may remain unchanged for months. Missing data, ClamAV data older
|
|
than the default 48 hours, an available extra-channel update, or a failed
|
|
channel check creates a deduplicated administrator task. Healthy data and
|
|
current serial numbers complete the matching task. The Worker never installs
|
|
rules or invokes a service manager. The hourly root-owned systemd oneshot is
|
|
the only Bongo component that updates the opted-in KAM and Heinlein channels.
|
|
The distribution remains responsible for its official Apache SpamAssassin
|
|
channel and FreshClam.
|