Encontrar bases de datos con información de la salud protegida

PII de inventario, PHI y otros datos sensibles dentro de bases de datos y hojas de cálculo.

El robo de identidad y el fraude médico son problemas crecientes. Son tan grandes que el gobierno de EE.UU está gastando miles de millones de dólares asegurando sus propios sistemas informáticos y ha escrito miles de páginas de nuevas normas que usted debe seguir para ayudar a proteger los datos de su cliente y de su empleado. Para cumplir con las nuevas normas y asegurar los datos adecuadamente, necesitará encontrar información de identificación personal (PII) e información protegida de salud (PHI) en sus bases de datos y documentos. PHI y PII son conceptualmente fáciles de entender pero muy difíciles de seguir en los miles de almacenes de datos relacionales, archivos y hojas de cálculo que conforman un entorno de TI típico de una organización. Este artículo describe algunos métodos para identificar e inventariar automáticamente la PII, la PHI y otros datos sensibles con bases de datos y hojas de cálculo utilizando tecnología Java™ y la herramienta de construcción Apache Ant.

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

Shahid Shah photoShahid N. Shah es un líder de pensamiento de TI del cuidado de la salud reconocido e influyente internacionalmente que es conocido como "El Tipo de la TI del Cuidado de la Salud" en Internet. Es un consultor para diversas agencias federales en asuntos de TI y ganador del codiciado premio "Fed 100" de Federal Computer Week otorgado a expertos de TI que han causado un gran impacto en el gobierno. Shahid ha proyectado y desarrollado diversas soluciones clínicas en sus casi 20 años de carrera. Ayudó a diseñar y desplegar la solución de registros electrónicos de salud de la Cruz Roja Americana a través de miles de sitios; ha construido dos EMRs basados en web ahora en uso por cientos de médicos; ha diseñado grandes sitios de groupware y colaboración que están siendo utilizados por miles; y, como un ex-CTO de una división de miles de millones de dólares de CardialHealth, ayudó a diseñar interfaces clínicas avanzadas para dispositivos médicos y hospitales. Shahid también sirve como consejero sénior de estrategia de tecnología para el programa SBIR/STTR de NIH ayudando a pequeñas empresas a comercializar sus aplicaciones del cuidado de la salud.



08-04-2011

La recolección y almacenamiento de datos de PII y PHI se está expandiendo

El robo de identidad es ya un problema bien conocido en la industria financiera, y las compañías están tratando de tomar medidas para contrarrestarlo lo mejor que pueden. El fraude relacionado con la medicina naciente en este momento— actualmente menos del 5 por ciento de las infracciones reportadas ocurrieron dentro del cuidado de la salud— pero el crecimiento de los fraudes del cuidado de la salud se continuará acelerando mientras los fondos de estímulo gubernamentales expandan el uso de registros de salud electrónicos. Cuando las infracciones de identidad y robo médico ocurren, lo hacen porque la mayoría de los sistemas de información que tienen valor para las organizaciones contienen un nivel de información de identificación personal (PII) o información protegida de la salud (PHI). La PII y la PHI son tipos de datos altamente privados almacenados sobre personas y, si son violados o robados, causan eventos adversos como robo de identidad o fraude médico. Por ejemplo, el Departamento de Defensa, asuntos del Departamento de Veteranos, manejadores de PII y PHI (como una compañía de seguros o de inversiones personales) y empleadores (como una cadena de hoteles) han reportado pérdidas significativas de datos de PII y PHI, en algunos casos de hasta 25 millones de registros. Proteger la información no es fácil, pero es vital.

La PII es usualmente definida como cualquier nombre o número que pueda ser utilizado, solo o en conjunción con cualquier otra información, para identificar a un individuo específico. Usualmente es el nombre de un individuo, en conjunto con uno o más de los siguientes datos: número de licencia de manejo, número de tarjeta de ID del estado, número de Seguro Social, número de cuenta, número de tarjeta de crédito o número de tarjeta de débito.

La PHI, definida como cualquier información que enlace una persona con su condición de salud, es un poco más compleja. Existen dieciocho identificadores oficiales definidos por Health Insurance Portability and Accountability Act (HIPAA) y caen en los siguientes grupos:

  • Nombres
  • Fechas
  • Números
  • Direcciones
  • Gráficas

Si todos estos grupos, o identificadores, son eliminados o cifrados de alguna manera, la información se convierte en des-identificada o anonimizada y ya no se considera PHI. La lista específica de dieciocho tipos de datos definidos en las normas gubernamentales como HIPAA consta de:

  1. Nombres
  2. Todas las subdivisiones geográficas más pequeñas que un estado, incluyendo: dirección, ciudad, país, distrito, Código Postal y sus códigos geográficos equivalentes, excepto por los primeros 3 dígitos de un Código Postal si, de acuerdo con los datos actuales disponibles públicamente en la Oficina del Censo:
    1. La unidad geográfica formada al combinar todos los Códigos Postales con los mismos tres dígitos iniciales contiene más de 20.000 personas.
    2. Los tres dígitos iniciales de un Código Postal para todas estas unidades geográficas que contienen 20.000 personas o menos son cambiados a 000. De acuerdo con las Modificaciones Finales de Agosto de 2002 a la Norma de Privacidad y utilizando los datos del Censo de 2000, existen 17 Códigos Postales restringidos de tres dígitos que corresponden a poblaciones de 20.000 o menos personas y deben ser cambiados a 000 para ser des-identificados: 036, 059, 063, 102, 203, 556, 692, 790, 821, 823, 830, 831, 878, 879, 884, 890, y 893.
  3. Todos los elementos de fechas (excepto el año) para fechas directamente relacionadas a un individuo, incluyendo la fecha de nacimiento, fecha de admisión, fecha de alta y fecha de defunción. Todas las edades arriba de 89 años y todos los elementos de fechas (incluyendo el año) indicativos de tal edad, a menos que tales edades y elementos puedan ser agregados en una categoría individual de edad de 90 años o más.
  4. Número telefónico
  5. Número de fax
  6. Dirección de e-mail
  7. Número de Seguro Social
  8. Número de registro médico
  9. Número de beneficiario del plan de salud
  10. Números de cuenta
  11. Número de licencia o certificado
  12. Identificadores de vehículo y números de serie (incluyendo las placas)
  13. Identificadores de dispositivo y números de serie
  14. Dirección URL
  15. Dirección IP
  16. Identificadores biométricos, como huellas digitales y de voz
  17. Fotografías de cara completa y cualquier imagen comparable
  18. Cualquier otro número exclusivo de identificación, característica o código

La PHI aparece en distintas formas: registros en papel o impresos, registros electrónicos y comunicaciones de lenguaje verbal y por señas. Es más fácil proteger registros de papel y comunicaciones verbales, ya que hemos estado utilizando y protegiendo estos tipos de registros durante cientos de años y, normalmente, somos buenos en ello. Las comunicaciones electrónicas tienen menos de sesenta años de edad y la mayoría de los datos de salud tienen menos de treinta años de edad, así que apenas estamos comenzando a entender cómo protegerlos. A diferencia de los registros de papel robados que son difíciles y consumen mucho tiempo para copiarse y diseminarse, los registros electrónicos robados son fáciles de distribuir. Por esta razón, este artículo se enfoca en encontrar y proteger los registros electrónicos.


Una guía para proteger la confidencialidad de la PII

La publicación SP 800-122 del National Institute of Standards and Technology (NIST), "Guía para Proteger la Confidencialidad de Información de Identificación Personal (PII)" (ver Recursos) es uno de los mejores recursos gratuitos e imparciales gratuitos para ayudarle a entender qué es la privacidad de los datos y cómo puede protegerla. Originalmente creada para ayudar a organizaciones federales a identificar la PII y determinar el nivel de protección que requiere cada caso, este documento igualmente aplicable a organizaciones comerciales y sin fines de lucro. Aconseja cuál es la protección apropiada y salvaguardias para la PII y cómo manejar las violaciones de datos. Mientras que el enfoque está en la PII, también puede soportar la PHI para sus propios planes de privacidad y seguridad.


Para proteger los la privacidad de datos, necesita saber dónde están

Usted sabe que necesita proteger la PII y la PHI que reside en sus bases de datos. También sabe que el cifrado en tránsito es un requisito mínimo para asegurar los datos privados. Sin embargo, ¿qué datos deben ser cifrados y protegidos? Declarar todo como privado no es inteligente, ya que los costos de seguridad de datos son altos.

Proteger grandes bases de datos empresariales es sencillo— al menos usted sabe dónde se encuentran los datos. La tarea difícil es cómo manejar las docenas, quizá cientos, de documentos de Lotus® Notes® y archivos de Microsoft® Word, Access® y Excel®. Mientras que se podría tratar a estos documentos como problemas simples de gestión de archivos, son más que eso, son aplicaciones reales y bases de datos reales. Cualquier análisis razonable de las preocupaciones de privacidad de HIPAA relacionadas con información del paciente en una organización considerable puede descubrir miles de archivos de Microsoft Word, Access y Excel con datos de la salud que necesitan protección.

Descubrimiento de datos sensibles

Este artículo presenta algunos mecanismos de descubrimiento de datos (inventario) para ayudar a identificar la PII y la PHI que puede residir en cualquier origen de datos que pueda ser conectada mediante JDBC u ODBC. El enfoque básico es el siguiente:

  • Observe la tabla, columna y otros nombres de objeto de esquema para ver si coinciden con los patrones conocidos y asuma que todos los objetos coincidentes tienen datos de PII o PHI.
  • Observe el SQL real o las consultas siendo llevadas a cabo para explorar el SQL Data Query Language (DQL) o los resultados generados.
  • Observe los datos en reposo dentro de la base de datos o los archivos utilizando coincidencia de serie o patrón para palabras específicas como do not distribute, confidential, \d{3}\-\d{2}\-\d{4} (SSN) y agrégueles un distintivo.
  • Observe todo el contenido que está siendo transferido mediante firewalls o proxys utilizando patrones de coincidencia similares.

Cómo clasificar los datos como sensibles o privados

Existen muchas técnicas para clasificar los datos, pero realizan una de las siguientes opciones:

  • Igualan de forma determinista con palabras clave específicas o patrones en los datos reales o en los metadatos que definen los datos.
  • Utilizan algorítmicamente la agrupación en clúster de documentos con clasificación taxonómica o de otro tipo, análisis de lenguaje natural, inferencia Bayesian o análisis de estadísticas.

Los mecanismos algorítmicos están más allá del ámbito de este documento, pero usted verá que no es difícil igualar con palabras clave en metadatos.


Autodescubrimiento de columnas de PII o PHI en orígenes de datos JDBC u ODBC

Casi todas las bases de datos relacionales populares son directamente accesibles mediante JDBC; los documentos de Microsoft Office tales como Access o Excel son accesibles mediante puentes JDBC-ODBC. Utilizando el modelo de puente o JDBC directo junto con la clase java.sql.DatabaseMetaData de JDBC le entrega todo lo que necesita para realizar una exploración rápida de las columnas, tablas y otros objetos de esquema de la base de datos. Envuelva eso en una tarea de Ant y tendrá una herramienta de línea de comandos reutilizable que puede utilizar en cualquier plataforma conectada a cualquier base de datos.

Definiendo el archivo de filtros

Defina un archivo de texto que contenga una lista de distintas expresiones regulares a buscar. Llámela la lista filters. Puede crear un archivo llamado filters.txt (ver Download para el archivo) y puede comenzar con los patrones mostrados en el Listado 1. Deseará expandir el archivo de forma que tenga todas sus normas específicas.

Listado 1. filters.txt contiene expresiones regulares de muestra que identifican los patrones a localizar
^.*(ssn|social|security).*$
^.*name.*$
^.*address.*$
^.*city.*$
^.*state.*$
^.*zip.*$
^.*county.*$
^.*precinct.*$
^.*(email|e-mail|mail).*$

Utilizando la Tarea de Ant

Herramientas de exploración comerciales y de código abierto

Muchas otras herramientas de exploración de código abierto y comerciales inician con funcionalidad similar, pero agregan más dispositivos. Cuando usted busque herramientas de terceros, considere el descubrimiento automatizado (las herramientas automáticamente encuentran bases de datos y fuentes de registros con PII/PHI), las plantillas configurables (usted agrega sus propias normas), la cobertura amplia (todos los archivos, bases de datos y transferencias de red están cubiertas), la exploración de contenido y las auditorías.

Para utilizar la tarea de Ant necesitará crear un Archivo de Proyecto de Ant (ver Listado 2). Tome en cuenta que estará utilizando el archivo filters.txt previamente definido. Puede tener tantas etiquetas <scanner> como necesite para buscar a través de todas sus bases de datos distintas, documentos de Access y Excel y otros archivos. El poder completo de Ant está disponible para utilizar variables, scripting, etc.

Listado 2. scanner.xml—el Archivo de Proyecto de Ant que describe las conexiones y opciones de 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>

Si desea buscar bases de datos o documentos adicionales, simplemente agregue secciones <scanner> adicionales en el archivo de proyecto de Ant. Sugiero agregar todas las conexiones distintas de base de datos en un archivo o agrupar distintas bases de datos por sistema o departamento en archivos separados. Recuerde que puede explorar documentos de Microsoft Access o Excel al utilizar el puente JDBC-ODBC.


El origen Java de la tarea de Ant (PrivacyDataScannerTask.java)

Puede grabar el código de exploración de privacidad de datos como un programa Java de línea de comandos o utilizar otras técnicas diversas para hacer un script de ello. Sin embargo, si usted graba el código de exploración de privacidad como una tarea de Ant, se vuelve fácil de inyectar en la automatización de construcción y otros scripts y es más reutilizable a través de los proyectos que utilizan Ant (ver el Listado 3). Ya que su código estará utilizando JDBC, tiene sentido extender la clase de tarea de Ant incorporada org.apache.tools.ant.taskdefs.JDBCTask.

Listado 3. PrivacyDataScannerTask.java, parte 1: Las sentencias de importación
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;

Note que usted utiliza Ant para importar esas clases, y necesitará Ant 1.6 o superior en su variable CLASSPATH (ver el Listado 4).

Listado 4. PrivacyDataScannerTask.java, parte 2: La cabecera de clase y los métodos setter
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();
    }

Su tarea es extender una Tarea de Ant incorporada (JDBCTask) y esta automáticamente hereda todas las propiedades de configuración de conexión de JDBC. setCatalog, setSchemaPattern, setOutput y setFiltersFile son automáticamente llamados por Ant cuando el proyecto hace referencia de los atributos XML en la etiqueta <scanner> mostrada en el Listado 5.

Listado 5. PrivacyDataScannerTask.java, parte 3: El método que realmente realiza la verificación de la PII o la PHI
    public String isPIIOrPHI(final String text) {
        for (final String regex : filters) {
            if (text.matches(regex)) return regex;
        }

        return null;
    }

El verdadero trabajo de igualar nombres de tabla, nombres de columna y otros objetos de esquema es manejado por este método. Por ahora, usted está simplemente verificando si el texto pasó (que será el nombre de una columna o tabla) y si cumple nuestras normas. Las normas fueron definidas en filter.txt en el Listado 1 y leídas en utilizar el método setFiltersFile en el Listado 4.

Por supuesto, si tiene una forma distinta de especificar los filtros, como obtener los filtros de un servicio HTTP o recuperarlos de una base de datos central, puede modificar este método para utilizar su fuente de normas y normas empresariales (ver el Listado 6).

Listado 6. PrivacyDataScannerTask.java, parte 4: El método de Ant principal que realiza la exploración real.
    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(); 
        }
    }
}

El método execute() de una tarea de Ant es el método que será llamado por el proyecto de Ant (ver el Listado 2) cuando la etiqueta <scanner> termine. Todos los atributos habrán sido pasados en los métodos setter definidos en el Listado 4 y el método execute puede entonces utilizar las variables de miembro privado para sus requisitos de proceso.

El método comienza por verificar si catalog y schemaPattern han sido proporcionados. Si un catalog o schemaPattern no es proporcionado, el método simplemente hará una lista de los catálogos y esquemas disponibles de forma que pueda modificar el archivo de proyecto en el Listado 2 para elegir el esquema y catálogo apropiados.

Si un catalog y schemaPattern apropiados son proporcionados, el código simplemente realiza un bucle a través de todas las tablas (dentro de cada tabla realiza un bucle a través de todas las columnas) y ejecuta la verificación de la PII y la PHI para cada nombre de tabla y nombre de columna utilizando el método definido en el Listado 5. A medida que el método realiza el bucle a través de las tablas y columnas, almacena mensajes para salvarlos en un archivo. Al final del método, los mensajes son colocados y grabados en el archivo.

Esta solución es sólo el comienzo, pero puede ver que le ahorra mucho tiempo mientras que conduce su búsqueda para proteger la privacidad de los datos.


Conclusión

Es vital realizar un seguimiento de la PII y la PHI en toda la empresa. Si no puede explorar manual o automáticamente la PII y la PHI, arriesga la integridad de la información confidencial, la pérdida de seguridad de información personal (robo de identidad), el robo potencial de propiedad intelectual, la mala publicidad y las costosas notificaciones de violación. Utilizando las técnicas descritas en este artículo, puede ver que es relativamente sencillo crear un código de trabajo que pueda realizar un inventario de las bases de datos y hojas de cálculo de forma que esté consciente de cuáles bases de datos necesitan protección privada y atención.


Descargar

DescripciónNombretamaño
Article source codepiiphi.source.zip3KB

Recursos

Aprender

Obtener los productos y tecnologías

Comentar

Comentarios

developerWorks: Ingrese

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


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

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

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Industries
ArticleID=645434
ArticleTitle=Encontrar bases de datos con información de la salud protegida
publish-date=04082011