Jails gebruiken in FreeBSD

FreeBSD heeft standaard een functie waarmee je jails kan aanmaken (vergelijkbaar met Linux containers). In freebsd zijn deze zeer uitgebreid: Er zijn “Thick Jails” waar elke jail zijn eigen bestandssysteem heeft, “Thin jails” waar maar een paar mappen verschillen en de rest word overgenomen van het basissysteem, en zelfs Linux Jails, waarmee je Linux applicaties kan draaien op een freeBSD kernel! In deze post leg ik uit hoe je Thick Jails kan gebruiken, maar je kan meer lezen over de andere soorten jails in de FreeBSD documentatie.

Lees verder

UFW basics

Op een server is een firewall onmisbaar. Op Debian & Ubuntu is UFW de eenvoudigste manier om een firewall in te stellen. UFW staat voor “The Uncomplicated Firewall” en is dan ook zeer eenvoudig in gebruik. In deze post leg ik de basis uit van UFW.

Lees verder

Freebsd Installeren

Ik heb altijd “FreeBSD” zien staan als optie als ik een VM aanmaakte bij een cloudprovider, maar ik heb er nooit mee geëxperimenteerd. Ik heb besloten om er mee te experimenteren in een VM. In deze post zal ik de installatie van FreeBSD toelichten

Lees verder

Nat instellen in proxmox

Binnen proxmox word standaard gebruik gemaakt van briding. Dit is echter niet altijd handig (we hebben bijvoorbeeld maar 1 IP adres tot onze beschikking. Gelukkig kunnen we met iptables aan maquerading doen.

Voeg het volgende toe aan /etc/network/interfaces:

auto vmbr1
iface vmbr1 inet static
        address  10.0.0.1/24
        bridge-ports none
        bridge-stp off
        bridge-fd 0

        post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
        post-up   iptables -t nat -A POSTROUTING -s '10.0.0.0/24' -o enp35s0 -j MASQUERADE
        post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/24' -o enp35s0 -j MASQUERADE
        ## do do a port-forward to the VM with "lan" ip 10.0.0.3 from the host port 8080 the VM port 80
        ## you can use a line like this.
        # post-up   iptables -t nat -A PREROUTING -i enp35s0 -p tcp --dport 8080 -j DNAT --to 10.10.10.3:80

vervolgens kunnen we het netwerk herladen met

ifreload -a

 

Pelican & Jenkins

Met de volgende jenkinsfile kan je automatisch een Pelican site bouwen met Jenkins. Dit maakt gebruik van deSFTP publish en Docker plugins

pipeline {
  agent {
    docker {
      image 'python:3.8'
    }
  }
  stages {
    stage('setup') {
      steps {
        withEnv(["HOME=${env.WORKSPACE}"]) {
          sh 'python -m pip install --user --upgrade pip "pelican[markdown]"'
          sh 'python --version'
          sh 'python -m pelican --version'
        }
      }
    }
    stage('publish - web') {
      steps {
        withEnv(["HOME=${env.WORKSPACE}"]) {
          sh 'python -m pelican content -s publishconf.py'
        }
        sshPublisher(
          publishers: [
            sshPublisherDesc(
              configName: 'vincentlammens.be',
              sshRetry: [retries: 5, retryDelay: 10000],
              transfers: [
                sshTransfer(
                  remoteDirectory: '',
                  removePrefix: 'output/',
                  sourceFiles: 'output/**/*'
                )
              ]
            )
          ]
        )
      }
    }
  }
  
  post {
    always {
      cleanWs()
    }
  }
}

Caching met apache’s mod_cache

Caching is bij drukbezochte sites een must. Het verminderd de load op de webserver door de gegenereerde pagina’s op te slaan. Hierdoor word de database minder belast bij dynamische websites waardoor de webserver meer tijd heeft voor andere bezoekers.

Apache heeft een module, `mod_cache` die door middel van een paar opslagmechanismen (disk, shared memory, redis, memcached of zelf een DBM file) een snelle cache voorziet voor Apache. mod_cache is standaard als 1e laag in de processing stack, maar dit kan aangepast worden.

Eenvoudige configuratie

In de documentatie staat een voorbeeld van een eenvoudige configuratie. Als we deze
lichtjes aanpassen voor onze omgeving (in dit geval gaan we `/var/cache/httpd` gebruiken om de cache op te slaan, je moet deze map standaard zelf nog aanmaken).

<IfModule mod_cache.c>
<IfModule mod_cache_disk.c>
CacheRoot "/var/cache/httpd"
CacheEnable disk "/"
CacheDirLevels 2
CacheDirLength 2
CacheLock on
CacheLockMaxAge 5
CacheIgnoreHeaders Vary DNT User-Agent Accept Accept-Encoding Accept-Language
</IfModule>
</IfModule>

Hierna moeten we zorgen dat mod_cache en mod_cach_disk zijn ingeladen met `a2enmod mod_cache mod_cache_disk`.

Vervolgens moet onze applicatie `Cache-control:` headers meegeven. Deze worden gebruikt om te vertellen hoe lang een pagina mag gecached worden. Afhankelijk van het soort pagina, en de updatefrequentie stel je deze in. Een blog waar vaak updates worden gepost is `300` seconden bijvoorbeeld een goed begin. Vaste pagina’s op die blog die zelden veranderen (zoals de ‘about’ pagina) kunnen dan weer een langere tijd krijgen, zoals `3600` seconden of zelfs `86400` seconden (1 dag).

Met apache komt standaard ook htcacheclean, een tool om de disk cache op te schonen. Deze tool kan je als daemon of als cronjob pereodiek uitvoeren om de groote van de cache map te beperken. Het onderstaande commando zal zorgen dat er maximaal 1GB aan data cachen, of 50000 inodes in gebruik nemen.

htcacheclean -p /var/cache/httpd -l1G -L50000 -n -t

 

Linux processen beperken in CPU gebruik

Nice

Met nice kan een process een prioriteit toegekend worden. Prioriteiten zijn een manier om de scheduler te vertellen welke processen voorang krijgen op minder belangerijke processen. Dit kan met renice ook op een process dat al draait. Nice waarden gaan van -20 (hoogste) tot 19 (laagste). Standaard is deze waarde 0.

Het gebruik van nice is zeer eenvoudig, je plaatst nice -n <prioriteit> voor het commando dat je wenst uit te voeren, bijvoorbeeld nice -n 19 tar -zcf /var/backups/home.tgz /home/.

De scheduler zal processen met een hoge nice waarde (dus lage prioriteit) minder cpu tijd geven dan processen met een hogere prioriteit. Heel handig voor bijvoorbeeld zware backup processen.

Default nice voor een linux gebruiker

De standaard nice waarde voor een linux gebruiker is 0. Dit kan echter aangepast worden in /etc/security/limits.conf door de priority parameter in te stellen voor een bepaalde gebruiker/groep. Bijvoorbeeld:

gebruiker   hard    priority    10

Cpulimit

cpulimit is een programma dat met behulp van SIGSTOP en SIGCONT signalen het gemiddelde cpu-percentage van een process beperkt tot een gegeven percentage. Dit commando werkt net zoals nice door het te plaatsen vlak voor het commando dat je wilt uitvoeren:

cpulimit -l 50 tar -zcf /var/backups/home.tgz /home/

Het voorbeeld hierboven zou de backup van de /home/ directory beperken tot 50% cpu snelheid.

Indien een process subprocessen spawned, is het belangerijk om aan cpulimit ook de -m parameter mee te geven.

Spamassassin regels maken

Waar voeg je spamassassin regels toe

Je kan spamassassin op verschillende plaatsen toevoegen, je kan het toevoegen aan de globale configuratie (`/etc/mail/spamassassin/local.cf`) of aan de user-configuratie, indien ingeschakeld. (`~/.spamassassin/user_prefs`).

Standaard staat het toevoegen van regels in de user-configuratie standaard uit als spamassassin draait als spamd. Dit is uit veiligheids en performance overwegingen. Spamassassin moet in dat geval namelijk de regels telkens compileren bij elke mail, wat niet het geval is bij de globale configuratie.

De keuze waar je je regels toevoegd licht uiteraard bij jou.

Regels schrijven

Om te voorkomen dat regels overlappen met bestaande regels, word aangeraden om ze een prefix te geven. bijvoorbeeld `LOCAL_` of je initialen `VL_`.

Body regels

Om in de tekst van een mail op een bepaald woord te filteren kan je een regel zoals hieronder aanmaken. Deze regel filters op “test”, maar ook op “testpersoon”.

Spamassassin maakt gebruikt van reguliere expressies, met name die van perl.

`BODY_BEVAT_TEST` is hier de naam van de test.

body BODY_BEVAT_TEST /test/
score BODY_BEVAT_TEST 0.1
describe BODY_BEVAT_TEST dit is een test regel

De `score` regel, bepaald welke score word toegevoegd als een mail met deze regel matched. Dit kan altijd in user_prefs per-user worden aangepast.
de `describe`regel bevat wat extra info over de regel.

Wil je enkel op “test” filteren maar niet op “testpersoon”, dan kan je een het woord omringen met `\b`

body BODY_BEVAT_TEST /\btest\b/
score BODY_BEVAT_TEST 0.1
describe BODY_BEVAT_TEST dit is een test regel

we kunnen dit ook nog case-insensitive maken door `i` achter de reguliere expressie te hangen. (`body BODY_BEVAT_TEST /\btest\b/i`)

Header regels

Om te filteren op het onderwerp, de verzender of andere headers kunnen header regels gebruikt worden. Deze werken net zoals body regels met reguliere expressies. Om bijvoorbeeld een test te maken die het onderwerp controleerd op “test” kunnen we een regel als volgt aanmaken

header SUBJECT_BEVAT_TEST Subject =~ /\btest\b/i
score SUBJECT_BEVAT_TEST 0.1
describe SUBJECT_BEVAT_TEST deze mail bevat test in het onderwerp

De gespecifieerde header (in dit voorbeeld `Subject`) is altijd case-insentitive.

Meta regels

Meta regels zijn heel handig om complexere regels te maken. Deze laten toe om meerdere tests te combineren en de score aan te passen aan bijvoorbeeld het aantal keer dat de regel matched tegen een mail.

body __BEVAT_TEST1 /\btest1\b/i
body __BEVAT_TEST2 /\btest2\b/i
body __BEVAT_TEST3 /\btest3\b/i
meta BEVAT_TEST1_TEST2_TEST3 ((__BEVAT_TEST1 + __BEVAT_TEST2 + __BEVAT_TEST3)>1)
score BEVAT_TEST1_TEST2_TEST3 0.3

Dit voorbeeld voegt 0.3 score toe als de mail zowel de strings “test1”, “test2” en “test3” tegelijk bevat.

Regels testen

Na het schrijven van regels laat je spamassassin beter de configuratie eens linten. dit kan je doen met `spamassassin –lint`.