In het tijdperk waarin we nu leven, is alles met een minder veilige omgeving gemakkelijk een doelwit voor een aanval en wordt het een beloning voor de aanvallers. In vergelijking met de afgelopen 20 jaar zijn hackers tegenwoordig geavanceerder, niet alleen met de vaardigheden, maar ook met de tools die ze gebruiken. Het is geen verrassing waarom sommige gigantische bedrijven worden gehackt en hun waardevolle gegevens worden gelekt.
Alleen al in het jaar 2021 zijn er al meer dan 10 incidenten gerelateerd aan datalekken. Het meest recente incident werd gemeld door BOSE, een bekende audiomaker die in mei plaatsvond. BOSE ontdekte dat de aanvallers toegang hadden tot een deel van de persoonlijke gegevens van haar huidige en voormalige werknemers. De persoonlijke informatie die bij de aanval wordt blootgelegd, omvat namen, burgerservicenummers, informatie over vergoedingen en andere HR-gerelateerde informatie.
Wat is volgens jou het doel van dit soort aanvallen en wat motiveert de hacker om dit te doen? Het draait natuurlijk allemaal om het geld. Omdat gestolen gegevens ook vaak worden verkocht, kunnen hackers geld verdienen door grote bedrijven aan te vallen. Niet alleen de belangrijke gegevens kunnen worden verkocht aan de concurrenten van het bedrijf, maar de hackers kunnen tegelijkertijd ook een enorm losgeld vragen.
Dus hoe kunnen we dit relateren aan databases? Aangezien de database een van de grote troeven van het bedrijf is, wordt aanbevolen om er voor te zorgen met verbeterde beveiliging, zodat onze waardevolle gegevens het grootste deel van de tijd worden beschermd. In mijn laatste blogpost hebben we al een introductie gehad over SELinux, hoe het in te schakelen, welk type modus SELinux heeft en hoe het te configureren voor MongoDB. Vandaag zullen we bekijken hoe we SELinux kunnen configureren voor op MySQL gebaseerde systemen.
Top 5 voordelen van SELinux
Voordat we verder gaan, vragen sommigen van jullie zich misschien af of SELinux enige positieve voordelen biedt, aangezien het een beetje gedoe is om het in te schakelen. Hier zijn de top 5 SELinux-voordelen die je niet wilt missen en die je zou moeten overwegen:
-
De vertrouwelijkheid en integriteit van gegevens afdwingen en tegelijkertijd processen beschermen
-
De mogelijkheid om services en daemons te beperken om voorspelbaarder te zijn
-
Het risico op escalatie-aanvallen op bevoegdheden verminderen
-
Het beleid dat voor het hele systeem wordt afgedwongen, niet naar goeddunken van de gebruiker wordt ingesteld en administratief wordt gedefinieerd
-
Een fijnmazige toegangscontrole bieden
Voordat we beginnen met het configureren van de SELinux voor onze MySQL-instanties, waarom niet doornemen hoe u SELinux met ClusterControl inschakelt voor alle op MySQL gebaseerde implementaties. Hoewel de stap hetzelfde is voor alle databasebeheersystemen, denken we dat het een goed idee is om enkele screenshots toe te voegen ter referentie.
Stappen om SELinux in te schakelen voor MySQL-replicatie
In deze sectie gaan we MySQL-replicatie implementeren met ClusterControl 1.8.2. De stappen zijn hetzelfde voor MariaDB, Galera Cluster of MySQL:ervan uitgaande dat alle knooppunten gereed zijn en SSH zonder wachtwoord is geconfigureerd, laten we beginnen met de implementatie. Om SELinux voor onze setup in te schakelen, moeten we "AppArmor/SELinux uitschakelen" uitschakelen, wat betekent dat SELinux voor alle knooppunten als "permissief" wordt ingesteld.
Vervolgens kiezen we Percona als leverancier (u kunt ook kiezen voor MariaDB , Oracle of MySQL 8 ook), geef dan het "root"-wachtwoord op. Je kunt een standaardlocatie of je andere mappen gebruiken, afhankelijk van je instellingen.
Zodra alle hosts zijn toegevoegd, kunnen we de implementatie starten en laten voltooien voordat we kunnen beginnen met de SELinux-configuratie.
Stappen om SELinux in te schakelen voor MariaDB-replicatie
In deze sectie gaan we MariaDB-replicatie implementeren met ClusterControl 1.8.2.
We kiezen MariaDB als leverancier en versie 10.5 en specificeren de "root"-wachtwoord. Je kunt een standaardlocatie of je andere mappen gebruiken, afhankelijk van je instellingen.
Zodra alle hosts zijn toegevoegd, kunnen we de implementatie starten en laten voltooien voordat we verder kunnen gaan met de SELinux-configuratie.
Stappen om SELinux voor Galera-cluster in te schakelen
In deze sectie gaan we Galera Cluster implementeren met ClusterControl 1.8.2. Schakel nogmaals "AppArmor/SELinux uitschakelen" uit, wat betekent dat SELinux voor alle knooppunten als "permissief" wordt ingesteld:
Vervolgens kiezen we Percona als leverancier en MySQL 8 evenals specificeer het "root"-wachtwoord. Afhankelijk van uw instellingen kunt u een standaardlocatie of uw andere mappen gebruiken. Zodra alle hosts zijn toegevoegd, kunnen we de implementatie starten en laten eindigen.
Zoals gewoonlijk kunnen we de status van de implementatie volgen in het gedeelte 'Activiteit' van de gebruikersinterface.
SELinux configureren voor MySQL
Aangezien al onze clusters gebaseerd zijn op MySQL, zijn de stappen om SELinux te configureren ook hetzelfde. Voordat we beginnen met de installatie en aangezien dit een nieuw ingestelde omgeving is, raden we u aan de automatische herstelmodus voor zowel cluster als knooppunt uit te schakelen volgens de onderstaande schermafbeelding. Door dit te doen, kunnen we voorkomen dat het cluster in een failover terechtkomt terwijl we het testen uitvoeren of de service opnieuw starten:
Laten we eerst eens kijken wat de context is voor "mysql". Ga je gang en voer de volgende opdracht uit om de context te bekijken:
$ ps -eZ | grep mysqld_t
En het voorbeeld van de uitvoer is als volgt:
system_u:system_r:mysqld_t:s0 845 ? 00:00:01 mysqld
De definitie voor de bovenstaande uitvoer is:
-
system_u - Gebruiker
-
system_r - Rol
-
mysqld_t - Type
-
s0 845 - Gevoeligheidsniveau
Als je de SELinux-status controleert, kun je zien dat de status "permissief" is, wat nog niet volledig is ingeschakeld. We moeten de modus veranderen in "afdwingen" en om dat te bereiken moeten we het SELinux-configuratiebestand bewerken om het permanent te maken.
$ vi /etc/selinux/config
SELINUX=enforcing
Ga door met het opnieuw opstarten van het systeem na de wijzigingen. Omdat we de modus wijzigen van "permissief" naar "afdwingend", moeten we het bestandssysteem opnieuw labelen. Meestal kunt u kiezen of u het hele bestandssysteem opnieuw wilt labelen of slechts voor één toepassing. De reden waarom opnieuw labelen vereist is, is omdat de "afdwingende" modus het juiste label of de juiste functie nodig heeft om correct te werken. In sommige gevallen worden die labels gewijzigd tijdens de "toegelaten" of "uitgeschakelde" modus.
Voor dit voorbeeld zullen we slechts één applicatie (MySQL) opnieuw labelen met de volgende opdracht:
$ fixfiles -R mysqld restore
Voor een systeem dat al geruime tijd in gebruik is, is het een goed idee om het hele bestandssysteem opnieuw te labelen. De volgende opdracht zal het werk doen zonder opnieuw op te starten en dit proces kan even duren, afhankelijk van uw systeem:
$ fixfiles -f -F relabel
Net als veel andere databases, vereist MySQL ook het lezen en schrijven van veel bestanden. Zonder een correcte SELinux-context voor die bestanden, zal de toegang zonder twijfel worden geweigerd. Om het beleid voor SELinux te configureren, is 'semanage' vereist. "semanage" staat ook elke configuratie toe zonder dat de beleidsbronnen opnieuw hoeven te worden gecompileerd. Voor de meeste Linux-systemen is deze tool al standaard geïnstalleerd. Wat ons geval betreft, het is al geïnstalleerd met de volgende versie:
$ rpm -qa |grep semanage
python3-libsemanage-2.9-3.el8.x86_64
libsemanage-2.9-3.el8.x86_64
Voor het systeem waarop het niet is geïnstalleerd, helpt het volgende commando u om het te installeren:
$ yum install -y policycoreutils-python-utils
Laten we nu eens kijken wat de MySQL-bestandscontexten zijn:
$ semanage fcontext -l | grep -i mysql
Zoals je misschien opmerkt, zijn er een aantal bestanden die zijn verbonden met MySQL zodra het bovenstaande commando is uitgevoerd. Als u zich in het begin herinnert, gebruiken we een standaard "Servergegevensdirectory". Als uw installatie een andere gegevensmaplocatie gebruikt, moet u de context voor "mysql_db_t" bijwerken, die verwijst naar de /var/lib/mysql/
De eerste stap is om de SELinux-context te wijzigen door een van deze opties te gebruiken:
$ 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
En als laatste, herstart de service:
$ systemctl restart mysql
In sommige instellingen is waarschijnlijk een andere loglocatie vereist voor welk doel dan ook. Voor deze situatie moet ook "mysqld_log_t" worden bijgewerkt. "mysqld_log_t" is een context voor de standaardlocatie /var/log/mysqld.log en de onderstaande stappen kunnen worden uitgevoerd om deze bij te werken:
$ semanage fcontext -a -t mysqld_log_t "/your/custom/error.log"
$ restorecon -Rv /path/to/my/custom/error.log
$ systemctl restart mysql
Er zal een situatie zijn waarin de standaardpoort is geconfigureerd met een andere poort dan 3306. Als u bijvoorbeeld poort 3303 voor MySQL gebruikt, moet u de SELinux-context definiëren met het volgende commando :
$ semanage port -a -t mysqld_port_t -p tcp 3303
En om te controleren of de poort is bijgewerkt, kunt u het volgende commando gebruiken:
$ semanage port -l | grep mysqld
audi2allow gebruiken om beleid te genereren
Een andere manier om het beleid te configureren is door gebruik te maken van "audit2allow", dat zojuist al was opgenomen tijdens de installatie van "semanage". Wat deze tool doet, is door de logboekgebeurtenissen uit de audit.log te halen en die informatie te gebruiken om een beleid te maken. Soms heeft MySQL een niet-standaard beleid nodig, dus dit is de beste manier om dat te bereiken.
Laten we eerst de modus instellen op permissief voor het MySQL-domein en de wijzigingen verifiëren:
$ semanage permissive -a mysqld_t
$ semodule -l | grep permissive
permissive_mysqld_t
permissivedomains
De volgende stap is om het beleid te genereren met behulp van de onderstaande opdracht:
$ grep mysqld /var/log/audit/audit.log | audit2allow -M {yourpolicyname}
$ grep mysqld /var/log/audit/audit.log | audit2allow -M mysql_new
U zou de uitvoer als volgt moeten zien (zal verschillen afhankelijk van uw beleidsnaam die u instelt):
******************** BELANGRIJK ********************* **
Om dit beleidspakket actief te maken, voert u het volgende uit:
semodule -i mysql_new.pp
Zoals vermeld, moeten we “semodule -i mysql_new.pp” uitvoeren om het beleid te activeren. Ga je gang en voer het uit:
$ semodule -i mysql_new.pp
De laatste stap is om het MySQL-domein terug te zetten naar de "afdwingende" modus:
$ semanage permissive -d mysqld_t
libsemanage.semanage_direct_remove_key:laatste permissive_mysqld_t-module verwijderen (er bestaat geen andere permissive_mysqld_t-module met een andere prioriteit).
Wat moet je doen als SELinux niet werkt?
Vaak vereist de SELinux-configuratie zoveel testen. Een van de beste manieren om de configuratie te testen, is door de modus te wijzigen in "permissief". Als u het alleen voor het MySQL-domein wilt instellen, kunt u gewoon de volgende opdracht gebruiken. Dit is een goede gewoonte om te voorkomen dat u het hele systeem op "permissief" configureert:
$ semanage permissive -a mysqld_t
Zodra alles klaar is, kunt u de modus terugzetten naar "afdwingen":
$ semanage permissive -d mysqld_t
Daarnaast biedt /var/log/audit/audit.log alle logs gerelateerd aan de SELinux. Dit logboek zal u veel helpen bij het identificeren van de oorzaak en de reden. Het enige wat u hoeft te doen is "geweigerd" te filteren met "grep".
$ more /var/log/audit/audit.log |grep "denied"
We zijn nu klaar met het configureren van het SELinux-beleid voor een op MySQL gebaseerd systeem. Een ding dat het vermelden waard is, is dat dezelfde configuratie moet worden uitgevoerd op alle knooppunten van uw cluster, mogelijk moet u hetzelfde proces voor hen herhalen.