Introdução
A autenticação via proxy user pode ser empregada para que um determinado usuário proxy consiga realizar o acesso represantando outro usuário destino, com acesso total ou limitado a certas roles. De modo geral, essa autenticação pode ser utilizada em aplicações para diferenciação de acessos e funcionalidades, e para os casos de gerenciamento de acessos sem compartilhamento de credenciais do usuário destino, visto que o proxy user se conecta com a sua senha e/ou com uma autenticação adicional a nível de client. É importante avaliar bem os cenários em que isso possa ser empregado, pois está diretamente relacionado à questão de acessos e de segurança.
Configurações iniciais – setup
Serão criados três usuários para reprenstar aplicações e um usuário que será o proxy, o qual conseguirá realizar o acesso em um dos usuários da aplicação. Também há a criação de alguns objetos tabela e roles, além da concessão de privilégios para que os testes de acesso possam ser realizados nas próximas seções.
Observação: Se for de interesse realizar as configurações, configurá-las em um ambiente propício a testes, a fim de mitigar erros em ambientes críticos.
SQL> create user appuser01 identified by strongpassword01;
User created.
SQL> grant create session to appuser01;
Grant succeeded.
SQL> grant create table to appuser01;
Grant succeeded.
SQL> create table appuser01.table01 (
id number); 2
Table created.
SQL> create user appuser02 identified by strongpassword02;
User created.
SQL> grant create session to appuser02;
Grant succeeded.
SQL> grant create table to appuser02;
Grant succeeded.
SQL> create table appuser02.table02 (
id number); 2
Table created.
SQL> create role appuser02_select;
Role created.
SQL> grant select on appuser02.table02 to appuser02_select;
Grant succeeded.
SQL> create user appuser03 identified by strongpassword03;
User created.
SQL> grant create session to appuser03;
Grant succeeded.
SQL> grant create table to appuser03;
Grant succeeded.
SQL> create table appuser03.table03 (
id number); 2
Table created.
SQL> create role appuser03_select;
Role created.
SQL> grant select on appuser02.table02 to appuser02_select;
Grant succeeded.
SQL> create user proxyuser identified by strongpassword;
User created.
SQL> grant create session to proxyuser;
Grant succeeded.
SQL> alter user appuser01 grant connect through proxyuser;
User altered.
SQL> grant appuser02_select to appuser01;
Grant succeeded.
SQL> grant appuser03_select to appuser01;
Grant succeeded.
SQL> grant select on appuser03.table03 to appuser01;
Grant succeeded.
Alguns dos comandos utilizados nas próximas sessões envolvem a utilização de scripts, os quais podem ser encontrados na página de scripts desse site. Tanto as configurações que foram realizadas, quanto as consultas/scripts, requerem alguns privilégios no ambiente de banco de dados.
Testando os acessos/autenticações
Visto que o usuário proxyuser pode realizar o acesso por meio do appuser01, serão exemplificados o acesso direto com o appuser01 e o acesso via proxy user ao usuário appuser01. Por meio da utilização da function sys_context em um script de consulta, foram obtidas algumas informações de contexto de ambas as conexões, e das informações presentes abaixo se obser que na conexão proxy o valor de PROXY_USER corresponde ao nome do usuário proxy e que o valor de AUTHENTICATION_METHOD está igual a none.
SQL> connect appuser01/strongpassword01@pdb03
Connected.
SQL> @ora_context_info.sql
INSTANCE_NAME CON_NAME DATABASE_ROLE SESSION_USER CURRENT_USER CURRENT_SCHEMA PROXY_USER AUTHENTICATED_IDENTITY AUTHENTICATION_METHOD
------------------------- ------------------------- ------------------------- ------------------------- ------------------------- ------------------------- ------------------------- ------------------------- -------------------------
orcl02 PDB03 PRIMARY APPUSER01 APPUSER01 APPUSER01 APPUSER01 PASSWORD
SQL>
SQL> disconnect;
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.20.0.0.0
SQL>
SQL> connect proxyuser[appuser01]/strongpassword@pdb03;
Connected.
SQL> @ora_context_info.sql
INSTANCE_NAME CON_NAME DATABASE_ROLE SESSION_USER CURRENT_USER CURRENT_SCHEMA PROXY_USER AUTHENTICATED_IDENTITY AUTHENTICATION_METHOD
------------------------- ------------------------- ------------------------- ------------------------- ------------------------- ------------------------- ------------------------- ------------------------- -------------------------
orcl02 PDB03 PRIMARY APPUSER01 APPUSER01 APPUSER01 PROXYUSER APPUSER01 NONE
Gerenciamento de roles no acesso via proxy user
É importante controlar o nível dos acessos que os usuários podem realizar no banco de dados, e isso segue válido para os proxy users, sendo possível limitar, de modo total ou parcial, as roles que o usuário destino da autenticação via proxy terá no acesso proxy. Esse controle é realizado por meio da configuração da autenticação via proxy “… grant connect through…” onde é específicada a utilização de roles. Para verificar o que configurado, a view dba_proxies pode ser consultada.
Obs: Mesmo com a possível limitação de roles, o usuário destino ainda manterá os privilégios que forem atribuídos diretamente à ele.
Habilitar todas as roles
Por padrão, na configuração da autenticação via proxy, a não especificação de designação de roles implica no acesso à todas as roles do usuário destino.
SQL> alter user appuser01 grant connect through proxyuser;
User altered.
SQL> @ora_proxy_user_info.sql PROXYUSER
PROXY CLIENT AUTHENTICATION AUTHORIZATION_CONSTRAINT ROLE PROXY_AUTHORITY
-------------------- -------------------- -------------- ----------------------------------- -------------------- ---------------
PROXYUSER APPUSER01 NO PROXY MAY ACTIVATE ALL CLIENT ROLES DATABASE
SQL> connect proxyuser[appuser01]/strongpassword@pdb03;
Connected.
SQL> select distinct granted_role from user_role_privs;
GRANTED_ROLE
--------------------------------------------------------------------------------
APPUSER02_SELECT
APPUSER03_SELECT
SQL> select grantee || ' ' || table_name || ' ' || privilege || ' ' || grantor from user_tab_privs;
GRANTEE||''||TABLE_NAME||''||PRIVILEGE||''||GRANTOR
--------------------------------------------------------------------------------
APPUSER01 TABLE03 SELECT APPUSER03
PUBLIC APPUSER01 INHERIT PRIVILEGES APPUSER01
SQL> select * from appuser02.table02;
no rows selected
SQL> select * from appuser03.table03;
no rows selectedHabilitar todas as roles exceto uma específica
Pode ser excluída uma role específica. Vale a pena lembrar que os privilégios atribuídos ao usuário destino permanecem.
SQL> alter user appuser01 grant connect through proxyuser with role all except appuser03_select;
User altered.
SQL> @ora_proxy_user_info.sql PROXYUSER
PROXY CLIENT AUTHENTICATION AUTHORIZATION_CONSTRAINT ROLE PROXY_AUTHORITY
-------------------- -------------------- -------------- ----------------------------------- -------------------- ---------------
PROXYUSER APPUSER01 NO PROXY MAY NOT ACTIVATE ROLE APPUSER03_SELECT DATABASE
SQL> connect proxyuser[appuser01]/strongpassword@pdb03;
Connected.
SQL>
SQL> select distinct granted_role from user_role_privs;
GRANTED_ROLE
--------------------------------------------------------------------------------
APPUSER02_SELECT
SQL> select grantee || ' ' || table_name || ' ' || privilege || ' ' || grantor from user_tab_privs;
GRANTEE||''||TABLE_NAME||''||PRIVILEGE||''||GRANTOR
--------------------------------------------------------------------------------
APPUSER01 TABLE03 SELECT APPUSER03
PUBLIC APPUSER01 INHERIT PRIVILEGES APPUSER01
SQL> select * from appuser02.table02;
no rows selected
SQL> select * from appuser03.table03;
no rows selectedAtribuir um conjunto de roles
Há a possibilidade de serem definidas uma ou mais roles após a autenticação via proxy.
SQL> alter user appuser01 grant connect through proxyuser with role appuser02_select;
User altered.
SQL> @ora_proxy_user_info.sql PROXYUSER
PROXY CLIENT AUTHENTICATION AUTHORIZATION_CONSTRAINT ROLE PROXY_AUTHORITY
-------------------- -------------------- -------------- ----------------------------------- -------------------- ---------------
PROXYUSER APPUSER01 NO PROXY MAY ACTIVATE ROLE APPUSER02_SELECT DATABASE
SQL> alter user appuser01 grant connect through proxyuser with role appuser02_select, appuser03_select;
User altered.
SQL> @ora_proxy_user_info.sql PROXYUSER
PROXY CLIENT AUTHENTICATION AUTHORIZATION_CONSTRAINT ROLE PROXY_AUTHORITY
-------------------- -------------------- -------------- ----------------------------------- -------------------- ---------------
PROXYUSER APPUSER01 NO PROXY MAY ACTIVATE ROLE APPUSER02_SELECT DATABASE
PROXYUSER APPUSER01 NO PROXY MAY ACTIVATE ROLE APPUSER03_SELECT DATABASEDesabilitar as roles
Todas as roles do usuário destino podem ser desativas no acesso com autenticação proxy.
SQL> alter user appuser01 grant connect through proxyuser with no role;
User altered.
SQL> @ora_proxy_user_info.sql PROXYUSER
PROXY CLIENT AUTHENTICATION AUTHORIZATION_CONSTRAINT ROLE PROXY_AUTHORITY
-------------------- -------------------- -------------- ----------------------------------- -------------------- ---------------
PROXYUSER APPUSER01 NO NO CLIENT ROLES MAY BE ACTIVATED DATABASEConsultas acerca dos proxy users
É fundamental entender o que foi configurado a nível de privilégios e o que eventualmente está sendo utilizado no banco de dados a nível de sessões. Abaixo seguem algumas consultas referentes aos proxy users.
Listar os proxy users
A view proxy_users exibirá a lista dos proxy users.
SQL> @ora_proxy_user_info.sql PROXYUSER
PROXY CLIENT AUTHENTICATION AUTHORIZATION_CONSTRAINT ROLE PROXY_AUTHORITY
-------------------- -------------------- -------------- ----------------------------------- -------------------- ---------------
PROXYUSER APPUSER01 NO NO CLIENT ROLES MAY BE ACTIVATED DATABASEListar as roles atribuídas as conexões via proxy user
A view dba_proxies pode ser consulta para obter informações acerca das conexões proxy no banco de dados.
SQL> @ora_proxy_user_info.sql PROXYUSER
PROXY CLIENT AUTHENTICATION AUTHORIZATION_CONSTRAINT ROLE PROXY_AUTHORITY
-------------------- -------------------- -------------- ----------------------------------- -------------------- ---------------
PROXYUSER APPUSER01 NO PROXY MAY ACTIVATE ALL CLIENT ROLES DATABASEIdentificar as sessões de proxy user
As views v$session_connect_info, v$process e v$session podem ser combinadas para obter detalhes das sessões no banco de dados.
SQL> @ora_query_proxy_sessions.sql
USERNAME AUTHENTICATION_TYPE INST_ID SID SERIAL# STATUS LOGON_TIME ELAPSED_TIME MACHINE||PORT||OSUSER||PROGRAM MODULE || EVENT PROCESS SPID SQL_ID PREV_SQL_ID CON_ID
-------------------- ------------------- ---------- ---------- ---------- -------- ------------------- ------------------- ------------------------------------------------------------------------------ ---------------------------------------------------------------------- ------------------------ ------------------------ ------------- ------------- ----------
APPUSER01 PROXY 1 153 49341 INACTIVE 2025-08-29 19:13:39 00d00h04m34s oracledb||61228||oracle||sqlplus@oracledb (TNS V1-V3) SQL*Plus || SQL*Net message from client 2659 2661 g4y6nw3tts7cc 4Revogar a autenticação via proxy user
É possível revogar a autenticação via proxy user.
SQL> @ora_proxy_users.sql
PROXY CLIENT AUTHENTICATION FLAGS
-------------------- -------------------- -------------- -----------------------------------
PROXYUSER APPUSER01 NO PROXY MAY ACTIVATE ALL CLIENT ROLES
SQL>
SQL> alter user appuser01 revoke connect through proxyuser;
User altered.
SQL>
SQL> @ora_proxy_users.sql
no rows selectedConsiderações
Avaliar os impactos das autenticações via proxy e definir os níveis de acesso, são fundamentais para o controle de acessos e segurança do banco de dados, portanto os usuários proxy e suas autenticações devem ser gerenciados com cautela.