Aspecto
PROTECTION do EPOS
Cleyton André Pires
O conceito de capability reforça a idéia de fornecer
proteção a objetos dentro de um sistema operacional afim de restringir o acesso
a estes objetos para garantir a integridade dos mesmos. O aspecto protection tem como
objetivo fornecer esta característica de proteção aos objetos dentro do EPOS e
utiliza capabilities como recurso de proteção.
Através deste trabalho estaremos estendendo a análise
do domínio explicitando a implementação do aspecto protection e sua
implantação no sistema EPOS.
Aspectos
de cenário (Scenario Aspects) são propriedades que geralmente não fazem parte
ou não dizem respeito ao escopo de uma abstração.
Os
aspectos podem ser aplicados a uma abstração através de adaptadores de cenário.
O aspecto protection tem como objetivo controlar o acesso a recursos do sistema. Este será feito através da família de aspectos mostrada abaixo:
No aspecto Checked, a proteção será conseguida através da capability associada que nada mas é que um número
randômico esparso, que dá identificação única aos objetos. Sendo assim, um objeto terá que saber a capability do
outro objeto para acessá-lo.
O aspecto Permitted estende Checked,
para permitir diferentes níveis de acesso para cada processo. Isso é feito
através de um wrap da capability (será melhor explicado abaixo).
Além disso, temos a aspecto Enrolled, que tem a função de guardar
das listas de capabilities associadas aos objetos criados por cada processo.
Baseado nisto, o aspecto Protection funcionará da
seguinte forma:
1-
Quando
uma abstração em que o aspecto Protection se aplica é criada, é
associada a ela uma capability (número de 32 a 64 bits gerado
aleatoriamente). Essa capability é chamada de owner capability, e
tem nível de acesso máximo ao objeto;
2-
A
partir daí, essa abstração pode conceder permissão de acesso a objetos. Porém,
a capability inicialmente criada não pode ser repassada para
outros objetos, pois por ter nível máximo de acesso, comprometeria toda a
proteção ao objeto. Com isso, são criadas versões restritas através de um
“wrap” da capability original. Essas capabilities restritas que
são repassadas para os objetos que acessarão o objeto protegido.
3-
Quando
o objeto quer acessar o objeto protegido, ele passa a capability restrita
que tinha sido a ele passado. O aspecto Protection, através de uma
função polinomial verifica se aquela capability restrita foi gerada a
partir da owner capability, e permite o acesso ao objeto protegido.
O acesso ao objeto protegido, porém, deve ser transparente ao cliente que vai acessá-lo. Isto é feito como mostrado abaixo: o “Handle” passa para o adaptador de cenário a capability restrita associada ao objeto que requer o acesso. O adaptador por sua vez, verifica através da chamada de uma rotina do aspecto Protection, se aquela capability pode acessar o objeto protegido. Ou seja, o objeto chamador acessa o objeto protegido transparentemente, sem ter que ficar passando toda a vez sua capability restrita.
Baseado no que foi exposto acima, não
fica muito difícil definir o diagrama de classes da aplicação. O diagrama
ficaria:
O principal método é o grant. Quando o objeto
chamador chama o objeto protegido, esse método é invocado para verificar se a capability
passada pelo objeto chamador foi gerada a partir da capability owner.
Além disso, é verificado também se o objeto chamador tem o nível de acesso
(“rights”) que ele passou como parâmetro.
Sendo um aspecto, não se encaixa no
escopo de qualquer abstração que possa ser usada no sistema. A seguir é
apresentada uma lista contendo a aplicabilidade do aspecto Protection nas
principais abstrações do EPOS:
Memory Management - Uma abstração para gerencia de memória necessita do aspecto protection para prover a proteção de seguimentos de memória que precisam ter sua integridade protegida. O aspecto de proteção Permitted utiliza a abstração segment para prover a proteção de memória. Neste caso torna-se necessário uma MMU (memory management unit) para prover os endereços a serem protegidos;
Process Management - O aspecto protection pode ser incluído a abstrações de
gerencia de processos exceto a Processor Schedulers pois neste caso a
verificação de privilégio de acesso em cada escalonamento reduziria o
desempenho do sistema de forma proibitiva.
Inter-Process
Communication - Em ambientes multi-tarefas
a proteção é essencial para o controle de acesso a recursos compartilhados.
Neste caso o aspecto Checked torna-se útil pois um objeto pode ter sua
capability divulgada provendo privilégio de acesso diferenciado conforme a
necessidade (somente leitura, somente escrita, leitura e escrita etc).
Time Management - Esta abstração implementa clocks e cronômetros. Neste caso o aspecto protection pode ser incluído para dar proteção às variáveis do cronômetro garantindo a integridade da abstração.
I/O Management - A integridade do estado dos dispositivos usados no
sistema pode ser conseguida através da utilização de um esquema de proteção
usado para proteção de segmentos de memória, visto que todos os dispositivos
possuem suas variáveis de estado armazenadas em um certo segmento de memória.
COMPLEMENTO DA ANÁLISE DE DOMÍNIO APÓS FEITA IMPLEMENTAÇÃO
Estrutura de uma capability:
A capability é um número que oferece
identificação única a um objeto do S.O. A capability tem uma parte
aleatória (rand) que foi usada para proteção do objeto. Ou parte (grants)
foi usada para definir o nível de acesso ao objeto.
Para uma capability owner, ou seja, a versão irrestrita da
capability, o campo grants é preenchido com nível máximo de
acessibilidade. Assim, como somente o processo que criou o objeto possui a
versão restrita da capability, este passa a ter direito total de acesso sobre o
objeto.
Para que outros processos possam
ganhar direito de acesso a um objeto protegido, estes devem possuir uma cópia
restrita da capability deste objeto. Esta capability restrita é
fornecida pelo processo owner do objeto protegido. Cabe a este processo decidir
fornecer ou não capabilities restritas e ainda especificar qual o nível
de acessibilidade a ser fornecido. Para isso é invocado o método (getRestrictedId
da classe Checked)
O acesso a um objeto protegido é
feito após o reconhecimento da capability restrita (verifica-se se a capability restrita está associada a
capability owner). Isto é feito através do método check da classe checked.
Se o método retornar verdadeiro então o acesso é permitido.
No campo
grants, o bit menos significativo define se o método 0 da abstração poderá ou
não ser executado (1 ou 0 respectivamente). O segundo bit menos significativo
define o acesso ao método 1, e assim por diante. Isso é implementado pela
função access da classe Checked.
Método getRestritedId(grants)
Este método é invocado pelo processo criador do objeto
protegido a fim de fornecer uma versão restrita de sua capability irrestrita. Os
níveis de acesso devem ser fornecidos como parâmetro.
Este método
devolve um Id que é uma versão criptografada da capability irrestrita
através da aplicação de uma função não reversível.
Nesta
implementação foi feito um XOR entre os quatro primeiros bytes da capability a
fim de obter-se o campo ID da versão irrestrita. O campo grants fornecido como
parâmetro é anexado.
Abaixo segue a descrição do processo:
Capability
restrita: A A BB CC DD | F F F F
Somente o
campo ID é encriptado:
AA BB AA DD
Å CC
DD Å BB CC
_____ ______
XX YY ZZ WW
Campo ID da versão restrita: XX YY ZZ WW
Versão
restrita com o campo grants anexado: XX YY ZZ WW | G G G G
Método check(capability)
Este método fornece o direito de acesso a um objeto
protegido através da avaliação do campo rand da versão restrita da capability
passada como parâmetro. Isto é feito da seguinte forma:
1 - O campo rand da versão irrestrita da capability é
encriptado pela mesma função não reversível usada para obter a versão restrita.
2 - O campo rand da versão restrita é separado e
comparado com o resultado de 1, se forem iguais o acesso e fornecido.
Método access(methodNumber)
O campo grants é
decodificado para especificar quais os métodos e atributos que o processo
usuário pode acessar.