Guia de Implementação da SES GO - Segurança
0.0.2 - draft Brazil flag

Guia de Implementação da SES GO - Segurança - Local Development build (v0.0.2) built by the FHIR (HL7® FHIR® Standard) Build Tools. See the Directory of published versions

Conteúdo assinado

A política de assinatura digital avançada é definida especificamente para dados em saúde registrados por meio de instâncias de recursos FHIR (versão 4.0.1), conforme definido abaixo.

Identificação do que assinar

A assinatura contempla documentos FHIR, assim como uma única instância de Observation, ou de qualquer outro recurso, de fato, um conjunto de instâncias. Apesar da flexibilidade além de documentos FHIR, há restrições.

As instâncias a serem assinadas são identificadas por uma instância do recurso Provenance, em particular, pelo elemento Provenance.target.

Na ilustração abaixo as instâncias 1 e 2 são identificadas para serem assinadas pelas duas entradas de Provenance.target. Observe que há uma terceira instância, identificada na ilustração, mas cujo conteúdo não é assinado. Neste caso, o que é assinado é a referência lógica contida na instância 2. O conteúdo de "Instância Externa" não é assinado.

graph TD
    direction TB
    Prov["Provenance<br>(define o que é assinado)"]
    ResA["Instância 1<br>(o que é assinado)"]
    ResB["Instância 2<br>(o que é assinado)"]
    ResC["Instância Externa<br>(não é assinada)"]
   Prov -->|"target[0]"| ResA
  Prov -->|"target[1]"| ResB
  ResB -->|"Referência lógica"| ResC
  
  classDef externa fill:#fff,stroke:#000,stroke-width:1px;
  classDef bundle fill:#eee,stroke:#000,stroke-width:1px;
  classDef resource fill:#e0f7fa,stroke:#26a69a,stroke-width:2px;
  classDef provenance fill:#f1f8e9,stroke:#8bc34a,stroke-width:2px;
  classDef signature fill:#fff9c4,stroke:#fbc02d,stroke-width:2px;
  class B bundle
  class ResA,ResB resource
  class ResC externa
  class Prov externa
  class Signer signature

A instância do recurso Provenance indica explicitamente quais instâncias de recursos compõem o conteúdo assinado, bem como armazena a assinatura digital correspondente. Essa assinatura é representada pelo tipo de dados Signature, localizado no elemento Provenance.signature, conforme ilustrado abaixo. Observe que a assinatura digital não é identificada por uma referência, em vez disso, a assinatura está contida, é parte da instância de Provenance.

graph TD
    direction TB
    Prov["Conteúdo Assinado<br>(Provenance)"]
    ResA["Instância 1<br>(o que é assinado)"]
    ResB["Instância N<br>(o que é assinado)"]
    ResC["Instância Externa<br>(não é assinada)"]
   Prov -.->|"signature[0]"| Signer["Assinatura Avançada<br>(Signature)"]
  Prov -->|"target[0]"| ResA
  Prov -->|"target[1]"| ResB
  ResB -->|"Referência lógica"| ResC
  
  classDef externa fill:#fff,stroke:#000,stroke-width:1px;
  classDef bundle fill:#eee,stroke:#000,stroke-width:1px;
  classDef resource fill:#e0f7fa,stroke:#26a69a,stroke-width:2px;
  classDef provenance fill:#f1f8e9,stroke:#8bc34a,stroke-width:2px;
  classDef signature fill:#fff9c4,stroke:#fbc02d,stroke-width:2px,link:'https://cnn.com';
  class B bundle
  class ResA,ResB resource
  class ResC externa
  class Prov signature
  class Signer signature

  click Signer "/StructureDefinition-assinatura-avancada.html"
  click B "/StructureDefinition-conteudo-assinado.html"

O perfil Conteúdo Assinado define as regras para a estrutura da instância do Provenance, enquanto o perfil Assinatura Avançada estabelece restrições e requisitos específicos para o tipo de dados Signature. Estes perfis estão em conformidade com as características da assinatura avançada.

Adicionalmente, a instância de Provenance e as instâncias por ela referenciadas em Provenance.target devem estar contidas em uma instância do recurso Bundle, aqui denominado de Bundle de assinatura (ilustrado abaixo).

graph TD
    direction TB
    B["Bundle de assinatura<br>(reúne o que é assinado)"]
    Prov["Conteúdo Assinado<br>(Provenance)"]
    ResA["Instância 1<br>(o que é assinado)"]
    ResB["Instância N<br>(o que é assinado)"]
    ResC["Instância Externa<br>(não é assinada)"]
   Prov -.->|"signature[0]"| Signer["Assinatura Avançada<br>(Signature)"]
  B -->|entry| ResA
  B -->|entry| ResB
  B --> Prov
  Prov -->|"target[0]"| ResA
  Prov -->|"target[1]"| ResB
  ResB -->|"Referência lógica"| ResC
  
  classDef externa fill:#fff,stroke:#000,stroke-width:1px;
  classDef bundle fill:#eee,stroke:#000,stroke-width:1px;
  classDef resource fill:#e0f7fa,stroke:#26a69a,stroke-width:2px;
  classDef provenance fill:#f1f8e9,stroke:#8bc34a,stroke-width:2px;
  classDef signature fill:#fff9c4,stroke:#fbc02d,stroke-width:2px,link:'https://cnn.com';
  class B bundle
  class ResA,ResB resource
  class ResC externa
  class Prov signature
  class Signer signature

  click Signer "/StructureDefinition-assinatura-avancada.html"
  click B "/StructureDefinition-conteudo-assinado.html"

Um Bundle de assinatura pode conter várias assinaturas, inclusive instâncias não assinadas. Esta instância é exigida apenas para efeito de criação e validação da assinatura. A motivação está no fato de um Bundle permitir que instâncias sejam identificadas sem o uso de uma referência absoluta.

Contempla o conteúdo das instâncias

Os conteúdos de todas as instâncias referenciadas por Provenance.target são considerados pela assinatura. Observe, contudo, que o conteúdo de instâncias eventualmente referenciadas por instâncias que devem ser assinadas, mas não identificadas em Provenance.target, não são consideradA pela assinatura.

Para ilustrar, segue uma instância do recurso Observation, apenas parcialmente fornecida abaixo, contendo uma referência para o paciente pertinente, por meio de uma referência lógica (identificador de negócio).

{ 
   "resourceType" : "Observation",
   ...
   "subject" : {
      "identifier" : {
         "system" : "http://saude.go.gov.br/sid/cpf",
         "value" : "123.456.789-99"
      }
   }
   ...
}

Neste exemplo, apenas esta instância de Observation seria assinada, o que NÃO inclui uma instância de Patient. Ou seja, o CPF hipotético fornecido (identifier) seria assinado, mas não o conteúdo de uma instância de Patient que possui tal CPF.

Convém destacar que a assinatura avançada não está definida, não contempla, o cenário no qual uma instância a ser assinada contém uma referência absoluta, conforme ilustrado abaixo.

{ 
   "resourceType" : "Observation",
   ...
   "subject" : {
      "reference" : "https://server.com/fhir/44/Patient/123/_history/3"
   }
   ...
}

Em tempo, o conteúdo de uma instância a ser assinada inclui as instâncias referenciadas e contidas no elemento contained.

Preparação de instâncias com referências externas

Uma instância com referência externa é aquela que faz uso do elemento reference com um valor relativo, por exemplo, Patient/123 ou absoluto, https://server.com/Patient/123. Toda e qualquer instância que deve ser assinada e possui tais referências, exige que as instâncias referenciadas sejam recuperadas e inseridas no Bundle de assinatura. Adicionalmente, as referências literais devem ser substituídas pelo uuid criado para a finalidade de identificar cada uma destas instâncias no Bundle e fornecida junto com a instância no elemento Bundle.entry.fullUrl.

Dito de outra forma, se uma instância a ser assinada contém uma referência literal para outra instância, então esta referência será substituída por um valor do tipo uuid. Este valor corresponderá a um valor em entry.fullUrl cujo elemento entry.resource contém a instância referenciada.

{
   "reference" : "urn:uuid:[uuid válido]"
}

Desta forma, a instância correspondente poderá ser recuperada no Bundle de assinatura e terá seu conteúdo considerado, caso também esteja referenciada pelo Provenance (Provenance.target).

Para ilustrar, o Bundle abaixo contém duas entradas referenciando as instâncias cujos valores para fullUrl são urn:uuid:X e urn:uuid:Y. Adicionalmente, a instância 1 referencia a instância 2 por meio do fullUrl correspondente. Desta forma, se ambas as instâncias também fazem parte do Provenance.target, ambas serão consideradas na assinatura por meio de seus conteúdos correspondentes. Ou seja, não apenas o valor urn:uuid:Y será considerado na instãncia 1, mas também o conteúdo da instância 2.

graph TD
    direction TB
    B["Bundle de assinatura<br>(reúne o que é assinado)"]
    ResA["Instância que referencia<br>(o que é assinado)"]
    ResB["Instância referenciada<br>(o que é assinado)"]
    ResC["Instância Externa<br>(não é assinada)"]
    Prov["Conteúdo Assinado<br>(Provenance)"]
  B -->|"entry[0].resource<br>fullUrl=urn:uuid:X"| ResA
  B -->|"entry[1].resource<br>fullUrl=urn:uuid:Y"| ResB
  ResA -->|reference<br>urn:uuid:Y| ResB
  ResB -->|"identifier<br>(identificador lógico)"| ResC
  Prov -->|"target[0]=urn:uuid:X"| ResA
  Prov -->|"target[1]=urn:uuid:Y"| ResB
  
  classDef externa fill:#fff,stroke:#000,stroke-width:1px;
  classDef bundle fill:#eee,stroke:#000,stroke-width:1px;
  classDef resource fill:#e0f7fa,stroke:#26a69a,stroke-width:2px;
  classDef signature fill:#fff9c4,stroke:#fbc02d,stroke-width:2px;
  class B bundle
  class ResA,ResB resource
  class ResC externa
  class Signer signature
  class Prov signature