PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak skonfigurować SELinux dla PostgreSQL i TimescaleDB?

Dane są najważniejszym zasobem w firmie, dlatego należy wziąć pod uwagę wszystkie względy bezpieczeństwa w bazie danych, aby była jak najbezpieczniejsza. Jedną z ważnych funkcji bezpieczeństwa w systemach operacyjnych opartych na RedHat jest SELinux. W tym blogu zobaczymy, czym jest ta funkcja i jak ją skonfigurować dla baz danych PostgreSQL i TimescaleDB.

Co to jest SELinux?

Linuks ze wzmocnionymi zabezpieczeniami (SELinux) to architektura bezpieczeństwa dla systemów Linux, która umożliwia administratorom większą kontrolę nad tym, kto może uzyskać dostęp do systemu. Definiuje kontrolę dostępu do aplikacji, procesów i plików w systemie za pomocą polityk bezpieczeństwa, które są zbiorem reguł, które informują SELinux, do czego można uzyskać dostęp.

Gdy aplikacja lub proces, znany jako podmiot, żąda dostępu do obiektu, takiego jak plik, SELinux sprawdza za pomocą pamięci podręcznej wektorów dostępu (AVC), w której buforowane są uprawnienia dla podmiotów i obiektów . Jeśli SELinux nie jest w stanie podjąć decyzji o dostępie na podstawie uprawnień z pamięci podręcznej, wysyła żądanie do serwera bezpieczeństwa. Serwer zabezpieczeń sprawdza kontekst zabezpieczeń aplikacji lub procesu oraz pliku. Kontekst bezpieczeństwa jest stosowany z bazy danych strategii SELinux, a uprawnienie jest udzielane lub odmawiane.

Istnieją różne sposoby konfiguracji. Możesz zajrzeć do głównego pliku konfiguracyjnego SELinux w /etc/selinux/config, aby zobaczyć, jak jest obecnie skonfigurowany.

$ 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

 

W tym pliku znajdują się dwie dyrektywy. Dyrektywa SELINUX określa tryb SELinux i może mieć trzy możliwe wartości:Enforcing, Permissive lub Disabled.

  • Wymuszanie (domyślne):Włącza i egzekwuje politykę bezpieczeństwa SELinux w systemie, blokując nieautoryzowane próby dostępu przez użytkowników i procesy.

  • Tolerancyjny:Używając go, SELinux jest włączony, ale nie wymusza polityki bezpieczeństwa. Wszystkie naruszenia zasad są rejestrowane w dziennikach kontrolnych. Jest to dobry sposób na przetestowanie SELinuksa przed jego wymuszeniem.

  • Wyłączone:SELinux jest wyłączony.

Dyrektywa SELINUXTYPE określa stosowane zasady. Domyślna wartość jest ukierunkowana i dzięki tej polityce SELinux umożliwia dostosowanie i dostrojenie uprawnień kontroli dostępu.

Nawet jeśli tryb wymuszania jest trybem domyślnym, wyłączenie SELinuksa stało się powszechną praktyką, ponieważ jest łatwiejsze niż radzenie sobie z nim. Oczywiście nie jest to zalecane i powinieneś skonfigurować go przynajmniej w trybie zezwalającym i okresowo sprawdzać logi w poszukiwaniu nietypowego zachowania.

Jak skonfigurować SELinux

Jeśli SELinux jest wyłączony w twoim środowisku, możesz go włączyć, edytując plik konfiguracyjny /etc/selinux/config i ustawiając SELINUX=permissive lub SELINUX=enforcing.

Jeśli nigdy nie używałeś SELinux, najlepszym sposobem na jego skonfigurowanie jest najpierw użycie trybu Permissive, sprawdzenie dzienników w poszukiwaniu odrzuconych wiadomości w pliku dziennika wiadomości i naprawienie go w razie potrzeby:

$ grep "SELinux" /var/log/messages

Po sprawdzeniu wszystkiego i bezpiecznej kontynuacji możesz skonfigurować SELinux do wymuszania przy użyciu poprzedniej metody lub bez ponownego uruchamiania za pomocą następującego polecenia:

$ setenforce 1

Jeśli chcesz wycofać, uruchom:

$ setenforce 0

To polecenie może być używane do przełączania się między trybami Wymuszania i Zezwolenia w locie, ale te zmiany nie zostaną zachowane po ponownym uruchomieniu systemu. Będziesz musiał skonfigurować wartość w pliku konfiguracyjnym, aby była trwała.

Aktualny stan SELinux można sprawdzić za pomocą polecenia getenforce:

$ getenforce
Enforcing

Lub, aby uzyskać bardziej szczegółowe informacje, możesz zamiast tego użyć 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 skonfigurować SELinux dla PostgreSQL i TimescaleDB

Jeżeli instalujesz PostgreSQL/TimescaleDB przy użyciu domyślnej konfiguracji i domyślnego katalogu danych, a SELinux jest również skonfigurowany domyślnie, najprawdopodobniej nie będziesz mieć żadnego problemu, ale problem polega na tym, że chcesz użyj na przykład określonej lokalizacji, w której chcesz przechowywać swoją bazę danych, więc zobaczmy, jak skonfigurować SELinux, aby działał. W tym przykładzie zainstalujemy PostgreSQL 13 na CentOS 8 i użyjemy /pgsql/data/ jako katalogu danych.

Najpierw włącz moduł postgresql:

$ dnf module enable postgresql:13

Zainstaluj odpowiednie pakiety PostgreSQL 13:

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

Włącz usługę:

$ systemctl enable postgresql.service

Zainicjuj bazę danych PostgreSQL:

$ postgresql-setup --initdb

Teraz, jeśli po prostu uruchomisz usługę bez zmiany czegokolwiek, na przykład katalogu danych, uruchomi się dobrze, w przeciwnym razie zobaczysz błąd taki jak:

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'.

Więc zobaczmy, jak to naprawić. Najpierw zmień katalog danych w pliku konfiguracyjnym i usłudze PostgreSQL. W tym celu edytuj plik usługi PostgreSQL i zmień lokalizację PGDATA:

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

Edytuj plik profilu PostgreSQL bash i zmień lokalizację PGDATA:

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

Przeczytaj zmiany:

$ systemctl daemon-reload

Zainicjuj nową bazę danych PostgreSQL:

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

Nie ma potrzeby określania nowej lokalizacji katalogu danych, tak jak to zrobiłeś wcześniej w plikach konfiguracyjnych. Teraz przed uruchomieniem musisz zmienić etykietę SELinux:

$ chcon -Rt postgresql_db_t /pgsql/data

To polecenie zmieni kontekst bezpieczeństwa SELinux, a flagi to:

  • -R, --recursive:działa rekurencyjnie na plikach i katalogach

  • -t, --type=TYP:Ustaw typ TYP w docelowym kontekście bezpieczeństwa

Następnie uruchom usługę PostgreSQL:

$ systemctl start postgresql.service

Twoja baza danych działa teraz:

$ 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

To jest tylko podstawowy przykład konfiguracji SELinux dla PostgreSQL/TimescaleDB. Można to zrobić na różne sposoby z różnymi ograniczeniami lub narzędziami. Najlepsza implementacja lub konfiguracja SELinux zależy od wymagań biznesowych.

Jak używać PostgreSQL i TimescaleDB z ClusterControl i SELinux

ClusterControl nie zarządza żadnymi modułami bezpieczeństwa jądra Linuksa, takimi jak SELinux. Podczas wdrażania klastra PostgreSQL lub TimescaleDB za pomocą ClusterControl możesz określić, czy ClusterControl ma wyłączać SELinux podczas procesu wdrażania, aby zmniejszyć ryzyko błędów:

Jeśli nie chcesz go wyłączać, możesz użyć trybu i monitoruj dziennik na swoich serwerach, aby upewnić się, że masz poprawną konfigurację SELinux. Następnie możesz zmienić go na Wymuszanie, postępując zgodnie z instrukcjami wymienionymi powyżej.

Więcej informacji na temat konfiguracji SELinux można znaleźć na oficjalnych stronach RedHat lub CentOS.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przekonwertować ciąg na datę w PostgreSQL

  2. wyłącz UWAGI w wyjściu psql

  3. Jak uzyskać wartość z ostatniego wstawionego wiersza?

  4. Nielegalna instrukcja:4 podczas uruchamiania Django

  5. postgresql:INSERT INTO ... (WYBIERZ * ...)