Data jsou ve společnosti nejdůležitějším aktivem, takže byste měli ve své databázi vzít v úvahu všechna bezpečnostní hlediska, aby byla co nejbezpečnější. Jednou z důležitých funkcí zabezpečení na operačních systémech založených na RedHat je SELinux. V tomto blogu uvidíme, co tato funkce je a jak ji nakonfigurovat pro databáze PostgreSQL a TimescaleDB.
Co je SELinux?
Security-Enhanced Linux (SELinux) je architektura zabezpečení pro systémy Linux, která správcům umožňuje mít větší kontrolu nad tím, kdo má k systému přístup. Definuje řízení přístupu pro aplikace, procesy a soubory v systému pomocí bezpečnostních politik, což je sada pravidel, která SELinuxu říkají, k čemu lze přistupovat.
Když aplikace nebo proces, známý jako subjekt, požádá o přístup k objektu, jako je soubor, SELinux to zkontroluje pomocí mezipaměti přístupového vektoru (AVC), kde se ukládají oprávnění pro subjekty a objekty. . Pokud SELinux není schopen rozhodnout o přístupu na základě oprávnění uložených v mezipaměti, odešle požadavek na bezpečnostní server. Server zabezpečení zkontroluje kontext zabezpečení aplikace nebo procesu a souboru. Kontext zabezpečení je aplikován z databáze zásad SELinux a oprávnění je uděleno nebo odepřeno.
Existují různé způsoby konfigurace. Můžete se podívat na hlavní konfigurační soubor SELinux v /etc/selinux/config, abyste viděli, jak je aktuálně nakonfigurován.
$ 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
V tomto souboru jsou dvě direktivy. Direktiva SELINUX specifikuje režim SELinux a může mít tři možné hodnoty:Enforcing, Permissive nebo Disabled.
-
Vynucování (výchozí):Povolí a vynucuje bezpečnostní politiku SELinux v systému a odmítne pokusy o neoprávněný přístup podle uživatelů a procesů.
-
Povolné:Při jeho použití je SELinux povolen, ale nebude vynucovat bezpečnostní politiku. Všechna porušení zásad se zaznamenávají do protokolů auditu. Je to dobrý způsob, jak otestovat SELinux před jeho vynucením.
-
Zakázáno:SELinux je vypnutý.
Směrnice SELINUXTYPE specifikuje politiku, která se má použít. Výchozí hodnota je cílená a pomocí této zásady vám SELinux umožňuje přizpůsobit a doladit oprávnění řízení přístupu.
I když je režim vynucení nastaven jako výchozí, deaktivace SELinuxu se stala běžnou praxí, protože je jednodušší než se s tím vyrovnat. To se samozřejmě nedoporučuje a měli byste jej mít nakonfigurovaný alespoň v Permisivním režimu a pravidelně kontrolovat protokoly a hledat neobvyklé chování.
Jak nakonfigurovat SELinux
Pokud je SELinux ve vašem prostředí zakázán, můžete jej povolit úpravou konfiguračního souboru /etc/selinux/config a nastavením SELINUX=permisivní nebo SELINUX=enforcing.
Pokud jste nikdy nepoužili SELinux, nejlepší způsob, jak jej nakonfigurovat, je nejprve použít permisivní režim, zkontrolovat protokoly, které hledají odmítnuté zprávy v souboru protokolu zpráv, a v případě potřeby jej opravit:
$ grep "SELinux" /var/log/messages
Poté, co bylo vše zkontrolováno a je bezpečné pokračovat, můžete nakonfigurovat SELinux na vynucení pomocí předchozí metody nebo bez restartování pomocí následujícího příkazu:
$ setenforce 1
Pokud potřebujete vrátit zpět, spusťte:
$ setenforce 0
Tento příkaz lze použít k přepínání mezi režimem vynucování a povolování za běhu, ale tyto změny se neprojeví, pokud restartujete systém. Budete muset nakonfigurovat hodnotu v konfiguračním souboru, aby byla trvalá.
Aktuální stav SELinuxu můžete zkontrolovat pomocí příkazu getenforce:
$ getenforce
Enforcing
Nebo pro podrobnější informace můžete místo toho použít sestatus:
$ 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
Jak nakonfigurovat SELinux pro PostgreSQL a TimescaleDB
Pokud instalujete PostgreSQL/TimescaleDB pomocí výchozí konfigurace a výchozího datového adresáře a ve výchozím nastavení je nakonfigurován i SELinux, s největší pravděpodobností nebudete mít žádný problém, ale problém je, pokud chcete použijte například konkrétní místo pro uložení databáze, takže se podívejme, jak nakonfigurovat SELinux, aby fungoval. V tomto příkladu nainstalujeme PostgreSQL 13 na CentOS 8 a jako datový adresář použijeme /pgsql/data/.
Nejprve povolte modul postgresql:
$ dnf module enable postgresql:13
Nainstalujte odpovídající balíčky PostgreSQL 13:
$ dnf -y install postgresql-server postgresql-contrib postgresql-libs
Povolte službu:
$ systemctl enable postgresql.service
Inicializujte svou databázi PostgreSQL:
$ postgresql-setup --initdb
Pokud nyní službu spustíte, aniž byste cokoli změnili, například datový adresář, spustí se v pořádku, jinak se zobrazí chyba jako:
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'.
Podívejme se tedy, jak to opravit. Nejprve změňte svůj datový adresář v konfiguračním souboru a službě PostgreSQL. Za tímto účelem upravte soubor služby PostgreSQL a změňte umístění PGDATA:
$ vi /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGDATA=/pgsql/data
Upravte soubor bash profilu PostgreSQL a změňte umístění PGDATA:
$ vi /var/lib/pgsql/.bash_profile
PGDATA=/pgsql/data
Přečtěte si změny:
$ systemctl daemon-reload
Inicializovat novou databázi PostgreSQL:
$ postgresql-setup --initdb
* Initializing database in '/pgsql/data'
* Initialized, logs are in /var/lib/pgsql/initdb_postgresql.log
Není nutné zadávat umístění nového datového adresáře, jak jste to udělali dříve v konfiguračních souborech. Nyní, než jej spustíte, musíte změnit štítek SELinux:
$ chcon -Rt postgresql_db_t /pgsql/data
Tento příkaz změní kontext zabezpečení SELinux a příznaky jsou:
-
-R, --rekurzivní:Operovat se soubory a adresáři rekurzivně
-
-t, --type=TYPE:Nastavit typ TYPE v kontextu cílového zabezpečení
Potom spusťte službu PostgreSQL:
$ systemctl start postgresql.service
A vaše databáze nyní běží:
$ 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
Toto je jen základní příklad, jak nakonfigurovat SELinux pro PostgreSQL/TimescaleDB. Existují různé způsoby, jak toho dosáhnout s různými omezeními nebo nástroji. Nejlepší implementace nebo konfigurace SELinux závisí na obchodních požadavcích.
Jak používat PostgreSQL a TimescaleDB s ClusterControl a SELinux
ClusterControl nespravuje žádné bezpečnostní moduly jádra Linuxu, jako je SELinux. Při nasazování clusteru PostgreSQL nebo TimescaleDB pomocí ClusterControl můžete určit, zda chcete, aby ClusterControl během procesu nasazení zakázal SELinux, aby se snížilo riziko chyb:
Pokud jej nechcete deaktivovat, můžete použít Permisivní režimu a sledujte protokol na svých serverech, abyste se ujistili, že máte správnou konfiguraci SELinux. Poté jej můžete změnit na Vynucování podle výše uvedených pokynů.
Více informací o konfiguraci SELinux můžete najít na oficiálních stránkách RedHat nebo CentOS.