I den era som vi lever i nu är allt med en mindre säker miljö lätt ett mål för en attack och blir en belöning för angriparna. Jämfört med de senaste 20 åren är hackare nuförtiden mer avancerade, inte bara med de färdigheter utan också med de verktyg de använder. Det är ingen överraskning varför vissa jätteföretag hackas och deras värdefulla data läcker ut.
Enbart under år 2021 finns det redan mer än 10 incidenter relaterade till dataintrång. Den senaste incidenten rapporterades av BOSE, en välkänd ljudtillverkare som inträffade i maj. BOSE upptäckte att en del av dess nuvarande och tidigare anställdas personliga information nåddes av angriparna. Den personliga informationen som exponerades i attacken inkluderar namn, personnummer, ersättningsinformation och annan HR-relaterad information.
Vad tror du är syftet med denna typ av attack och vad motiverar hackaren att göra det? Det handlar så klart om pengar. Eftersom stulen data också ofta säljs kan hackare tjäna pengar genom att attackera stora företag. Inte bara den viktiga informationen kan säljas till företagets konkurrenter, utan hackarna kan samtidigt begära en enorm lösensumma.
Så hur skulle vi kunna relatera detta till databaser? Eftersom databasen är en av de stora tillgångarna för företaget rekommenderas det att ta hand om den med förstärkt säkerhet så att vår värdefulla data skyddas för det mesta. I mitt förra blogginlägg gick vi redan igenom lite introduktion om SELinux, hur man aktiverar det, vilken typ av läge SELinux har och hur man konfigurerar det för MongoDB. Idag ska vi ta en titt på hur man konfigurerar SELinux för MySQL-baserade system.
De 5 bästa fördelarna med SELinux
Innan du går vidare kanske några av er undrar om SELinux ger några positiva fördelar eftersom det är lite krångligt att aktivera det. Här är de 5 bästa SELinux-fördelarna som du inte vill missa och bör överväga:
-
Att upprätthålla datakonfidentialitet och integritet samtidigt som processer skyddas
-
Förmågan att begränsa tjänster och demoner för att vara mer förutsägbara
-
Minska risken för attacker med eskalering av rättigheter
-
Policen tillämpas i hela systemet, inte fastställd efter användarens gottfinnande och administrativt definierad
-
Ge en finkornig åtkomstkontroll
Innan vi börjar konfigurera SELinux för våra MySQL-instanser, varför inte gå igenom hur man aktiverar SELinux med ClusterControl för alla MySQL-baserade distributioner. Även om steget är detsamma för alla databashanteringssystem, tycker vi att det är en bra idé att inkludera några skärmdumpar som referens.
Steg för att aktivera SELinux för MySQL-replikering
I det här avsnittet kommer vi att distribuera MySQL-replikering med ClusterControl 1.8.2. Stegen är desamma för MariaDB, Galera Cluster eller MySQL:förutsatt att alla noder är klara och lösenordslös SSH är konfigurerad, låt oss börja driftsättningen. För att aktivera SELinux för vår installation måste vi avmarkera "Disable AppArmor/SELinux" vilket betyder att SELinux kommer att ställas in som "tillåtande" för alla noder.
Närnäst kommer vi att välja Percona som leverantör (du kan också välja MariaDB , Oracle eller MySQL 8), ange sedan "root"-lösenordet. Du kan använda en standardplats eller dina andra kataloger beroende på dina inställningar.
När alla värdar har lagts till kan vi starta distributionen och låta den avsluta innan vi kan börja med SELinux-konfigurationen.
Steg för att aktivera SELinux för MariaDB-replikering
I det här avsnittet kommer vi att distribuera MariaDB-replikering med ClusterControl 1.8.2.
Vi kommer att välja MariaDB som leverantör och version 10.5 samt specificera "root" lösenord. Du kan använda en standardplats eller dina andra kataloger beroende på dina inställningar.
När alla värdar har lagts till kan vi starta implementeringen och låta den avsluta innan vi kan fortsätta med SELinux-konfigurationen.
Steg för att aktivera SELinux för Galera Cluster
I det här avsnittet kommer vi att distribuera Galera Cluster med ClusterControl 1.8.2. Återigen, avmarkera "Disable AppArmor/SELinux" vilket betyder att SELinux kommer att ställas in som "tillåtande" för alla noder:
Närnäst kommer vi att välja Percona som leverantör och MySQL 8 samt ange "root"-lösenordet. Du kan använda en standardplats eller dina andra kataloger beroende på din inställning. När alla värdar har lagts till kan vi starta implementeringen och låta den slutföras.
Som vanligt kan vi övervaka statusen för distributionen i avsnittet "Aktivitet" i användargränssnittet.
Hur man konfigurerar SELinux för MySQL
Med tanke på att alla våra kluster är MySQL-baserade, är stegen för att konfigurera SELinux också desamma. Innan vi börjar med installationen och eftersom detta är en nyinstallerad miljö föreslår vi att du inaktiverar automatisk återställningsläge för både kluster och nod enligt skärmdumpen nedan. Genom att göra detta kan vi undvika att klustret stöter på en failover medan vi testar eller starta om tjänsten:
Låt oss först se vad som är sammanhanget för "mysql". Gå vidare och kör följande kommando för att se sammanhanget:
$ ps -eZ | grep mysqld_t
Och exemplet på utdata är som nedan:
system_u:system_r:mysqld_t:s0 845 ? 00:00:01 mysqld
Definitionen för utdata ovan är:
-
system_u - Användare
-
system_r - Roll
-
mysqld_t - Typ
-
s0 845 - Känslighetsnivå
Om du kontrollerar SELinux-statusen kan du se att statusen är "tillåtande" som inte är helt aktiverad ännu. Vi måste ändra läget till "framtvingande" och för att uppnå det måste vi redigera SELinux-konfigurationsfilen för att göra den permanent.
$ vi /etc/selinux/config
SELINUX=enforcing
Fortsätt att starta om systemet efter ändringarna. Eftersom vi ändrar läget från "tillåtande" till "upprätthållande", måste vi märka om filsystemet igen. Vanligtvis kan du välja om du vill märka om hela filsystemet eller bara för en applikation. Anledningen till att ommärkning krävs på grund av det faktum att "enforcement"-läget behöver rätt etikett eller funktion för att fungera korrekt. I vissa fall ändras dessa etiketter i läget "tillåtande" eller "inaktiverat".
I det här exemplet kommer vi bara att ommärka ett program (MySQL) med följande kommando:
$ fixfiles -R mysqld restore
För ett system som har använts ganska länge är det en bra idé att märka om hela filsystemet. Följande kommando kommer att göra jobbet utan att starta om och denna process kan ta ett tag beroende på ditt system:
$ fixfiles -f -F relabel
Liksom många andra databaser kräver MySQL också att läsa och skriva många filer. Utan en korrekt SELinux-kontext för dessa filer kommer åtkomsten utan tvekan att nekas. För att konfigurera policyn för SELinux, "semanage" krävs. "semanage" tillåter också vilken konfiguration som helst utan att behöva kompilera om policykällorna. För de flesta Linux-system är detta verktyg redan installerat som standard. När det gäller vårt fall är den redan installerad med följande version:
$ rpm -qa |grep semanage
python3-libsemanage-2.9-3.el8.x86_64
libsemanage-2.9-3.el8.x86_64
För systemet som inte har det installerat, kommer följande kommando att hjälpa dig att installera det:
$ yum install -y policycoreutils-python-utils
Låt oss nu se vad MySQL-filkontexterna är:
$ semanage fcontext -l | grep -i mysql
Som du kanske märker finns det ett gäng filer som är anslutna till MySQL när kommandot ovan har körts. Om du kommer ihåg i början använder vi en standard "Server Data Directory". Om din installation använder en annan datakatalogplats måste du uppdatera kontexten för "mysql_db_t" som hänvisar till /var/lib/mysql/
Det första steget är att ändra SELinux-kontexten genom att använda något av dessa alternativ:
$ semanage fcontext -a -t mysqld_db_t /var/lib/yourcustomdirectory
$ semanage fcontext -a -e /var/lib/mysql /var/lib/yourcustomdirectory
After the step above, run the following command:
$ restorecon -Rv /var/lib/yourcustomdirectory
Och slutligen, starta om tjänsten:
$ systemctl restart mysql
I vissa inställningar krävs sannolikt en annan loggplats för alla ändamål. För den här situationen måste "mysqld_log_t" också uppdateras. "mysqld_log_t" är en kontext för standardplatsen /var/log/mysqld.log och stegen nedan kan utföras för att uppdatera den:
$ semanage fcontext -a -t mysqld_log_t "/your/custom/error.log"
$ restorecon -Rv /path/to/my/custom/error.log
$ systemctl restart mysql
Det kommer att uppstå en situation när standardporten är konfigurerad med en annan port än 3306. Om du till exempel använder port 3303 för MySQL måste du definiera SELinux-kontexten med följande kommando :
$ semanage port -a -t mysqld_port_t -p tcp 3303
Och för att verifiera att porten har uppdaterats kan du använda följande kommando:
$ semanage port -l | grep mysqld
Använda audit2allow för att skapa policy
Ett annat sätt att konfigurera policyn är att använda "audit2allow" som redan inkluderades under "semanage"-installationen just nu. Vad det här verktyget gör är att hämta logghändelserna från audit.log och använda den informationen för att skapa en policy. Ibland kan MySQL behöva en icke-standardiserad policy, så detta är det bästa sättet att uppnå det.
Låt oss först ställa in läget på tillåtande för MySQL-domänen och verifiera ändringarna:
$ semanage permissive -a mysqld_t
$ semodule -l | grep permissive
permissive_mysqld_t
permissivedomains
Nästa steg är att skapa policyn med kommandot nedan:
$ grep mysqld /var/log/audit/audit.log | audit2allow -M {yourpolicyname}
$ grep mysqld /var/log/audit/audit.log | audit2allow -M mysql_new
Du bör se utdata som följande (kommer att skilja sig beroende på ditt policynamn som du anger):
******************** VIKTIGT ********************* **
För att göra detta policypaket aktivt, kör:
semodule -i mysql_new.pp
Som sagt måste vi köra "semodule -i mysql_new.pp" för att aktivera policyn. Fortsätt och kör det:
$ semodule -i mysql_new.pp
Det sista steget är att återställa MySQL-domänen till "tillämpningsläge":
$ semanage permissive -d mysqld_t
libsemanage.semanage_direct_remove_key:Tar bort den senaste permissive_mysqld_t-modulen (ingen annan permissive_mysqld_t-modul finns med en annan prioritet).
Vad ska du göra om SELinux inte fungerar?
Många gånger kräver SELinux-konfigurationen så mycket testning. Ett av de bästa sätten att testa konfigurationen är genom att ändra läget till "tillåtande". Om du bara vill ställa in det för MySQL-domänen kan du bara använda följande kommando. Detta är god praxis för att undvika att konfigurera hela systemet till "tillåtande":
$ semanage permissive -a mysqld_t
När allt är klart kan du ändra läget tillbaka till "framtvingande":
$ semanage permissive -d mysqld_t
Utöver det tillhandahåller /var/log/audit/audit.log alla loggar relaterade till SELinux. Denna logg kommer att hjälpa dig mycket att identifiera grundorsaken och orsaken. Allt du behöver göra är att filtrera "denied" med "grep".
$ more /var/log/audit/audit.log |grep "denied"
Vi är nu klara med att konfigurera SELinux-policyn för MySQL-baserat system. En sak som är värd att nämna är att samma konfiguration måste göras på alla noder i ditt kluster, du kan behöva upprepa samma process för dem.