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