Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


segunda-feira, 3 de agosto de 2009

Segurança e compressão de dados com o Data Pump Export do Oracle 11g

Por Eduardo Legatti

Olá,

Neste artigo irei comentar um pouco das novas funcionalidades introduzidas no utilitário de exportação Export Data Pump (expdp) do Oracle 11g no que se refere à segurança e compressão dos dados exportados. É fato que os utilitários Data Pump (expdp/impdp) introduzidos à partir do Oracle 10g trouxeram vários recursos e vantagens sobre os utilitários tradicionais (exp/imp) como mais rapidez e flexibilidade nas operações de exportação/importação dos dados, entre outros. Portanto, destaquei alguns dos novos parâmetros adicionados ao utilitário Export Data Pump da versão 11g:
C:\> expdp help=y

Export: Release 11.1.0.6.0 - Production on Segunda-Feira, 03 Agosto, 2009 09:08:45

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Palavra-Chave         Descrição (Default)
--------------------- ------------------------------------------------------------------
COMPRESSION           Reduzir o tamanho do conteúdo do arquivo de dump onde houver 
                      palavra-chave válida. Os valores são: ALL, (METADATA_ONLY), 
                      DATA_ONLY e NONE.
ENCRYPTION            Criptografa parte ou todo o arquivo de dump onde houver a palavra-
                      chave válida. Os valores são: ALL, DATA_ONLY, METADATA_ONLY,
                      ENCRYPTED_COLUMNS_ONLY ou NONE.
ENCRYPTION_ALGORITHM  Especifica como a criptografia deve ser feita onde for válido. Os
                      valores de palavra-chave são: (AES128), AES192 e AES256.
ENCRYPTION_MODE       Método de gerar chave de criptografia onde houver palavra-chave 
                      válida. Os valores são: DUAL, PASSWORD e (TRANSPARENT).
ENCRYPTION_PASSWORD   Chave de senha para criar dados de coluna criptografados. 
REUSE_DUMPFILES       Sobregrava o arquivo de dump de destino, se existir (N).


Em versões anteriores, se quiséssemos proteger um arquivo dump de exportação de forma que somente pessoas autorizadas pudessem ter acesso ao seu conteúdo afim de realizar uma importação, teríamos que "compactar" o arquivo dump utilizando compactadores de terceiros e, através de senha, proteger o mesmo. No entanto, além de não ser uma tarefa muito interessante, mesmo assim isso não impediria que o arquivo compactado fosse "crackeado" através de softwares específicos para estes tipos de compactação. Uma outra forma seria a de exportar os dados utilizando um usuário de banco de dados com privilégios DBA na qual, para importar o arquivo, apenas outro usuário com privilégios DBA ou com privilégios IMP_FULL_DATABASE conseguiria importar o arquivo. Entretanto, nada impediria alguém de simplesmente carregar o arquivo dump para outro banco de dados e, com os privilégios apropriados, importar os dados.

A boa notícia é que à partir do Oracle 11g o utilitário de exportação Export Data Pump (expdp) veio com algumas inovações como o parâmetro ENCRYPTION_PASSWORD e ENCRYPTION_ALGORITHM na qual poderemos simplesmente definir uma senha criptografada que será armazenada no arquivo dump de exportação. Neste caso, a importação do arquivo através do utilitário Import Data Pump (impdp) somente poderá ser realizada diante da digitação da senha que foi definida na criação do arquivo dump de exportação. Vale a pena salientar que na versão do utilitário expdp 10g R2, o parâmetro ENCRYPTION_PASSWORD era aplicado apenas em colunas encriptadas.

Bom, antes de realizar um exemplo prático sobre este recurso, iniciarei o artigo com um outro recurso que foi adicionado ao utilitário de exportação (expdp) chamado COMPRESSION. Com esta opção poderemos definir um nível de compressão não só dos metadados, mas também dos dados. Na versão 10g, por padrão, a compressão é realizada somente no nível de metadados e, na versão 11g, esta compressão foi estendida também para o nível de dados.


Abaixo realizarei alguns testes comparando a taxa de compressão entre as opções disponíveis:
   compression={all | data_only | metadata_only | none}
onde,
 
* ALL: Ambos os metadados e dados são compactados;
* DATA_ONLY: Somente os dados são compactados.
* METADATA_ONLY: Somente os metadados são compactados. Esta é a opção padrão.
* NONE: Nada é compactado.

Apenas como ilustração, irei exportar um schema de banco de dados na qual atualmente possui aproximadamente 460 MB de dados (entre dados tabelas e índices).

SQL> select sum(bytes)/1024/1024 "TOTAL (MB)" from dba_segments where owner='SCOTT';

TOTAL (MB)
----------
   460,875


-- Utilizando o expdp da versão 11g (sem nenhuma compactação)
C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp11_compress_none.dmp
     compression=none

-- Utilizando o expdp da versão 10g (compactação padrão)
C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp10.dmp

-- Utilizando o expdp da versão 11g (compactando apenas metadados)
C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp11_compress_metadata_only.dmp
     compression=metadata_only

-- Utilizando o expdp da versão 11g (compactando apenas dados)
C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp11_compress_data_only.dmp
     compression=data_only

-- Utilizando o expdp da versão 11g (compactando dados e metadados)
C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp11_compress_all.dmp
     compression=all

-- Utilizando o exp 11g tradicional
C:\> exp scott/tiger file=exp_traditional.dmp


Abrindo um parênteses aqui, podemos ver abaixo que a estimativa de tamanho para o dump gerado será de aproximadamente 413 MB, bem próximo ao tamanho real dos arquivos de exportação gerados, que não passaram de 395 MB.

Export: Release 11.1.0.6.0 - Production on Segunda-Feira, 03 Agosto, 2009 09:10:35

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Estimativa em andamento com o método BLOCKS...
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimativa total usando o método de BLOCKS: 413.8 MB
Vamos então aos resultados dos tamanhos dos arquivos dump gerados (em MB) pelas exportações:

[Linux tmp]$ ls -hlatr *.dmp
(1) -rw-r----- 1 oracle oinstall 395M Ago  3 09:12 expdp11_compress_none.dmp
(2) -rw-r----- 1 oracle oinstall 384M Ago  3 09:19 expdp10.dmp
(3) -rw-r----- 1 oracle oinstall 384M Ago  3 09:25 expdp11_compress_metadata_only.dmp
(4) -rw-r----- 1 oracle oinstall 137M Ago  3 09:32 expdp11_compress_data_only.dmp
(5) -rw-r----- 1 oracle oinstall 125M Ago  3 09:39 expdp11_compress_all.dmp
(6) -rw-r----- 1 oracle oinstall 382M Ago  3 09:42 exp_traditional.dmp
De acordo com a listagem acima, a primeira exportação (1) realizada utilizando o expdp da versão 11g com a opção (compression=none) gerou um arquivo dump de 395 MB de tamanho.

A segunda exportação (2) realizada utilizando o expdp da versão 10g gerou um arquivo dump de 384 MB de tamanho, ou seja, o arquivo foi compactado a uma proporção de cerca de 97% em relação ao arquivo dump gerado pela exportação (1) na qual não foi utilizada nenhuma opção de compressão. Como dito anteriormente, apenas os metadados são compactados na versão 10g:



A terceira exportação (3) realizada utilizando o expdp da versão 11g com a opção (compression=metadata_only) gerou um arquivo dump de 384 MB, ou seja, a mesma taxa de compressão que foi utilizada com o utilitário expdp da versão 10g.



A quarta exportação (4) realizada utilizando o expdp da versão 11g com a opção (compression=data_only) gerou um arquivo dump de 137 MB, ou seja, o arquivo foi compactado a uma proporção de cerca de 35% em relação ao arquivo dump gerado pela exportação (3), onde foi utilizada a opção (compression=metadata_only).



A quinta exportação (5) realizada utilizando o expdp da versão 11g com a opção (compression=all) gerou um arquivo dump de 125 MB, ou seja, o arquivo foi compactado a uma proporção de cerca de 32% em relação ao arquivo dump gerado pela exportação (4), onde foi utilizada a opção (compression=data_only).



Para não deixar o export tradicional (exp) de lado, a sexta exportação (6) foi realizada utilizando o exp da versão 11g que gerou um arquivo dump de 382 MB, ou seja, o arquivo criado teve uma proporção de cerca de 99% em relação ao arquivo dump gerado pela exportação (3), onde foi utilizado o utilitário expdp com a opção (compression=data_only).



Apenas para fins de comparação, irei utilizar um dos compactadores mais conhecidos do mercado para de compactar o arquivo de 384 MB (expdp11_compress_metadata_only.dmp).

[Linux tmp]$ zip expdp11_compress_metadata_only.zip expdp11_compress_metadata_only.dmp
  adding: expdp11_compress_metadata_only.dmp (deflated 69%)

[Linux tmp]$ ls -lh *.zip
-rw-r--r-- 1 oracle oinstall 119M Ago 03 09:45 expdp11_compress_metadata_only.zip


Podemos perceber acima que o arquivo foi compactado a uma proporção de cerca de 31% em relação ao arquivo original, ou seja, praticamente a mesma proporção utilizando a opção (compression=data_only) do utilitário expdp.



Já que utilizei o "zip" porque não usar o famoso "Winrar"? Fazendo um teste, o arquivo original de 384 MB foi compactado a uma proporção de cerca de 17%, ou seja, o tamanho do arquivo de 384 MB foi reduzido para 65,8 MB.



No geral, e deixando de lado os compactadores de terceiros, podemos perceber uma diferença "gritante" de compressão do arquivo dump de exportação quando utilizamos as opções (data_only) ou (all) do utilitário Export Data Pump 11g.

Protegendo o arquivo dump de exportação com senha

Agora irei comentar um pouco sobre outro recurso muito interessante que, como dito anteriormente, à partir do Oracle 11g, o utilitário de exportação Export Data Pump (expdp) disponibilizou os parâmetros ENCRYPTION_PASSWORD e ENCRYPTION_ALGORITHM na qual poderemos definir de forma "nativa", uma senha criptografada que será armazenada no arquivo dump de exportação. Neste caso, a importação do arquivo através do utilitário Import Data Pump (impdp) somente poderá ser realizada diante da digitação da senha que foi definida na criação do arquivo dump de exportação. Meu foco aqui será demonstrar a utilização do método (modo) PASSWORD.

De acordo com a documentação, o "Data pump encryption" é um recurso relevante apenas para instalações do Oracle 11g Enterprise Edition. Para maiores detalhes sobre os parâmetros abaixo, recomendo acessar a documentação oficial.

O parâmetro ENCRYPTION possui as seguintes opções:

ENCRYPTION = {all | data_only | encrypted_columns_only | metadata_only | none}

O parâmetro ENCRYPTION_PASSWORD possui as seguintes opções de algoritmos para criptografia:

ENCRYPTION_ALGORITHM = { AES128 | AES192 | AES256 }

O parâmetro ENCRYPTION_MODE especifica o método para geração da chave de criptografia:

ENCRYPTION_MODE = { DUAL | PASSWORD | TRANSPARENT }

O parâmetro ENCRYPTION_PASSWORD é utilizado para informarmos a senha que será criptografada.

Vale a pena salientar que o valores padrões desses parâmetros dependerão de uma combinação dos mesmos. Se somente o parâmetro ENCRYPTION_PASSWORD for especificado, então o parâmetro ENCRYPTION terá por padrão o valor ALL. Se nenhum dos parâmetros ENCRYPTION e ENCRYPTION_PASSWORD for especificado, então o parâmetro ENCRYPTION terá por padrão o valor NONE. No caso do parâmetro ENCRYPTION_ALGORITHM, seu valor padrão é AES128.

Vamos então a um exemplo prático:

C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp11_senha.dmp 
     encryption=all 
     encryption_mode=password 
     encryption_password=minhasenha

Após a execução do comando acima o arquivo dump gerado foi criado como demonstrado abaixo:

[Linux tmp]$ ls -hlatr *.dmp
-rw-r----- 1 oracle oinstall 384M Ago  3 09:50 expdp11_senha.dmp

Irei simular agora a importação do arquivo dump para um outro schema de banco de dados. Para isso irei criar o usuário de banco de dados ADAM como demonstrado abaixo:

C:\> sqlplus system/manager

SQL*Plus: Release 11.1.0.6.0 - Production on Seg Ago 3 09:55:06 2009

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> create user adam identified by jones default tablespace users;

Usuário criado.

SQL> grant connect,resource to adam;

Concessão bem-sucedida.
Após a criação do usuário ADAM no banco de dados, irei realizar a importação do arquivo dump criptografado:

-- Realizando a importação sem informar a senha
C:\> impdp adam/jones DIRECTORY=datapump_dir DUMPFILE=expdp11_senha.dmp

Import: Release 11.1.0.6.0 - Production on Segunda-Feira, 03 Agosto, 2009 09:57:46

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39002: operação inválida
ORA-39174: A senha de criptografia deve ser fornecida.


-- Realizando a importação especificando uma senha inválida
C:\> impdp adam/jones DIRECTORY=datapump_dir DUMPFILE=expdp11_senha.dmp 
     encryption_password=senhaerrada

Import: Release 11.1.0.6.0 - Production on Segunda-Feira, 03 Agosto, 2009 10:03:55

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39002: operação inválida
ORA-39176: A senha de criptografia está incorreta.


-- Realizando a importação especificando a senha correta
C:\> impdp adam/jones DIRECTORY=datapump_dir DUMPFILE=expdp11_senha.dmp 
     encryption_password=minhasenha 
     remap_schema=scott:adam

Import: Release 11.1.0.6.0 - Production on Segunda-Feira, 03 Agosto, 2009 10:05:48

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Tabela-mestre "ADAM"."SYS_IMPORT_FULL_01" carregada/descarregada com sucesso
Iniciando "ADAM"."SYS_IMPORT_FULL_01":  adam/******** DIRECTORY=datapump_dir
DUMPFILE=expdp11_senha.dmp encryption_password=******** remap_schema=scott:adam
Processando o tipo de objeto SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processando o tipo de objeto SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
. . importou "ADAM"."EMP"                        330.6 MB    1352 linhas
. . importou "ADAM"."DEPT"                       9.157 MB   55417 linhas
.
.
.

Para finalizar, o Export Data Pump da versão 11g, trouxe também um novo parâmetro chamado REUSE_DUMPFILES que poderá ser utilizado para que possamos sobrescrever um arquivo dump gerado anteriormente sem a necessidade de ter que exclui-lo manualmente como nas releases anteriores (10g R1/R2):

C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp11_senha.dmp 
     encryption=all 
     encryption_mode=password 
     encryption_password=minhasenha

Export: Release 11.1.0.6.0 - Production on Segunda-Feira, 03 Agosto, 2009 10:09:38

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORA-39001: valor de argumento inválido
ORA-39000: especificação de arquivo de dump incorreto
ORA-31641: não é possível criar o arquivo de dump "/tmp/expdp11_senha.dmp"
ORA-27038: arquivo criado já existe
Additional information: 1


C:\> expdp scott/tiger DIRECTORY=datapump_dir DUMPFILE=expdp11_senha.dmp 
     encryption=all 
     encryption_mode=password 
     encryption_password=minhasenha 
     reuse_dumpfiles=y

Export: Release 11.1.0.6.0 - Production on Segunda-Feira, 01 Agosto, 2009 10:15:26

Copyright (c) 2003, 2007, Oracle.  All rights reserved.

Conectado a: Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Iniciando "SCOTT"."SYS_EXPORT_SCHEMA_01":  scott/******** DIRECTORY=datapump_dir 
DUMPFILE=expdp11_senha.dmp encryption=all encryption_mode=password 
encryption_password=******** reuse_dumpfiles=y
Estimativa em andamento com o método BLOCKS...
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE_DATA
Estimativa total usando o método de BLOCKS: 413.8 MB
Processando o tipo de objeto SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processando o tipo de objeto SCHEMA_EXPORT/SEQUENCE/SEQUENCE
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TABLE
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/GRANT/OWNER_GRANT/OBJECT_GRANT
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/COMMENT
Processando o tipo de objeto SCHEMA_EXPORT/PACKAGE/PACKAGE_SPEC
Processando o tipo de objeto SCHEMA_EXPORT/FUNCTION/FUNCTION
Processando o tipo de objeto SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processando o tipo de objeto SCHEMA_EXPORT/PACKAGE/COMPILE_PACKAGE/PACKAGE_SPEC/ALTER...
Processando o tipo de objeto SCHEMA_EXPORT/FUNCTION/ALTER_FUNCTION
Processando o tipo de objeto SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processando o tipo de objeto SCHEMA_EXPORT/VIEW/VIEW
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/TRIGGER
Processando o tipo de objeto SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
. . exportou "SCOTT"."EMP"                  330.6 MB    1352 linhas
. . exportou "SCOTT"."DEPT"                 9.157 MB   55417 linhas
.
.
.



3 comentários:

Samuluc disse...

Gostei muito parabéns

Fábio Prado disse...

Muito bom Eduardo, vou aproveitar e deixar o link de um artigo meu que complementa este teu e vou referenciar o seu dentro do meu ok?: http://www.fabioprado.net/2015/03/compressao-de-dados-com-o-oracle-data.html.

[]s

Eduardo Legatti disse...

Olá Fábio,

Tudo bem? Combinado!!

Abraços,

Legatti

Postagens populares