Ik ben de laatste tijd wat aan het experimenteren met FreeBSD. In deze post licht ik toe hoe ik een Apache, MySQL en PHP stack op FreeBSD heb geïnstalleerd.
Categorie archieven: Devops
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.
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.
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
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
ProFTPd installeren in Debian 12
ProFTPd is een FTP server die zeer praktisch is. Het laat toe om virtuele gebruikers aan te maken en meer. In deze post ga ik toelichten hoe ik ProFTPd configureer met Virtual user support en TLS.
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`.