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

Guia de Implementação da SES GO - Segurança - Downloaded Version 0.1.0 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 as restrições abaixo.

Restrições

R1 A assinatura é definida para um conjunto não vazio de instancias FHIR (versão 4.0.1).

Desta forma, a assinatura contempla documentos FHIR, assim como uma única instância de Observation, ou qualquer combinação de instâncias de qualquer recurso.

R2 As instâncias 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, pois não possui uma entrada correspondente em Provenance.target. Observe que, 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. Nesta mesma instância pode ser armazenada a assinatura digital no elemento Provenance.signature, conforme ilustrado abaixo.

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.

R3 A ordem definida em Provenance.target é relevante tanto para o processo de criação da assinatura quanto para o processo de validação.

R4 As instâncias a serem assinadas devem estar contidas em uma instância do recurso Bundle, aqui denominado de Bundle de assinatura (ilustrado abaixo). O Bundle de assinatura é exigido apenas para efeito de criação e validação da assinatura.

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
  
  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"

A motivação do Bundle de assinatura está no fato de um Bundle permitir que instâncias sejam identificadas sem o uso de uma referência absoluta.

R5 O tipo de dados uuid deve ser empregado para estabelecer relações entre as instâncias do Bundle, caso existam.

Se o que é assinado é uma instância de Observation e a instância do Patient correspondente, via Observation.subject, então o valor de subject.reference necessariamente deve ser o uuid que identifica a instância no Bundle via fullUrl.

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 consideradas pela assinatura nem para validação.

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 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.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 Bundle.entry.fullUrl cujo elemento Bundle.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 Bundle.entry.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