Guia de Implementação da SES GO - Segurança
0.0.2 - draft
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
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.
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.
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.
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