Cover Image

Sende systemmail/systemrapporter fra Linux til en spesifikk mailadresse

 Mon 2024-04-15    

Jeg liker å samle inn og se systemrapporter fra serverne jeg administrerer. Det jeg ikke liker, er å måtte logge inn på hvert enkelt system for å lese disse rapportene med mail eller alpine. Det funker jo, men det er mer jobb enn jeg egentlig vil legge i det.

Siden slutten av 90-tallet har jeg hovedsaklig brukt BSD-systemer for serveroppgaver. Dette har fungert alldeles utmerket, men de siste årene har jeg begynt å migrere tjenester til Docker, som ikke er tilgjengelig for BSD. Jeg har også begynt å sette veldig pris på enkel oppdatering og oppgradering, noe som i og for seg ikke er veldig vanskelig på FreeBSD (som er serverOSet jeg har brukt de siste 20 årene) heller, men tidvis støter jeg på problemer som ikke kan løses på annen måte enn å kompilere koden fra ports. Dette tar tid, og ofte dras det inn dependencies jeg ikke trenger eller vil ha, som Rust. Rust krever over 40GB diskplass for å kompileres. Serverne mine er som regel satt opp med 20GB eller mindre, siden de gjør små og spesialiserte oppgaver som ikke krever mye diskplass. Det sier seg selv at dette ikke funker. Ja, jeg kan installere en prekompilert binary av Rust og da vil ting funke, selv om binaryen kanskje ikke er aller siste versjon... og da fungerer det helt til jeg likevel må kompilere noe fra ports og dette trigger en kjedereaksjon som oppgradere masse greier, deriblant Rust.

Jeg har ikke tid til å sitte en helg og finne ut av hvorfor en tjeneste som har fungert knirkefritt i 15 år plutselig ikke lenger funker (et bibliotek den trenger ble skrevet om i Rust og dette trigget kompilering av Rust som fylte disken og alt døde brutalt), så nå migrerer jeg til Debian Linux og docker-containere så langt det lar seg gjøre.

Uansett, poenget var ikke at Rust er en svær mastodont som (for meg) bare skaper problemer, men at jeg liker å få daglige, ukentlige og månedlige rapporter om serverens tilstand. På FreeBSD har jeg løst dette ved å installere Postfix og gjenbruke en gammel config som Bare Funker(tm). Når jeg gjør det samme på Linux får jeg ingen rapporter. Jeg skjønner ikke hvorfor.

Jeg har dog funnet en løsning: ssmtp.

ssmtp fungerer som en lokal mailklient som logger seg inn på mailserveren man angir og sender mailen som en autentisert bruker, ikke bare en tilfeldig systembruker. Dette har flere fordeler - man ser med en gang om oppsettet fungerer, og man har kontroll på hvem som faktisk sender mailen. Man slipper også å sette opp og vedlikeholde mange mailservere og bekymre seg for at man setter dem opp feil og de fungerer som åpne relays.

ssmtpinstalleres så enkelt som: apt install ssmtp

I /etc/ssmtp ligger det to filer, revaliases og ssmtp.conf.

revaliases er en reverse-mapping av lokal bruker som mottar systemmailer (typisk root), til en ekstern mailadresse. Man spesifiserer også hvilken server og port mailen skal sendes ut via, i denne filen.

ssmtp.conf er configfilen for ssmtp. Denne inneholder faktisk samme informasjon som revaliases, men formattert på en annen måte. Jeg skjønner ikke helt hvorfor det er gjort sånn, men begge filene må eksistere for at det skal fungere.

Opprett/endre filene i /etc/ssmtp fra det de er til følgende:

/etc/ssmtp/revaliases:

# sSMTP aliases
#
# Format:       local_account:outgoing_address:mailhub
#
# Example: root:your_login@your.domain:mailhub.your.domain[:port]
# where [:port] is an optional port number that defaults to 25.
root:systemmailcatcher@example.com:mail.example.com:587

Merk at portnummeret IKKE skal i firkantparenteser - gjør man det får man feilmelding og ingenting virker.

/etc/ssmtp/ssmtp.conf:

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=systemmailcatcher@example.com

# The place where the mail goes. The actual machine name is required no
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=mail.example.com:587

# Where will the mail seem to come from?
rewriteDomain=example.com

# The full hostname
hostname=mail.example.com #endre dette til det fulle hostnavnet på serveren som sender mailen

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES
AuthUser=authenticateduser@example.com
AuthPass=SuperSecretPassword123
UseTLS=YES
UseSTARTTLS=YES

Det er alt. ssmtp ligger og snuser på mailfilen til root og sender mail som kommer dit, til den angitte adressen i configfilen(e). Det er ingen tjeneste som må startes, det Bare Funker(tm). Mye lettere enn Postfix, ingen sertifikater å ta hensyn til, ingen potensielle åpne relays.