Transmitir mensajes HL7v2 a través de conexiones TCP/IP con una imagen MLLP firmada

En este tutorial se explica cómo usar la autorización binaria como parte de una implementación de protocolo de capa inferior mínimo (MLLP) en una configuración de varios proyectos. Si usas la autorización binaria en Google Kubernetes Engine, te aseguras de que el adaptador MLLP solo se pueda desplegar desde una imagen de contenedor verificada y firmada.

El codelab de código abierto de autorización binaria del adaptador MLLP en GitHub muestra un caso similar en detalle.

Objetivos

Cuando hayas terminado este tutorial, sabrás cómo hacer lo siguiente:

  • Configura un attestor para que certifique cuándo está lista para implementarse una imagen de MLLP.
  • Despliega una imagen certificada del archivo binario del adaptador MLLP.
  • Usa una configuración de varios proyectos para separar la responsabilidad de firmar imágenes del entorno de implementación.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

  • Cloud Healthcare API
  • Google Kubernetes Engine
  • Artifact Analysis
  • Cloud Key Management Service
  • Binary Authorization

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Requisitos previos

Antes de empezar este tutorial, familiarízate con la documentación conceptual sobre MLLP. Para ello, consulta MLLP y el adaptador MLLP Google Cloud . La documentación conceptual ofrece una descripción general de MLLP, cómo pueden enviar y recibir mensajes los sistemas de atención a la API Cloud Healthcare a través de una conexión MLLP y los conceptos básicos de la seguridad de MLLP.

Elegir un shell

Para completar este tutorial, puedes usar Cloud Shell o tu shell local.

Cloud Shell es un entorno de shell para gestionar recursos alojados en Google Cloud. Cloud Shell tiene preinstaladas la CLI de Google Cloud y la herramienta de línea de comandos kubectl. La CLI de gcloud proporciona la interfaz de línea de comandos principal de Google Cloud. La herramienta kubectl proporciona la interfaz de línea de comandos para ejecutar comandos en clústeres de Kubernetes.

Si prefieres usar tu shell local, debes instalar Google Cloud CLI.

Para abrir Cloud Shell o configurar tu shell local, sigue estos pasos:

Cloud Shell

Para iniciar Cloud Shell, sigue estos pasos:

  1. Ve a la Google Cloud consola.

    Google Cloud console

  2. En la esquina superior derecha de la consola, haz clic en el botón Activar Google Cloud Shell: .

Se abrirá una sesión de Cloud Shell dentro de un marco en la parte inferior de la consola. Esta shell se usa para ejecutar comandos gcloud y kubectl.

Shell local

Para instalar gcloud CLI y la herramienta kubectl, sigue estos pasos:

  1. Instala e inicializa gcloud CLI.

  2. Instala la herramienta de línea de comandos kubectl ejecutando el siguiente comando:

    gcloud components install kubectl
    

Proyecto de contenedor

El proyecto de contenedor cloud-healthcare-containers ya existe. Contiene las imágenes del adaptador MLLP.

Crear un conjunto de claves y un par de claves

El proyecto de Cloud KMS proporciona una firma de infraestructura de clave pública (X.509) (PKIX) mediante Cloud KMS. Autorización binaria usa claves criptográficas para verificar de forma segura la identidad de los certificadores. De esta forma, solo las partes verificadas pueden participar en la autorización de una imagen de contenedor. El par de claves consta de una clave privada, que usa el attestor para firmar digitalmente las certificaciones, y una clave pública, que añades al attestor y que almacena el servicio Autorización binaria.

Si quieres gestionar pares de claves públicas y privadas de forma local, no necesitas el proyecto de Cloud KMS. Para obtener más información, consulta el artículo Usar claves de cifrado gestionadas por el cliente.

Para crear un conjunto de claves y un par de claves, sigue estos pasos:

  1. Crea el proyecto de Cloud KMS siguiendo estos pasos:

    1. En la Google Cloud consola, ve a la página Nuevo proyecto.

      Ir a Nuevo proyecto

    2. Rellena el formulario y haz clic en Crear. El nombre del proyecto que selecciones se mencionará como KMS_PROJ_ID a lo largo de este tutorial.

    Para obtener más información sobre cómo crear proyectos, consulta el artículo Crear y gestionar proyectos.

  2. Para habilitar la API de Cloud KMS en el proyecto de Cloud KMS, ejecuta el siguiente comando:

    gcloud services enable cloudkms.googleapis.com \
        --project=KMS_PROJ_ID
  3. Para crear un conjunto de claves, ejecuta el siguiente comando, donde KEY_RING es un nombre único para el conjunto de claves y KEY_RING_LOCATION es una región como us-central-1:

    gcloud kms keyrings create KEY_RING \
        --project=KMS_PROJ_ID \
        --location=KEY_RING_LOCATION
  4. Para crear un par de claves, ejecuta el siguiente comando:

    gcloud kms keys create KEY \
        --project=KMS_PROJ_ID \
        --keyring=KEY_RING \
        --location=KEY_RING_LOCATION \
        --purpose=asymmetric-signing \
        --default-algorithm="ec-sign-p256-sha256"
  5. Para verificar la versión de la clave en el proyecto de Cloud KMS, ejecuta el siguiente comando. La versión de la clave debe ser 1.

    gcloud kms keys versions list \
        --project=KMS_PROJ_ID \
        --location=KEY_RING_LOCATION \
        --key=KEY \
        --keyring=KEY_RING

Crear y configurar el proyecto, el conjunto de datos y el almacén HL7v2

Para crear y configurar el proyecto, el conjunto de datos y el almacén HL7v2, sigue estos pasos:

  1. Para crear el proyecto HL7v2, sigue estos pasos:

    1. En la Google Cloud consola, ve a la página Nuevo proyecto.

      Ir a Nuevo proyecto

    2. Rellena el formulario y haz clic en Crear. El nombre del proyecto que selecciones se mencionará como HL7V2_PROJ_ID a lo largo de este tutorial.

  2. Para habilitar la API Cloud Healthcare en el proyecto, ejecuta el siguiente comando:

    gcloud services enable healthcare.googleapis.com \
        --project=HL7V2_PROJ_ID
  3. Para crear un conjunto de datos en el que almacenar el almacén HL7v2, ejecuta el siguiente comando:

    gcloud healthcare datasets create DATASET_ID \
        --location=HL7V2_STORE_LOCATION \
        --project=HL7V2_PROJ_ID
  4. Para crear el almacén HL7v2, ejecuta el siguiente comando:

    gcloud healthcare hl7v2-stores create HL7V2_STORE_ID \
        --dataset=DATASET_ID \
        --location=HL7V2_STORE_LOCATION \
        --project=HL7V2_PROJ_ID

Crear una nota de Artifact Analysis

El proyecto de la nota es el propietario de la nota de Artifact Analysis.

Para crear una nota de análisis de artefactos, sigue estos pasos:

  1. Crea el proyecto de notas siguiendo estos pasos:

    1. En la Google Cloud consola, ve a la página Nuevo proyecto.

      Ir a Nuevo proyecto

    2. Rellena el formulario y haz clic en Crear. El nombre del proyecto que selecciones se mencionará como NOTE_PROJ_ID a lo largo de este tutorial.
  2. Para habilitar la API Artifact Analysis en el proyecto de la nota, ejecuta el siguiente comando:

    gcloud services enable containeranalysis.googleapis.com \
         --project=NOTE_PROJ_ID
  3. Para guardar la carga útil de la nota de ejemplo en un archivo llamado ./tmp/note_payload.json, ejecuta el siguiente comando:

    cat > ./tmp/note_payload.json << EOM
    {
      "name": "projects/NOTE_PROJ_ID/notes/NOTE_ID",
      "attestation": {
        "hint": {
          "human_readable_name": "Attestor note"
        }
      }
    }
    EOM
  4. Para crear una nota de análisis de artefactos en el proyecto de notas, ejecuta el siguiente comando:

    curl -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)"  \
        --data-binary @./tmp/note_payload.json  \
        "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/?noteId=NOTE_ID"
  5. Para verificar que se ha creado la nota, ejecuta el siguiente comando:

    curl \
    -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
    "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/NOTE_ID"

Crear y configurar un encargado de la atestación

El proyecto de attestor almacena attestors, que verifican o certifican que una imagen de contenedor está lista para implementarse.

Para crear y configurar un attestor, sigue estos pasos:

  1. Para crear el proyecto de attestor, sigue estos pasos:

    1. En la Google Cloud consola, ve a la página Nuevo proyecto.

      Ir a Nuevo proyecto

    2. Rellena el formulario y haz clic en Crear. El nombre del proyecto que selecciones se mencionará como ATTESTOR_PROJ_ID a lo largo de este tutorial.
  2. Para habilitar las APIs Binary Authorization y Cloud KMS en el proyecto del attestor, ejecuta los siguientes comandos:

    gcloud services enable binaryauthorization.googleapis.com \
        --project=ATTESTOR_PROJ_ID
    gcloud services enable cloudkms.googleapis.com \
        --project=ATTESTOR_PROJ_ID
  3. Para crear un attestor en el proyecto del attestor, ejecuta el siguiente comando. El attestor usa la nota creada en el proyecto de nota para la certificación.

    gcloud beta container binauthz attestors create ATTESTOR_ID \
        --project=ATTESTOR_PROJ_ID \
        --attestation-authority-note=NOTE_ID \
        --attestation-authority-note-project=NOTE_PROJ_ID
  4. Para verificar que se ha creado el attestor, ejecuta el siguiente comando:

    gcloud beta container binauthz attestors list \
        --project=ATTESTOR_PROJ_ID
  5. Haz las sustituciones que se indican a continuación y, después, guarda el archivo JSON de ejemplo en un archivo llamado ./tmp/iam_request.json ejecutando el siguiente comando:

    • Usa los valores de NOTE_PROJ_ID y NOTE_ID de Crear una nota de análisis de artefactos.
    • Para encontrar el ATTESTOR_PROJECT_NUM, sigue estos pasos:

      1. Ve a la página Panel de control de la consola de Google Cloud .

        Ir a la página Panel de control

      2. En la parte superior de la página, haz clic en la lista desplegable Seleccionar de. En la ventana Seleccionar de que aparece, selecciona el proyecto del attestor.

      El número de proyecto se muestra en la tarjeta Información del proyecto del panel de control del proyecto.

    cat > ./tmp/iam_request.json << EOM
    {
      "resource": "projects/NOTE_PROJ_ID/notes/NOTE_ID",
      "policy": {
        "bindings": [
          {
            "role": "roles/containeranalysis.notes.occurrences.viewer",
            "members": [
              "serviceAccount:service-ATTESTOR_PROJ_NUM@gcp-sa-binaryauthorization.iam.gserviceaccount.com"
            ]
          }
        ]
      }
    }
    EOM
  6. Para conceder a la cuenta de servicio de Autorización binaria del proyecto de atestación permiso para leer las ocurrencias de notas de Análisis de artefactos en el proyecto de notas, ejecuta el siguiente comando:

    curl -X POST  \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
        --data-binary @./tmp/iam_request.json \
    "https://containeranalysis.googleapis.com/v1/projects/NOTE_PROJ_ID/notes/NOTE_ID:setIamPolicy"
  7. Para añadir la clave generada en el proyecto de Cloud KMS al verificador, ejecuta el siguiente comando:

    gcloud beta container binauthz attestors public-keys add  \
        --project=ATTESTOR_PROJ_ID \
        --attestor=ATTESTOR_ID  \
        --keyversion-project=KMS_PROJ_ID  \
        --keyversion-location=KEY_RING_LOCATION \
        --keyversion-keyring=KEY_RING \
        --keyversion-key=KEY \
        --keyversion=KEY_VERSION

Crear una atestación

El proyecto de certificación almacena certificaciones. Una certificación es una declaración de un certificador que indica que se ha completado un proceso obligatorio en tu canalización y que se ha autorizado la implementación de una imagen de contenedor.

Para crear una certificación, sigue estos pasos:

  1. Para crear el proyecto de certificación, sigue estos pasos:

    1. En la Google Cloud consola, ve a la página Nuevo proyecto.

      Ir a Nuevo proyecto

    2. Rellena el formulario y haz clic en Crear. El nombre del proyecto que selecciones se mencionará como ATTESTATION_PROJ_ID a lo largo de este tutorial.
  2. Para habilitar la API de autorización binaria en el proyecto de certificación, ejecuta el siguiente comando:

    gcloud services enable binaryauthorization.googleapis.com \
        --project=ATTESTATION_PROJ_ID
  3. Para firmar y crear la certificación, ejecuta el siguiente comando, donde IMAGE_SIGNED es la ubicación de la imagen del adaptador MLLP firmado: gcr.io/cloud-healthcare-containers/mllp-adapter@sha256:231b073df13db0c65e57b0e1d526ab6816a73c37262e25c18bcca99bf4b4b185

    gcloud beta container binauthz attestations sign-and-create \
        --project=ATTESTATION_PROJ_ID \
        --artifact-url=IMAGE_SIGNED \
        --attestor=ATTESTOR_ID \
        --attestor-project=ATTESTOR_PROJ_ID \
        --keyversion-project=KMS_PROJ_ID \
        --keyversion-location=KEY_RING_LOCATION \
        --keyversion-keyring=KEY_RING \
        --keyversion-key=KEY \
        --keyversion=KEY_VERSION

Implementar el adaptador MLLP

El proyecto de implementación es el propietario del clúster de GKE en el que se importa y se almacena la autorización binaria.

Para implementar el adaptador MLLP, sigue estos pasos:

  1. Para crear el proyecto de implementación, sigue estos pasos:

    1. En la Google Cloud consola, ve a la página Nuevo proyecto.

      Ir a Nuevo proyecto

    2. Rellena el formulario y haz clic en Crear. El nombre del proyecto que selecciones se mencionará como DEPLOYER_PROJ_ID a lo largo de este tutorial.
  2. Para habilitar la API de autorización binaria en el proyecto de implementación, ejecuta el siguiente comando:

    gcloud services enable binaryauthorization.googleapis.com \
        --project=DEPLOYER_PROJ_ID
  3. Para conceder a la cuenta de servicio de Autorización binaria del proyecto de implementación permiso para acceder al encargado de la atestación para verificar la atestación, ejecuta el siguiente comando:

    gcloud beta container binauthz attestors add-iam-policy-binding \
        "projects/ATTESTOR_PROJ_ID/attestors/ATTESTOR_ID" \
        --project=ATTESTOR_PROJ_ID \
        --member="serviceAccount:service-DEPLOYER_PROJ_NUM@gcp-sa-binaryauthorization.iam.gserviceaccount.com" \
        --role=roles/binaryauthorization.attestorsVerifier
  4. Para crear un clúster con --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE en el proyecto de implementación, ejecuta el siguiente comando:

    gcloud beta container clusters create CLUSTER_NAME \
        --project=DEPLOYER_PROJ_ID \
        --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
        --zone CLUSTER_ZONE
  5. La política de implementación de ejemplo añade fuentes de imágenes a la lista de permitidas y define una regla predeterminada de ámbito de proyecto para bloquear las imágenes de fuentes que no haya verificado el verificador. Para guardar la política de implementación de muestra en un archivo llamado ./tmp/policy.yaml, ejecuta el siguiente comando:

    cat > ./tmp/policy.yaml << EOM
        admissionWhitelistPatterns:
        - namePattern: gcr.io/google_containers/*
        - namePattern: gcr.io/google-containers/*
        - namePattern: k8s.gcr.io/*
        - namePattern: gcr.io/stackdriver-agents/*
        defaultAdmissionRule:
          evaluationMode: REQUIRE_ATTESTATION
          enforcementMode: ENFORCED_BLOCK_AND_AUDIT_LOG
          requireAttestationsBy:
            - projects/ATTESTOR_PROJ_ID/attestors/ATTESTOR_ID
        name: projects/DEPLOYER_PROJ_ID/policy
    EOM
  6. Para importar la política de implementación al proyecto de implementador, ejecuta el siguiente comando:

    gcloud beta container binauthz policy import ./tmp/policy.yaml \
        --project=DEPLOYER_PROJ_ID
  7. Para ver los detalles de la política, ve a la página Autorización binaria de la Google Cloud consola.

    Ir a la página Autorización binaria

  8. Para consultar las credenciales del clúster de GKE, ejecuta el siguiente comando:

    gcloud container clusters get-credentials \
        --project=DEPLOYER_PROJ_ID \
        --zone CLUSTER_ZONE CLUSTER_NAME
  9. Sustituye los valores que se indican a continuación y, después, guarda el archivo YAML de ejemplo con el nombre ./tmp/deployment.yaml ejecutando el siguiente comando:

    cat > ./tmp/deployment.yaml << EOM
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: mllp-adapter-deployment
     spec:
       replicas: 1
       selector:
         matchLabels:
           app: mllp-adapter
       template:
         metadata:
           labels:
             app: mllp-adapter
         spec:
           containers:
             - name: mllp-adapter
               imagePullPolicy: Always
               image: IMAGE_SIGNED
               ports:
                 - containerPort: 2575
                   protocol: TCP
                   name: "port"
               command:
                 - "/usr/mllp_adapter/mllp_adapter"
                 - "--hl7_v2_project_id=HL7V2_PROJ_ID"
                 - "--hl7_v2_location_id=HL7V2_STORE_LOCATION"
                 - "--hl7_v2_dataset_id=DATASET_ID"
                 - "--hl7_v2_store_id=HL7V2_STORE_ID"
                 - "--api_addr_prefix=https://healthcare.googleapis.com:443/v1beta1"
                 - "--logtostderr"
                 - "--receiver_ip=0.0.0.0"
    EOM
  10. Para crear un despliegue con la imagen certificada, ejecuta el siguiente comando:

    kubectl create -f ./tmp/deployment.yaml
  11. Para confirmar que la implementación se ha realizado correctamente, ejecuta los siguientes comandos:

    kubectl get pods
    kubectl get event

    El comando get pods muestra un pod en ejecución y el comando get event muestra Scaled up replica set mllp-adapter-deployment-xxxx to 1.

Después de completar esta sección, habrás desplegado de forma segura una imagen de adaptador MLLP atestada en Google Kubernetes Engine.

Eliminar los proyectos

Para evitar que se apliquen cargos en tu cuenta de Google Cloud por los recursos utilizados en este tutorial, puedes eliminar los recursos que has creado enGoogle Cloud.

Sigue los pasos que se indican a continuación para eliminar los proyectos que has creado en este tutorial:

  • Proyecto de encargado de la atestación
  • Proyecto de atestación
  • Proyecto de implementador
  • Proyecto de nota
  • Proyecto de Cloud KMS
  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.