Picture of Roberto Sobrinho
Roberto Sobrinho

18/07/2024

Configurando Proxy User e Connect Through em Ambientes Oracle


Recentemente, um cliente adotou a solução de autenticação Proxy User no Oracle para evitar o compartilhamento de senhas dos usuários de aplicação. Vou detalhar essa abordagem e como ela foi implementada com sucesso.


Configuração Básica

Primeiro, vamos criar um usuário proxy e configurar a conexão através dele.

CREATE USER proxy_user IDENTIFIED BY senha#123;

GRANT CREATE SESSION to proxy_user;

O comando CREATE USER cria um novo usuário no banco de dados com a senha especificada. Em seguida, o comando GRANT CREATE SESSION permite que o usuário estabeleça uma conexão com o banco de dados. Finalmente, o comando ALTER USER sh GRANT CONNECT THROUGH proxy_user permite que o proxy_user se conecte como o usuário sh.

Conexão via Proxy

Para conectar via proxy, use a seguinte sintaxe:

sqlplus proxy_user[sh]/senha#123@pdb

Tipos de Proxy User

  • Proxy Normal:
ALTER USER sh GRANT CONNECT THROUGH proxy_user;

Este comando permite que o usuário proxy_user conecte-se como o usuário sh sem qualquer limitação adicional. É uma configuração básica onde o proxy tem os mesmos privilégios que o usuário alvo.

  • Limitar Privilégios a uma Role Específica:
ALTER USER sh GRANT CONNECT THROUGH proxy_user WITH ROLE ROLE_READ_ONLY;

Este comando restringe os privilégios do proxy_user ao conectar-se como sh apenas à role ROLE_READ_ONLY. Qualquer outra role atribuída ao usuário sh não será aplicada na sessão proxy.

  • Autenticação Necessária para Roles Autenticadas
ALTER USER sh GRANT CONNECT THROUGH proxy_user WITH ROLE ROLE_WRITE_ALL AUTHENTICATION REQUIRED;

Adiciona uma camada de segurança onde o proxy deve autenticar para utilizar a role ROLE_WRITE_ALL. Este comando é útil para situações onde roles específicas exigem uma autenticação adicional.

  • Desabilitar uma Role Específica do Usuário Destino
ALTER USER sh GRANT CONNECT THROUGH proxy_user WITH ROLE ALL EXCEPT ROLE_WRITE_ALL ;

Permite que o proxy_user se conecte como sh, mas desativa a role ROLE_WRITE_ALL durante a sessão. Isso é útil para limitar os privilégios de proxy sem remover completamente as roles.

  • Desabilitar Todas as Roles do Usuário Destino
ALTER USER sh GRANT CONNECT THROUGH proxy_user WITH NO ROLES;

Quando este comando é utilizado, o proxy_user pode se conectar como sh, mas todas as roles atribuídas ao usuário sh são desativadas durante a sessão. Isso assegura que o proxy tenha um nível mínimo de privilégios.

Identificação de Privilégios de Proxy

Para visualizar os privilégios de proxy, utilize a consulta abaixo:

 col PROXY                      format a15
 col CLIENT                     format a15
 col AUTHENTICATION             format a15
 col AUTHORIZATION_CONSTRAINT   format a60
 col ROLE                       format a15
 col PROXY_AUTHORITY            format a15

 SELECT * FROM proxy_users;

Esta consulta lista todos os privilégios de proxy concedidos a todos usuários. É útil para verificar as configurações de proxy no banco de dados.

Identificando Sessões Proxy

COLUMN "SID/SERIAL"        FORMAT A10
COLUMN username            FORMAT A15
COLUMN osuser              FORMAT A15
COLUMN authentication_type FORMAT A10

select distinct  ss.sid || ',' || ss.serial#  as "SID/SERIAL",
       ss.username, ss.osuser, pry.authentication_type
from   v$session ss,
       v$session_connect_info pry
where  ss.sid = pry.sid
and    ss.serial# = pry.serial#
and    pry.authentication_type = 'PROXY';

Esta consulta permite monitorar sessões que foram autenticadas por proxy.

Script para Copiar Privilégios de Proxy

Este script PL/SQL gera comandos SQL para transferir privilégios de proxy de um usuário de origem para um usuário de destino. Ele verifica se o usuário de origem possui privilégios de proxy e, se positivo, gera comandos ALTER USER para conceder esses privilégios ao usuário de destino.
Imagine que você precisa copiar os privilégios de proxy do usuário PROXY_USER para o usuário PROXY_TEMP. Para isso, você usará o script fornecido. Veja como isso seria feito na prática:

SET SERVEROUTPUT ON;
SET ECHO ON; 
DECLARE
    v_user_origem      VARCHAR2(30) := '&USER__ORIGEM';
    v_user_destino     VARCHAR2(30) := '&USER_DESTINO';
    v_privileges_count INTEGER;

BEGIN
    SELECT COUNT(*) INTO v_privileges_count
    FROM dba_proxies
    WHERE proxy = v_user_origem;

    IF v_privileges_count = 0 THEN
        DBMS_OUTPUT.PUT_LINE('Nenhum privilegio de proxy encontrado para ' || v_user_origem);
    ELSE
		    DBMS_OUTPUT.PUT_LINE('. . .                                                                                ');
			DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------');
			DBMS_OUTPUT.PUT_LINE('. . .                                                                                ');
        FOR r IN (SELECT * FROM dba_proxies WHERE proxy = v_user_origem) LOOP
            DBMS_OUTPUT.PUT_LINE('ALTER USER ' || r.client || ' GRANT CONNECT THROUGH ' || v_user_destino ||
                                 CASE WHEN r.role = 'ALL' THEN ' WITH NO ROLES' 
                                      WHEN r.role IS NOT NULL THEN ' WITH ROLE ' || r.role ELSE '' END || 
                                 CASE WHEN r.authentication = 'REQUIRED' THEN ' AUTHENTICATION REQUIRED' ELSE '' END || ';');
        END LOOP;
		    DBMS_OUTPUT.PUT_LINE('. . .                                                                                ');
			DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------------------------');
		    DBMS_OUTPUT.PUT_LINE('. . .                                                                                ');
    END IF;
END;
/
SET ECHO OFF; 
SET SERVEROUTPUT OFF;

Após a cópia dos privilégios de proxy do usuário PROXY_USER para o PROXY_TEMP, podemos concluir que o usuário PROXY_TEMP conseguirá fazer login entrando como SH, assim como estava o PROXY_USER.

sqlplus proxy_temp[sh]/senha#123@pdb

A técnica de autenticação de usuários proxy Connect Through no Oracle foi uma solução eficiente para um cliente que buscava aumentar a segurança sem comprometer a usabilidade. Essas técnicas evitam o compartilhamento de senhas e permitem um controle granular dos privilégios de acesso. Com elas, os DBAs conseguem auditar e monitorar atividades de forma mais precisa, garantindo que apenas usuários autorizados realizem operações sensíveis. Essa abordagem não só melhora a segurança, mas também a gestão e a conformidade com as políticas internas.


🚜🧱 #20240718 #GuinaNãoTinhaDó #ObraNãoAcaba #SeReagirBúmViraPó 🧱🚜



Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print

Pesquisar

Roberto Sobrinho

Sou Roberto Fernandes Sobrinho, também conhecido como Sobrinho DBA , pós graduado em “Architecture and Database Administration”, entusiasta, dedicado e com 20 anos de experiência com Oracle Database e suas diversas distribuições e variações.

Oracle ACE Associate

2025

Specialist

Exadata Database Machine X9M

Professional

Oracle Database Administration

Professional

Oracle Database 19c: RAC, ASM, & Grid Infra Administrator

Professional

Oracle Autonomous Database Cloud

Professional

Oracle Cloud Database Migration and Integration

Professional

Oracle Database PL/SQL Developer

Associate

Oracle Cloud Infrastructure Architect

Associate

Oracle Cloud Infrastructure Foundations

Categorias

Categorias

Tags

Configurando Proxy User e Connect Through em Ambientes Oracle