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
. Para isso, você usará o script fornecido. Veja como isso seria feito na prática:PROXY_TEMP
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ó 🧱🚜