Data er det vigtigste aktiv i en virksomhed, så du bør tage alle sikkerhedshensyn i betragtning i din database for at holde den så sikker som muligt. En vigtig sikkerhedsfunktion på RedHat-baserede operativsystemer er SELinux. I denne blog vil vi se, hvad denne funktion er, og hvordan den konfigureres til PostgreSQL- og TimescaleDB-databaser.
Hvad er SELinux?
Sikkerhedsforbedret Linux (SELinux) er en sikkerhedsarkitektur til Linux-systemer, der tillader administratorer at have mere kontrol over, hvem der kan få adgang til systemet. Den definerer adgangskontrol for applikationer, processer og filer på et system ved hjælp af sikkerhedspolitikker, som er et sæt regler, der fortæller SELinux, hvad der kan tilgås.
Når en applikation eller proces, kendt som et emne, fremsætter en anmodning om at få adgang til et objekt, f.eks. en fil, kontrollerer SELinux med en adgangsvektorcache (AVC), hvor tilladelser cachelagres for emner og objekter . Hvis SELinux ikke er i stand til at træffe en beslutning om adgang baseret på de cachelagrede tilladelser, sender den anmodningen til sikkerhedsserveren. Sikkerhedsserveren kontrollerer sikkerhedskonteksten for appen eller processen og filen. Sikkerhedskonteksten anvendes fra SELinux-politikdatabasen, og tilladelsen gives eller nægtes.
Der er forskellige måder at konfigurere det på. Du kan tage et kig på SELinux-hovedkonfigurationsfilen i /etc/selinux/config for at se, hvordan den er konfigureret i øjeblikket.
$ 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
Der er to direktiver i denne fil. SELINUX-direktivet specificerer SELinux-tilstanden, og den kan have tre mulige værdier:Enforcer, Permissive eller Disabled.
-
Håndhævelse (standard):Det vil aktivere og håndhæve SELinux-sikkerhedspolitikken på systemet og nægte uautoriserede adgangsforsøg af brugere og processer.
-
Tilladende:Ved at bruge det, er SELinux aktiveret, men vil ikke håndhæve sikkerhedspolitikken. Alle politikovertrædelser logges i revisionsloggene. Det er en god måde at teste SELinux, før den håndhæves.
-
Deaktiveret:SELinux er slået fra.
SELINUXTYPE-direktivet specificerer den politik, der skal bruges. Standardværdien er målrettet, og med denne politik giver SELinux dig mulighed for at tilpasse og finjustere adgangskontroltilladelser.
Selv når håndhævelsestilstanden er standardtilstanden, er deaktivering af SELinux blevet en almindelig praksis, da det er lettere end at klare det. Dette anbefales selvfølgelig ikke, og du bør have det konfigureret i det mindste i tilladelig tilstand og tjekke logfilerne med jævne mellemrum og se efter usædvanlig adfærd.
Sådan konfigureres SELinux
Hvis SELinux er deaktiveret i dit miljø, kan du aktivere det ved at redigere /etc/selinux/config-konfigurationsfilen og indstille SELINUX=permissive eller SELINUX=enforcing.
Hvis du aldrig har brugt SELinux, er den bedste måde at konfigurere det på ved at bruge den tilladelige tilstand først, tjek logfilerne på udkig efter afviste meddelelser i meddelelseslogfilen, og ret det om nødvendigt:
$ grep "SELinux" /var/log/messages
Efter at alt er blevet gennemgået, og det er sikkert at fortsætte, kan du konfigurere SELinux til at håndhæve ved hjælp af den tidligere metode eller uden at genstarte ved at bruge følgende kommando:
$ setenforce 1
Hvis du har brug for at rulle tilbage, skal du køre:
$ setenforce 0
Denne kommando kan bruges til at skifte mellem håndhævende og tilladelige tilstande, men disse ændringer fortsætter ikke, hvis du genstarter systemet. Du bliver nødt til at konfigurere værdien i konfigurationsfilen for at gøre den vedvarende.
Du kan kontrollere den aktuelle SELinux-status ved at bruge getenforce-kommandoen:
$ getenforce
Enforcing
Eller for mere detaljeret information, kan du bruge sestatus i stedet:
$ 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
Sådan konfigureres SELinux til PostgreSQL og TimescaleDB
Hvis du installerer PostgreSQL/TimescaleDB ved hjælp af standardkonfigurationen og standarddatabiblioteket, og SELinux også er konfigureret som standard, vil du sandsynligvis ikke have noget problem, men problemet er, hvis du vil brug for eksempel en specifik placering, hvor du skal gemme din database, så lad os se, hvordan du konfigurerer SELinux til at få det til at virke. I dette eksempel vil vi installere PostgreSQL 13 på CentOS 8 og vil bruge /pgsql/data/ som databiblioteket.
Først skal du aktivere postgresql-modulet:
$ dnf module enable postgresql:13
Installer de tilsvarende PostgreSQL 13-pakker:
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
Aktiver tjenesten:
$ systemctl enable postgresql.service
Initialiser din PostgreSQL-database:
$ postgresql-setup --initdb
Nu, hvis du bare starter tjenesten uden at ændre noget, f.eks. databiblioteket, starter den fint, ellers vil du se en fejl som:
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'.
Så lad os se, hvordan du løser det. Først skal du ændre dit databibliotek i din PostgreSQL-konfigurationsfil og -tjeneste. Til dette skal du redigere PostgreSQL-tjenestefilen og ændre PGDATA-placeringen:
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data
Rediger PostgreSQL bash-profilfilen og skift PGDATA-placeringen:
$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data
Læs ændringerne:
$ systemctl daemon-reload
Initialiser den nye PostgreSQL-database:
$ postgresql-setup --initdb
* Initializing database in '/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Det er ikke nødvendigt at angive den nye datamappeplacering, som du tidligere gjorde i konfigurationsfilerne. Nu, før du starter det, skal du ændre SELinux-etiketten:
$ chcon -Rt postgresql_db_t /pgsql/data
Denne kommando vil ændre SELinux sikkerhedskonteksten, og flagene er:
-
-R, --rekursiv:Betjen filer og mapper rekursivt
-
-t, --type=TYPE:Indstil type TYPE i målsikkerhedskonteksten
Start derefter PostgreSQL-tjenesten:
$ systemctl start postgresql.service
Og din database kører nu:
$ 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
Dette er blot et grundlæggende eksempel på, hvordan man konfigurerer SELinux til PostgreSQL/TimescaleDB. Der er forskellige måder at gøre dette på med forskellige begrænsninger eller værktøjer. Den bedste SELinux-implementering eller -konfiguration afhænger af forretningskravene.
Sådan bruger du PostgreSQL og TimescaleDB med ClusterControl og SELinux
ClusterControl administrerer ikke nogen Linux-kernesikkerhedsmoduler som SELinux. Når du implementerer en PostgreSQL- eller TimescaleDB-klynge ved hjælp af ClusterControl, kan du angive, om du ønsker, at ClusterControl skal deaktivere SELinux for dig under implementeringsprocessen for at reducere risikoen for fejl:
Hvis du ikke vil deaktivere det, kan du bruge Tilladende tilstand og overvåg loggen på dine servere for at sikre, at du har den korrekte SELinux-konfiguration. Derefter kan du ændre det til Håndhævelse ved at følge instruktionerne nævnt ovenfor.
Du kan finde mere information om SELinux-konfigurationen på RedHat eller CentOS officielle websteder.