5

Segurança e Auditoria

Privilégios, roles, profiles, unified audit, TDE, data masking

📖

Definição

Modelo de Segurança Oracle

Privilégios de Sistema

Permitem executar operações específicas no banco. Exemplos:
CREATE SESSION, CREATE TABLE, ALTER SYSTEM, DROP ANY TABLE

  • 200+ privilégios de sistema disponíveis
  • Prefixo ANY: ação em qualquer schema (muito poderoso!)

Privilégios de Objeto

Permitem executar operações em objetos específicos:
SELECT, INSERT, UPDATE, DELETE, EXECUTE, ALTER, INDEX

  • Granularidade fina (por tabela, coluna, procedure)
  • WITH GRANT OPTION: permite repassar privilégio

Roles

Agrupamento de privilégios para facilitar gestão. Roles predefinidos:
DBA: Administração completa
CONNECT: Conectar e criar sessão
RESOURCE: Criar objetos básicos
SELECT_CATALOG_ROLE: Consultar dicionário de dados

Profiles

Limites de recursos e políticas de senha:
Recursos: SESSIONS_PER_USER, CPU_PER_SESSION, CONNECT_TIME
Senhas: FAILED_LOGIN_ATTEMPTS, PASSWORD_LIFE_TIME, PASSWORD_REUSE_TIME

Recursos de Segurança Avançada

TDE (Transparent Data Encryption)

Criptografia transparente de dados em repouso (datafiles, backups). Protege contra roubo de mídia física.

Unified Audit

Auditoria consolidada (12c+) que registra todas atividades em uma única trilha (SYS.AUD$UNIFIED).

Data Redaction

Mascara dados sensíveis em tempo real para usuários não autorizados (ex: mostrar apenas últimos 4 dígitos de CPF).

VPD (Virtual Private Database)

Row-level security dinâmico. Adiciona predicados WHERE automaticamente baseado em contexto do usuário.

🛠️

Aplicação Prática

Gerenciamento de Usuários e Privilégios

-- Criar usuário
CREATE USER app_user IDENTIFIED BY Welcome1
  DEFAULT TABLESPACE users
  TEMPORARY TABLESPACE temp
  QUOTA 100M ON users;

-- Conceder privilégios de sistema
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO app_user;

-- Conceder privilégios de objeto
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO app_user;
GRANT SELECT ON hr.departments TO app_user;
GRANT EXECUTE ON hr.get_salary TO app_user;

-- Conceder com WITH GRANT OPTION (permite repassar)
GRANT SELECT ON hr.employees TO app_user WITH GRANT OPTION;

-- Criar e atribuir role
CREATE ROLE app_role;
GRANT CREATE SESSION, CREATE TABLE TO app_role;
GRANT app_role TO app_user;

-- Revogar privilégios
REVOKE DELETE ON hr.employees FROM app_user;
REVOKE CREATE TABLE FROM app_user;

-- Ver privilégios de usuário
SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'APP_USER';
SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'APP_USER';
SELECT * FROM DBA_ROLE_PRIVS WHERE GRANTEE = 'APP_USER';

Profiles e Políticas de Senha

-- Criar profile com política de senha forte
CREATE PROFILE secure_profile LIMIT
  -- Limites de recursos
  SESSIONS_PER_USER          2
  CPU_PER_SESSION            UNLIMITED
  CONNECT_TIME               480        -- 8 horas
  IDLE_TIME                  30         -- 30 minutos
  -- Políticas de senha
  FAILED_LOGIN_ATTEMPTS      5
  PASSWORD_LIFE_TIME         90         -- dias
  PASSWORD_REUSE_TIME        365        -- dias antes de reusar
  PASSWORD_REUSE_MAX         5          -- quantas senhas diferentes antes de reusar
  PASSWORD_LOCK_TIME         1          -- dia(s) de bloqueio
  PASSWORD_GRACE_TIME        7          -- dias de aviso antes de expirar
  PASSWORD_VERIFY_FUNCTION   ora12c_strong_verify_function;

-- Atribuir profile ao usuário
ALTER USER app_user PROFILE secure_profile;

-- Ver profiles
SELECT * FROM DBA_PROFILES WHERE PROFILE = 'SECURE_PROFILE';

-- Criar função de verificação customizada
CREATE OR REPLACE FUNCTION custom_password_verify
(username VARCHAR2, password VARCHAR2, old_password VARCHAR2)
RETURN BOOLEAN IS
BEGIN
  -- Mínimo 12 caracteres
  IF LENGTH(password) < 12 THEN
    RAISE_APPLICATION_ERROR(-20001, 'Senha deve ter no mínimo 12 caracteres');
  END IF;
  
  -- Deve conter letra maiúscula, minúscula, número e caractere especial
  IF NOT REGEXP_LIKE(password, '[A-Z]') OR
     NOT REGEXP_LIKE(password, '[a-z]') OR
     NOT REGEXP_LIKE(password, '[0-9]') OR
     NOT REGEXP_LIKE(password, '[^A-Za-z0-9]') THEN
    RAISE_APPLICATION_ERROR(-20002, 'Senha deve conter maiúscula, minúscula, número e especial');
  END IF;
  
  -- Não pode conter username
  IF INSTR(UPPER(password), UPPER(username)) > 0 THEN
    RAISE_APPLICATION_ERROR(-20003, 'Senha não pode conter username');
  END IF;
  
  RETURN TRUE;
END;
/

TDE - Transparent Data Encryption

-- Configurar Oracle Wallet (armazena master key)
-- No sqlnet.ora adicionar:
-- ENCRYPTION_WALLET_LOCATION = (SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=/u01/app/oracle/wallet)))

-- Criar e abrir wallet
ADMINISTER KEY MANAGEMENT CREATE KEYSTORE '/u01/app/oracle/wallet' IDENTIFIED BY Welcome1;
ADMINISTER KEY MANAGEMENT SET KEYSTORE OPEN IDENTIFIED BY Welcome1;

-- Criar master encryption key
ADMINISTER KEY MANAGEMENT SET KEY IDENTIFIED BY Welcome1 WITH BACKUP;

-- Criptografar tablespace inteira
CREATE TABLESPACE secure_data
  DATAFILE '/u01/app/oracle/oradata/secure01.dbf' SIZE 100M
  ENCRYPTION USING 'AES256'
  DEFAULT STORAGE(ENCRYPT);

-- Criptografar tablespace existente
ALTER TABLESPACE users ENCRYPTION ONLINE USING 'AES256' ENCRYPT;

-- Criptografar colunas específicas
CREATE TABLE customers (
  customer_id   NUMBER PRIMARY KEY,
  name          VARCHAR2(100),
  ssn           VARCHAR2(11) ENCRYPT USING 'AES256',  -- Coluna criptografada
  credit_card   VARCHAR2(16) ENCRYPT USING 'AES256',
  address       VARCHAR2(200)
);

-- Verificar objetos criptografados
SELECT TABLESPACE_NAME, ENCRYPTED FROM DBA_TABLESPACES;
SELECT TABLE_NAME, COLUMN_NAME, ENCRYPTION_ALG FROM DBA_ENCRYPTED_COLUMNS;

Unified Audit

-- Verificar se Unified Audit está habilitado
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';

-- Criar política de auditoria
CREATE AUDIT POLICY critical_operations
  ACTIONS DELETE ON hr.employees,
          UPDATE ON hr.employees,
          EXECUTE ON hr.adjust_salary;

-- Habilitar política
AUDIT POLICY critical_operations BY app_user;
AUDIT POLICY critical_operations BY USERS WITH GRANTED ROLES dba;

-- Auditar todos os privilégios de sistema
CREATE AUDIT POLICY system_privs_audit
  PRIVILEGES CREATE ANY TABLE, DROP ANY TABLE, ALTER SYSTEM;
AUDIT POLICY system_privs_audit;

-- Auditar logins e logouts
AUDIT POLICY ora_logon_failures;  -- Política predefinida
AUDIT POLICY ora_account_mgmt;    -- Gestão de contas

-- Consultar trilha de auditoria
SELECT EVENT_TIMESTAMP, DBUSERNAME, ACTION_NAME, 
       OBJECT_SCHEMA, OBJECT_NAME, SQL_TEXT
FROM UNIFIED_AUDIT_TRAIL
WHERE DBUSERNAME = 'APP_USER'
ORDER BY EVENT_TIMESTAMP DESC
FETCH FIRST 20 ROWS ONLY;

-- Limpar auditoria antiga (dados acumulam rapidamente!)
BEGIN
  DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(
    audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
    use_last_arch_timestamp => FALSE
  );
END;
/

Data Redaction

-- Redação parcial (mascara parte dos dados)
BEGIN
  DBMS_REDACT.ADD_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'mask_ssn',
    column_name   => 'SSN',
    function_type => DBMS_REDACT.PARTIAL,
    function_parameters => 'VVVFVVFVVVV,XXX-XX-####,*,1,6',  -- Mostra apenas últimos 4 dígitos
    expression    => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') != ''HR_ADMIN'''
  );
END;
/

-- Redação completa (substitui por valor fixo)
BEGIN
  DBMS_REDACT.ADD_POLICY(
    object_schema => 'HR',
    object_name   => 'EMPLOYEES',
    policy_name   => 'hide_salary',
    column_name   => 'SALARY',
    function_type => DBMS_REDACT.FULL,
    expression    => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') NOT IN (''HR_ADMIN'',''PAYROLL'')'
  );
END;
/

-- Testar redação
-- Como usuário sem privilégio:
SELECT EMPLOYEE_ID, NAME, SSN, SALARY FROM HR.EMPLOYEES;
-- Resultado: SSN mostra XXX-XX-1234, SALARY mostra 0

-- Como HR_ADMIN:
SELECT EMPLOYEE_ID, NAME, SSN, SALARY FROM HR.EMPLOYEES;
-- Resultado: Dados reais visíveis

-- Ver políticas de redação
SELECT OBJECT_OWNER, OBJECT_NAME, POLICY_NAME, EXPRESSION
FROM REDACTION_POLICIES;

Resultado Esperado

Competências Adquiridas

Gestão de Privilégios

Criar usuários, atribuir roles e privilégios

Políticas de Senha

Criar profiles com regras fortes

TDE

Criptografar dados sensíveis

Unified Audit

Configurar e analisar auditoria

Data Redaction

Mascarar dados em tempo real

Princípio do Menor Privilégio

Conceder apenas permissões necessárias

Compliance

Atender regulações (LGPD, GDPR, SOX)

Investigação de Incidentes

Rastrear atividades suspeitas

Boas Práticas de Segurança

  • Nunca use contas genéricas - crie usuário individual para cada pessoa
  • Desabilite contas padrão (SCOTT, HR) em produção
  • Implemente senha forte e rotação periódica
  • Use TDE para dados sensíveis (PCI-DSS, LGPD, GDPR)
  • Habilite auditoria em todas operações críticas
  • Revise privilégios regularmente - remova o que não é usado
  • Separe ambientes (dev/test/prod) com usuários diferentes
  • Nunca compartilhe credenciais de SYS ou SYSTEM
  • Monitore logins falhados e atividades anormais
  • Mantenha backups de audit trail em local seguro
Anterior: Multitenant Voltar ao Índice