sql >> Database >  >> RDS >> PostgreSQL

Hoe AppArmor te configureren voor PostgreSQL en TimescaleDB

Beveiliging is een must voor alle systemen om uw gegevens zo goed mogelijk te beschermen. Zelfs als er altijd een risico is om gehackt te worden, zal het volgen van een beveiligingschecklist dit risico aanzienlijk verminderen. Een basiscontrolelijst voor beveiliging omvat een firewallconfiguratie, gegevenscodering, authenticatiebeleid, enz. Een ander belangrijk hulpmiddel om uw gegevens op op Debian gebaseerde besturingssystemen te beschermen, is AppArmor. In deze blog zullen we zien wat is en hoe het te configureren voor PostgreSQL- en TimescaleDB-databases.

Wat is AppArmor?

AppArmor, standaard opgenomen in Ubuntu en (onder andere) besturingssystemen van Debian, is een Mandatory Access Control (MAC)-systeem om programma's te beperken tot een beperkt aantal bronnen. Het werkt met profielen die in de kernel zijn geladen. Deze profielen kunnen in twee modi worden geconfigureerd:

  • Handhaving:de profielen die in deze modus worden geladen, zullen het in het profiel gedefinieerde beleid afdwingen en beleidsschendingen melden pogingen.

  • Klagen:de profielen in deze modus dwingen het beleid niet af, maar rapporteren in plaats daarvan pogingen tot beleidsschending.

Ook maakt AppArmor het mogelijk om handhavings- en klachtmodusprofielen te combineren.

AppArmor configureren

De AppArmor-profielen staan ​​in /etc/apparmor.d/. U kunt uw eigen profielen maken en ze daarheen verplaatsen of de AppArmor-repository raadplegen. Laten we eens kijken hoe we een nieuw AppArmor-profiel kunnen maken.

Laten we eerst de benodigde pakketten installeren om dit af te handelen:

$ apt install apparmor-profiles apparmor-utils

En kijk of AppArmor is ingeschakeld:

$ systemctl status apparmor.service

of

$ aa-status
apparmor module is loaded.
31 profiles are loaded.
29 profiles are in enforce mode.
   /snap/snapd/11588/usr/lib/snapd/snap-confine
   /snap/snapd/11588/usr/lib/snapd/snap-confine//mount-namespace-capture-helper
  ...

Als je het genoemde pad /etc/apparmor.d/ aanvinkt, zul je enkele basisprofielen zien, zoals usr.sbin.tcpdump of usr.sbin.traceroute. Laten we nu een nieuw profiel maken voor PostgreSQL of TimescaleDB. Hiervoor kunt u dit profiel als voorbeeld gebruiken. Op basis van dat profiel zullen we de PostgreSQL-versie vervangen om specifieker te zijn. In dit geval gebruiken we PostgreSQL 13.

# Author: Felix Geyer <[email protected]>
#include <tunables/global>
/usr/lib/postgresql/13/bin/postgres {
  #include <abstractions/base>
  #include <abstractions/nameservice>
  #include <abstractions/ssl_keys>
  /etc/postgresql/** r,
  /usr/share/postgresql/** r,
  /var/lib/postgresql/** rwl,
  /{,var/}run/postgresql/** rw,
  owner @{PROC}/13/oom_adj rw,
}

Bewaar het in /etc/apparmor.d/usr.lib.postgresql.13.bin.postgres. Laad vervolgens het nieuwe profiel met apparmor_parser -a:

$ cat /etc/apparmor.d/usr.lib.postgresql.13.bin.postgres | sudo apparmor_parser -a

Als je iets aan dit profiel wilt wijzigen, moet je het opnieuw laden:

$ apparmor_parser -r /etc/apparmor.d/usr.lib.postgresql.13.bin.postgres

U kunt de Klachtenmodus aan het profiel toewijzen door het volgende commando te gebruiken:

$ aa-complain /usr/lib/postgresql/13/bin/postgres

Vervolgens kunt u het syslog-bestand in /var/log controleren om te zien of de AppArmor-configuratie correct is, of dat u iets moet wijzigen. Als het veilig is, kunt u de modus wijzigen in Afdwingen door het volgende uit te voeren:

$ aa-enforce /usr/lib/postgresql/13/bin/postgres

U kunt het logboek filteren op TOEGESTANE of GEWEIGERD acties:

Jun 25 19:48:02 ip-172-31-18-94 kernel: [ 5160.111028] audit: type=1400 audit(1624650482.537:103): apparmor="ALLOWED" operation="open" profile="/usr/lib/postgresql/13/bin/postgres" name="/proc/17405/oom_score_adj" pid=17405 comm="postgres" requested_mask="w" denied_mask="w" fsuid=113 ouid=113

Jun 25 19:48:02 ip-172-31-18-94 kernel: [ 5160.112524] audit: type=1400 audit(1624650482.541:104): apparmor="ALLOWED" operation="open" profile="/usr/lib/postgresql/13/bin/postgres" name="/proc/17404/oom_score_adj" pid=17404 comm="postgres" requested_mask="w" denied_mask="w" fsuid=113 ouid=113

Jun 25 19:50:02 ip-172-31-18-94 kernel: [ 5280.141262] audit: type=1400 audit(1624650602.569:112): apparmor="DENIED" operation="open" profile="/usr/lib/postgresql/13/bin/postgres" name="/proc/17518/oom_score_adj" pid=17518 comm="postgres" requested_mask="w" denied_mask="w" fsuid=113 ouid=113

Je kunt profielen ook op deze manier uitschakelen:

$ aa-disable /etc/apparmor.d/usr.lib.postgresql.13.bin.postgres

En je moet de service opnieuw laden:

$ systemctl reload apparmor.service

Als u AppArmor liever uitschakelt, kunt u het volgende uitvoeren:

$ systemctl stop apparmor
$ systemctl disable apparmor

Natuurlijk wordt dit niet aanbevolen voor productieomgevingen, en je moet het draaiende houden, in ieder geval door de Klachtenmodus in alle profielen te gebruiken, zodat je de logs kunt controleren op onverwacht gedrag.

PostgreSQL en TimescaleDB gebruiken met ClusterControl en AppArmor

ClusterControl beheert geen Linux-kernelbeveiligingsmodules zoals AppArmor. Wanneer u een PostgreSQL- of TimescaleDB-cluster implementeert met behulp van ClusterControl, kunt u aangeven of u wilt dat ClusterControl AppArmor voor u uitschakelt tijdens het implementatieproces om het risico op fouten te verkleinen:

Als u het niet wilt uitschakelen, wat wordt aanbevolen voor productie omgevingen, kunt u de klachtenmodus gebruiken en het logbestand op uw servers controleren om er zeker van te zijn dat u de juiste AppArmor-configuratie hebt. Daarna kunt u het wijzigen in Afdwingen volgens de hierboven vermelde instructies.

U kunt meer informatie over de AppArmor-configuratie vinden op de officiële Ubuntu-site.


  1. Hoe u identiteitskolomwaarden kunt krijgen zonder de naam van de identiteitskolom te vermelden in Select - SQL Server / T-SQL-zelfstudie, deel 46

  2. ORA-01438:waarde groter dan gespecificeerde precisie toegestaan ​​voor deze kolom bij het invoegen van 3

  3. Hoe de CASE-verklaring in MySQL te gebruiken?

  4. Hoe tel je alle rijen bij gebruik van SELECT met LIMIT in MySQL-query?