sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man konfigurerar SELinux för PostgreSQL och TimescaleDB

Data är den viktigaste tillgången i ett företag, så du bör ta hänsyn till alla säkerhetsöverväganden i din databas för att hålla den så säker som möjligt. En viktig säkerhetsfunktion på RedHat-baserade operativsystem är SELinux. I den här bloggen kommer vi att se vad den här funktionen är och hur man konfigurerar den för PostgreSQL- och TimescaleDB-databaser.

Vad är SELinux?

Säkerhetsförbättrad Linux (SELinux) är en säkerhetsarkitektur för Linux-system som tillåter administratörer att ha mer kontroll över vem som kan komma åt systemet. Den definierar åtkomstkontroller för applikationer, processer och filer på ett system med hjälp av säkerhetspolicyer, som är en uppsättning regler som talar om för SELinux vad som kan nås.

När en applikation eller process, känd som ett ämne, gör en begäran om att få tillgång till ett objekt, som en fil, kontrollerar SELinux med en åtkomstvektorcache (AVC), där behörigheter cachelagras för objekt och objekt . Om SELinux inte kan fatta ett beslut om åtkomst baserat på de cachade behörigheterna, skickar den begäran till säkerhetsservern. Säkerhetsservern kontrollerar säkerhetskontexten för appen eller processen och filen. Säkerhetskontexten tillämpas från SELinux policydatabas och tillståndet beviljas eller nekas.

Det finns olika sätt att konfigurera det. Du kan ta en titt på SELinux huvudkonfigurationsfil i /etc/selinux/config för att se hur den för närvarande är konfigurerad.

$ 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

 

Det finns två direktiv i den här filen. SELINUX-direktivet specificerar SELinux-läget och det kan ha tre möjliga värden:Enforcing, Permissive eller Disabled.

  • Tillämpning (standard):Det kommer att aktivera och upprätthålla SELinux säkerhetspolicy på systemet, vilket nekar obehöriga åtkomstförsök av användare och processer.

  • Tillåtande:Genom att använda det är SELinux aktiverat men kommer inte att tillämpa säkerhetspolicyn. Alla policyöverträdelser loggas i granskningsloggarna. Det är ett bra sätt att testa SELinux innan det tillämpas.

  • Inaktiverad:SELinux är avstängt.

SELINUXTYPE-direktivet anger vilken policy som ska användas. Standardvärdet är riktat och med denna policy låter SELinux dig anpassa och finjustera behörigheter för åtkomstkontroll.

Även när upprätthållandeläget är standardläget har det blivit vanligt att inaktivera SELinux eftersom det är lättare än att hantera det. Detta rekommenderas naturligtvis inte och du bör ha det konfigurerat åtminstone i tillåtande läge och kontrollera loggarna med jämna mellanrum och leta efter ovanligt beteende.

Hur man konfigurerar SELinux

Om SELinux är inaktiverat i din miljö kan du aktivera det genom att redigera /etc/selinux/config-konfigurationsfilen och ställa in SELINUX=permissive eller SELINUX=enforcing.

Om du aldrig har använt SELinux, är det bästa sättet att konfigurera det genom att använda tillåtande läge först, kontrollera loggarna och leta efter nekade meddelanden i meddelandeloggfilen och fixa det om det behövs:

$ grep "SELinux" /var/log/messages

Efter att allt har granskats och det är säkert att fortsätta kan du konfigurera SELinux för att tillämpa den tidigare metoden eller utan att starta om genom att använda följande kommando:

$ setenforce 1

Om du behöver återställa, kör:

$ setenforce 0

Det här kommandot kan användas för att växla mellan upprätthållande och tillåtande lägen i farten men dessa ändringar kvarstår inte om du startar om systemet. Du måste konfigurera värdet i konfigurationsfilen för att göra det beständigt.

Du kan kontrollera den aktuella SELinux-statusen med kommandot getenforce:

$ getenforce
Enforcing

Eller för mer detaljerad information kan du använda sestatus istället:

$ 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

Hur man konfigurerar SELinux för PostgreSQL och TimescaleDB

Om du installerar PostgreSQL/TimescaleDB med standardkonfigurationen och standarddatakatalogen, och SELinux också är konfigurerad som standard, kommer du förmodligen inte att ha några problem, men problemet är om du vill använd till exempel en specifik plats där du ska lagra din databas, så låt oss se hur du konfigurerar SELinux för att få det att fungera. För det här exemplet kommer vi att installera PostgreSQL 13 på CentOS 8 och kommer att använda /pgsql/data/ som datakatalog.

Aktivera först postgresql-modulen:

$ dnf module enable postgresql:13

Installera motsvarande PostgreSQL 13-paket:

$ dnf -y install postgresql-server postgresql-contrib postgresql-libs

Aktivera tjänsten:

$ systemctl enable postgresql.service

Initiera din PostgreSQL-databas:

$ postgresql-setup --initdb

Nu, om du bara startar tjänsten utan att ändra något, som datakatalogen, kommer den att starta bra, annars kommer du att se ett felmeddelande 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å, låt oss se hur vi fixar det. Ändra först din datakatalog i din PostgreSQL-konfigurationsfil och tjänst. För detta, redigera PostgreSQL-tjänstfilen och ändra PGDATA-platsen:

$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data

Redigera PostgreSQL bash-profilfilen och ändra PGDATA-platsen:

$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data

Läs ändringarna:

$ systemctl daemon-reload

Initiera den nya PostgreSQL-databasen:

$ postgresql-setup --initdb
 * Initializing database in '/pgsql/data'
 * Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log

Det är inte nödvändigt att ange den nya datakatalogplatsen som du gjorde tidigare i konfigurationsfilerna. Nu, innan du startar det, måste du ändra SELinux-etiketten:

$ chcon -Rt postgresql_db_t /pgsql/data

Detta kommando kommer att ändra SELinux säkerhetskontext, och flaggorna är:

  • -R, --rekursiv:Arbeta på filer och kataloger rekursivt

  • -t, --type=TYPE:Ställ in typ TYPE i målsäkerhetskontexten

Starta sedan PostgreSQL-tjänsten:

$ systemctl start postgresql.service

Och din databas körs 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

Detta är bara ett grundläggande exempel på hur man konfigurerar SELinux för PostgreSQL/TimescaleDB. Det finns olika sätt att göra detta med olika begränsningar eller verktyg. Den bästa SELinux-implementeringen eller -konfigurationen beror på affärskraven.

Hur man använder PostgreSQL och TimescaleDB med ClusterControl och SELinux

ClusterControl hanterar inte några Linux-kärnsäkerhetsmoduler som SELinux. När du distribuerar ett PostgreSQL- eller TimescaleDB-kluster genom att använda ClusterControl kan du ange om du vill att ClusterControl ska inaktivera SELinux för dig under distributionsprocessen för att minska risken för fel:

Om du inte vill inaktivera det kan du använda tillåtande läge och övervaka loggen på dina servrar för att se till att du har rätt SELinux-konfiguration. Efter det kan du ändra det till Enforcing genom att följa instruktionerna som nämns ovan.

Du kan hitta mer information om SELinux-konfigurationen på RedHat eller CentOS officiella webbplatser.


  1. Återställ rotlösenordet för MySQL

  2. Använder PIVOT i SQL Server 2008

  3. Har PL/SQL en likvärdig StringTokenizer till Java?

  4. Hur man bifogar .db-fil med en annan .apk-android