Tarefas comuns de DBA do Amazon RDS for PostgreSQL - Amazon Relational Database Service

Tarefas comuns de DBA do Amazon RDS for PostgreSQL

Os administradores de banco de dados (DBAs) executam várias tarefas ao administrar uma instância de banco de dados Amazon RDS for PostgreSQL. Isso ajuda a entender alguns dos recursos básicos do PostgreSQL e como usá-los em uma instância de banco de dados do RDS for PostgreSQL. Por exemplo, se você é um DBA que já conhece o PostgreSQL, esteja ciente de que o Amazon RDS não permite acesso de shell a instâncias de banco de dados. Isso significa que você não pode acessar arquivos de log da mesma forma que faz quando executa o PostgreSQL no hardware do servidor. Para saber mais sobre como trabalhar com arquivos de log do RDS for PostgreSQL, consulte Arquivos de log do banco de dados PostgreSQL.

O Amazon RDS limita o acesso a determinados procedimentos e tabelas do sistema que exigem privilégios avançados para a função rds_superuser. Essa é a identidade mais privilegiada em uma instância de banco de dados do RDS for PostgreSQL. Para obter mais informações, consulte Noções básicas sobre a função rds_superuser.

Veja a seguir algumas tarefas comuns do DBA para o RDS for PostgreSQL.

Controlar o acesso de usuários ao banco de dados PostgreSQL

No RDS for PostgreSQL, você pode gerenciar quais usuários têm privilégios estabelecer conexão com quais bancos de dados. Em ambientes do PostgreSQL, você pode realizar esse tipo de gerenciamento modificando o arquivo pg_hba.conf. No Amazon RDS, você pode usar concessões de banco de dados.

Os novos bancos de dados no PostgreSQL são sempre criados com um conjunto padrão de privilégios. Os privilégios padrão concedem permissão PUBLIC (todos os usuários) para a conexão com o banco de dados e a criação de tabelas temporárias durante a conexão.

Para controlar quais usuários terão permissão para se conectar a um determinado banco de dados no Amazon RDS, primeiro revogue os privilégios padrão PUBLIC. Em seguida, conceda novamente os privilégios de uma maneira mais granular. O exemplo a seguir mostra como.

postgres=> REVOKE ALL on database db-name from public; postgres=> GRANT CONNECT, TEMPORARY on database db-name to user/role;

Para obter mais informações sobre privilégios nos bancos de dados PostgreSQL, consulte o comando GRANT na documentação do PostgreSQL.

Trabalhar com os mecanismos de registro em log compatíveis com o RDS for PostgreSQL

Existem vários parâmetros, extensões e outros itens configuráveis que você pode definir para registrar em log as atividades que ocorrem na sua instância de banco de dados PostgreSQL. Incluindo o seguinte:

  • O parâmetro log_statement pode ser usado para registrar as atividades dos usuários no seu banco de dados PostgreSQL. Para saber mais sobre o registro em log do RDS for PostgreSQL e como monitorar os logs, consulte Arquivos de log do banco de dados PostgreSQL.

  • O parâmetro rds.force_admin_logging_level registra na instância de banco de dados as ações do usuário interno do Amazon RDS (rdsadmin) nos bancos de dados. Ele grava a saída no log de erros do PostgreSQL. Os valores permitidos são disabled, debug5, debug4, debug3, debug2, debug1, info, notice, warning, error, log,fatal e panic. O valor padrão é disabled.

  • O parâmetro rds.force_autovacuum_logging_level pode ser definido para capturar várias operações de autovacuum no log de erros do PostgreSQL. Para obter mais informações, consulte Registrar atividades do autovacuum e do vacuum em log.

  • A extensão pgaudit pode ser instalada e configurada para capturar atividades no nível da sessão ou no nível do objeto. Para obter mais informações, consulte Registro em log no nível da sessão e do objeto com a extensão pgaudit.

  • A extensão log_fdw possibilita que você acesse o log do mecanismo de banco de dados usando SQL. Para obter mais informações, consulte Usar a extensão log_fdw para acessar o log de banco de dados usando SQL.

  • A biblioteca pg_stat_statements é especificada como padrão para o parâmetro shared_preload_libraries no RDS for PostgreSQL versão 10 e posteriores. É essa biblioteca que você pode usar para analisar consultas em execução. Certifique-se de que pg_stat_statements esteja definido no grupo de parâmetros de banco de dados. Para obter mais informações sobre o monitoramento da instância de banco de dados do RDS for PostgreSQL usando as informações fornecidas por essa biblioteca, consulte Estatísticas SQL do RDS PostgreSQL.

Em termos gerais, o objetivo do registro em log é possibilitar que o DBA monitore, ajuste a performance e solucione problemas. Muitos dos logs são carregados automaticamente no Amazon CloudWatch ou no Performance Insights. Aqui, eles são classificados e agrupados para fornecer métricas completas para sua instância de banco de dados. Para saber mais sobre o monitoramento e as métricas do Amazon RDS, consulte Métricas de monitoramento em uma instância do Amazon RDS.

Uso de pgBadger para análise de logs com o PostgreSQL

Você pode usar um analisador de log, como o pgBadger, para analisar logs do PostgreSQL. A documentação do pgBadger indica que o padrão %l (linha de log da sessão ou do processo) deve ser uma parte do prefixo. Contudo, se você fornecer o log_line_prefix atual do RDS como um parâmetro para pgBadger, isso ainda produzirá um relatório.

Por exemplo, o comando a seguir formata corretamente um arquivo de log do Amazon RDS for PostgreSQL com data de 04/02/2014 usando pgBadger.

./pgbadger -f stderr -p '%t:%r:%u@%d:[%p]:' postgresql.log.2014-02-04-00

Limitar o controle de senhas de usuários a uma função específica

Restrinja quem pode gerenciar senhas de usuários de bancos de dados a uma função especial. Fazendo isso, tenha mais controle sobre o gerenciamento de senhas no lado do cliente.

Ative o gerenciamento de senhas restrito com o parâmetro estático rds.restrict_password_commands e use uma função chamada rds_password. Quando o parâmetro rds.restrict_password_commands está definido como 1, somente usuários membros da função rds_password podem executar determinados comandos SQL. Os comandos SQL restritos são comandos que modificam senhas de usuário de banco de dados e tempo de expiração de senha.

Para usar o gerenciamento de senhas restrito, certifique-se de que a instância de banco de dados esteja executando o RDS for PostgreSQL 10.6 ou posterior. Como o parâmetro rds.restrict_password_commands é estático, alterar esse parâmetro exige uma redefinição de banco de dados.

Quando um banco de dados tem o gerenciamento de senhas restrito ativado, se tentar executar comandos SQL restritos, você receberá o seguinte erro: ERROR: must be a member of rds_password to alter passwords (ERROR: deve ser um membro de rds_password para alterar senhas).

Estes são alguns exemplos de comandos SQL restritos quando o gerenciamento de senhas restrito está ativado.

postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword'; postgres=> CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole WITH PASSWORD 'mypassword'; postgres=> ALTER ROLE myrole VALID UNTIL '2020-01-01'; postgres=> ALTER ROLE myrole RENAME TO myrole2;

Alguns comandos ALTER ROLE que incluem RENAME TO também podem estar restritos. Eles podem estar restritos porque renomear uma função PostgreSQL com uma senha MD5 limpa a senha.

A função rds_superuser tem associação com a função rds_password por padrão, e não é possível alterar isso. Atribua outras associações à função rds_password usando o comando SQL GRANT. Recomendamos conceder associação a rds_password a apenas algumas funções usadas exclusivamente no gerenciamento de senhas. Essas funções exigem o atributo CREATEROLE para modificar outras funções.

Verifique os requisitos de senha, como expiração e complexidade necessária, no lado do cliente. Recomendamos restringir alterações relacionadas à senha usando o próprio utilitário no lado do cliente. Esse utilitário deve ter uma função membro de rds_password e tenha o atributo de função CREATEROLE.

Noções básicas sobre a função rds_superuser

Quando você cria uma instância de banco de dados do RDS for PostgreSQL, a conta do sistema do usuário principal que você cria é atribuída à função rds_superuser. A função rds_superuser é uma função predefinida do Amazon RDS semelhante à função de superusuário do PostgreSQL (normalmente denominada postgres em instâncias locais), mas com algumas restrições. Como ocorre com a função de superusuário PostgreSQL, a função rds_superuser tem a maioria dos privilégios da instância de banco de dados. Não atribua essa função aos usuários, a menos que eles precisem do máximo acesso à instância de banco de dados.

A função rds_superuser pode fazer o seguinte:

  • Adicionar extensões que estão disponíveis para o uso com o Amazon RDS. Para obter mais informações, consulte a seção Trabalhar com recursos do PostgreSQL compatíveis com o Amazon RDS for PostgreSQL e a documentação do PostgreSQL.

  • Gerenciar os tablespaces, incluindo a criação e a exclusão deles. Para obter mais informações, consulte Tablespaces para RDS for PostgreSQL e a seção Tablespaces na documentação do PostgreSQL.

  • Visualize todos os usuários não atribuídos à função rds_superuser usando o comando pg_stat_activity e interrompa as conexões deles usando os comandos pg_terminate_backend e pg_cancel_backend.

  • Conceda e revogue a função rds_replication para todas as funções, exceto para a função rds_superuser. Para obter mais informações, consulte a seção GRANT na documentação do PostgreSQL.

Como mencionado, a função rds_superuser não pode fazer tudo o que o superusuário postgres pode fazer. Por exemplo,rds_superuser não pode ignorar o privilégio CONNECT ao se conectar a um banco de dados. Essa função deve ser especificamente concedida a todos os usuários que você criar e que devem ter privilégios rds_superuser.

O exemplo a seguir mostra como criar um usuário e depois conceder a ele a função rds_superuser.

postgres=> CREATE ROLE bus_app_admin WITH PASSWORD 'change_me' LOGIN; CREATE ROLE postgres=> GRANT rds_superuser TO bus_app_admin; GRANT ROLE