lokale website voor whitelist beheer

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20-05 14:11
Ik ben denk ik een beetje op zoek naar inspiratie:

TLDR:
Concreet denk ik dat ik een lokaal draaiende website zoek om simpelweg entries toe te kunnen voegen aan een whitelist textfile - specifiek /etc/postgrey/whitelist_recipients.

Wat uitgebreider:
Heb een eigen domeinnaam en een klein servertje in de meterkast waar een mailserver & webserver op draait. Voor mail gebruik ik het systeem dat elke instantie waar ik mee mail een eigen mailadres toegewezen krijgt, dus zou ik met, bijvoorbeeld, de Gamma mailen dan gebruik ik "gamma@<domeinnaam>". Dus op die manier heb ik ondertussen al vele tientallen verschillende mailadressen in gebruik.

Nou is in principe elk mailadres (dus *@<domeinnaam>") hier geldig op een paar blacklist entries na, dus als je mij mailt op "sdufasfda@<domeinnaam>" dan komt dat in principe gewoon in m'n mailbox terecht. Geen probleem, maar ik moet het hier dus wel hebben van spamfiltering. Een van de maatregelen die erg effectief is is greylisting met postgrey.

Het probleem: er wil nog wel eens een flinke vertraging zitten in de ontvangst van het eerste mailtje die je op een 'nieuw' adres ontvangt, wat hinderlijk kan zijn als je ergens op zit te wachten. De huidige aanpak die ik hanteer: met ssh inloggen op m'n server, een entry toevoegen aan de whitelist van postgrey en postgrey herstarten.

De oplossing zoals ik die nu voor mij zie: een mini-website die op m'n server draait met enkel een invulbox waar ik een nieuwe entry in kan invoeren die vervolgens aan de whitelist van Postgrey toegevoegd wordt (en vervolgens postgrey herstart).

Wat kan ik: ik ben redelijk handig met Linux, maar websites bouwen is niet mijn ding. Eenvoudige Bash scripts schrijven gaat mij wel redelijk goed af, maar Perl, PHP, Python en andere programmeertalen zitten bij mij op het niveau 'lezen lukt, modificeren gaat ook nog wel, van scratch schrijven is wellicht TE uitdagend".

Ofwel, ik zoek inspiratie: is er al een kant-en-klare oplossing voor mijn 'probleem'? Ik heb gezocht naar 'whitelist maintenance' maar kom dan hooguit dingen tegen als plugins voor drupal of commerciele
toepassingen.
En als er nog geen kant-en-klare oplossing is... wat is dan de meest eenvoudige en laag-drempelige kant die ik op zou moeten op zelf iets te maken?
En zoals zo vaak als je zelf al een oplossing in gedachte hebt: zoek ik in de verkeerde richting en moet ik een hele andere richting op denken?

Alle reacties


Acties:
  • 0 Henk 'm!

  • aawe mwan
  • Registratie: December 2002
  • Laatst online: 21:52

aawe mwan

Wat ook leuk is:

vanaalten schreef op zondag 31 december 2023 @ 15:27:
[...]
De huidige aanpak die ik hanteer: met ssh inloggen op m'n server, een entry toevoegen aan de whitelist van postgrey en postgrey herstarten.
[...]
Is het niet handig om op de remote machine een Bash scriptje beschikbaar te hebben, dat de benodigde aanpassing uitvoert? Dat script (en bijbehorende parameters) start je dan via ssh, zonder in te loggen.
Door middel van een ssh-key zorg je er voor dat dit kan zonder een password in te typen. Eventueel maak je een aparte user aan op de remote machine, die niets anders kan dan jouw scriptje uitvoeren.

Voorbeeld:
16:21 XXX ~$ wc /etc/fstab
  20  126 1213 /etc/fstab

16:23 XXX ~$ ssh $systeem wc /etc/fstab

XXX 2023-12-31 - Unauthorized access to this machine is prohibited

  6  26 227 /etc/fstab

[ Voor 17% gewijzigd door aawe mwan op 31-12-2023 16:30 ]

„Ik kan ook ICT, want heel moeilijk is dit niet”


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20-05 14:11
aawe mwan schreef op zondag 31 december 2023 @ 16:17:
[...]


Is het niet handig om op de remote machine een Bash scriptje beschikbaar te hebben, dat de benodigde aanpassing uitvoert? Dat script (en bijbehorende parameters) start je dan via ssh, zonder in te loggen.
Door middel van een ssh-key zorg je er voor dat dit kan zonder een password in te typen. Eventueel maak je een aparte user aan op de remote machine, die niets anders kan dan jouw scriptje uitvoeren.

Voorbeeld:
16:21 XXX ~$ wc /etc/fstab
  20  126 1213 /etc/fstab

16:23 XXX ~$ ssh $systeem wc /etc/fstab

XXX 2023-12-31 - Unauthorized access to this machine is prohibited

  6  26 227 /etc/fstab
Dat zou kunnen, maar werkt alleen als je toegang hebt tot ssh en die remote key ook bij je hebt. Op een mobiele (Apple) telefoon vind ik ssh al niet de meest makkelijke manier, bijvoorbeeld. En het wil nog wel eens gebeuren dat ik bij de balie van een hotel of wat dan ook ben, daar een mailadres geef en ter plekke die aan de Postgrey whitelist wil toevoegen.

Maar in de tussentijd ben ik er toch maar eens zelf mee aan de slag gegaan en heb in basis dit al werkend: een PHP script dat een simpel entry box formulier laat zien, eerst checkt of de ingevoerde entry al in de lijst staat en zo niet, die toevoegt en Postgrey herstart. En dat werkt al prima - enige dat ik nog wil doen is het geheel achter een Apache authentication-popup stoppen.

Dus dit is typisch iets waar ik flink tegenaan zat te hikken maar weinig voorstelde toen ik er eenmaal gewoon aan begon. Maar goed, dit topic was ook om na te gaan of ik een bestaande of alternatieve oplossing over het hoofd zag. Daar lijkt het dus niet op. :)

Acties:
  • 0 Henk 'm!

Anoniem: 80910

Bij php heb je file_get_content, file_put_content en exec om dingen uit te voeren. Bij web heb je het probleem dat je user www-data waarschijnlijk je setup niet mag herstarten. Dus daarvoor moet je iets handigs verzinnen, zoals een cronjob als root uitvoeren

Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20-05 14:11
Even voor de compleetheid wat ik nu gemaakt heb:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
!DOCTYPE HTML>  
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>  

<?php
// define variables and set to empty values
$f_whitelist = "/etc/postgrey/whitelist_recipients";
$entryErr = "";
$entry = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  if (empty($_POST["entry"])) {
    $entryErr = "Entry is required";
  } else {
    $entry = htmlspecialchars(stripslashes(trim($_POST["entry"])));
    // check if entry only contains letters/digits/minus/underscore
    if (!preg_match("/^[a-zA-Z0-9-_]*$/",$entry)) {
      $entryErr = "Only letters, digits, minus and underscore allowed";
    } else {
      $entryErr = "OK";
    }
  }
}
?>

<h2>Postgrey whitelist addition</h2>
<p><span class="error">* required field</span></p>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
  Entry: <input type="text" name="entry" value="<?php echo $entry;?>">
  <span class="error">* <?php echo $entryErr;?></span>
  <br><br>
  <input type="submit" name="submit" value="Submit">  
</form>

<?php
if ( $entryErr == "OK" ) {
  $entry = $entry ."@";

  $entry_exists = 0;
  $whitelist = file($f_whitelist);
  foreach ($whitelist as $line_num => $line) {
    if ( strcasecmp(htmlspecialchars(trim($line)), $entry) == 0 ) { $entry_exists++;}
  }
  if ( $entry_exists > 0 ) {
    echo "$entry already exists $entry_exists times in the whitelist.";
  } else {
    echo "Adding $entry to the whitelist<br>";
    $myfile = fopen("$f_whitelist", "a") or die("Unable to open file!");
    fwrite($myfile, $entry . "\n");
    fclose($myfile);
  }
}

?>
</body>
</html>
...wat dus simpelweg een form geeft om een nieuwe entry toe te voegen, waarna er wat sanitizing gedaan wordt om foute invoer af te vangen. Daarna wordt de Postgrey whitelist ingelezen en gekeken of de entry al bestaat en, zo niet, wordt de file geopend voor 'append' en een nieuwe entry toegevoegd.

Het herstarten was een beetje een puzzel. Mijn eerste aanpak was om in /etc/sudoers een entry voor www-data toe tevoegen, heel specifiek voor het herstarten van Postgrey. Dat werkte, maar het voelde voor mij toch wat fout om user www-data wat sudo-rechten te geven, al helemaal om iets met systemd te laten doen.

Een cronjob als root had gekund (om de vijf minuten kijken of de whitelist veranderd is, bijvoorbeeld) maar geeft dan toch een ongewenste vertraging.

Huidige oplossing: incrond geinstalleerd en een config gemaakt om de whitelist te monitoren en zo nodig Postgrey te herstarten. Dan hoeft www-data enkel toegang te hebben tot de whitelist-file en geen extra rechten te krijgen. En dit alles werkt vooralsnog zoals ik wil.

Het php script hierboven heb ik vervolgens achter een Apache authentication gezet, want uiteraard mag niet iedereen entries aan de whitelist toevoegen. :)

Mocht er commentaar of aanmerkingen op bovenstaande zijn, dan hoor ik dat graag. :)

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 21:35

Hero of Time

Moderator LNX

There is only one Legend

Je kan het ook puur met systemd doen via een .path unit dat naar je bestand wijst en acties doet. Zie https://www.putorius.net/systemd-path-units.html.

Maak een .path unit en een aparte unit dat getriggered wordt door de .path unit. Dat herstart je postgrey unit. Omdat je van alles kan gebruiken voor die 'tussen' unit kan je er een script in zetten die wat meer sanity checks doet, zoals config valideren en dan postgrey herstart.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20-05 14:11
Hero of Time schreef op woensdag 3 januari 2024 @ 20:26:
Je kan het ook puur met systemd doen via een .path unit dat naar je bestand wijst en acties doet. Zie https://www.putorius.net/systemd-path-units.html.

Maak een .path unit en een aparte unit dat getriggered wordt door de .path unit. Dat herstart je postgrey unit. Omdat je van alles kan gebruiken voor die 'tussen' unit kan je er een script in zetten die wat meer sanity checks doet, zoals config valideren en dan postgrey herstart.
Ah, dat is mogelijk ook een leuke oplossing daarvoor. Ik ben nog steeds wat anti-systemd, maar dit is wellicht toch beter dan een complete nieuwe tool installeren puur voor dit gebruik. Zal er eens naar kijken, bedankt!

Acties:
  • 0 Henk 'm!

  • Oon
  • Registratie: Juni 2019
  • Niet online

Oon

Is het niet veel simpeler om een standaard mailserver met catch-all in te stellen, en voor je blacklist gebruik te maken van een standaard spamfilter (spamassassin of rspamd)?
Voor die setups heb je gewoon web UIs zoals Mail-in-a-Box en mailcow, waarbij je in het ergste geval bijv. Roundcube zou kunnen gebruiken om een Sieve-filter te beheren voor je 'vlugge' blacklist.

Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20-05 14:11
Oon schreef op donderdag 4 januari 2024 @ 08:17:
Is het niet veel simpeler om een standaard mailserver met catch-all in te stellen, en voor je blacklist gebruik te maken van een standaard spamfilter (spamassassin of rspamd)?
Voor die setups heb je gewoon web UIs zoals Mail-in-a-Box en mailcow, waarbij je in het ergste geval bijv. Roundcube zou kunnen gebruiken om een Sieve-filter te beheren voor je 'vlugge' blacklist.
Mailserver met catch-all heb ik al, net als spamassassin. Het probleem met die catch-all is dat een spammer dus willekeurige adressen kan gebruiken om spam naar mij te sturen. Dan helpt een postfix blacklist om gelekte adressen (dropbox@<mijndomein> bijvoorbeeld) te blocken. En dan helpt spamassassin om spam op gegokte adressen te filteren.

Maar Postgrey, greylisting, helpt al de stroom in te dammen voor iets is binnengekomen. Alleen heeft dat wat hinderlijke bijwerkingen waar ik omheen wil werken door de whitelist van postgrey makkelijk te kunnen updaten - wat ik nu dus voor elkaar heb gekregen. :)

En achteraf was het wellicht beter geweest als ik geen catch-all had gebruikt, maar vanaf het allereerste begin een whitelist voor het ontvangen van mail had gebruikt - maar daar is het nu een beetje te laat voor, want ik heb geen overzicht van wat ik afgelopen twintig jaar allemaal aan mailadressen in gebruik heb genomen.
Pagina: 1