Usando Lockdown Profiles estáticos e dinâmicos

Por Fabio Prado Oracle ACE, Skant Gupta Oracle ACE, Joel Pérez Oracle ACE director
Publicado em Fevereiro 2019

Revisado por Francisco Riccio




A instrução CREATE LOCKDOWN PROFILE permite aos DBAs criarem “lockdown profiles”, cujo propósito é restringir operações de usuários dentro dos PDBs que estão associados com multitenant CDBs. Essa restrição pode ser aplicada usando certas options do Banco de Dados, features e instruções SQL.

O Oracle 18c fornece 3 métodos diferentes para atribuir lockdown profiles a PDBs individualmente ou a todos os PDBs presentes em um CDB ou application container, como descrito abaixo:

  • O lockdown profile pode ser aplicado ao application root tão bem quanto a todos os PDBs no application container configurando o parâmetro PDB_LOCKDOWN, conectando-se no application root;

  • O lockdown profile será aplicado em todos os PDBs dentro de um CDB configurando o parâmetro PDB_LOCKDOWN conectado ao CDB root. Neste caso, o lockdown não será aplicado ao CDB root;

  • O lockdown profile será aplicado a um particular PDB enquanto sobrescreve o CDB lockdown profile, se você configurar o parâmetro PDB_LOCKDOWN em um particular PDB.


Além desses métodos, existem mais 2 caminhos para criar lockdown profiles usando profiles existentes:


Static lockdown profile:

A cláusula FROM é usada para criar um lockdown profile estático fora do base profile. Quaisquer mudanças subsequentes feitas no base profile não refletirão no lockdown profile estático.


Dynamic lockdown profile:

A cláusula INCLUDING é usada para criar um lockdown profile dinâmico. Quaisquer mudanças feitas para o base profile deverão refletir no seu lockdown profile. Quaisquer mudanças feitas no base profile deverão também refletir no lockdown profile. No caso do DBA explicitamente adicionar uma nova regra para a regra de lockdown dinâmica que está conflitante com as regras existentes, então as regras presentes no base profile deverão ter predecência sobre a nova regra conflitante.




Lockdown Profiles estáticos e dinâmicos: Exemplo


O exemplo abaixo fornece uma demonstração passo-a-passo para ver como funcionam os lockdown profiles no Oracle 18c:

Pré-requisitos:

  • Ter Oracle 18c Container Database (CDB18C) já instalado
  • Ter 2 PDBs (PDB$SEED & PDB18C) já configurados.

  1. Abra o SQL*Plus e faça logon no banco de dados como SYS no CDB18C e verifique os arquivos existentes:

    Code
    [oracle@18c ~]$ sqlplus SYS@CDB18C AS SYSDBA
    SQL> SELECT profile_name, rule, clause, status, CLAUSE_OPTION FROM cdb_lockdown_profiles;
    
    no rows selected


  2. Crie um profile comum que desabilita o comando ALTER SYSTEM para alterar a SGA:

    Code
    SQL> CREATE LOCKDOWN PROFILE CDB_BASE_PROFILE;
    Lockdown Profile created.
    
    SQL> ALTER LOCKDOWN PROFILE CDB_BASE_PROFILE DISABLE STATEMENT= ('ALTER SYSTEM') 
    clause=('SET')  OPTION = ('SGA_TARGET');
    Lockdown Profile altered.
    
    SQL> SELECT profile_name, rule, clause, status, CLAUSE_OPTION FROM cdb_lockdown_profiles;
    
    PROFILE_NAME         RULE                           CLAUSE     STATUS CLAUSE_OPTION
    -------------------- ------------------------------ ---------- ------- ------------
    CDB_BASE_PROFILE     ALTER SYSTEM                   SET        DISABLE SGA_TARGET
    


  3. Agora crie o profile estático que inicialmente herda a propriedade do base profile, mas que não pega as mudanças depois de criado:

    Code
    SQL> CREATE LOCKDOWN PROFILE static_profile FROM cdb_base_profile;
    Lockdown Profile created.
    
    SQL> SELECT profile_name, rule, clause, status, CLAUSE_OPTION FROM cdb_lockdown_profiles;
    
    PROFILE_NAME         RULE                           CLAUSE     STATUS CLAUSE_OPTION
    -------------------- ------------------------------ ---------- ------- ------------
    CDB_BASE_PROFILE     ALTER SYSTEM                   SET        DISABLE SGA_TARGET
    STATIC_PROFILE       ALTER SYSTEM                   SET        DISABLE SGA_TARGET
        


  4. Vamos criar o profile dinâmico que herda a propriedade inicial do base profile tão bem quanto mudanças feitas futuramente nele:

    Code
    SQL> CREATE LOCKDOWN PROFILE dynamic_profile INCLUDING cdb_base_profile;
    Lockdown Profile created.
    
    SQL> SELECT profile_name, rule, clause, status, CLAUSE_OPTION FROM cdb_lockdown_profiles;
    
    PROFILE_NAME         RULE                           CLAUSE     STATUS CLAUSE_OPTION
    -------------------- ------------------------------ ---------- ------- ------------
    CDB_BASE_PROFILE     ALTER SYSTEM                   SET        DISABLE SGA_TARGET
    DYNAMIC_PROFILE                                                EMPTY
    STATIC_PROFILE       ALTER SYSTEM                   SET        DISABLE SGA_TARGET
    

    Nota: Podemos observamos que as regras do base profile não foram copiadas no DYNAMIC_PROFILE, que é um profile vazio.



  5. Logue-se no PDB18C, configure os diferentes lockdown profiles e realize algumas operações neles para testar o comportamento:

    Code
    SQL> ALTER SESSION SET CONTAINER = PDB18C;
    Session altered.
    
    SQL> ALTER SYSTEM SET pdb_lockdown = CDB_BASE_PROFILE;
    System altered.
    
    SQL> ALTER SYSTEM SET SGA_TARGET=100m;
    ALTER SYSTEM SET SGA_TARGET=100m
    *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    SQL> ALTER SYSTEM SET pdb_lockdown = DYNAMIC_PROFILE;
    System altered.
    
    
    SQL> ALTER SYSTEM SET SGA_TARGET=100m;
    ALTER SYSTEM SET SGA_TARGET=100m
    *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    SQL> ALTER SYSTEM SET pdb_lockdown = STATIC_PROFILE;
    System altered.
    
    SQL> ALTER SYSTEM SET SGA_TARGET = 100m;
    ALTER SYSTEM SET SGA_TARGET=100m
                               *
    ERROR at line 1:
    ORA-01031: insufficient privileges
        


    Como podemos observar, o base profile e o profile estático possuem comportamento similar, já o profile dinâmico impõe as mesmas restrições embora seja um profile vazio.

    Agora vamos adicionar mais algumas restrições para o base profile e veremos se elas serão cascateadas para os outros profiles:

    Code
    SQL> CONN / AS SYSDBA
    Connected.
    
    SQL> ALTER LOCKDOWN PROFILE CDB_BASE_PROFILE DISABLE STATEMENT= ('ALTER SYSTEM') 
    clause=('FLUSH SHARED_POOL');
    Lockdown Profile altered.
    
    PROFILE_NAME		RULE		 CLAUSE			STATUS		CLAUSE_OPTION
    --------------- 	------------	 -----------------	--------	---------
    CDB_BASE_PROFILE	ALTER SYSTEM	 FLUSH SHARED_POOL	DISABLE
    CDB_BASE_PROFILE	ALTER SYSTEM	 SET               	DISABLE		SGA_TARGET
    DYNAMIC_PROFILE		                                      	EMPTY
    STATIC_PROFILE		ALTER SYSTEM	 SET               	DISABLE		SGA_TARGET
    
    SQL> ALTER SESSION SET CONTAINER = PDB18C;
    Session altered.
    
    SQL> ALTER SYSTEM SET pdb_lockdown = CDB_BASE_PROFILE;
    System altered.
    
    SQL> ALTER SYSTEM FLUSH SHARED_POOL;
    ALTER SYSTEM FLUSH SHARED_POOL
    *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    SQL> ALTER SYSTEM SET pdb_lockdown = DYNAMIC_PROFILE;
    System altered.
    
    SQL> ALTER SYSTEM FLUSH SHARED_POOL;
    ALTER SYSTEM FLUSH SHARED_POOL
    *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    SQL> ALTER SYSTEM SET pdb_lockdown = STATIC_PROFILE;
    System altered.
    
    SQL> ALTER SYSTEM FLUSH SHARED_POOL;
    System altered.
    


    Como vimos acima, novas restrições no base profile levarão efeito somente no profile dinâmico, mas não no profile estático. Isso significa que as propriedades são herdadas apenas nos profiles dinâmicos.



  6. Explicitamente adicione algumas regras para o profile dinâmico e veja os efeitos em todos os profiles:

    Code
    SQL> CONN / AS SYSDBA
    Connected.
    
    SQL> ALTER LOCKDOWN PROFILE CDB_BASE_PROFILE ENABLE STATEMENT= ('ALTER SYSTEM') 
    clause= ('FLUSH SHARED_POOL');
    Lockdown Profile altered.
    
    SQL> ALTER LOCKDOWN PROFILE DYNAMIC_PROFILE DISABLE STATEMENT= ('ALTER SYSTEM') 
    clause= ('FLUSH SHARED_POOL');
    Lockdown Profile altered.
    
    SQL> SELECT profile_name, rule, clause, status, CLAUSE_OPTION FROM cdb_lockdown_profiles;
    PROFILE_NAME         RULE          CLAUSE               STATUS  CLAUSE_OPTION
    -------------------- ------------- -------------------- ------- -------------------
    CDB_BASE_PROFILE     ALTER SYSTEM  FLUSH SHARED_POOL    ENABLE
    CDB_BASE_PROFILE     ALTER SYSTEM  SET                  DISABLE SGA_TARGET
    DYNAMIC_PROFILE      ALTER SYSTEM  FLUSH SHARED_POOL    DISABLE
    STATIC_PROFILE       ALTER SYSTEM  SET                  DISABLE SGA_TARGET
    
    SQL> ALTER SESSION SET CONTAINER = PDB18C;
    Session altered.
    
    SQL> ALTER SYSTEM SET pdb_lockdown = DYNAMIC_PROFILE;
    System altered.
    
    SQL> ALTER SYSTEM FLUSH SHARED_POOL;
    ALTER SYSTEM FLUSH SHARED_POOL
    *
    ERROR at line 1:
    ORA-01031: insufficient privileges
    
    SQL> ALTER SYSTEM SET pdb_lockdown = CDB_BASE_PROFILE;
    System altered.
    
    SQL> ALTER SYSTEM FLUSH SHARED_POOL;
    System altered.
    



    Fabio Prado trabalha como DBA em uma empresa do Governo Federal do Brasil, atua como instrutor na ORAMASTER, é Organizador do DBA BRASIL, autor do blog https://www.fabioprado.net, e possui diversas certificações Oracle e Microsoft, além de ser Oracle ACE Member. Trabalha com tecnologia desde 2000 e possui experiência e profundos conhecimentos em Bancos de Dados Oracle, tais como: Administração, Programação em PL/SQL, Backup and Recovery, e principalmente Tuning.

    Skant Gupta é um Oracle Certified Cloud Professional 12c, OCE RAC 11g and Oracle Certified Professional (10g, 11g, 12c). Atualmente trabalha na Vodafone no Reino Unido e trabalhava anteriormente como DBA Sênior na Etisalat em Dubai. Tem 6 anos de experiência em diferentes tecnologias Oracle, focando principalmente em banco de dados, nuvem, soluções de alta disponibilidade, WebLogic e GoldenGate. Já esteve presente em vários grupos de usuários Oracle ao redor do mundo e mais recentemente nos EUA, Emirados Árabes e Índia. Perfil de Skant Gupta no LinkedIn - https://www.linkedin.com/in/skantali, Blog: http://oracle-help.com/

    Joel Pérez é um DBA (Oracle ACE Director, Maximum Availability OCM, OCM Cloud Admin. & OCM12c/11g) Especialista com mais de 17 anos de experiência real no mundo da tecnologia Oracle, especializada na concepção e implementação de soluções: Nuvem, alta disponibilida de, recuperação de desastres, Upgrades, replicação e toda a área relacionada com bancos de dados Oracle. Joel serve como "Senior Database Cloud Architect" para en.Enmotech.com Yunhe ENMO (Beijing) Technology Co. Ltd. Beijing, China. Conectar com Joel: Conecte-se com Joel’s Linkedin para ser atualizado com as informações mais notáveis relacionadas ao Oracle Cloud: https://www.linkedin.com/in/sir-joel-pérez-oracle-ace-director-ocm-cloud-99530555/

    Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle