Gegevens zijn het belangrijkste bezit in een bedrijf, dus u moet rekening houden met alle veiligheidsoverwegingen in uw database om deze zo veilig mogelijk te houden. Een belangrijke beveiligingsfunctie op RedHat-gebaseerde besturingssystemen is SELinux. In deze blog zullen we zien wat deze functie is en hoe deze te configureren voor PostgreSQL- en TimescaleDB-databases.
Wat is SELinux?
Security-Enhanced Linux (SELinux) is een beveiligingsarchitectuur voor Linux-systemen waarmee beheerders meer controle hebben over wie toegang heeft tot het systeem. Het definieert toegangscontroles voor de applicaties, processen en bestanden op een systeem met behulp van beveiligingsbeleid, wat een set regels is die SELinux vertellen waartoe toegang kan worden verkregen.
Wanneer een applicatie of proces, bekend als een subject, een verzoek doet om toegang te krijgen tot een object, zoals een bestand, controleert SELinux met een access vector cache (AVC), waar permissies worden gecached voor onderwerpen en objecten . Als SELinux niet in staat is een beslissing te nemen over toegang op basis van de in de cache opgeslagen machtigingen, stuurt het het verzoek naar de beveiligingsserver. De beveiligingsserver controleert de beveiligingscontext van de app of het proces en het bestand. De beveiligingscontext wordt toegepast vanuit de SELinux-beleidsdatabase en de toestemming wordt verleend of geweigerd.
Er zijn verschillende manieren om het te configureren. Je kunt het hoofdconfiguratiebestand van SELinux in /etc/selinux/config bekijken om te zien hoe het momenteel is geconfigureerd.
$ cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
Er zijn twee richtlijnen in dit bestand. De SELINUX-richtlijn specificeert de SELinux-modus en kan drie mogelijke waarden hebben:Enforcing, Permissive of Disabled.
-
Afdwingen (standaard):Het zal het SELinux-beveiligingsbeleid op het systeem inschakelen en handhaven, waarbij ongeautoriseerde toegangspogingen worden geweigerd door gebruikers en processen.
-
Toestemming:als je het gebruikt, is SELinux ingeschakeld maar zal het beveiligingsbeleid niet afdwingen. Alle beleidsschendingen worden vastgelegd in de controlelogboeken. Het is een goede manier om SELinux te testen voordat je het afdwingt.
-
Uitgeschakeld:SELinux is uitgeschakeld.
De SELINUXTYPE-richtlijn specificeert het te gebruiken beleid. De standaardwaarde is gericht en met dit beleid stelt SELinux je in staat om toegangsbeheerrechten aan te passen en te verfijnen.
Zelfs wanneer de Enforcing-modus de standaard is, is het uitschakelen van SELinux een gangbare praktijk geworden omdat het gemakkelijker is dan ermee om te gaan. Dit wordt natuurlijk niet aanbevolen en u moet het op zijn minst in de permissieve modus configureren en de logs regelmatig controleren op ongewoon gedrag.
SELinux configureren
Als SELinux in uw omgeving is uitgeschakeld, kunt u dit inschakelen door het /etc/selinux/config configuratiebestand te bewerken en SELINUX=permissive of SELINUX=enforcing in te stellen.
Als je SELinux nog nooit hebt gebruikt, is de beste manier om het te configureren door eerst de Permissieve modus te gebruiken, de logs te controleren op zoek naar geweigerde berichten in het berichtenlogbestand, en het indien nodig te repareren:
P>$ grep "SELinux" /var/log/messages
Nadat alles is bekeken en het veilig is om verder te gaan, kun je SELinux configureren om af te dwingen met behulp van de vorige methode of zonder opnieuw te starten door het volgende commando te gebruiken:
$ setenforce 1
Als u een rollback wilt uitvoeren, voert u het volgende uit:
$ setenforce 0
Deze opdracht kan worden gebruikt om direct te schakelen tussen de modi Afdwingen en Toelaten, maar deze wijzigingen blijven niet bestaan als u het systeem opnieuw opstart. U moet de waarde in het configuratiebestand configureren om het persistent te maken.
Je kunt de huidige SELinux-status controleren met het getenforce-commando:
$ getenforce
Enforcing
Of voor meer gedetailleerde informatie kunt u in plaats daarvan sestatus gebruiken:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
SELinux configureren voor PostgreSQL en TimescaleDB
Als je PostgreSQL/TimescaleDB installeert met behulp van de standaardconfiguratie en standaardgegevensmap, en SELinux is ook standaard geconfigureerd, heb je hoogstwaarschijnlijk geen probleem, maar het probleem is of je dat wilt gebruik bijvoorbeeld een specifieke locatie waar je je database moet opslaan, dus laten we eens kijken hoe je SELinux kunt configureren om het te laten werken. Voor dit voorbeeld zullen we PostgreSQL 13 op CentOS 8 installeren en /pgsql/data/ gebruiken als de gegevensmap.
Schakel eerst de postgresql-module in:
$ dnf module enable postgresql:13
Installeer de bijbehorende PostgreSQL 13-pakketten:
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
Schakel de service in:
$ systemctl enable postgresql.service
Initialiseer uw PostgreSQL-database:
$ postgresql-setup --initdb
Als u de service nu gewoon start zonder iets te wijzigen, zoals de gegevensmap, start deze goed, anders ziet u een fout zoals:
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal postmaster[29116]: postmaster: could not access the server configuration file "/pgsql/data/postgresql.conf": Permission denied
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
Jun 15 19:41:40 ip-172-31-24-90.us-east-2.compute.internal systemd[1]: postgresql.service: Failed with result 'exit-code'.
Dus laten we eens kijken hoe we dit kunnen oplossen. Wijzig eerst uw gegevensmap in uw PostgreSQL-configuratiebestand en -service. Bewerk hiervoor het PostgreSQL-servicebestand en wijzig de PGDATA-locatie:
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data
Bewerk het PostgreSQL bash-profielbestand en wijzig de PGDATA-locatie:
$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data
Lees de wijzigingen:
$ systemctl daemon-reload
Initialiseer de nieuwe PostgreSQL-database:
$ postgresql-setup --initdb
* Initializing database in '/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Het is niet nodig om de nieuwe locatie van de gegevensmap op te geven, zoals u dat eerder deed in de configuratiebestanden. Nu, voordat u het start, moet u het SELinux-label wijzigen:
$ chcon -Rt postgresql_db_t /pgsql/data
Dit commando zal de SELinux beveiligingscontext veranderen, en de vlaggen zijn:
-
-R, --recursive:recursief werken met bestanden en mappen
-
-t, --type=TYPE:type TYPE instellen in de doelbeveiligingscontext
Start vervolgens de PostgreSQL-service:
$ systemctl start postgresql.service
En uw database is nu actief:
$ ps aux |grep postgres |head -1
postgres 28566 0.0 3.0 497152 25312 ? Ss 21:16 0:00 /usr/bin/postmaster -D /pgsql/data
Dit is slechts een basisvoorbeeld van hoe SELinux te configureren voor PostgreSQL/TimescaleDB. Er zijn verschillende manieren om dit te doen met verschillende beperkingen of hulpmiddelen. De beste SELinux-implementatie of configuratie hangt af van de zakelijke vereisten.
PostgreSQL en TimescaleDB gebruiken met ClusterControl en SELinux
ClusterControl beheert geen Linux-kernelbeveiligingsmodules zoals SELinux. Wanneer u een PostgreSQL- of TimescaleDB-cluster implementeert met behulp van ClusterControl, kunt u specificeren of u wilt dat ClusterControl SELinux voor u uitschakelt tijdens het implementatieproces om het risico op fouten te verkleinen:
Als u het niet wilt uitschakelen, kunt u de Permissive gebruiken mode en controleer de log in je servers om er zeker van te zijn dat je de juiste SELinux configuratie hebt. Daarna kunt u het wijzigen in Afdwingen volgens de hierboven vermelde instructies.
Je kunt meer informatie vinden over de SELinux-configuratie op de officiële RedHat- of CentOS-sites.