Localize Bancos de Dados com Informações Protegidas sobre Saúde

Inventário PII, PHI e outros dados sensíveis dentro de bancos de dados e planilhas

O furto de identidade e a fraude médica são problemas cada vez maiores. São tão grandes que o governo está gastando bilhões de dólares para proteger seus próprios sistemas de informática e criou milhares de páginas de novos regulamentos que devem ser seguidos para ajudar a proteger os dados dos seus clientes e funcionários. Para cumprir os novos regulamentos e proteger os dados adequadamente, é necessário localizar informações pessoalmente identificáveis (PII) e informações protegidas de saúde (PHI) nos seus bancos de dados e documentos. As PHI e as PII são conceitualmente fáceis de entender, mas muito difíceis de controlar, nos milhares de armazenamentos de dados relacionais, arquivos e planilhas que formam o ambiente de TI de uma organização típica. Este artigo descreve alguns métodos para identificar e inventariar automaticamente as PII, PHI e outros dados sensíveis com bancos de dados e planilhas por meio da tecnologia Java™ e da ferramenta de desenvolvimento Apache Ant.

Shahid N Shah, CEO and Chief Architect, Netspective Communications, LLC

Shahid Shah photoShahid N. Shah é líder de ideias de TI para assistência médica, influente e internacionalmente reconhecido. Na Internet, ele é conhecido como "O cara de TI para assistência médica". É consultor de várias agências federais sobre assuntos de TI e vencedor do cobiçado prêmio "Fed 100" da Federal Computer Week, concedido a especialistas de TI que tiveram um grande impacto no governo. Shahid desenvolveu diversas soluções clínicas ao longo de seus quase 20 anos de carreira. Ajudou a projetar uma solução de registro eletrônico de saúde para a Cruz Vermelha Norte-Americana e implementá-lo em milhares de sites, desenvolveu dois EMRs baseados na web usados por médicos e projetou grandes sites de colaboração e groupware usado por milhares de pessoas. Como ex-CTO de uma divisão bilionária da CardinalHealth, ajudou a projetar interfaces clínicas avançadas para dispositivos médicos e hospitais. Shahid também serve como orientador senior de estratégia de tecnologia para o programa SBIR/STTR da NIH, ajudando pequenas empresas a comercializar seus aplicativos de assistência médica.



31/Ago/2012

A coleta e armazenamento de dados de PII e PHI estão se expandindo

O furto de identidade já é um problema bem conhecido no segmento de mercado financeiro, e as empresas estão tentando tomar atitudes para combatê-lo da melhor forma possível. Nesta época, fraude médica está apenas no início — atualmente, menos de 5% das violações relatadas ocorrem na assistência médica — mas a intensificação das fraudes na assistência médica continuará acelerando à medida que os fundos de estímulo do governo expandem o uso de registros eletrônicos de saúde. Quando ocorrem violações de furto médico e de identidade, elas acontecem porque a maioria dos sistemas de informação que têm valor para as organizações contém alguma quantidade de informações pessoalmente identificáveis (PII) ou informações protegidas sobre saúde (PHI). As PII e PHI são os tipos de dados mais privados que são armazenados sobre as pessoas e, caso sejam violados ou roubados, provocam efeitos adversos como furto de identidade ou fraude médica. Por exemplo: o Departamento de Defesa, o Departamento de Assuntos dos Veteranos e manipuladores de PII e PHI (como uma empresa de seguros ou investimentos pessoais) e empregadores (como uma rede de hotéis) relataram perdas significativas de dado de PII e PHI — em alguns casos, até 25 milhões de registros. A proteção das informações não é fácil, mas é vital.

Geralmente, as PII são definidas como qualquer nome ou número que pode ser usado, isoladamente ou em conjunto com outras informações, para identificar uma pessoa específica. Geralmente é o nome da pessoa, em combinação com um ou mais dos elementos a seguir: número da carteira de habilitação, número da cédula de identidade estadual, número do seguro social, número da conta, número do cartão de crédito ou de débito.

As PHI, definidas como qualquer informação que ligue uma pessoa ao seu problema de saúde, são um pouco mais complexas. Há dezoito identificadores oficiais definidos pela Lei de Portabilidade e Prestação de Contas dos Seguros-Saúde (HIPAA), que se enquadram nos seguintes grupos:

  • Nomes
  • Datas
  • Números
  • Endereços
  • Gráficos

Se todos esses grupos ou identificadores são removidos ou criptografados de alguma forma, as informações se tornam desidentificadas ouanonimizadas e não são mais consideradas PHI. A lista específica dos dezoito tipos de dados definidos em regulamentos governamentais como a as HIPAA consiste em:

  1. Nomes
  2. Todas as subdivisões geográficas menores que um estado, como endereço postal, cidade, condado, distrito, código postal e seus códigos geográficos equivalentes, com exceção dos três dígitos iniciais de um código postal se, de acordo com os dados disponíveis publicamente na atualidade, procedentes da Agência de Recenseamento:
    1. A unidade geográfica formada pela combinação de todos os códigos postais com os mesmos três dígitos iniciais contém mais do que 20.000 pessoas.
    2. Os três dígitos iniciais de um código postal referente a todas as unidades geográficas que contêm 20.000 pessoas ou menos são alterados para 000. De acordo com as Modificações Finais na Regra de Privacidade de Agosto de 2002 e utilizando os dados do censo de 2000, há 17 códigos postais restritos de três dígitos que correspondem a populações de até 20.000 pessoas e devem ser alterados para 000 para ser desidentificados: 036, 059, 063, 102, 203, 556, 692, 790, 821, 823, 830, 831, 878, 879, 884, 890 e 893.
  3. Todos os elementos de data (com exceção do ano) referentes às datas relacionadas diretamente a uma pessoa, inclusive a data de nascimento, admissão, alta e óbito. Todas as idades acima de 89 e todos os elementos de datas (inclusive o ano) que indicam essas idades, mas essas idades e elementos podem ser agregados em uma única categoria de 90 anos ou mais.
  4. Número de telefone
  5. Número do fax
  6. Endereço de email
  7. Número da seguridade social
  8. Número de registro médico
  9. Número do beneficiário do plano de saúde
  10. Números de conta
  11. Número do certificado ou licença
  12. Identificadores de veículos e números de série (inclusive as placas)
  13. Identificadores de dispositivos e números de série
  14. Endereço de URL
  15. Endereço IP
  16. Identificadores biométricos, como impressões digitais e de voz
  17. Fotos do rosto inteiro e quaisquer imagens semelhantes
  18. Qualquer outro número, característica ou código que identifique de forma exclusiva

As PHI aparecem de diversas formas: registros em papel ou cópia impressa, registros eletrônicos e comunicações verbais e na linguagem de sinais. É mais fácil proteger registros em papel e comunicações verbais, já que usamos e protegemos esses tipos de registros há centenas de anos e, de modo geral, somos bons nisso. As comunicações eletrônicas têm menos de sessenta anos e a maioria dos dados de saúde, menos de trinta, portanto, só estamos começando a entender como protegê-los. Diferentemente do roubo de registros em papel, cuja cópia e disseminação levam tempo e são difíceis, os registros eletrônicos roubados são fáceis de distribuir. Por isso, este artigo se concentra na localização e proteção de registros eletrônicos.


Um guia para proteger a confidencialidade das PII

A publicação do National Institute of Standards and Technology (NIST) SP 800-122, intitulada "Guide to Protecting the Confidentiality of Personally Identifiable Information (PII)" (consulte Recursos) é um dos melhores recursos grátis e imparciais disponíveis para ajudar você a entender o que são dados privados e como protegê-los. Criado originalmente para ajudar as organizações federais a identificar as PII e determinar o nível de proteção que cada caso requer, esse documento também se aplica a organizações comerciais e sem fins lucrativos. Ele recomenda proteções e salvaguardas adequadas para as PII e mostra como lidar com violações de dados. Embora o foco seja nas PII, o documento pode ser aproveitado para as PHI nos seus planos de privacidade e segurança.


Para proteger os dados privados, é preciso saber onde eles estão

Você sabe que é necessário proteger as PII e PHI que residem nos seus bancos de dados. Também sabe que a criptografia em trânsito é um requisito mínimo para proteger os dados privados. No entanto, quais dados devem ser criptografados e protegidos? Declarar tudo como privado não é algo inteligente, porque os custos de segurança dos dados são altos.

A proteção de bancos de dados corporativos grandes é objetiva — pelo menos você sabe onde os dados estão. A tarefa difícil é manipular as dezenas — talvez centenas — de documentos do Lotus® Notes® e arquivos do Microsoft® Word, Access®e Excel® . Embora seja possível tratar esses documentos como problemas simples de gerenciamento de arquivos, eles são mais do que isso, são aplicativos e bancos de dados reais. Qualquer análise razoável das questões de privacidade da HIPAA relacionadas às informações sobre os pacientes em uma organização de grande porte pode revelar milhares de arquivos do Microsoft Word, Access e Excel com dados de saúde que precisam de proteção.

Descoberta de dados sensíveis

Esse artigo apresenta alguns mecanismos de descoberta de dados (inventariamento) para ajudar a identificar PII e PHI que podem residir em qualquer origem de dados que possa ser conectada por meio de JDBC ou ODBC. A abordagem básica é a seguinte:

  • Observar os nomes de tabela, coluna e outros nomes de objeto do esquema para ver se eles correspondem a nomes conhecidos e supor que todos os objetos correspondentes têm dados de PII ou PHI.
  • Observar a SQL real ou as consultas que estão sendo realizadas para varrer a SQL Data Query Language (DQL) ou os resultados gerados.
  • Observar os dados em repouso dentro do banco de dados ou dos arquivos usando cadeias de caracteres ou padrões que correspondem a palavras específicas como não distribuir, confidencial, \d{3}\-\d{2}\-\d{4} (SSN) e sinalizá-los.
  • Observar todo o conteúdo que está sendo transferido por firewalls ou proxies usando padrões correspondentes semelhantes.

Como classificar os dados como sensíveis ou privados

Há muitas técnicas para classificar os dados, mas elas:

  • Correspondem de forma determinista em palavras-chave ou padrões específicos nos dados ou metadados reais que definem os dados ou
  • Usam de forma algorítmica o armazenamento de documentos em cluster com classificação taxonômica ou de outro tipo, análise de idioma natural, inferência bayesiana ou análise estatística.

Os mecanismos algorítmicos estão fora do escopo deste documento, mas você verá que não é difícil corresponder palavras em metadados.


Autodescoberta de colunas de PII ou PHI em origens de dados de JDBC ou ODBC

Quase todos os bancos de dados relacionais bastantes conhecidos são diretamente acessíveis por meio do JDBC; documentos do Microsoft Office, como Access ou Excel, são acessíveis por meio de pontes JDBC-ODBC. O uso do modelo de ponte ou do JDBC direto juntamente com a classe java.sql.DatabaseMetaData do JDBC dá a você tudo o que é necessário para fazer a varredura rápida de colunas e tabelas de bancos de dados e outros objetos do esquema. Ao colocar isso dentro de uma tarefa do Ant, você terá uma ferramenta de linha de comando reutilizável que pode ser usada em qualquer plataforma conectada a qualquer banco de dados.

Definindo o arquivo de filtros

Defina um arquivo de texto que contenha uma lista de diversas expressões regulares a serem procuradas. Chame-o de lista de filtros . É possível criar um arquivo chamado filters.txt (consulte Download para obter o arquivo) e ele pode começar com os padrões mostrados na Listagem 1. Convém expandir o arquivo para que ele tenha todas as suas regras específicas.

Listagem 1. Filters.txt contém amostras de expressões regulares que identificam padrões a serem localizados
^.*(ssn|social|security).*$
^.*name.*$
^.*address.*$
^.*city.*$
^.*state.*$
^.*zip.*$
^.*county.*$
^.*precinct.*$
^.*(email|e-mail|mail).*$

Usando a tarefa Ant

Ferramentas de varredura comerciais e de software livre

Várias outras ferramentas de varredura comerciais e de software livre começam com uma funcionalidade semelhante, mas incluem mais recursos. Ao procurar ferramentas de terceiros, considere a descoberta automatizada (as ferramentas automaticamente localizam bancos de dados e origens de registros com PII/PHI), modelos configuráveis (você inclui as suas próprias regras), cobertura ampla (todos os arquivos, bancos de dados e transferências de rede são cobertos), varredura de conteúdo e auditoria.

Para usar a tarefa Ant, será necessário criar um arquivo de projeto Ant (consulte a Listagem 2). Observe que você usará o arquivo filters.txt definido anteriormente. É possível ter tantas tags <scanner> quantas forem necessárias para procurar em todos os bancos de dados, documentos de Access e Excel e outros arquivos. O poder total do Ant está disponível para usar variáveis, scripting, etc.

Listagem 2. scanner.xml — o arquivo de projeto Ant que descreve as opções e conexões do JDBC
<?xml version="1.0" encoding="utf-8"?>
<project id="PII and PHI Scanner">
    <taskdef name="scanner" classname="PrivacyDataScanner"/>
    <scanner  catalog=""  schemaPattern=""
              filtersFile="filters.txt"
              output="database-one-scanner-output.txt"

              driver="com.ibm.db2.jcc.DB2Driver"
              url="jdbc:db2://HOST:5702/INSTANCE"
              userid="USER_ID"
              password="PA$$WORD">
    </scanner>

    <scanner  scanner  catalog=""  schemaPattern=""
              filtersFile="filters.txt"
              output="database-two-scanner-output.txt"

              driver="com.ibm.db2.jcc.DB2Driver"
              url="jdbc:db2://HOST:5702/INSTANCE2"
              userid="USER_ID2"
              password="PA$$WORD2">
    </scanner>
</project>

Se você quiser procurar em bancos de dados ou documentos adicionais, basta incluir seções <scanner> adicionais no arquivo de projeto Ant. Eu sugiro incluir todas as conexões com o banco de dados em um arquivo ou agrupando diversos bancos de dados por sistema ou departamento em arquivos separados. Lembre-se de que é possível varrer documentos do Microsoft Access ou Excel usando a ponte JDBC-ODBC.


A origem Java da tarefa Ant (PrivacyDataScannerTask.java)

É possível escrever o código do scanner de dados privados como um programa Java de linha de comando ou usar várias outras técnicas para possibilitar o uso de scripts. Entretanto, se você escreve o scanner de dados privados como uma tarefa Ant, fica fácil injetá-lo na automação do desenvolvimento e em outros scripts e ele se torna mais reutilizável em projetos que usam o Ant (consulte a Listagem 3). Já que o seu código utilizará JDBC, faz sentido estender a classe da tarefa Ant integrada org.apache.tools.ant.taskdefs.JDBCTask.

Listagem 3. PrivacyDataScannerTask.java, parte 1: as instruções de importação
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.taskdefs.JDBCTask;

import java.io.*;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

Observe que você usa o Ant para importar essas classes e precisará do Ant 1.6 ou superior no seu caminho da classe (consulte a Listagem 4).

Listagem 4. PrivacyDataScannerTask.java, parte 2: o cabeçalho da classe e os configuradores
public class PrivacyDataScannerTask extends JDBCTask {

    // inherits attributes and setters for JDBC connection parameters
    private String catalog;
    private String schemaPattern;
    private File output;
    private File filtersFile;
    private List<String> filters = new ArrayList<String>();

    public void setCatalog(final String catalog) {
        this.catalog = catalog;
    }

    public void setSchemaPattern(final String schemaPattern) {
        this.schemaPattern = schemaPattern;
    }

    public void setOutput(final File output) {
        this.output = output;
    }

    public void setFiltersFile(final File filtersFile) throws IOException {
        this.filtersFile = filtersFile;
        final FileReader fileReader = new FileReader(filtersFile);
        final BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line = null;
        while ((line = bufferedReader.readLine()) != null)
            filters.add(line);
        bufferedReader.close();
    }

A sua tarefa está estendendo uma tarefa Ant integrada (JDBCTask) e herda automaticamente todas as propriedades de configurações de conexão JDBC. O setCatalog, setSchemaPattern, setOutpute setFiltersFile são chamados automaticamente pelo Ant quando o projeto referencia os atributos XML na tag <scanner> mostrada na Listagem 5.

Listagem 5. PrivacyDataScannerTask.java, parte 3: o método que efetivamente procura as PII ou PHI
    public String isPIIOrPHI(final String text) {
        for (final String regex : filters) {
            if (text.matches(regex)) return regex;
        }

        return null;
    }

O trabalho real de corresponder nomes de tabela, de coluna e outros objetos do esquema é feito por esse método. Por enquanto, você só está verificando se o texto passado (que será o nome de uma coluna ou tabela) se enquadra nas suas regras. As regras foram definidas no filter.txt na Listagem 1 e lidas usando o método setFiltersFile na Listagem 4.

Evidentemente, se você tem outra forma de especificar os filtros, como obtê-los de um serviço HTTP ou recuperá-los de um banco de dados central, é possível modificar esse método para usar a sua origem de regras e suas regras de negócios (consulte a Listagem 6).

Listagem 6. PrivacyDataScannerTask.java, parte 4: O método main do Ant que realiza a varredura propriamente dita.
    public void execute() throws BuildException {
       final Writer analysis = new StringWriter();
       final Connection conn = getConnection();
       try {
          final DatabaseMetaData dbmd = conn.getMetaData();

          analysis.write("** Privacy Analysis Scanner Output ** \n\n");
          analysis.write("driver: " + dbmd.getDriverName() + "\n");
		  analysis.write("driver-version: " + dbmd.getDriverVersion() + "\n");
          analysis.write("product: " + dbmd.getDatabaseProductName() + "\n");
          analysis.write("product-version: " + dbmd.getDatabaseProductVersion() + "\n");

            if (catalog != null && catalog.length() > 0) {
                analysis.write("catalog: " + catalog + "\n");
                if (schemaPattern != null && schemaPattern.length() > 0) {
                    analysis.write("schemaPattern: " + schemaPattern + "\n\n");

                    ResultSet tables = null;
                    try {
                        tables = dbmd.getTables(catalog, schemaPattern, null, 
                                  new String[]{"TABLE"});
                        while (tables.next()) {
                            final String tableName = tables.getString(3);
                            analysis.write("table name=\"" + tableName);
                            String matchesPII = isPIIOrPHI(tableName);
                            if(matchesPII != null)
                                analysis.write(", *** Contains PII or PHI: " + matchesPII
                                  + " ***\n");
                            else
                                analysis.write("\n");

                            ResultSet columns = null;
                            try {
                               columns = dbmd.getColumns(null, null, tableName, null);
                               while (columns.next()) {
                                  final String columnName = columns.getString(4);
                                  analysis.write("  column name=\"" + columnName + "\"");
                                  analysis.write(", type=\"" + columns.getShort(5));
                                  matchesPII = isPIIOrPHI(columnName);
                                  if(matchesPII != null)
                                      analysis.write(", *** Contains PII or PHI: " 
                                        + matchesPII + " ***\n");
                                  else
                                      analysis.write("\n");
                               }
                            }
                            finally {
                                if (columns != null) columns.close();
                            }
                        }
                    }
                    finally {
                        tables.close();
                    }
                } else {
                   analysis.write("No 'schemaPattern' provided -- available schemas: ");
                   ResultSet rs = null;
                   try {
                        rs = dbmd.getSchemas();
                        while (rs.next()) {
                            analysis.write(", " + rs.getObject(1).toString());
                        }
                    }
                    finally {
                        if (rs != null) rs.close();
                    }
                    analysis.write("\n");
                }
            } else {
                analysis.write("No 'catalog' provided - listing available catalogs: ");
                ResultSet rs = null;
                try {
                    rs = dbmd.getCatalogs();
                    while (rs.next()) {
                        analysis.write(", " + rs.getObject(1).toString());
                    }
                }
                finally {
                    if (rs != null) rs.close();
                }
                analysis.write("\n");
            }
        } catch (SQLException e) {
            throw new BuildException(e);
        } catch (IOException e) {
            throw new BuildException(e);
        }

        // at this point we've captured the output and can e-mail or send it to
        // standard out; we're just going to write it out to a file for now
        FileWriter out = null;
        try {
            out = new FileWriter(output);
            out.write(analysis.toString());
        } catch (IOException e) {
            e.printStackTrace(); 
        }
    }
}

O método execute() da tarefa Ant é o método que será chamado pelo projeto Ant (consulte a Listagem 2) quando a tag <scanner> terminar. Todos os atributos terão sido passados nos configuradores definidos na Listagem 4 e, em seguida, o método execute pode usar as variáveis de membro privadas para os seus requisitos de processamento.

O método começa verificando se catalog e schemaPattern foram fornecidos. Se um catalog ou schemaPattern não tiver sido fornecido, o método simplesmente listará os catálogos e esquemas disponíveis para que seja possível modificar o arquivo do projeto na Listagem 2 para escolher o esquema e catálogo adequados.

Se forem fornecidos catalog e schemaPattern adequados, código simplesmente faz um loop em todas as tabelas (dentro de cada tabela, ele faz loops em todas as colunas) e realiza a verificação de PII e PHI em cada nome de tabela e de coluna usando o método definido na Listagem 5. Conforme o método faz loops nas tabelas e colunas, ele armazena mensagens para salvar em um arquivo. Ao final do método, as mensagens são coletadas e gravadas no arquivo.

Essa solução é só o começo, mas é possível notar que poupa muito tempo na procura para proteger os dados privados.


Conclusão

É vital controlar as PII e PHI em toda a empresa. Se você não conseguir procurar PII e PHI manual ou automaticamente, colocará em risco a integridade das informações confidenciais e correrá o risco de perda da segurança das informações pessoais (furto de identidade), possível furto de propriedade intelectual, publicidade ruim e notificações de violações, que custam caro. Por meio das técnicas descritas neste artigo, é possível ver que é relativamente simples criar um código funcional que pode inventariar bancos de dados e planilhas para que você saiba quais bancos de dados precisam de proteção e atenção às informações privadas.


Download

DescriçãoNomeTamanho
Article source codepiiphi.source.zip3KB

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Segmentos de mercado, Software livre, Information Management
ArticleID=833255
ArticleTitle=Localize Bancos de Dados com Informações Protegidas sobre Saúde
publish-date=08312012