O Database Autonomy Service (DAS) oferece uma cadeia de ferramentas para gerenciar regras de criptografia de colunas (mascaramento de dados). Use scripts Python para criar, consultar e gerenciar essas regras em massa. Este tópico descreve como usar a cadeia de ferramentas para automatizar o gerenciamento de regras de criptografia de colunas.
Visão geral da cadeia de ferramentas
Casos de uso
As práticas de segurança e conformidade de bancos de dados geralmente exigem as seguintes capacidades:
Criptografia em massa: Configure regras de criptografia de colunas para dados sensíveis, como números de telefone, documentos de identidade e endereços de e-mail, em várias instâncias, bancos de dados e tabelas.
Consulta e auditoria: Consulte colunas criptografadas, status de ativação de instâncias, uso de cotas, usuários autorizados e grupos de permissões.
Gerenciamento de políticas: Exclua ou atualize políticas de criptografia, modifique permissões de autorização em lote, altere algoritmos de criptografia e sincronize políticas manualmente.
Conformidade de segurança: Substitua operações manuais no console por fluxos de trabalho baseados em scripts que permitam auditoria, rastreamento e visualização prévia.
Arquitetura da cadeia de ferramentas
A cadeia de ferramentas inclui quatro scripts Python que chamam a OpenAPI do DAS pelo mecanismo CommonRequest do Alibaba Cloud Python SDK V1. Todos os scripts compartilham a mesma lógica de carregamento de credenciais e aceitam a flag --dry-run para execução em modo de simulação.
|
Script |
Finalidade |
Operação de escrita |
|
|
Cria regras de criptografia de colunas (script principal com biblioteca reutilizável de credenciais e requisições) |
Sim |
|
|
Conecta-se ao banco de dados, lê o schema e exporta uma lista de colunas |
Não |
|
|
Consultas somente leitura (usuários, algoritmos, colunas criptografadas, instâncias, status e estatísticas de cota) |
Não |
|
|
Operações de escrita (excluir ou atualizar políticas, modificar autorizações em lote, alterar algoritmos e sincronização manual) |
Sim |
Arquivos de configuração
A cadeia de ferramentas usa quatro tipos de arquivos de configuração. Cada tipo fornece um arquivo real e um modelo .example. Cada categoria tem uma finalidade distinta:
|
Categoria |
Arquivo real |
Modelo |
Usado por |
|
Credenciais da API cloud |
|
|
create / describe / manage |
|
Conexão com banco de dados |
|
|
fetch_schema.py |
|
Lista de colunas (CSV) |
|
|
create |
|
Política de criptografia (JSON) |
|
|
create |
Os arquivos de configuração reais contêm informações sensíveis. Não faça commit deles no controle de versão. Mantenha apenas os modelos *.example em seu repositório.
Escopo aplicável
|
Componente |
Permissões e recursos necessários |
|
Ambiente de execução |
Python 3.8 ou superior. Recomenda-se o uso de um ambiente virtual venv. |
|
Usuário RAM do Alibaba Cloud |
O usuário RAM deve ter permissões para chamar as operações da API de criptografia de colunas do DAS. |
|
Rede |
O endereço IP de origem deve estar dentro do intervalo de rede permitido para operações de criptografia de colunas do DAS. |
|
Instância de banco de dados |
O service column encryption deve estar ativado e a cota de criptografia de colunas deve ter sido adquirida. |
A criptografia de colunas é uma operação sensível. Mesmo que a política do RAM conceda as permissões necessárias, o controle de risco de segurança bloqueia requisições provenientes de endereços IP fora da lista de permissões. Confirme a lista de permissões de rede com sua equipe de segurança antes de prosseguir.
Procedimento
Etapa 1: Baixar e extrair a cadeia de ferramentas
Baixe o arquivo da cadeia de ferramentas dbse-skills.tgz e extraia-o localmente:
tar xzf dbsec-skills.tgz
cd dbsec-skills/skills/column-encryption-rule/scripts
Etapa 2: Instalar dependências do Python
Crie um ambiente virtual e instale as dependências:
python3 -m venv .venv
.venv/bin/python -m pip install -r requirements.txt
Conteúdo do arquivo de dependências (requirements.txt):
aliyun-python-sdk-core>=2.16.0
PyMySQL>=1.1.0
Use o venv do projeto para todos os comandos subsequentes: .venv/bin/python.
Etapa 3: Configurar credenciais da API cloud
Copie o modelo e insira seu par de AccessKey:
cp .aliyun.env.example .aliyun.env
Exemplo de conteúdo do arquivo .aliyun.env:
ALIBABA_CLOUD_ACCESS_KEY_ID=your_access_key_id
ALIBABA_CLOUD_ACCESS_KEY_SECRET=your_access_key_secret
# Required only for STS temporary credentials. Delete or leave empty for standard AccessKey pairs.
ALIBABA_CLOUD_SECURITY_TOKEN=your_sts_token
Este arquivo contém credenciais reais. Armazene-o com segurança e nunca o compartilhe.
Etapa 4: Preparar o modelo de política de criptografia
Copie o modelo de regra:
cp rule.example.json rule.json
Mantenha o arquivo rule.json como modelo de política compartilhada e mova todas as informações específicas da instância para o arquivo columns.csv:
{
"ProductId": 5,
"EncAlgorithm": "AES_128_GCM",
"EncryptionKeyMode": "client_key",
"CooperationChannel": "DAS",
"BackendRegionId": "cn-zhangjiakou",
"UserList": [
{
"AccountId": "shared_user",
"AuthRole": "fullAccess",
"EngineType": "MySQL"
},
{
"AccountId": "only_for_instanceB",
"InstanceId": "rm-instanceB",
"AuthRole": "restrictedAccess",
"EngineType": "MySQL"
}
],
"ResourceGroupId": ""
}
Campos principais:
|
Campo |
Descrição |
|
|
Tipo de product de banco de dados. O valor 5 representa RDS MySQL. Para uma política de product único, mantenha este campo no nível superior. Para uma política entre produtos, especifique-o por linha no arquivo |
|
|
Algoritmo de criptografia, como |
|
|
Modo de chave de criptografia, como |
|
|
Defina como |
|
|
Região de processamento backend. Defina como |
|
|
Lista de usuários autorizados. Defina |
Valores de AuthRole:
|
Valor |
Descrição |
|
|
Pode visualizar dados em texto simples |
|
|
Pode visualizar apenas texto cifrado e descriptografar com uma chave de usuário |
|
|
Pode visualizar apenas texto cifrado, sem capacidade de descriptografia |
Não inclua InstanceId ou ServiceRegionId no nível superior. Especifique esses campos por linha no arquivo CSV.
Etapa 5: Preparar a lista de colunas
Prepare a lista de colunas de uma das seguintes maneiras:
Método 1: Criar columns.csv manualmente
Copie o modelo:
cp columns.example.csv columns.csv
Insira os dados com uma coluna por linha. Exemplo:
RegionId,InstanceId,DbName,TableName,Column,EngineType,ProductId
cn-hangzhou,rm-instanceA,your_database,your_table,email,MySQL,
cn-hangzhou,rm-instanceA,your_database,your_table,phone,MySQL,
cn-beijing,rm-instanceB,another_db,users,id_card,MySQL,
Para especificar várias colunas na mesma tabela, use o campo Columns com valores separados por vírgula entre aspas:
RegionId,InstanceId,DbName,TableName,Columns,EngineType
cn-hangzhou,rm-instanceA,your_database,your_table,"email,phone",MySQL
A coluna ProductId é opcional. Especifique-a para cenários entre produtos. Se deixada em branco, o valor de nível superior do arquivo rule.json será usado.
Método 2: Exportar automaticamente com fetch_schema.py
Copie o modelo e insira as informações de conexão do seu banco de dados:
cp mysql.example.conf mysql.conf
Exemplo de conteúdo do arquivo mysql.conf (formato chave:valor):
url:rm-xxxxxxxxxxxxxxxxx.rwlb.rds.aliyuncs.com
user:your_user
pass:your_password
Visualize o schema do banco de dados (formato texto):
.venv/bin/python fetch_schema.py --config mysql.conf --database your_database
Exporte um arquivo columns.csv compatível:
.venv/bin/python fetch_schema.py --config mysql.conf --database your_database \
--format csv --region-id cn-beijing --instance-id rm-xxxxxxxxxxxxxxxxx > columns.csv
Os parâmetros --region-id e --instance-id são obrigatórios no modo CSV, pois são identificadores de recursos cloud que não podem ser obtidos pelo schema do banco de dados. Após a exportação, edite o arquivo columns.csv para manter apenas as colunas sensíveis que exigem criptografia.
Lista completa de parâmetros para fetch_schema.py:
--config Database configuration file. Default: mysql.conf
--database Query only the specified database. Repeatable. Omit to enumerate all business databases.
--include-system Include system databases (information_schema, etc.)
--format json | text | csv. Default: text
--region-id Required for CSV: instance region, e.g. cn-beijing
--instance-id Required for CSV: instance ID, e.g. rm-xxxx
--engine-type EngineType for CSV. Default: MySQL
Etapa 6: Executar uma simulação (dry run)
Sempre execute uma simulação antes de enviar alterações para verificar o corpo da requisição e a divisão em lotes.
Simulação para uma criação única (sem CSV):
.venv/bin/python create_data_masking_rule.py \
--env-file .aliyun.env --config rule.json --dry-run
Simulação para criação em lote (com CSV):
.venv/bin/python create_data_masking_rule.py \
--env-file .aliyun.env --config rule.json --columns-csv columns.csv --dry-run
Exemplo de saída da simulação:
BatchCount: number of batches
TotalSubRuleCount: aggregated table rule count
TotalUniqueColumnCount: unique column count
Batches: InstanceId, ServiceRegionId, SubRuleCount, UniqueColumnCount per batch
Opcional: verificação prévia de cota local. Por exemplo, se a cota restante for de 50 colunas:
.venv/bin/python create_data_masking_rule.py \
--env-file .aliyun.env --config rule.json --columns-csv columns.csv \
--max-new-columns 50 --dry-run
Se a contagem de colunas exceder o limite definido por --max-new-columns, o script será interrompido localmente sem enviar requisições.
Etapa 7: Criar regras de criptografia de colunas
Após o sucesso da simulação, remova a flag --dry-run para executar a operação.
Criação única:
.venv/bin/python create_data_masking_rule.py \
--env-file .aliyun.env --config rule.json
Criação em lote:
.venv/bin/python create_data_masking_rule.py \
--env-file .aliyun.env --config rule.json --columns-csv columns.csv
Opcional: ajuste o número de SubRules por lote (máximo de 100):
.venv/bin/python create_data_masking_rule.py \
--env-file .aliyun.env --config rule.json --columns-csv columns.csv --batch-size 50
O script agrupa automaticamente as regras por RegionId + InstanceId + ProductId e divide cada instância em requisições independentes, com até 100 entradas SubRuleList por lote. Não combine múltiplas instâncias em uma única requisição. Caso contrário, as regras podem ser criadas com êxito, mas a instância ainda poderá aparecer esmaecida no centro de ativos.
Etapa 8: Consultar e verificar
Use o script describe_data_masking.py para consultar o status da criptografia de colunas. Use --action para selecionar uma operação de API somente leitura. Todas as operações aceitam --dry-run.
|
Operação (--action) |
Descrição |
Parâmetros obrigatórios |
|
|
Usuários autorizados e grupos de permissões |
Nenhum |
|
|
Algoritmos de criptografia suportados pela instância |
|
|
|
Lista de colunas criptografadas (suporta paginação e filtragem multidimensional) |
Parâmetros de filtro opcionais |
|
|
Lista de instâncias com criptografia de colunas (suporta paginação e filtragem multidimensional) |
Parâmetros de filtro opcionais |
|
|
Status de ativação da criptografia de colunas para a instância |
|
|
|
Contagem de colunas criptografadas e estatísticas de cota |
|
|
|
Estatísticas de contagem de contas autorizadas |
Nenhum |
Exemplos:
# List authorized users
.venv/bin/python describe_data_masking.py --env-file .aliyun.env \
--action DescribeDataMaskingUsers
# Query supported encryption algorithms for an instance
.venv/bin/python describe_data_masking.py --env-file .aliyun.env \
--action DescribeDataMaskingAlgorithms \
--product-id 5 --service-region-id cn-beijing --instance-id rm-xxxxxxxxxxxxxxxxx
# Query encrypted columns with pagination
.venv/bin/python describe_data_masking.py --env-file .aliyun.env \
--action ListDataMaskingColumns \
--product-ids 5 --db-name your_database --page-size 20 --current-page 1
# Get encrypted column quota statistics
.venv/bin/python describe_data_masking.py --env-file .aliyun.env \
--action GetDataMaskingColumnCount --product-ids 5
Parâmetros de filtro e paginação para operações List: --masking-status, --template-id, --risk-level-id, --model-tag-id, --instance-id, --db-name, --table-name, --column-name, --current-page, --page-size, --product-id, --product-ids, --risk-level-ids, --template-rule-ids, --engine-type.
Etapa 9: Operações de gerenciamento
Use o script manage_data_masking.py com --action para selecionar uma operação de API de escrita. Todas as operações aceitam --dry-run para visualizar previamente o corpo da requisição. Os parâmetros de lista são fornecidos por meio de um arquivo JSON especificado por --config. Parâmetros escalares podem ser definidos no arquivo de configuração ou substituídos por opções da CLI (a CLI tem precedência).
|
Operação (--action) |
Descrição |
Observações |
|
|
Exclui uma política de criptografia |
|
|
|
Atualiza uma política de criptografia |
|
|
|
Modifica grupos de permissões de autorização em lote |
|
|
|
Altera o algoritmo de criptografia de uma instância |
Especifique |
|
|
Sincroniza manualmente todas as políticas de criptografia |
Sem parâmetros de negócio |
Exemplos (execute primeiro com --dry-run para visualizar e, em seguida, remova --dry-run para executar):
# Delete a policy: provide SubRuleList in config. ProductId is an integer.
.venv/bin/python manage_data_masking.py --env-file .aliyun.env \
--action DeleteDataMaskingRule --config delete_rule.json --rule-name rule-demo --dry-run
# Batch-modify authorization permission groups
.venv/bin/python manage_data_masking.py --env-file .aliyun.env \
--action BatchModifyDataMaskingUsers --config batch_users.json \
--auth-role fullAccess --dry-run
# Change the encryption algorithm for an instance
.venv/bin/python manage_data_masking.py --env-file .aliyun.env \
--action ModifyDataMaskingEncryptionAlgorithm \
--instance-id rm-xxx --product-id 5 --service-region-id cn-beijing \
--encryption-algorithm AES_256_GCM --dry-run
# Manually synchronize all encryption policies (no business parameters)
.venv/bin/python manage_data_masking.py --env-file .aliyun.env \
--action ManualSyncMaskingRules --dry-run
Referência rápida do fluxo de trabalho
O fluxo de trabalho completo consiste em seis etapas:
1. Prepare credentials cp .aliyun.env.example .aliyun.env # Enter AK/SK for DAS OpenAPI
2. Prepare rule template cp rule.example.json rule.json # Configure the shared encryption policy
3. Prepare column list Write columns.csv manually, or use fetch_schema.py to export
4. Dry run Add --dry-run to verify the request body and batches
5. Execute Remove --dry-run to execute
6. Verify results Use describe_data_masking.py to query and verify
Configuração padrão da API
Os scripts usam a seguinte configuração da API do DAS por padrão:
Domain: das.cn-shanghai.aliyuncs.com
Version: 2020-01-16
Action: CreateDataMaskingRule
Method: POST / HTTPS
RegionId: cn-shanghai (POP access region. Do not modify.)
CooperationChannel: DAS
BackendRegionId: cn-zhangjiakou
RegionId: cn-shanghai é a região de acesso usada pelo Python SDK e pelas requisições POP. Ela difere do ServiceRegionId de nível de negócio. Especifique a região da instância a ser criptografada por meio de ServiceRegionId e SubRuleList[].RegionId (por exemplo, cn-hangzhou para Hangzhou ou cn-beijing para Pequim).
Melhores práticas de segurança
Gerenciamento de credenciais: Os arquivos
.aliyun.env,mysql.conf,rule.jsonecolumns.csvcontêm credenciais reais ou dados de negócios. Não faça commit deles no controle de versão. Mantenha apenas os modelos*.exampleem seu repositório.Privilégio mínimo: Conceda ao usuário RAM apenas as permissões necessárias para as operações da API de criptografia de colunas do DAS. Use credenciais temporárias STS sempre que possível.
Controle de acesso à rede: A criptografia de colunas é uma operação sensível. Certifique-se de que o endereço IP de origem esteja dentro do intervalo de rede permitido para o DAS.
Simulação antes da execução: Todas as operações de escrita (criar e gerenciar) aceitam
--dry-run. Sempre realize uma simulação antes de enviar alterações.Verificação prévia de cota: Antes da execução em lote, verifique o valor de
TotalUniqueColumnCountna saída da simulação. Use--max-new-columnspara proteção local de cota quando necessário.Auditoria de operações: Os scripts chamam o DAS via OpenAPI. Todas as operações podem ser auditadas pelo ActionTrail.
Perguntas frequentes
-
P: A simulação passa, mas a criação real retorna 401 Deny. O que devo fazer?
R: A simulação valida apenas o corpo da requisição localmente, não garantindo a aceitação pelo servidor. Causas comuns de 401 Deny: o usuário RAM associado ao par de AccessKey não tem permissões para chamar as operações da API de criptografia de colunas do DAS; o endereço IP de origem não está na lista de permissões; o par de AccessKey está bloqueado por políticas de segurança. Solução de problemas: verifique se a política do RAM concede as permissões de Action necessárias; entre em contato com a equipe de segurança informando o RequestID, o par de AccessKey e o endereço IP de origem; ou tente novamente com um par de AccessKey que tenha as permissões necessárias e esteja dentro do intervalo de rede permitido.
-
P: Alguns lotes falham durante a criação em lote. O que devo fazer?
R: Se a cota for excedida, a API retorna
sale_instance_quota_exception. O script indica qual lote falhou. Lotes anteriores bem-sucedidos não são revertidos automaticamente. Antes da execução em lote, verifique o valor deTotalUniqueColumnCountna saída da simulação e use--max-new-columnspara proteção local de cota quando necessário. -
P: Devo incluir InstanceId no arquivo rule.json?
R: Não inclua. Mantenha o arquivo
rule.jsoncomo modelo de política compartilhada e forneça todas as informações específicas da instância no arquivocolumns.csv. Dessa forma, um único arquivorule.jsonpode ser reutilizado com arquivos CSV para qualquer instância. Para escalar para múltiplas instâncias, modifique apenas o arquivo CSV sem alterar orule.json. -
P: Como configuro autorizações diferentes para múltiplas instâncias na UserList?
R: Use
InstanceIdpara diferenciar: seInstanceIdfor omitido, o usuário será considerado compartilhado e aplicado a todas as instâncias com preenchimento automático das informações da instância; seInstanceIdfor especificado, o usuário se aplicará apenas aos lotes correspondentes àquela instância, e outros lotes filtrarão automaticamente esse usuário. Nenhuma estrutura aninhada é necessária. -
P: Por que o CSV exportado pelo fetch_schema.py não inclui RegionId e InstanceId?
R:
RegionId,InstanceIdeEngineTypesão identificadores de recursos cloud que não podem ser obtidos pelo schema do banco de dados. No modo CSV,--region-ide--instance-idsão obrigatórios. Após a exportação, edite o arquivocolumns.csvpara manter apenas as colunas sensíveis que exigem criptografia. -
P: Após o BatchModifyDataMaskingUsers alterar a autorização, a mesma conta aparece em dois grupos de permissões. Isso é normal?
R: Após alterações de autorização, a operação
DescribeDataMaskingUserspode mostrar temporariamente a mesma conta em dois grupos comSyncStatus=1(sincronizando). Após a conclusão da sincronização (SyncStatus=0), apenas o grupo de destino permanecerá. Trata-se de uma sincronização assíncrona esperada no lado do servidor, não exigindo tratamento pelo script. Consulte novamente após uma breve espera para verificar o estado final. -
P: A operação ModifyDataMaskingRule retorna InvalidParameter para regras personalizadas de criptografia de colunas. O que devo fazer?
R: A operação
ModifyDataMaskingRulefoi projetada para regras baseadas em modelos. Para regras personalizadas de criptografia de colunas criadas porCreateDataMaskingRule(RuleId=0), esta operação retornaInvalidParameter "InstanceId". Esta é uma restrição de negócio, não um defeito do script. Para atualizar regras personalizadas de criptografia de colunas, exclua-as primeiro e recrie-as em seguida.