O padrão de nível de design

Secure Factory

Intenção

A intenção do padrão de design seguro Secure Factory é separar a lógica dependente de segurança envolvida na criação ou seleção de um objeto da funcionalidade básica do objeto criado ou selecionado.

Em resumo, o padrão de design seguro Secure Factory funciona da seguinte forma:

  1. Um caller solicita uma implementação do padrão Secure Factory para o objeto apropriado, dado um conjunto específico de credenciais de segurança.
  2. A implementação do padrão Secure Factory usa as credenciais de segurança fornecidas para selecionar e retornar o objeto apropriado.

O padrão de projeto seguro Secure Factory apresentado aqui é uma extensão específica de segurança do padrão Abstract Factory [Gamma 1995]. Observe que também é possível implementar o padrão de design seguro Secure Factory usando o padrão Factory não abstrato. Embora o padrão Abstract Factory seja mais complexo do que o padrão Factory não abstrato, o padrão Abstract Factory é apresentado aqui como a base para o padrão de projeto seguro Secure Factory devido ao suporte do padrão Abstract Factory para alterar de forma fácil e transparente o concreto subjacente implementação de fábrica.

As especializações do padrão de design seguro Secure Factory são os padrões de design seguro Secure Strategy Factory (Seção 3.2) e Secure Builder Factory (Seção 3.3).

Motivação (Forças)

Uma aplicação segura pode fazer uso de um objeto cujo comportamento depende do nível de confiança que a aplicação deposita em um usuário ou ambiente operacional. A lógica que define o comportamento dependente do nível de confiança do objeto pode ser implementada de várias maneiras:

  • O próprio objeto pode receber informações sobre o nível de confiança do usuário/ambiente, que seria usado pelo objeto para controlar seu comportamento. Isso cria um forte acoplamento entre o comportamento baseado em segurança do objeto e a funcionalidade geral do objeto.
  • A aplicação seguro que cria o objeto pode usar as informações sobre o nível de confiança do usuário/ambiente para escolher diretamente entre diferentes objetos que implementam diferentes comportamentos baseados em segurança. Isso cria um forte acoplamento entre a lógica de seleção de objetos baseada em segurança e a funcionalidade de aplicação segura mais geral.
  • A lógica necessária para escolher o objeto correto com base no nível de confiança do usuário/ambiente pode ser desacoplada do objeto e do código do aplicativo que cria o objeto pelo uso do padrão de design seguro Secure Factory. Isso cria um acoplamento fraco entre a lógica de seleção de objeto baseada em segurança e a implementação de objeto e um acoplamento fraco entre a lógica de seleção de objeto baseada em segurança e a implementação de aplicação segura.

O acoplamento fraco entre a lógica de seleção de objeto baseada em segurança e a implementação de objeto e um acoplamento fraco entre a lógica de seleção de objeto baseada em segurança e a implementação de aplicativo seguro torna mais fácil verificar, testar e modificar a lógica de seleção de objeto baseada em segurança.

Aplicabilidade

O padrão de design seguro Secure Factory é aplicável se

  • O sistema constrói diferentes versões de um objeto com base nas credenciais de segurança de um usuário/ambiente operacional.
  • As credenciais de segurança disponíveis contêm todas as informações necessárias para selecionar e construir o objeto correto. Nenhuma outra informação relacionada à segurança é necessária.

Estrutura

A Figura 7 mostra a estrutura do padrão de design seguro Secure Factory.

image

Figura 7: Estrutura de Secure Factory Pattern

Participantes

  • Cliente – O cliente rastreia as credenciais de segurança de um usuário e/ou do ambiente em que o sistema está operando. Dadas as credenciais de segurança de interesse, o cliente usa o método getInstance() da classe AbstractSecureFactory para obter uma instância concreta do Secure Factory e, em seguida, chama o método getObject() do factory concreto para obter o objeto apropriado, dada a segurança atual das credenciais.
  • SecurityCredentials – A classe SecurityCredentials fornece uma representação das credenciais de segurança de um usuário e/ou ambiente operacional.
  • AbstractSecureFactory – A classe AbstractSecureFactory serve a vários propósitos:
    • Ele fornece uma instância concreta de um secure factory por meio do método getInstance() do factory.
    • Ele permite que o sistema defina o secure factory concreto padrão em tempo de execução por meio do método setInstance(). Isso torna relativamente fácil alterar a metodologia de seleção de objetos especificando um secure factory concreto diferente em tempo de execução.
    • Ele define o método abstrato getObject() que deve ser implementado por todas as implementações concretas de AbstractSecureFactory. O método getObject() é chamado pelo cliente para obter o objeto apropriado com algumas credenciais de segurança.
  • ConcreteSecureFactoryN – Diferentes metodologias de seleção de objetos são implementadas em várias implementações concretas de AbstractSecureFactory. Cada secure factory concreta fornece uma implementação do método getObject().
  • SomeObject – A classe abstrata SomeObject define a interface básica implementada pelos objetos retornados pela secure factory.
  • ConcreteObjectN – Uma implementação concreta de SomeObject será criada para cada conjunto de comportamentos de objetos ditados pelas informações de segurança atuais. Por exemplo, se um aplicativo classifica os usuários como tendo total, pouca ou nenhuma confiança, três implementações concretas de SomeObject serão criadas, uma para cada nível de confiança. Uma implementação concreta de SomeObject conterá apenas a funcionalidade apropriada para o nível de confiança correspondente da implementação concreta.

Consequências

  • A seleção dependente da credencial de segurança do objeto apropriado é ocultada das partes do sistema que fazem uso do objeto selecionado. O Secure Factory opera como uma caixa preta fornecendo o objeto apropriado ao chamador. Isso oculta a lógica de seleção de objeto dependente de segurança do chamador.
  • Os objetos criados pelo Secure Factory só precisam implementar a funcionalidade adequada ao seu nível de confiança correspondente. A funcionalidade que não é apropriada para o nível de confiança correspondente do objeto não será implementada no objeto.
  • Os objetos criados pelo Secure Factory não precisam verificar se uma ação implementada no objeto é permitida, dada a informação sobre o usuário ou ambiente operacional atual. Essas verificações já foram realizadas pela Secure Factory que criou o objeto.
  • A natureza de caixa preta do padrão de design seguro Secure Factory facilita a alteração do comportamento dependente da credencial de segurança do sistema. Alterações na lógica de seleção de objetos ou nos próprios objetos fornecidos exigirão pouca ou nenhuma alteração no código usando o Secure Factory.

Implementação

O processo geral de implementação do padrão de design seguro Secure Factory é o seguinte:

  1. Identificar um objeto cuja construção ou escolha depende do nível de confiança associado a um usuário ou ambiente operacional. Defina uma classe abstrata ou interface descrevendo a funcionalidade geral suportada pelo objeto.
  2. Implemente as classes concretas que implementam o comportamento específico do nível de confiança do objeto. Uma implementação concreta será criada para cada nível de confiança identificado.
  3. Use o padrão Abstract Factory básico conforme descrito na seção Estrutura para definir a classe AbstractSecureFactory.
  4. Identifique as informações necessárias para determinar o nível de confiança de um usuário ou ambiente. Essas informações serão usadas para definir a classe ou estrutura de dados SecurityCredentials.
  5. Implemente uma secure factory concreta que selecione o objeto apropriado definido na etapa dois com as credenciais de segurança definidas na etapa 4
  6. Defina a secure factory concreta definida na etapa 5 como a factory padrão fornecida pela factory abstrata definida na etapa 3.

Se o aplicação que está sendo escrito não precisar dar suporte à alteração fácil da secure factory que está sendo usada, é possível implementar o padrão de design seguro Secure Factory usando o padrão Factory não abstrato. Isso pode ser feito pulando a etapa três (criação da classe AbstractSecureFactory) e, em seguida, fazendo uso da única secure factory concreta (definida na etapa 5) na aplicação.

Código de amostra

Código de exemplo usando o padrão de design seguro Secure Factory para selecionar um objeto Builder [Gamma 1995] com informações de segurança fornecidas na seção Secure Builder Factory (Seção 3.3).

Código de exemplo usando o padrão de design seguro Secure Factory para selecionar um objeto Strategy [Gamma 1995] com informações de segurança fornecidas na seção Secure Strategy Factory (Seção 3.2).

Usos Conhecidos

Biblioteca Secure XML-RPC Server


March 2009; Updated October 2009

  • TECHNICAL REPORT
  • CMU/SEI-2009-TR-010
  • ESC-TR-2009-010

CERT Program

Unlimited distribution subject to the copyright.

PDF