Autenticação via proxy user no Oracle Database

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 selected

Habilitar 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 selected

Atribuir 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     DATABASE

Desabilitar 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                         DATABASE

Consultas 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                         DATABASE

Listar 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                      DATABASE

Identificar 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          4

Revogar 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 selected

Consideraçõ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.

Referências

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima