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