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`.

Site automatisch deployen met git hooks

Om een repository automatisch te deployen kan je de volgende git hook toevoegen aan de git repository.
Deze hook voeg je toe aan een bare repo. Deze maak je aan met `git init –bare ~/git-repo.git`. Hierna plaats je de volgende code in het bestand `~/git-repo.git/hooks/post-receive`.

#!/bin/bash
TARGET="/home/user/target-dir"
GIT_DIR="/home/user/git-repo.git"
BRANCH="master"

while read oldrev newrev ref
do
	# only checking out the master (or whatever branch you would like to deploy)
	if [ "$ref" = "refs/heads/$BRANCH" ];
	then
		echo "Ref $ref received. Deploying ${BRANCH} branch to production..."
		git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f $BRANCH
	else
		echo "Ref $ref received. Doing nothing: only the ${BRANCH} branch may be deployed on this server."
	fi
done

Daarna moet je het bestand gewoon nog uitvoerbaar maken (`chmod -x ~/git-repo.git/hooks/post-recieve`) en naar de repository pushen (bijvoorbeeld over ssh als deze op een remote host staat)

MySQL Ram gebruik verminderen

Ik merk vaak dat de MySQL server wel eens veel ram gebruikt op mijn webserver (die maar 1GB ram heeft). Een oplossing hiervoor is om `performance_schema = off` toe te voegen aan de mysql configuratie (/etc/mysql/my.cnf) onder het blokje `[mysqld]`

# ...
[mysqld]
# ... 
performance_schema = off # <-- Toevoegen aan configuratie onder [mysqld]
# ...

MySQL Server Installatie Automatiseren

Ik moest onlangs voor school een MySQL server installeren in een VM. Omdat een mysql server installatie
een interactieve prompt gebruikt voor de `mysql_secure_installation` ben ik op zoek gegaan naar een alternatieve
manier om dezelfde stappen te kunnen doen in een shellscript, om zo de installatie te automatiseren.

Het root wachtwoord kan ingesteld worden met `mysqladmin password “password”`, de overige opties kunnen uitgevoerd
worden met SQL queries:

– Anonieme gebruikers verwijderen:
“`sql
delete from mysql.user where user=”;
“`
– Test databases verwijderen:
“`sql
drop database if exists test;
delete from mysql.db where Db=’test’ or DB=’test\\_%’;
“`

Hieronder het gehele script, alsook extra regels die een extra superuser ‘admin’ aanmaken en mysql doen luisteren op all ip’s.

#!/bin/bash
# Dit script automatiseerd de installatie van een MySQL server op een Ubuntu Server
# Voor vragen/hulp mail vincent@vincentlammens.be
#
# Getest op Ubuntu 20.04
#
# 1. Installatie van de software
# ------------------------------
# Eerst moeten we de benodigde software installeren. In dit geval is het enkel het pakket
# 'mysql-server' dat we moeten installeren.
sudo apt update;
sudo apt install mysql-server -y;

# 2. MySQL Secure Installation
# ----------------------------
# De eerste stap is om MySQL veilig in te stellen. Hiervoor word normaal gebruik gemaakt van
# 'mysql_secure_installation'. Echter kan dit ook op een non-interactieve manier waarmee het te
# automatiseren is in een script
# zie: https://vincentlammens.be/blog/2021/02/23/mysql-server-installatie-automatiseren/
# !! NOOT:
# Hiermee word het root wachtwoord op 'root' gezet, en een extra superuser 'admin' gemaakt met
# wachtwoord 'admin'. Dit is niet veilig. Idealieter word dit vervangen door een veiliger
# wachtwoord, of een random gegenereerd wachtwoord.
sudo mysqladmin password "root";
sudo mysql --user=root <<EOF
delete from mysql.user where user='';
drop database if exists test;
delete from mysql.db where Db='test' or DB='test\\_%';
flush privileges;
create user 'admin'@'%' identified by 'admin';
grant all privileges on *.* to 'admin'@'%' with grant option;
flush privileges;
EOF

# 3. MySQL laten luisteren op alle ip's
# -------------------------------------
# Standaard luisterd MySQL server enkel op localhost. Hiervoor moet het bind-address ip veranderd
# worden van '127.0.0.1' naar '0.0.0.0'. Dit kunnen we automatiseren met het programma 'sed'.
sudo sed -i "s/.*bind-address.*/bind-address=0.0.0.0/" /etc/mysql/mysql.conf.d/mysqld.cnf
#restart mysql
sudo service mysql restart

Apache Authenticatie op verschillende manieren

In deze tutorial leg ik uit hoe je op verschillende manieren de toegang tot een website beperkt met apache. Dit kan op enkele manieren: ip-gebaseerd, of uit een bestand, of door middel van een database.

Toegang beperken per IP

Er zijn verschillende manieren, de makkelijkste is om het per IP te beperken. Zo kan je bijvoorbeeld de toegang tot je site beperken tot de ip’s van de developers bijvoorbeeld.

Om dit te doen maak je een bestandje in jouw website aan met de naam `.htaccess`. Zet je dit in een bepaalde map, dan word de toegang tot enkel die map beperkt.

Het stukje hieronder laat enkel gebruikers toe met het IP 12.34.56.78. Wil je meer ip’s toegang geven, dan kan je ze er gewoon aan toe voegen, gesplitst met een spatie.

<RequireAll>
Require all denied
Require ip 12.34.56.78
</RequireAll>

Ook het omgekeerde is mogenlijk, bijvoorbeeld een bepaald IP de toegang beperken.

<RequireAll>
Require all granted
Require not ip 78.65.43.21
</RequireAll>

Ook hier kan je gewoon ip’s toevoegen gesplitst met een spatie.

Toegang beperken met een wachtwoord

Eerst moet je een gebruiker & wachtwoord maken. Hiervoor moet je het linux commando `htpasswd` gebruiken

“`s
htpasswd -cB .htpasswd gebruikersnaam
“`

Dit zal je om een wachtwoord vragen en het in het bestand `.htaccess` zetten. om een 2e gebruiker toe te voegen kan je enkel `htpasswd -B .htpasswd gebruiker2` gebruiken, de `-c` vlag maakt namelijk een nieuw bestand aan.

Om dit te doen maak je een bestandje in jouw website aan met de naam `.htaccess`. Zet je dit in een bepaalde map, dan word de toegang tot enkel die map beperkt, je zet er het volgende in:

AuthName "Beveiligd gedeelte" 
AuthUserFile /pad/naar/.htpasswd 
AuthGroupFile /dev/null 
AuthType Basic 
require valid-user

Je moet uiteraard het pad vervangen naar het pad naar het htpasswd bestand.

Als je hierna de site bezoekt zal je gevraagd worden om een gebruikersnaam & wachtwoord in te geven.

 

Alma Linux Beta (RHEL) Installeren

Eind vorig jaar kondigde Centos aan dat ze de focus gingen leggen naar CentOS Steam, een Rolling release die gebruikt word als development branch voor de RedHat Distributie. Hierbij werd ook de ondersteuning voor CentOS 8 verkort, en zal eind dit jaar geen support meer krijgen. Er zijn een aantal alternatieven gekomen, waaronder Alma Linux. Alma Linux word gemaakt door de makers van CloudLinux, en is volledig Open Source. In deze Tutorial leg ik uit hoe je AlmaLinux installeert

Lees verder

Handige SSH Tips

In deze post ga ik enkele handige SSH-tips toelichten.

SSH Port forwarding

Het is mogenlijk om via SSH een poort op de ssh-server door te sturen naar een poort op jouw locale machine. Dit kan bijvoorbeeld gebruikt worden om door een firewall te komen.

ssh -L 80:voorbeeld.be:80 server.be

Hier maak je verbinding met de server `server.be` en worden alle aanvragen naar jouw eigen toestel (`localhost`) doorgestuurd (door de ssh server `server.be`) naar voorbeeld.be. Het poortnummer kan je naar wens aanpassen, links is de local port, rechts is de poort op voorbeeld.be die je naar de local port wilt doorsturen.

Reverse port forwarding

Met reverse port forwarding doe je eigenlijk hetzelfde als hierboven, maar omgekeerd. De client zet een verbinding op zodat de server aan de poort op de client kan. De syntax is bijna identiek Lees verder

Linux LAMP server tutorial

In deze tutorial leg ik je uit hoe je van jouw linux computer of server een webserver maakt met behulp van LAMP.

LAMP staat voor Linux Apache Mysql Php, dat zijn de onderdelen waar de meeste webservers gebruik van maken. Ik ga in deze tutorial gebruik maken van Ubuntu 18.04, maar deze stappen zijn voor de meeste ubuntu- en debian versies gelijk.

Apache installeren

Apache is de webserver. Deze is de meest gebruikte webserver en is dan ook zeer gemakkelijk en uitgebreid te configureren. Installeren doe je met het volgende commando:

sudo apt install apache2 -y

Als je nu naar het ip-adres van jouw server surft, dan zul je een pagina zoals hieronder te zien krijgen:

je kan deze pagina aanpassen door de inhoud in /var/www/html/ aan te passen.

PHP

Php zorgt ervoor dat je dynamishe inhoud kan gebruiken op jouw webserver. De installatie is zeer eenvoudig en doe je met onderstaand commando:

sudo apt install php libapache2-mod-php -y

Als je nu naar de /var/www/html/ map gaat en het index.html bestand verwijderd, en er een index.php bestand in de plaats zet met volgende inhoud:

<?php phpinfo(); ?>

En dan opnieuw naar het ip van jouw server gaat, dan zul je een pagina vol info over php zien, wat tevens ook wilt zeggen dat php goed is ingesteld.

MySQL

MySQL zorg ervoor dat je databases kan gebruiken. de Installatie is eenvoudig met de volgende commando’s:

sudo apt-get install mysql-server php-mysql -y
sudo service apache2 restart

Hierna moet je mysql nog instellen, en dat doe je als volgt:

sudo mysql_secure_installation

Je zult volgende vragen te zien krijgen:

  • “Enter current password for root (enter for none):” – druk hier op enter
  • “Set root password?” – typ hier y, typ dan het wachtwoord voor de root user.
  • “Remove anonymous users” – typ hier weer y
  • “Remove test database and access to it?” – Typ hier weer y
  • “Reload privilege tables now?” – je raad het al, typ y

Nu zou je mysql moeten kunnen gebruiken.

Zo, nu heb je successvol een LAMP stack geinstalleerd!

Edit 2020-04-11: Het commando om php te installeren was fout. Dit is nu aangepast.