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