PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como configurar o SELinux para PostgreSQL e TimescaleDB

Os dados são o ativo mais importante em uma empresa, portanto, você deve levar em consideração todas as considerações de segurança em seu banco de dados para mantê-lo o mais seguro possível. Um importante recurso de segurança em sistemas operacionais baseados em RedHat é o SELinux. Neste blog, veremos o que é esse recurso e como configurá-lo para bancos de dados PostgreSQL e TimescaleDB.

O que é SELinux?

Security-Enhanced Linux (SELinux) é uma arquitetura de segurança para sistemas Linux que permite aos administradores ter mais controle sobre quem pode acessar o sistema. Ele define controles de acesso para aplicativos, processos e arquivos em um sistema usando políticas de segurança, que são um conjunto de regras que informam ao SELinux o que pode ser acessado.

Quando um aplicativo ou processo, conhecido como assunto, faz uma solicitação para acessar um objeto, como um arquivo, o SELinux verifica com um cache de vetor de acesso (AVC), onde as permissões são armazenadas em cache para assuntos e objetos . Se o SELinux não puder tomar uma decisão sobre o acesso com base nas permissões armazenadas em cache, ele enviará a solicitação ao servidor de segurança. O servidor de segurança verifica o contexto de segurança do aplicativo ou processo e do arquivo. O contexto de segurança é aplicado a partir do banco de dados de políticas do SELinux e a permissão é concedida ou negada.

Existem diferentes maneiras de configurá-lo. Você pode dar uma olhada no arquivo de configuração principal do SELinux em /etc/selinux/config para ver como ele está configurado atualmente.

$ 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


Existem duas diretivas neste arquivo. A diretiva SELINUX especifica o modo SELinux e pode ter três valores possíveis:Enforcing, Permissive ou Disabled.

  • Aplicação (Padrão):Habilitará e aplicará a política de segurança do SELinux no sistema, negando tentativas de acesso não autorizado por usuários e processos.

  • Permissivo:Ao usá-lo, o SELinux é habilitado, mas não impõe a política de segurança. Todas as violações de política são registradas nos logs de auditoria. É uma boa maneira de testar o SELinux antes de aplicá-lo.

  • Desativado:SELinux está desativado.

A diretiva SELINUXTYPE especifica a política a ser usada. O valor padrão é direcionado e com essa política, o SELinux permite personalizar e ajustar as permissões de controle de acesso.

Mesmo quando o modo Enforcing é o padrão, desabilitar o SELinux tornou-se uma prática comum, pois é mais fácil do que lidar com ele. Claro, isso não é recomendado e você deve configurá-lo pelo menos no modo Permissivo e verificar os logs periodicamente procurando por comportamentos incomuns.

Como configurar o SELinux

Se o SELinux estiver desabilitado em seu ambiente, você pode habilitá-lo editando o arquivo de configuração /etc/selinux/config e definindo SELINUX=permissive ou SELINUX=enforcing.

Se você nunca usou o SELinux, a melhor maneira de configurá-lo é usando o modo Permissivo primeiro, verifique os logs procurando por mensagens negadas no arquivo de log de mensagens e corrija-o se necessário:

$ grep "SELinux" /var/log/messages

Depois que tudo for revisado e for seguro continuar, você pode configurar o SELinux para aplicar usando o método anterior ou sem reiniciar usando o seguinte comando:

$ setenforce 1

Se precisar reverter, execute:

$ setenforce 0

Este comando pode ser usado para alternar entre os modos de imposição e permissão em tempo real, mas essas alterações não persistem se você reinicializar o sistema. Você precisará configurar o valor no arquivo de configuração para torná-lo persistente.

Você pode verificar o status atual do SELinux usando o comando getenforce:

$ getenforce
Enforcing

Ou para informações mais detalhadas, você pode usar 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

Como configurar o SELinux para PostgreSQL e TimescaleDB

Se você estiver instalando o PostgreSQL/TimescaleDB usando a configuração padrão e o diretório de dados padrão, e o SELinux também estiver configurado por padrão, provavelmente você não terá nenhum problema, mas o problema é se você quiser use, por exemplo, um local específico onde armazenar seu banco de dados, então vamos ver como configurar o SELinux para que ele funcione. Para este exemplo, instalaremos o PostgreSQL 13 no CentOS 8 e usaremos /pgsql/data/ como o diretório de dados.

Primeiro, habilite o módulo postgresql:

$ dnf module enable postgresql:13

Instale os pacotes PostgreSQL 13 correspondentes:

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

Ative o serviço:

$ systemctl enable postgresql.service

Inicialize seu banco de dados PostgreSQL:

$ postgresql-setup --initdb

Agora, se você apenas iniciar o serviço sem alterar nada, como o diretório de dados, ele iniciará bem, caso contrário, você verá um erro como:

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

Então, vamos ver como corrigi-lo. Primeiro, altere seu diretório de dados no arquivo de configuração e serviço do PostgreSQL. Para isso, edite o arquivo de serviço PostgreSQL e altere a localização do PGDATA:

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

Edite o arquivo de perfil bash do PostgreSQL e altere o local do PGDATA:

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

Leia as alterações:

$ systemctl daemon-reload

Inicialize o novo banco de dados PostgreSQL:

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

Não é necessário especificar o novo local do diretório de dados como você fez anteriormente nos arquivos de configuração. Agora, antes de iniciá-lo, você precisa alterar o rótulo do SELinux:

$ chcon -Rt postgresql_db_t /pgsql/data

Este comando irá alterar o contexto de segurança do SELinux, e os sinalizadores são:

  • -R, --recursive:Opera em arquivos e diretórios recursivamente

  • -t, --type=TYPE:define o tipo TYPE no contexto de segurança de destino

Em seguida, inicie o serviço PostgreSQL:

$ systemctl start postgresql.service

E seu banco de dados está rodando agora:

$ 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

Este é apenas um exemplo básico de como configurar o SELinux para PostgreSQL/TimescaleDB. Existem diferentes maneiras de fazer isso com diferentes restrições ou ferramentas. A melhor implementação ou configuração do SELinux depende dos requisitos de negócios.

Como usar PostgreSQL e TimescaleDB com ClusterControl e SELinux

ClusterControl não gerencia nenhum módulo de segurança do kernel Linux como o SELinux. Ao implantar um cluster PostgreSQL ou TimescaleDB usando o ClusterControl, você pode especificar se deseja que o ClusterControl desabilite o SELinux para você durante o processo de implantação para reduzir o risco de erros:

Se você não quiser desativá-lo, você pode usar o Permissive mode e monitore o log em seus servidores para garantir que você tenha a configuração correta do SELinux. Depois disso, você pode alterá-lo para Enforcing seguindo as instruções mencionadas acima.

Você pode encontrar mais informações sobre a configuração do SELinux nos sites oficiais do RedHat ou CentOS.