Baixe o app para aproveitar ainda mais
Prévia do material em texto
146 Unidade IV Unidade IV 7 INTRODUÇÃO AO SISTEMA OPERACIONAL GNU/LINUX Neste tópico, faremos uma breve apresentação do sistema operacional GNU/Linux. Entenderemos um pouco do seu histórico, da motivação para a sua criação e de como funciona o seu processo de desenvolvimento, que não está baseado em uma empresa específica. Falaremos sobre a importância do projeto GNU e das licenças GPL e sobre o que significa um software ser considerado livre. Posteriormente, discorreremos a respeito do que é uma distribuição do GNU/Linux. Abordaremos, também, a questão da documentação do sistema, explorando algumas ferramentas úteis para explicar o funcionamento dos comandos e das suas peculiaridades. Contemplaremos itens relativos ao mecanismo de segurança do GNU/Linux e exporemos o mecanismo de autenticação e o mecanismo de controle de acesso. 7.1 Projeto GNU e Linux O que normalmente chamamos de sistema operacional GNU/Linux (ou simplesmente Linux) é, na realidade, uma coleção de diferentes projetos que são utilizados de forma integrada. Um sistema operacional é um software incrivelmente complexo, formado por diversas partes e diversos programas que se complementam. Por uma questão de praticidade, costumamos chamar de Linux toda essa coleção de ferramentas e projetos, mas, se formos cuidadosos, iremos perceber que estamos falando de várias coisas diferentes. Lembremos da teoria de sistemas operacionais, que o kernel, ou núcleo, representa o “coração” do sistema operacional. Existem vários núcleos disponíveis no mercado, sendo um deles o Linux propriamente dito. Não podemos utilizar um kernel de forma isolada: é necessário que existam outros programas para que um computador possa ser utilizado, como programas fundamentais para a cópia ou a remoção de arquivos, além de editores de texto, interfaces gráficas e navegadores para a internet, por exemplo. O projeto GNU tinha como objetivo original desenvolver um sistema operacional que fosse completamente livre. Por “liberdade”, o projeto GNU tinha em mente as quatro ideias (ou liberdades fundamentais) expostas a seguir (STALLMAN, 2020): 1 Deve haver liberdade de utilização, ou seja, qualquer pessoa deve ser livre para executar um programa da forma que ela quiser. Dessa forma, uma empresa não deve ser capaz de restringir o usuário em relação à maneira como ele queira executar um programa nem de restringir quem executa o programa em si. 147 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) 2 O código-fonte de um programa deve estar disponível para estudo, a fim de que possamos entender como um programa funciona, fazer modificações ou melhorias ou transportá-lo para outras plataformas, entre outras possibilidades. 3 Devemos ser livres para copiar um programa quantas vezes quisermos e “darmos” esse programa para outras pessoas. 4 Baseados na ideia exposta no item 2, se modificarmos um programa, deveremos ser livres para distribuir o programa modificado livremente. Vale notar que, frequentemente, as liberdades são numeradas a partir do zero, mas, aqui, vamos começar do número 1. Um programa que apresente uma licença de uso que respeite essas quatro liberdades é chamado de software livre pelo projeto GNU. Esse projeto visava produzir um sistema operacional em que todos os programas que fizessem parte da sua estrutura fossem livres e dessem liberdade total aos seus usuários. Devemos ter em mente que essa tarefa é longuíssima. Fabricantes de software investem fortunas para produzir apenas uma fração do que o projeto GNU tinha o objetivo de fazer. Mesmo assim, com a ajuda de colaboradores distribuídos pelo mundo todo, muitos deles sem nenhuma forma de pagamento, o projeto GNU foi produzindo aos poucos as peças desse grande quebra-cabeça, fazendo programas como utilitários para a cópia e a remoção de arquivos e compiladores, entre muitos outros. O desenvolvimento do kernel mostrou-se muito mais complexo do que originalmente se pensava, e esse foi um desafio para o projeto GNU durante um bom tempo. Contudo, alguns anos após a origem do projeto GNU, o programador finlandês Linus Torvalds começou a trabalhar em um kernel que iria ser chamado de Linux. Além disso, Linus resolveu utilizar a licença do projeto GNU, a GPL, para lançar o seu kernel. Assim, a peça que faltava para o projeto GNU, o kernel, foi encontrada. Tornava-se possível haver um sistema operacional completo pelo uso dos diversos programas providos pelo projeto GNU, com o Linux como kernel. Esse sistema operacional é chamado de GNU/Linux, mas, frequentemente, as pessoas usam apenas a terminologia Linux, por simplificação. 148 Unidade IV Saiba mais Para saber mais sobre o projeto GNU, acesse o site: gnu.org O site da Free Software Foundation também é bem interessante: fsf.org Para saber mais sobre software livre, podemos encontrar vários textos na seguinte página: GNU. Filosofia do Projeto GNU. [s.d.]. Disponível em: https://www.gnu. org/philosophy/philosophy.html. Acesso em: 17 set. 2020. 7.1.1 Um breve histórico do Linux Vimos que o sistema operacional GNU/Linux utiliza o Linux como seu kernel. O desenvolvimento do Linux nasceu de uma necessidade: Linus Torvalds, o criador do Linux, queria usar um sistema operacional similar ao Unix no seu computador pessoal. É interessante termos em mente o contexto no qual o Linux foi escrito, especialmente com relação aos sistemas operacionais disponíveis no final da década de 1980 e no início da década de 1990 nos computadores pessoais. O principal sistema operacional de microcomputadores ainda era o MS-DOS. Esse sistema operacional já mostrava limitações para os computadores da época, especialmente por causa das restrições no uso de memória e da ausência do recurso de multitarefas (execução simultânea de processos), ao menos na sua configuração padrão. Por outro lado, os computadores pessoais haviam evoluído muito no que se refere às suas estruturas. Um microprocessador lançado pela Intel em 1985, o 80386, era uma máquina poderosa, de 32 bits e com recursos avançados (para a época) de gerenciamento de memória. Contudo, o sistema operacional não explorava todos os recursos disponíveis. Linus queria utilizar na sua máquina um sistema operacional similar ao sistema Unix, usado, na ocasião, em computadores maiores e mais caros. Na época, existia um sistema operacional chamado de Minix, escrito pelo pesquisador Andrew Tanenbaum, mas esse sistema operacional era limitado e mais voltado para pesquisa. Linus chegou a sugerir mudanças e melhorias no Minix, que foram rejeitadas por Tanenbaum. 149 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Os demais Unix da época ou eram muito caros ou estavam em meio a uma disputa legal com relação ao seu uso, devido a problemas de copyrights. Esse contexto estimulou Linus a começar a escrever o Linux. Um aspecto interessante do desenvolvimento do Linux é o de que ele é aberto: Linus optou por compartilhar o código-fonte com quem estivesse interessado, de forma gratuita. Além disso, ele utilizou a licença GPL, o que permitiu que seu uso e sua cópia pudessem ser feitos de maneira livre. Muitas pessoas, do mundo todo, passaram a trabalhar com o kernel do Linux juntamente com Linus, o que gerou uma verdadeira rede internacional de colaboradores. Nesse ponto, temos uma espécie de feliz coincidência: o projeto GNU dispunha de diversas ferramentas básicas para um sistema operacional, mas não tinha um kernel. Ao mesmo tempo, Linus tinha um kernel, mas não tinha as ferramentas. Dado que ambos os projetos eram abertos, a sua junção foi um passo natural e extremamente proveitoso. Contudo, é preciso considerarmos que a simples disponibilização de um kernel e de programas ainda não é suficiente. É necessário integrar todas as aplicações em um conjunto coeso. Bibliotecas utilizadas por várias aplicações devem ser agrupadas e colocadas em locais convenientes e compartilhados. Deve ser criado um modelo de configuração. É necessário implantarum mecanismo de instalação em máquinas novas. Para atender a essas necessidades, surgiram as muitas distribuições Linux do mercado. Lembrete Vale lembrar que o Unix, em geral, e o Linux, em particular, estão presentes como sistemas operacionais em uma percentagem significativa do parque computacional mundial. Logo, alguma familiaridade com o Linux amplia o escopo de atuação dos profissionais da área de TI. 7.2 As diversas distribuições do GNU/Linux As distribuições GNU/Linux (coloquialmente chamadas de distros) agrupam milhares de aplicações de forma integrada. Existe uma forte influência do mundo Unix na estrutura da maioria das distribuições, tanto do ponto de vista de arquitetura quanto do ponto de uso, ainda que o modelo do Linux possa ser diferente do Unix em alguns aspectos. Muitas das distribuições GNU/Linux centralizam-se na instalação de programas. Esses programas são distribuídos por meio de pacotes. O pacote contém o programa propriamente dito e outros arquivos necessários para a sua execução, como imagens, arquivos de configuração e documentação, entre outros. As distribuições padronizam o local de instalação dos programas, de modo que a sua atualização e a sua remoção se tornam mais fáceis e mais seguras. No entanto, o papel das distribuições é mais do que simplesmente colecionar programas: muitas distribuições trabalham com um sistema nos quais os pacotes estão relacionados uns aos outros. 150 Unidade IV Por exemplo, suponha que um programa utilize determinada biblioteca compartilhada. Essa biblioteca pode ser usada por outros programas também. Bibliotecas dinâmicas são instaladas em arquivos em separado, justamente pelo fato de serem utilizadas por vários programas diferentes. Um gerenciador de pacotes deve saber quais são as dependências entre diversos pacotes a fim de que a instalação de um pacote implique a instalação de todas as suas dependências, como uma biblioteca. Outro problema que as distribuições devem resolver está ligado à manutenção. Programas frequentemente apresentam defeitos que devem ser corrigidos. Em outros casos, uma nova versão de um programa é lançada não por causa de erros, mas porque novas funcionalidades foram adicionadas. Boas distribuições devem prover mecanismos que permitam a atualização consistente dos programas e das suas dependências. Versões de programas e de bibliotecas devem ser cuidadosamente controladas pelo mantenedor de determinado pacote. Esse é um problema muito sério, especialmente crítico quando temos vários programas com dependências conflitantes (o que, de fato, acontece em algumas situações). Um ponto que deve ser controlado refere-se às licenças dos diversos programas envolvidos. Algumas distribuições são restritas e incluem apenas pacotes de programas que tenham licenças consideradas livres. Outras distribuições são mais permissivas e englobam pacotes com diversos tipos de licenças, inclusive proprietários. A popularização da internet e a facilidade em se disponibilizar o código (devido a licenças abertas como a GPL) levou à enorme proliferação de distribuições Linux. Muitas foram abandonadas, outras ficaram confinadas para uso em nichos específicos. Há versões que se tornaram extremamente populares, como as distribuições Red Hat e Debian. Na realidade, muitas distribuições são baseadas nessas duas, mesmo tendo nomes diferentes. Ainda que o uso e a estrutura geral das distribuições sejam similares, eles apresentam uma série de diferenças, que são importantes especialmente do ponto de vista da segurança. Algumas distribuições, como o Debian, apresentam um ciclo de lançamento de versões mais demorado. Versões de teste do Debian GNU/Linux são lançadas antes da versão final, com o objetivo de que sejam detectados defeitos antes que eles afetem os usuários. Isso faz que os pacotes dessa distribuição não correspondam às últimas versões em desenvolvimento (com isso, algumas pessoas podem achar que os programas estão “desatualizados”). Outras distribuições apresentam um ciclo de lançamento de versões mais agressivo, o que significa que elas podem conter, potencialmente, mais defeitos. Podemos perceber o relacionamento entre trocas da disponibilidade de programas e de recursos e aspectos vinculados à segurança. O GNU/Linux tornou-se popular no mundo dos servidores, especialmente servidores web e de banco de dados. Assim, muitas distribuições têm um viés mais voltado ao público que lida com essas situações. Contudo, o uso do Linux em desktops e notebooks por usuários finais vem crescendo nos últimos anos, e diversas distribuições focam exatamente nesse tipo de usuário, como algumas versões do Ubuntu (que, por sua vez, é derivado do Debian). 151 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) 7.3 Buscando documentação no próprio sistema (on-line) Um aspecto fundamental de um sistema é a sua documentação. Para que um programa seja útil, o usuário deve saber como usá-lo. Para isso, é fundamental que a documentação seja clara e adequada. A existência de documentação correta também é benéfica para os desenvolvedores, que podem compreender melhor como um programa funciona, o que ajuda na identificação de falhas e na implementação de melhorias. O Unix possui um utilitário de linha de comando bastante útil para documentação: o comando man (uma abreviação da palavra manual). Devemos nos lembrar de que, nos “primórdios da computação”, não tínhamos acesso a redes como a internet, a qual disponibiliza mecanismos de busca que permitem que encontremos respostas sobre qualquer tipo de dúvida. A documentação fornecida pelo sistema operacional era fundamental para o usuário. O utilitário man possibilita que o usuário consulte, na própria linha de comando, informações sobre um comando. A apresentação também é bastante padronizada, com seções típicas contendo, por exemplo, o nome do programa, uma sinopse do seu uso, uma descrição, o autor, referências para outras páginas e programas e exemplos de uso, entre outras. Na figura a seguir, temos uma ilustração de página de manual para o comando ls: Figura 99 – Página man do comando ls 152 Unidade IV Além das páginas de manual, outros documentos bastante comuns no mundo GNU/Linux são os chamados HowTo. Esses documentos detalham como se deve proceder para fazer determinada tarefa, como a configuração de um programa ou a instalação de um driver para uso de um equipamento. 7.4 Alguns aspectos do modelo de segurança do GNU/Linux Vamos agora explorar alguns aspectos da segurança no Linux. Devido à forte influência da arquitetura do Unix no Linux, seus modelos de segurança apresentam muitas similaridades, especialmente nos seus aspectos mais básicos (SILBERSCHATZ; GALVIN; GAGNE, 2015). Contudo, antes de entrarmos nos detalhes de cada um desses sistemas, precisamos ter em mente dois conceitos importantes: o de autenticação e o de modelo de controle de acesso. Para entendermos esses dois conceitos, vamos explorar um cenário hipotético, parcialmente baseado em Panek (2020). Suponha que uma empresa tenha sua sede em um prédio e que certo número de funcionários deva ir fisicamente a ela todos os dias para trabalhar. Na portaria do prédio, uma pessoa (recepcionista) deve controlar quem pode ou não entrar na empresa. Apenas funcionários podem entrar, mediante a apresentação de um crachá. A apresentação do crachá representa um mecanismo de autenticação, enquanto os funcionários representam os usuários do sistema. No entanto, uma vez dentro da empresa, nem todos os funcionários podem acessar todas as áreas ou todos os objetos da empresa. Alguns documentos podem ser de uso reservado apenas a um grupo de pessoas. Talvez existam documentos que possam ser acessados apenas por uma única pessoa. Nesse caso, podemos pensar que os usuários são, novamente, representados pelos funcionários, e que os objetos da empresa correspondem aos objetos de um sistema operacional, como arquivos e diretórios. Esse é o mecanismo de controle de acesso.Vamos, a seguir, explorar um pouco mais de perto esses dois mecanismos: o de autenticação e o de controle de acesso. 7.4.1 Mecanismo de autenticação Precisamos lembrar que, nos sistemas operacionais Unix e GNU/Linux, um usuário deve ter uma conta no sistema, normalmente criada pelo administrador. Toda vez que o usuário se conectar ao sistema (ou “logar”, como coloquialmente se diz na área), ele deve fornecer primeiramente esse usuário e, depois, a sua senha, que deve ser checada pelo sistema operacional. Originalmente, esse processo era feito por meio dos chamados “terminais burros”, equipamentos sem nenhuma capacidade de processamento e que serviam apenas para enviar e receber caracteres para um computador principal. É por isso que muitos comandos do mundo Unix são feitos via linha de comando: originalmente, apenas esses caracteres podiam ser mostrados em um terminal típico. 153 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Hoje, com o uso de interfaces gráficas, esse processo tornou-se visualmente mais interessante, uma vez que o login dos usuários é feito, de modo típico, em uma tela gráfica. Contudo, o processo continua sendo, em essência, o mesmo: inicialmente, deve ser inserido o nome do usuário, seguido da sua senha. O processo de autenticação evoluiu bastante no mundo Unix, sendo que ele começou como um processo bastante simples. Contudo, antes de descrevermos o mecanismo original do ambiente Unix, vamos pensar na natureza do processo de autenticação. Quando um usuário tenta se autenticar, o sistema operacional deve verificar se a senha do usuário está correta. Para isso, deve existir algum mecanismo de checagem. Uma abordagem na qual o sistema operacional simplesmente armazena os usuários e suas senhas em um arquivo e checa a correspondência toda vez que alguém tenta conectar é muito simples de ser feita, mas é também extremamente insegura. Qualquer pessoa que tenha acesso a esse arquivo sabe o usuário e a senha de todos os demais usuários do sistema, o que torna o sistema muito vulnerável. Uma forma um pouco mais sofisticada e menos vulnerável estaria em se armazenar não a senha diretamente, mas uma forma codificada dessa senha. Um algoritmo deve ser utilizado para converter a senha do seu formato original em uma forma alterada. Assim, suponha que dado usuário do sistema tenha uma senha como 123456 (uma senha muito ruim, diga-se). Em vez de armazenar diretamente a cadeia 123456, um algoritmo deve converter essa senha em uma cadeia como TXBx17%3f, que é o valor armazenado. Toda vez que um usuário se conecta ao sistema e entra com a senha, o algoritmo é executado na senha digitada pelo usuário e o resultado é comparado com a cadeia TXBx17%3f. Se as cadeias forem iguais, significa que a senha digitada foi 123456 e que, portanto, o usuário deve ser autorizado a entrar no sistema. Se o resultado for diferente de TXBx17%3f, o sistema deve dizer que a senha digitada está incorreta. Observe também que o algoritmo utilizado deve ser projetado de forma que, dada uma sequência codificada, não seja possível (ou não seja fácil) obter a cadeia original, que é a senha do usuário. A grande vantagem dessa estratégia é que o arquivo armazenado contém o usuário e o resultado da execução do algoritmo, não a senha propriamente dita. Assim, uma pessoa que simplesmente obtiver o arquivo não seria imediatamente capaz de identificar as senhas dos usuários. Contudo, se alguém tiver acesso ao algoritmo utilizado para gerar as cadeias de caracteres (no exemplo, TXBx17%3f) e também tiver acesso ao arquivo com as senhas codificadas, seria possível que essa pessoa tentasse identificar as senhas originais por meio de um processo de força bruta. Para que isso seja evitado, utilizamos uma técnica em que é adicionada uma cadeia aleatória à senha original e, depois, essa cadeia modificada é utilizada pelo algoritmo. Tal cadeia aleatória é chamada de sal (no inglês, salt, como se a senha original fosse “salgada” ou intensificada). Esse processo dificulta bastante o processo de busca por tentativa e erro, uma vez que as cadeias a serem codificadas se tornam maiores e mais complexas (desde que não se tenha acesso às cadeias aleatórias utilizadas). No mundo Unix, o arquivo contendo as senhas codificadas e outras informações do usuário eram armazenadas em um arquivo chamado passwd, armazenado em /etc. Esse arquivo precisa ser livre para ser lido por todos os usuários porque contém outras informações que são utilizadas por vários 154 Unidade IV programas, como o identificador numérico dos usuários, os diretórios home e shell padrão, entre outros. É por isso que é necessário que vários usuários sejam capazes de ler esse arquivo, e é por isso que foi necessário um esquema de codificação das senhas. Caso contrário, todos os usuários seriam capazes de ver as senhas dos demais. Hoje, no mundo Linux, o processo empregado é um pouco diferente, pois a senhas codificadas (ou, mais corretamente, criptografadas) são gravadas em outro arquivo, o arquivo shadow, também gravado no diretório /etc, mas que não pode ser lido pelos usuários comuns. Contudo, o arquivo passwd continua existindo, contendo as demais informações, exceto as senhas. Além do arquivo /etc/passwd e do arquivo /etc/shadow, outros arquivos utilizados no processo de controle de privilégios e permissões são o /etc/group e o /etc/gshadow, relacionados ao mecanismo de grupos (JANG; MESSIER, 2017). Ainda que esse mecanismo de autenticação seja bastante simples, baseado essencialmente na leitura de arquivos de texto e no uso de algumas funções de codificação, o aumento da complexidade dos sistemas e do número de usuários passou a requerer formas mais flexíveis e/ou sofisticadas de autenticação. Em 1996, a Sun introduziu a tecnologia PAM (Pluggable Authentication Modules) no Solaris 2.6 para a autenticação de usuários (GEISSHIRT, 2007). Ela é utilizada também no mundo GNU/Linux, por meio do Linux-PAM (SOBELL, 2010). Essa tecnologia permite a flexibilização e a configuração do processo de autenticação. A grande vantagem de usarmos os módulos PAM é que o processo de autenticação se torna unificado e transparente para a aplicação (LAWRENCE, 2005). Caso o processo de autenticação seja alterado (por exemplo, em vez de utilizarmos senhas, usamos algum mecanismo de biometria), o código da aplicação continua o mesmo. É responsabilidade do PAM dizer para a aplicação se o usuário foi autenticado ou não. Outra característica interessante do PAM é que ele pode ser configurado por arquivos (LAWRENCE, 2005). A configuração pode ser feita por serviço específico, de forma que é possível especificar configurações diferentes para programas diferentes. Essas configurações podem ser encontradas normalmente no diretório /etc/pam.d. Outra vantagem do PAM é que, em virtude da sua estrutura modular, podemos adicionar ou modificar o comportamento de autenticação sem haver mudança no código da aplicação (LAWRENCE, 2005). Esses módulos podem ser utilizados com diferentes finalidades e apresentar, por exemplo, funções para mudanças de senha, configurações de sessões, especificações de métodos de autenticação de contas e restrições de contas, entre outros. 7.4.2 Controle de acesso O controle de acesso no Linux é feito de várias formas, sendo as principais o controle de acesso discricionário e o controle de acesso obrigatório. Vamos analisar, inicialmente, o controle de acesso discricionário. Considere uma situação na qual um usuário navegue até o diretório /usr/bin, digite o comando ‘ls -l’ e obtenha a seguinte lista de arquivos (mostraremos apenas a parte final da saída, por simplicidade): 155 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) -rwxr-xr-x 1 root root 186664 ago 16 2019 zipinfo -rwxr-xr-x 1 root root 89488 abr 21 2017 zipnote -rwxr-xr-x 1 root root 93584 abr 21 2017 zipsplit -rwxr-xr-x 1 root root 2206 dez 13 2019 zless -rwxr-xr-x 1 root root 1842 dez 13 2019 zmore -rwxr-xr-x 1root root 4553 dez 13 2019 znew Observe que, na primeira coluna da saída, temos um conjunto de letras e de símbolos, como -rwxr-xr-x. Essas são as informações de permissão do arquivo. Vamos investigar um arquivo em específico, por exemplo, o arquivo znew. Observe a saída do comando stat znew nesse diretório: Arquivo: znew Tamanho: 4553 Blocos: 16 bloco de E/S: 4096 arquivo comum Dispositivo: 805h/2053d Inode: 16778649 Links: 1 Acesso: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Acesso: 2019-12-13 12:41:46.000000000 -0300 Modificação: 2019-12-13 12:41:46.000000000 -0300 Alteração: 2020-05-16 17:05:17.650083371 -0300 Criação: - No último trecho, temos novamente as permissões relacionadas a um arquivo em específico, no caso o arquivo znew. As permissões para um arquivo podem ser • de leitura, representada pela letra r (do inglês read); • de escrita, representada pela letra w (do inglês write); • de execução, representada pela letra x (do inglês execute, segunda letra). A ausência de permissão é representada por um traço: -. As permissões ainda podem ser dadas a três categorias (HAEDER et al., 2010): • ao usuário que é o dono do arquivo, que normalmente é o usuário que o cria; • ao grupo desse usuário; • aos usuários restantes. 156 Unidade IV Assim, temos três grupos de permissões aplicáveis a três classes de usuários, o que totaliza nove possibilidades, representadas por bits. Existem ainda mais três atributos especiais, associados a um arquivo, o que resulta em 12 bits. Na figura a seguir, temos a estrutura desses bits para o arquivo citado: 0 0 0 1 1 1 1 0 1 1 0 1 Bits especiais Usuário Grupo Outros SUID r: leitura r: leitura r: leitura SGID w: escrita w: escrita w: escrita Sticky x: execução x: execução x: execução Figura 100 – Estrutura dos bits de permissão para um arquivo Um campo com o bit 1 significa que a permissão foi dada, enquanto um campo com o bit zero significa que a permissão não foi concedida. Observe que esses atributos são normalmente codificados em octal e podem ser ajustados para cada arquivo pelo comando chmod. No exemplo da figura, ignorando os três primeiros bits especiais, podemos identificar o segundo conjunto de três bits (contando da direita para a esquerda) como 7 em octal, que equivale a 111 em binário. Isso significa que o usuário tem permissão para leitura, escrita e execução. Já os usuários do grupo têm permissão 101, que equivale ao número 5 em octal, ou seja, podem ler ou executar o arquivo. O mesmo acontece para os demais usuários (o último grupo de três bits). O exemplo dado foi de um arquivo, mas um raciocínio similar se aplica aos diretórios. Os três primeiros bits são bits especiais, conforme explicado a seguir. O primeiro corresponde ao SUID, e se aplica apenas a arquivos. Se esse bit for igual a 1, isso significa que o processo resultante, caso esse arquivo seja executado, deve pertencer ao usuário que criou o arquivo, e não ao usuário que o executou. Isso é normalmente utilizado para que um programa rode com permissões superiores às permissões do usuário que o executa, o que pode ser necessário para alguns programas, como o passwd, por exemplo (HAEDER et al., 2010). O segundo bit, o SGID, pode ter dois usos: um para arquivos e outro para diretórios. No caso de arquivos executáveis, seu funcionamento é similar ao funcionamento do SUID, mas voltado para a associação do grupo de um processo. No segundo caso, quando esse bit é aplicado a um diretório, os arquivos criados dentro desse diretório vão pertencer ao mesmo grupo a ele associado (HAEDER et al., 2010). 157 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) O terceiro bit é chamado de sticky bit em função do seu antigo uso para o gerenciamento de memória. Caso estivesse atribuído a um arquivo que representasse um programa, ele permaneceria em memória após o término da sua execução, e, por isso, é como se o programa tivesse se “colado” à memória (a palavra sticky, por ser traduzida como grudento ou pegajoso). Esse mesmo bit tem uma finalidade diferente quando aplicado a diretórios em que restringe os usuários que podem renomear ou deletar arquivos nele presentes: apenas o usuário dono do arquivo, o usuário dono do diretório e, obviamente, o usuário root (HAEDER et al., 2010). Adicionalmente a essas estratégias, o Linux também apresenta as chamadas access control lists, que permitem ajustar ainda mais as permissões e também funcionam como uma camada adicional de controle de acesso discricionário. Complementando o controle de acesso discricionário, temos sistemas como o AppArmor e o SELinux, que operam no controle de acesso obrigatório, ou seja, não podem ser modificados pelo usuário e são configurados pelo administrador da máquina (JANG; MESSIER, 2017). 8 INSTALAÇÃO E USO DO SISTEMA OPERACIONAL GNU/LINUX Neste tópico, vamos nos aprofundar um pouco mais no mundo dos sistemas operacionais GNU/Linux. Inicialmente, veremos como fazer a sua instalação, estudaremos algumas das suas principais ferramentas e abordaremos alguns aspectos fundamentais da sua estrutura. Existem várias distribuições do sistema operacional GNU/Linux disponíveis no mercado. Muitas dessas distribuições costumam ser utilizadas no contexto de servidores. Contudo, é crescente o uso de sistemas GNU/Linux em máquinas do tipo desktop e notebook, para uso pessoal e, até mesmo, para entretenimento. Há algumas distribuições (ou versões de distribuições) que são produzidas com foco no uso pessoal. Quando um sistema operacional é utilizado em um ambiente profissional e em servidores, sua instalação, idealmente, deve ser precedida por uma etapa cuidadosa de projeto e de verificação de compatibilidade com o hardware. Com relação à instalação de uma distribuição GNU/Linux, ela vem sendo bastante simplificada nos últimos anos. Hoje, ela é realizada de forma gráfica e de maneira bastante automática. Isso é, por um lado, algo positivo, pois possibilita que grande número de pessoas seja capaz de realizar a instalação. Por outro lado, isso pode fazer com que as pessoas responsáveis não se preocupem em conhecer os detalhes do sistema operacional e não façam o devido planejamento da instalação e manutenção. 8.1 Distribuição CentOS Neste item, vamos estudar como fazer a instalação de uma distribuição GNU/Linux chamada de CentOS. Ela é derivada da distribuição Red Hat e é bastante utilizada em servidores. Para simplificarmos nosso estudo, sugerimos a instalação dessa distribuição em uma máquina virtual, como a Oracle VirtualBox. Isso permite explorar a instalação e a configuração de uma distribuição GNU/Linux sem que precisemos nos preocupar com um hardware real. É importante termos em mente que instalações feitas em uma máquina real podem resultar em perda de dados, caso sejam realizadas em uma máquina 158 Unidade IV que já tenha um sistema operacional instalado. Por isso, como dissemos, aconselhamos o uso de uma máquina virtual. Para os próximos passos, partiremos do princípio de que o programa Oracle VM VirtualBox já se encontra instalado na máquina, pois sua instalação foge do escopo deste texto. Além disso, partimos do princípio de que a máquina host deve ter um sistema operacional de 64-bits instalado. Contudo, vamos mostrar como é possível fazer a criação da máquina virtual nesse ambiente. Depois, vamos mostrar como fazer a instalação da distribuição do GNU/Linux nessa máquina. Saiba mais Para saber mais sobre a distribuição CentOS, confira o site: CENTOS. About CentOS. [s.d.]. Disponível em: https://centos.org/about/. Acesso em: 20 ago. 2020. Para conhecer a ferramenta Oracle VM VirtualBox, acesse: https://www.virtualbox.org/ 8.2 Passos para a instalação da distribuição Este item está dividido em duas etapas (ainda que os passos tenham sido numerados sequencialmente). Na primeira etapa, devemos criar uma máquina virtual nova no Oracle VM VirtualBox (aqui, foi utilizada a versão 6.1). Na segunda, vamos instalar o CentOS nessa máquinavirtual. Passo 1. Ao abrir o Oracle VM VirtualBox, selecionamos o botão Novo, como mostrado na figura a seguir: Figura 101 – Opção de criar nova máquina virtual 159 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 2. Devemos escolher um nome para a máquina virtual (por exemplo, centos, como mostrado na figura a seguir) e um diretório para o seu armazenamento. Na mesma tela, não devemos nos esquecer de escolher o tipo Linux e a versão Red Hat (64 bit). Finalmente, selecionamos o botão Próximo, na parte inferior da janela. Figura 102 – Nomeando e escolhendo o local de armazenamento 160 Unidade IV Passo 3. Devemos escolher a quantidade de memória RAM disponível para a máquina virtual. Esse valor vai depender da quantidade de memória disponível na máquina real. Pensando apenas no funcionamento da máquina virtual, um valor adequado para testes básicos (não para uma situação real de funcionamento) é de 1 GB de memória RAM, que pode rodar de forma adequada supondo que a máquina real tenha mais de 4 GB de memória RAM disponível. Essa etapa é mostrada na figura a seguir. Novamente, devemos selecionar o botão Próximo. Figura 103 – Selecionando a quantidade de memória da máquina virtual 161 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 4. Da mesma forma que uma máquina real, a máquina virtual também necessita de alguma forma de armazenamento. Assim, nesse passo, devemos criar um disco virtual para a máquina. Selecionamos a opção Criar um novo disco virtual agora e, posteriormente, clicamos no botão Criar, como mostrado na figura a seguir: Figura 104 – Criando o disco rígido para a máquina virtual 162 Unidade IV Passo 5. O Oracle VirtualBox pode trabalhar com vários tipos de arquivos de discos virtuais. Nesse passo, devemos escolher qual é o tipo de arquivo que queremos que seja utilizado. Podemos optar pelo formato VDI e selecionar o botão Próximo, como mostrado na figura a seguir: Figura 105 – Escolhendo o tipo de arquivo do disco 163 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 6. Devemos escolher o tipo de alocação do disco. Selecionamos Dinamicamente alocado, como mostrado na figura a seguir. Posteriormente, clicamos no botão Próximo. Figura 106 – Escolhendo o tipo de alocação do disco 164 Unidade IV Passo 7. Devemos selecionar o local onde vamos armazenar o arquivo do disco virtual e qual deve ser o seu tamanho. Devemos escolher um diretório no qual temos permissão de leitura e de escrita. Com relação ao tamanho, devemos nos certificar de que o disco real tenha uma quantidade adequada de espaço disponível, suficiente para armazenar o disco virtual (ainda que o espaço não seja totalmente utilizado no início). Como vamos criar uma máquina apenas para testar a instalação, não será necessário termos um disco com grande espaço, sendo que apenas 20 GB são suficientes, como mostrado na figura a seguir. Contudo, valores maiores podem ser utilizados, desde que exista espaço suficiente disponível. Uma vez configurados o local e o tamanho, devemos clicar no botão Criar. Figura 107 – Selecionando o local de armazenamento e tamanho do disco virtual 165 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 8. Nesse ponto, a máquina já foi criada, mas está sem nenhum sistema operacional. Além disso, temos de fazer algumas configurações. Primeiramente, fazemos o download da mídia de instalação do CentOS. Para isso, devemos acessar o site https://centos.org/ e selecionar a opção de download, dada em https://centos.org/download/. Vamos baixar a versão de 64-bits do CentOS, como indicado no retângulo vermelho na figura a seguir: Figura 108 – Download da versão x86_64 166 Unidade IV Passo 9. Devemos escolher um mirror para o download do CD de instalação, como mostrado na figura a seguir: Figura 109 – Listas de mirrors para download da imagem do CD de instalação 167 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 10. Ao escolhermos um mirror, devemos obter uma imagem como a mostrada na figura a seguir. Podemos, agora, escolher qual arquivo vamos baixar. Vamos escolher a imagem do CD de instalação, para economizarmos tempo e volume de download. No caso, selecionamos o arquivo CentOS-8.2.2004-x86_64-boot.iso. Figura 110 – Listas de arquivos para download 168 Unidade IV Passo 11. Depois de concluirmos o download da imagem do CD de instalação, devemos configurar a imagem do CD no Oracle VirtualBox a fim de que a máquina virtual seja capaz de iniciar a máquina com o CD inserido no drive virtual. Para isso, devemos selecionar a máquina criada e selecionar a opção armazenamento, como mostrado na figura a seguir: Figura 111 – Seleção da opção de armazenamento 169 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 12. Com a opção do passo 11 selecionada, é aberta uma nova janela de configuração, onde devemos selecionar o CD virtual, que inicialmente está vazio. No pequeno botão com o símbolo de um CD, devemos selecionar a imagem que acabamos de baixar e, assim, obtemos como resultado o que é mostrado na figura a seguir. Com isso, a máquina virtual pode acessar o conteúdo do CD de instalação. Devemos selecionar o botão OK. Figura 112 – Seleção da imagem do CD 170 Unidade IV Passo 13. Devemos iniciar a máquina virtual. Com a máquina que criamos selecionada no painel da esquerda, selecionamos o botão Iniciar, como mostrado na figura a seguir: Figura 113 – Detalhe do botão para iniciar a máquina virtual Passo 14. Ao iniciarmos a máquina, como não temos ainda nenhum sistema operacional instalado, o Oracle VirtualBox vai solicitar a escolha de uma unidade de boot. Devemos selecionar a imagem que acabamos de baixar, como mostrado na figura a seguir. Depois, selecionamos o botão Iniciar. Figura 114 – Selecionando a unidade de boot 171 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 15. A máquina inicia o processo de boot do CD, como mostrado na figura a seguir. Na tela inicial de boot do CD, podemos selecionar a opção Install CentOS 8. Uma observação importante: ao clicarmos na tela do Oracle VirtualBox, o ponteiro do mouse deve ficar “preso”, ou seja, ele fica capturado pela máquina virtual. Para “soltarmos” o ponteiro do mouse, devemos pressionar a tecla do hospedeiro, que é mostrada na parte inferior da janela do aplicativo. Essa tecla é configurável. No caso da figura, a tecla é o Ctrl direito. Figura 115 – Tela inicial de boot do CD de instalação 172 Unidade IV Passo 16. Devemos, agora, aguardar um tempo para que a máquina prossiga com o boot do CD. Após alguns segundos, obtemos uma janela para a seleção da linguagem de instalação. Podemos selecionar Português (Brasil), como mostrado na figura a seguir. Depois, devemos pressionar o botão Continuar, que fica na parte inferior da tela. Figura 116 – Tela de seleção da língua 173 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 17. Aqui, devemos ter acesso a uma tela com diversas opções de instalação, como mostrado na figura a seguir. Primeiramente, devemos configurar a rede, selecionando a opção Network e nome do host. Figura 117 – Configuração da instalação 174 Unidade IV Passo 18. Na tela de configuração do nome do host e da rede, devemos inicialmente ativar a interface de rede por meio do “botão” logo ao lado do seu nome, como destacado no retângulo vermelho na figura a seguir. Observamos que, também, devemos configurar um nome para a máquina, no campo de texto destacado na parte inferior esquerda da figura. Depois de escolhermos um nome (no caso, escolhemos meulinux.meudominio, apenas a título de exemplo), devemos pressionar o botão Aplicar. Assim, o nome da máquina deve aparecer no canto inferior direito da figura, no local destacado. Depois disso, podemos selecionar o botão Pronto, na parte superior esquerda da tela. Figura 118 – Configuração da rede 175 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 19. Podemos observar, na figuraa seguir, que a opção de Fonte de instalação não apresenta mais um erro. Isso acontece porque o programa de instalação foi capaz de atualizar a sua fonte de instalação (que será a rede). Devemos agora selecionar Instalação destino, que corresponde ao particionamento do disco onde o sistema operacional vai ser instalado. Observamos que, como não estamos fazendo uma instalação profissional, podemos utilizar o particionamento automático, a fim de simplicidade. Vemos, na figura posterior, que o disco virtual criado deve aparecer como a única opção de instalação. Nessa tela, simplesmente devemos selecionar a opção Pronto, voltando à tela original. Figura 119 – Estado do resumo da instalação 176 Unidade IV Figura 120 – Particionamento do disco 177 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 20. O instalador volta para a tela com um resumo das opções de instalação, como mostrado na figura a seguir. Observamos que agora devemos clicar na opção Seleção de Software (destacada no quadro vermelho na figura), escolhendo o conjunto de pacotes que queremos instalar na máquina. Figura 121 – Estado da instalação 178 Unidade IV Passo 21. Vamos fazer a instalação mais básica possível, mas com uma interface gráfica. Em um momento posterior, se quisermos, podemos adicionar outros programas à máquina virtual. Dessa forma, apenas a primeira opção deve estar selecionada (Servidor com GUI), como destacado na figura a seguir. Depois, devemos pressionar o botão Pronto no canto superior esquerdo da janela. É possível vermos também, na parte direita da tela, que existe uma grande quantidade de opções de programas que podem ser adicionados, como servidores de FTP e WEB, entre outros. Figura 122 – Seleção de pacotes 179 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 22. Na tela do resumo de instalação, mostrada na figura a seguir, podemos perceber que todos os itens estão prontos, de forma que podemos proceder à instalação, selecionando o botão Iniciar a Instalação, que fica no canto inferior direito da tela. Figura 123 – Resumo da instalação 180 Unidade IV Passo 23. O sistema deve começar o processo de instalação, que pode demorar um pouco, dependendo das características da máquina real que está sendo utilizada (veja a figura a seguir). Enquanto isso, podemos já selecionar a senha do usuário root, que é o usuário administrador do GNU/Linux, e também criar um novo usuário. Vamos inicialmente criar a senha para o usuário root, selecionando a opção Root Password. Obtemos a tela mostrada na figura posterior. Figura 124 – Processo de instalação 181 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Figura 125 – Configurando a senha do usuário root 182 Unidade IV Passo 24. Na tela de configuração da senha do usuário root (veja a figura a seguir), devemos digitar uma senha nova. O “marcador” na tela tenta nos dizer se a senha é forte ou fraca. Depois de selecionada a senha, selecionamos o botão Pronto, que fica no canto superior esquerdo da tela. Passo 25. Agora, podemos criar um novo usuário, selecionando a opção User Creation na tela, como mostrado na figura a seguir: Figura 126 – Selecionando a opção User Creation 183 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 26. Devemos escolher um nome e uma senha para o novo usuário. Depois, podemos selecionar o botão Pronto, que fica no topo esquerdo da tela e está mostrado na figura a seguir. Precisamos nos certificar de que a opção Necessário uma senha para usar essa conta esteja selecionada. Figura 127 – Adicionando e configurando um novo usuário 184 Unidade IV Passo 27. Devemos aguardar o processo de instalação. Ao fim, uma mensagem de que a instalação foi terminada vai ser mostrada na parte inferior direita da tela. Então, podemos pressionar o botão Reinicializar, como mostrado na figura a seguir: Figura 128 – Finalizando a instalação 185 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 28. Como a imagem do CD está inserida no disco virtual, a máquina vai reiniciar do CD e iniciar novamente o processo de instalação. A fim de evitarmos isso e não começarmos novamente todo o processo, devemos remover a imagem do CD de instalação do drive virtual. Para isso, pressionamos a tecla do hospedeiro, caso o ponteiro do mouse esteja “preso” dentro da janela, e, depois, clicamos com o botão direito do mouse no pequeno ícone de um CD na parte inferior da tela. Selecionamos a opção Remover disco do drive virtual, como mostrado na figura a seguir. Depois disso, no menu Máquina, selecionamos a opção Reinicializar. Figura 129 – Removendo o CD do disco virtual Passo 29. Devemos aguardar o processo de boot da máquina. Uma tela vai ser mostrada perguntando se o usuário concorda com o termo de licença do sistema operacional. Selecionamos a opção License Information no centro da tela, como mostrado na figura a seguir: Figura 130 – Selecionando a opção de informação da licença de uso 186 Unidade IV Passo 30. Devemos ler o acordo de licença do CentOS e, caso concordemos, devemos checar a opção na parte inferior da tela que diz Eu aceito o contrato da licença e pressionar o botão Pronto na parte superior (veja a figura a seguir). Figura 131 – Licença de uso do CentOS 187 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 31. Devemos pressionar o botão Finish configuration na parte inferior da tela de configuração iniciar, como mostrado na figura a seguir: Figura 132 – Tela de configuração inicial 188 Unidade IV Passo 32. Finalmente, estamos prontos para “logar” no sistema (veja a figura a seguir) e começar o uso do sistema operacional. O CentOS vai fazer mais algumas perguntas de configuração para o usuário, começando pela língua (conforme mostra a figura posterior). Depois de selecionada a opção, o usuário deve pressionar o botão Próximo, no topo da tela. Figura 133 – Logando no sistema operacional 189 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Figura 134 – Tela inicial depois de o usuário ter logado 190 Unidade IV Passo 33. Vemos uma tela para a configuração do teclado, como mostrado na figura a seguir. Depois de feita a seleção solicitada, devemos pressionar o botão Próximo, que fica no topo da tela. Figura 135 – Tela de configuração do teclado 191 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 34. Na próxima tela, podemos ligar ou desligar o serviço de localização. Vamos deixar essa opção desligada, como mostrado na figura a seguir: Figura 136 – Desligando o serviço de localização 192 Unidade IV Passo 35. Podemos também sincronizar o sistema com vários serviços on-line, como os serviços do Google ou da Microsoft. Vamos ignorar essas opções e pressionar o botão Ignorar, que fica no topo da tela da figura a seguir: Figura 137 – Conexão com serviços on-line 193 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Passo 36. Podemos finalizar a configuração (veja a figura a seguir) e começar a utilizar o sistema operacional. Uma tela de boas-vindas, com pequenas explicações sobre tarefas comuns, vai ser mostrada: Figura 138 – Finalização da configuração 194 Unidade IV Figura 139 – Sistema operacional CentOS Lembrete Vale lembrar que no mundo empresarial há, basicamente, duas distribuições do Linux predominantes: Suse e Red Hat, do qual o CentOs é a versão gratuita. Logo, o CentOs é recomendável para organizações com recursos limitados e para uso didático. 8.3 Edição de textos no GNU/Linux: o editor de texto Vim Uma das ferramentas que administradores de rede e programadores de computadores mais utilizam é o editor de texto. Contudo, o tipo e a finalidade de um editor de texto nesses cenários são um pouco diferentes do tipo e da finalidade dos editores de texto voltados para a produção de livros, revistas e relatórios (como é o caso do Microsoft Word, por exemplo). Programadores e administradores de sistemas utilizam editores de texto para alterar arquivos deconfiguração, scripts ou códigos de programas. O objetivo desse tipo de editor não é produzir textos 195 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) visualmente bonitos, como ocorre em uma revista, mas elevar a produtividade do seu usuário. Seu tamanho deve ser “leve”, com o objetivo de permitir que ele “abra” e edite um arquivo de configuração, por exemplo. Um dos editores mais clássicos e conhecidos do mundo Unix é o editor Vi. Sua pronúncia é similar (no inglês) a vee-eye, uma abreviação para visual. Ele foi incorporado ao padrão POSIX, o que tornou esse editor extremamente popular no mundo Unix. Esse editor é um pouco diferente dos outros editores de texto “convencionais”, porque ele apresenta modos de trabalho. Em um dos seus modos, que vamos chamar de modo de entrada, seu funcionamento é similar ao de um editor de texto comum, em que o usuário digita um texto, e esse texto é diretamente inserido no arquivo em que o usuário está trabalhando. No outro modo de funcionamento, que vamos chamar de modo de controle, a entrada de usuário deixa de ser mandada para o arquivo e passa a ser interpretada como comandos para o editor. À primeira vista isso pode parecer um pouco estranho, pois o usuário deve memorizar a função associada a cada tecla, mas, após um tempo, a produtividade desse usuário se torna bastante elevada. A grande vantagem de um editor como o Vi é que o usuário não precisa utilizar o mouse ao trabalhar, mantendo sempre suas mãos no teclado e praticamente em uma mesma posição. Por movimentar menos as mãos, o usuário consegue digitar mais rapidamente, pois as mãos vão ficar sempre em uma posição ótima no teclado. O editor Vi original é bem antigo (1978) e, com o tempo, surgiram várias versões de código aberto com mais funcionalidades. Uma dessas versões é o Vim, ou Vi Improved, desenvolvido originalmente por Bram Moolenaar. Ele tem uma série de novas funcionalidades, além de reproduzir praticamente todas as funcionalidades originais. Por ser uma aplicação de código aberto e ser bastante poderoso, é um dos editores mais comuns nas diversas distribuições Linux. Vamos examinar um pouco o seu funcionamento. 8.3.1 Funcionamento básico do editor Vim Programadores e administradores de sistemas GNU/Linux (e também de sistemas Unix) tendem a utilizar bastante a linha de comando, também chamada de terminal. Isso ocorre por vários motivos, como os indicados a seguir. • Ampla disponibilidade de ferramentas que trabalham no modo texto. • Possibilidade da escrita de scripts (shell scripts) que automatizam diversas tarefas. • Elevada velocidade no uso das ferramentas. • Facilidade em combinar a saída de programas na entrada de outros, com a utilização de pipes. A principal forma de utilização do Vim é via terminal (ou linha de comando). Existe também uma versão com uma interface gráfica. Para usarmos o Vim no terminal, basta digitarmos vim, seguido do nome do arquivo que queremos editar. Se executarmos simplesmente o comando vim, obtemos uma tela como a mostrada na figura a seguir: 196 Unidade IV Figura 140 – Tela de abertura do Vim Por padrão, o editor começa no modo de controle, não no modo de edição. Para mudarmos o editor para o modo de edição e podermos digitar o texto, pressionamos a tecla i. Ao fazermos isso, observamos que a mensagem INSERÇÃO vai ser mostrada no canto inferior esquerdo da tela, o que indica a mudança do modo, como mostrado na figura a seguir: Figura 141 – Modo de inserção 197 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Após começarmos a digitar algum texto, a tela muda, e podemos continuar digitando o texto normalmente, até o momento em que queremos fazer alterações, como apagar uma linha, por exemplo. Observamos, na figura a seguir, que digitamos algumas linhas de texto e, posteriormente, pressionamos a tecla Esc. Ao pressionarmos essa tecla, o editor volta para o modo de controle. Agora, podemos manipular o texto digitado. Figura 142 – Entrando com um texto simples Observe a posição do cursor de entrada na figura a seguir. Queremos mover o cursor para a linha vazia e apagar essa linha. Podemos utilizar as teclas com setas “normais” ou utilizar as teclas h, j, k e l no modo de edição. Para isso, devemos nos lembrar de que essas teclas correspondem às setas, como mostrado na figura a seguir: h j k I Figura 143 – Teclas h, j, k e l do teclado e seu significado no modo de controle do Vim Assim, podemos pressionar a tecla k três vezes, até chegarmos à linha vazia. Depois, ainda no modo de controle, podemos pressionar duas vezes a tecla d. O comando dd elimina uma linha do texto. Dessa forma, a tela deve ficar com a aparência mostrada na figura a seguir: 198 Unidade IV Figura 144 – Texto após remoção da linha Vamos, agora, mover o cursor para a primeira linha do arquivo. Para isso, precisamos nos certificar de que o editor se encontra no modo de controle, ou seja, pressionamos a tecla Esc. Digitamos o número 1 seguido da letra G maiúscula. Observamos que o cursor deve se mover para o topo do arquivo. Vamos, agora, adicionar novamente um texto no início do arquivo. Para isso, devemos voltar com o editor para o modo de edição. Digitamos a letra i minúscula e, depois, digitamos o texto Palavras no início. O resultado deve ser o mostrado na figura a seguir: Figura 145 – Resultado após inserção de texto 199 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Nota-se que a tecla i volta para o modo de edição quando estamos no modo de controle, mas funciona como a tecla i normal quando já estamos no modo de edição. Voltamos para o modo de controle pressionando a tecla Esc. Vale notar que sempre podemos voltar ao modo de controle pressionando a tecla Esc, independentemente do modo em que nos encontrarmos. Ainda no modo de controle, vamos pressionar A, ou seja, a tecla shift seguida da letra a. Observamos que o cursor vai se mover automaticamente para o fim da linha. Digitamos o texto Palavras no fim. O resultado obtido deve ser como mostrado na figura a seguir: Figura 146 – Resultado da edição Vamos voltar ao modo de controle, pressionando a tecla Esc. Outra funcionalidade importante de um editor de texto é a busca por palavras. Por exemplo, vamos supor que queremos buscar no arquivo a palavra ver. Para isso, no modo de controle, devemos pressionar a tecla / e digitar ver. Observamos que, conforme digitamos uma palavra no modo de busca, o editor vai destacando os trechos encontrados na tela. Quando terminamos de digitar a palavra desejada para a busca, podemos pressionar a tecla Enter, e o cursor vai se mover diretamente para posição na qual a palavra digitada foi encontrada. Dessa forma, podemos nos mover rapidamente pelo texto. É interessante o fato de que foi possível fazer várias manipulações no texto digitado sem utilizarmos o mouse ou clicarmos em menus. Todas as funções foram ativadas diretamente pelo uso do teclado. Isso requer um pouco de memorização e leva algum tempo para nos acostumarmos. Porém, depois desse período, a produtividade, especialmente de um programador, se torna maior. 200 Unidade IV Outra funcionalidade muito útil para a edição é saltar para uma linha específica. Já testamos saltar para a linha 1. Para saltarmos para outra linha, por exemplo, a linha 2, devemos, primeiramente, nos certificar de que estamos no modo de controle (pressionando a tecla Esc). Digitamos 2 seguido das teclas shift e g (ou seja, a letra G maiúscula). Para nos certificarmos de que estamos na linha correta, podemos fazer com que o editor mostre a numeração de linhas da tela (os números não vão ser inseridos no arquivo, apenas mostrados na tela do editor). Para isso, no modo de controle, devemos digitar : seguido dos comandos set nu. O resultado é mostrado na figura a seguir: Figura 147 – Ativando a numeração de linhas Para gravarmos o que fizemos até agora em um arquivo chamado teste.txt, podemos digitar o comando :w teste.txt, o tipo e a finalidade.Vamos mover o cursor até a última linha do arquivo (pressionando a tecla j várias vezes ou digitando GG) e, depois, digitamos A para adicionarmos texto ao final da linha. Vamos escrever mais um pouco de texto (apenas para modificarmos o arquivo de entrada). Com isso, devemos obter um arquivo similar ao mostrado na figura a seguir: 201 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Figura 148 – Modificando o arquivo Para sairmos do editor e gravarmos as alterações, devemos voltar ao modo de controle (pressionando a tecla Esc). Digitamos o comando :wq, que vai gravar o conteúdo e sair. Para sairmos sem gravar as alterações, devemos utilizar o comando :q!, seguido de enter. Saiba mais Para saber mais sobre os diferentes modos do Vim, digite :h vim-modes- intro (seguido de enter) e consulte a própria documentação do editor, que é bastante completa. A ajuda geral com o Vim pode ser obtida digitando :h, seguido de enter. 8.4 Sistemas de arquivos e diretórios Um sistema operacional precisa ter um mecanismo de organizar os dados que devem ser armazenados no disco. Esse mecanismo é chamado de sistema de arquivos ou file system. No caso do GNU/Linux, o principal sistema de arquivos utilizado é a família ext, que foi sendo melhorado e expandido ao longo dos anos. O sistema Ext2 (Second Extended Filesystem) é bastante antigo e já não é mais utilizado (GRAVES, 2013). Uma das suas principais fraquezas é não apresentar um sistema de journaling. O sistema Ext3 sucedeu o Ext2: ele tem um mecanismo de journaling e permite a utilização de cotas (REARDON, 2016). Esse sistema também apresenta um sucessor, o Ext4, que foi criado para implementar uma série de melhorias, especialmente com relação ao desempenho e ao aumento na capacidade de armazenamento. Assim como o seu antecessor, também tem um sistema de journaling. 202 Unidade IV Segundo Graves (2013) e Basta et al. (2012), as estruturas desses sistemas de arquivos são similares e podem ser divididas em quatro tipos de objetos (não no sentido da orientação a objetos, mas em um sentido abstrato): • superbloco; • inode; • dentry; • arquivo. O superbloco é a estrutura mais geral e que armazena as informações que são válidas para todo o sistema de arquivos. O inode contém os metadados ou as informações específicas de um dado arquivo (BASTA et al., 2012). Entre essas informações, temos o dono do arquivo, seu tipo, suas permissões e seu tamanho (GRAVES, 2013). O dentry, abreviação de directory entry, é o mecanismo que permite associar os inodes aos nomes dos arquivos. Finalmente, o arquivo é armazenado como um conjunto de blocos de dados. Uma característica interessante dos sistemas GNU/Linux (e também de sistemas Unix) é que, além dos sistemas de arquivos de disco, ele apresenta um sistema de arquivos de rede, chamado de Network File System (NFS). Os sistemas de arquivos dos sistemas GNU/Linux são estruturados na forma de uma grande árvore, em que a raiz é denotada por /. Todos os demais arquivos e diretórios são nós filhos desse nó raiz e formam uma estrutura única. Observe que isso é bem diferente da estrutura convencional encontrada nas máquinas com o sistema operacional Microsoft Windows, na qual existem unidades (como C:, D: etc.), e cada uma delas tem uma árvore própria. É possível “montarmos” outros sistemas de arquivos nessa estrutura de árvore única. Por exemplo, se estivermos utilizando um pen drive, podemos montar o sistema de arquivos do pen drive como um ramo de /, como /mnt/pendrive. Não é necessário que os sistemas de arquivos sejam os mesmos, apenas que a versão do kernel seja capaz de trabalhar com o sistema de arquivos do pen drive. Uma vez que um sistema de arquivos tenha sido montado, ele passa a ser totalmente transparente para um usuário: seus arquivos são acessados da mesma forma que qualquer outro ramo do disco “local”. Isso também acontece com o NFS, em que é possível trabalharmos com arquivos e diretórios remotos da mesma forma como trabalhamos com arquivos locais. Na figura a seguir, vemos a saída do comando tree / -d –L 1, no qual listamos o primeiro nível da hierarquia de diretórios para a instalação feita no item anterior. 203 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Figura 149 – Primeiro nível da árvore de diretórios 8.5 Utilizando o shell Uma das principais características do mundo GNU/Linux e do Unix é a ampla utilização da linha de comando ou terminais. Existem diversos shells disponíveis, e cada um deles apresenta características próprias. Dentre os mais comuns, podemos citar os listados a seguir. • Bourne shell ou sh. • GNU Bourne-Again shell ou Bash. • Korn shell ou ksh. • C shell, entre outros. Conceitualmente, um shell funciona como uma interface (em modo de texto) entre o usuário e o sistema operacional (VERMA, 2008). Ele também funciona como uma linguagem interpretada: o usuário pode digitar comandos para o interpretador ou escrever programas ou scripts com esses comandos para a execução futura. 204 Unidade IV Saiba mais Para ler um tutorial sobre o Bourne Shell, acesse o site: https://www.shellscript.sh/ Outro tutorial bastante interessante pode ser encontrado em: CHADWICK, R. Bash Scripting tutorial. [s.d.]. Disponível em: https:// ryanstutorials.net/bash-scripting-tutorial/. Acesso em: 17 set. 2020. Um script para o Bash é simplesmente um arquivo de texto com um conjunto de comandos válidos (inclusive a execução de outros programas e scripts) e com permissão de execução pelo sistema operacional. A primeira linha do arquivo começa com: #!/bin/bash Ou, de uma forma ainda melhor (pois isso pode lidar com instalações do Bash em outros diretórios), temos: #!/usr/bin/env bash Essa linha, chamada de shebang, indica que o arquivo é um script Bash e mostra qual deve ser o interpretador invocado para a sua execução. Assim como outras linguagens de programação, podemos declarar variáveis nos nossos scripts. Por exemplo, suponha que queremos declarar uma variável chamada de MEUNOME e atribuir como conteúdo “Nome”. Para isso, podemos fazer: MEUNOME=”Nome” É importante que não exista um espaço entre o nome da variável, o sinal de igual e o conteúdo atribuído. Variáveis também podem conter números, como no exemplo a seguir: NUMERO=123 Há uma série de variáveis especiais que podem ser utilizadas nos scripts. A variável $0 contém o nome do script. As variáveis $1, $2,...,$9 contêm os 9 respectivos argumentos que são passados na linha de comando para o script em execução (CHADWICK, s.d.; MIGHT, 2020). A variável $# apresenta o número total de argumentos passados. A variável $@ tem esses argumentos na forma de lista (CHADWICK, s.d.). 205 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Outra variável bastante útil é a indicada por $?, que armazena o status de execução do último programa executado (CHADWICK, s.d.). A variável $$ indica o PID (process id) do script em execução, a variável $USER indica o nome do usuário logado, a variável $HOSTNAME indica o nome da máquina e a variável $SECONDS retorna o intervalo de tempo em que o script atual está em execução (CHADWICK, s.d.). Também podemos utilizar condicionais como of if e fazer diversos tipos de testes que envolvem comparações de números inteiros e de cadeias de textos (strings) e outros tipos de expressões. Um aspecto interessante é que podemos fazer comparações com relação a diretórios e arquivos. Por exemplo, podemos identificar se determinado arquivo (ou diretório) existe, se um arquivo tem ou não tamanho nulo, se um arquivo tem permissão de escrita, entre outros tipos de comparações úteis no gerenciamento de arquivos. A saída de texto é normalmente feita pelo comando echo. Expressões aritméticas podem ser feitas com os comandos let e expr. Podemos utilizar comandos como o case, que permitem desviar o fluxo de execução para um ponto específico entre um conjunto de possibilidades. Com relação às estruturas de laços, temos laços tradicionaiscomo o while e o for e laços do tipo until. De modo específico, os laços do tipo for podem ser utilizados tanto para um conjunto de valores numéricos quanto para um conjunto de arquivos. Isso é um recurso bastante interessante e poderoso, já que é possível iterar em um conjunto de arquivos grandes, inclusive selecionando os arquivos com base em padrões e/ou nas suas extensões. 8.6 Comandos úteis na administração e no uso de máquinas GNU/Linux A administração de servidores GNU/Linux é muito facilitada por uma série de programas tipicamente instalados ou disponíveis na maioria das distribuições. Um dos comandos que o administrador vai certamente utilizar com frequência é o comando man. Como vimos, essa é uma abreviação para manual e consiste na documentação on-line de boa parte dos programas instalados em uma máquina GNU/Linux. Por exemplo, para acessarmos a página do manual do ls, basta digitarmos man ls e obtemos o resultado mostrado na figura a seguir. É interessante observarmos que podemos navegar nas páginas do man da mesma forma como navegamos no editor Vi. 206 Unidade IV Figura 150 – Página de manual do comando ls Outro comando útil é o pwd, que permite que saibamos em que diretório estamos. Esse comando é especialmente bastante benéfico em shell scripts. O comando hostname mostra o nome da máquina na qual trabalhamos. Se executarmos como hostname -I, obteremos o ip da máquina. Um problema frequentemente verificado é a identificação do ambiente de trabalho. Muitas vezes, quando nos conectamos a uma máquina nova, queremos saber informações sobre qual é a distribuição que está sendo utilizada nessa máquina, bem como a sua versão. Essa informação também pode ser muito útil em shell scripts que são executados em um grande número de máquinas diferentes. Para isso, podemos executar o comando lsb_release -a. O programa lsb_release é bastante comum e disponível na maioria das distribuições, mas, em alguns casos específicos, ele pode não ser instalado por padrão. Outro comando que pode ser muito interessante para o administrador é o comando uname. Ele retorna informações sobre o kernel instalado na máquina. Executando o comando uname -a, ficamos sabendo informações sobre a versão do kernel em execução e sua arquitetura. 207 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) A navegação entre os diretórios é feita utilizando o comando cd. É importante notarmos que o comando cd ~ nos leva para o diretório home do usuário conectado. O comando cd - nos leva para o diretório anterior ao atual. O comando cd .. nos leva para um nível acima do diretório atual (de forma similar ao que ocorre no DOS e no Windows). É fundamental termos em mente que o Unix e os sistemas GNU/Linux diferenciam maiúsculas de minúsculas, diferentemente do mundo DOS e do Windows. Isso é válido tanto para nomes de arquivos quanto para nomes de diretórios. Um comando simples, mas surpreendente útil, é o comando cat. Seu uso original destina-se a concatenar de diversos arquivos e a mostrar o resultado na saída padrão (ou seja, a própria tela do terminal). Ele é muito utilizado para apresentar na tela o conteúdo de um arquivo, sendo chamado um único argumento (o nome do arquivo que queremos mostrar na tela). Resumo Nesta unidade, conhecemos o sistema operacional GNU/Linux. Contemplamos o projeto GNU, fizemos um breve histórico do Linux e mostramos as diversas distribuições do GNU/Linux. Também abordamos as buscas de documentação no próprio sistema (on-line), discorremos a respeito de alguns aspectos do modelo de segurança do GNU/Linux e analisamos os mecanismos de autenticação e de controle de acesso. Na sequência, apresentamos a distribuição GNU/Linux CentOS e explicamos o passo a passo de como fazer a sua instalação. Por fim, investigamos o editor de texto Vim e exploramos alguns aspectos básicos do seu funcionamento. Também vimos conceitos relativos aos sistemas de arquivos e de diretórios, o shell e alguns comandos básicos úteis na administração e no uso de máquinas GNU/Linux. 208 Unidade IV Exercícios Questão 1. No Unix original, um arquivo chamado de /etc/passwd armazenava os nomes de usuário, suas respectivas senhas criptografadas e várias outras informações relevantes sobre cada usuário, como o identificador numérico de cada usuário, seus diretórios “home” e seus shells padrão, em formato texto. Esse esquema simples é relativamente inseguro e precisou ser refinado com o passar do tempo. Com base no exposto e nos seus conhecimentos, avalie as asserções a seguir: I – Hoje, no Linux, a maioria das informações sobre cada usuário continua a ser armazenada, em formato texto, no arquivo /etc/passwd (que pode ser lido por qualquer um), mas as senhas criptografadas por um algoritmo pré-definido e os respectivos sais criptográficos (que são cadeias aleatórias de caracteres geradas especificamente para cada usuário, quando se cria o usuário) ficam em outro arquivo, o /etc/shadow, que não pode ser lido por usuários comuns. Isso contribui para tornar o processo de autenticação dos usuários mais seguro. porque II – Como o código-fonte do Linux é aberto, o algoritmo criptográfico empregado é público. Entretanto, existem algoritmos chamados de mão-única, que não podem ser revertidos, e o algoritmo empregado no Linux é desse tipo. Por outro lado, mesmo algoritmos de mão-única podem ser vencidos por um ataque de força bruta se a senha encriptada for muito curta, e é para isso que serve o sal criptográfico: ele é concatenado à senha digitada, o que torna a cadeia de caracteres resultante mais longa e complexa e inviabiliza o ataque de força-bruta. A respeito dessas asserções, assinale a opção correta: A) As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I. B) As asserções I e II são proposições verdadeiras, e a II não é uma justificativa correta da I. C) A asserção I é uma proposição falsa, e a II é uma proposição verdadeira. D) A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. E) As asserções I e II são proposições falsas. Resposta correta: alternativa A. 209 SEGURANÇA DE SISTEMAS OPERACIONAIS (WINDOWS / LINUX) Análise da questão Ambas as asserções descrevem corretamente o funcionamento da maioria absoluta das distribuições correntes de Linux no que tange à autenticação de usuários, e a asserção II é uma justificativa correta da I. Questão 2. Softwares para virtualização de plataformas computacionais permitem ao usuário criar uma ou mais máquinas virtuais (MV) dentro do ambiente oferecido por dado sistema operacional, o que possibilita utilizar, comparar ou testar diversos sistemas operacionais ao mesmo tempo, em uma mesma máquina física, de maneira simples e eficiente. No momento, possivelmente os mais conhecidos e utilizados softwares para virtualização são o VMWare (da VMWare, Inc.) e o VirtualBox (da Oracle). Com base no exposto e nos seus conhecimentos, avalie as asserções a seguir. I – A instalação de um segundo sistema operacional em uma máquina física já em uso pode resultar em perda de dados e/ou danificar a instalação do primeiro sistema operacional instalado, de forma a fazer com que nenhum dos dois sistemas operacionais consiga funcionar. Pare se evitar esse tipo de problemas, pode-se recorrer a softwares para virtualização de plataformas computacionais. porque II – Tais softwares rodam na máquina física e criam máquinas virtuais, totalmente isoladas do hardware real, mas convincentemente realistas, dentro das quais se pode instalar outros sistemas operacionais e usá-los sem que se interfira no sistema hospedeiro nem se consiga acessar o hardware da máquina física real em que o sistema hospedeiro está instalado. A respeito dessas asserções, assinale a opção correta. A) As asserções I e II são proposições verdadeiras, e a II é uma justificativa correta da I. B) As asserções I e II são proposições verdadeiras, e a II não é uma justificativa correta da I. C) Aasserção I é uma proposição falsa, e a II é uma proposição verdadeira. D) A asserção I é uma proposição verdadeira, e a II é uma proposição falsa. E) As asserções I e II são proposições falsas. Resposta correta: alternativa A. Análise da questão A asserção I descreve um problema real de forma clara e concisa e propõe um modo de se evitar tal problema, enquanto a asserção II explica corretamente por que tal solução é eficiente, ou seja, a asserção II é uma justificativa correta da I. 210 FIGURAS E ILUSTRAÇÕES Figura 1 SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. Fundamentos de sistemas operacionais. 9. ed. Rio de Janeiro: LTC: 2015. p. 344. Adaptada. Figura 100 HAEDER, A. et al. LPI Linux Certification in a Nutshell: a desktop quick reference. 3. ed. Sebastopol: O’Reilly, 2010. Adaptada. REFERÊNCIAS Textuais ALVES, D. Sistemas operacionais de redes (Windows/Linux). São Paulo: Sol, 2018. BALL, B.; DUFF, H. Dominando Linux: Red Hat e Fedora. São Paulo: Pearson, 2004. BASTA, A. et al. Linux operations and administration. Boston: Cengage Learning, 2012. BATTISTI, J.; POPOVICI, E. Windows Server 2012 R2 e Active Directory. São Paulo: Instituto Alpha, 2015. BINNIE, C. Segurança em servidores Linux. São Paulo: Novatec, 2017. CARRIER, B. File system forensic analysis. Upper Saddle River: Addison-Wesley, 2005. CENTOS. About CentOS. [s.d.]. Disponível em: https://centos.org/about/. Acesso em: 20 ago. 2020. CHADWICK, R. Bash Scripting tutorial. [s.d.]. Disponível em: https://ryanstutorials.net/bash-scripting- tutorial/. Acesso em: 17 set. 2020. CLINES, S.; LOUGHRY, M. Active directory for dummies. Hoboken: Wiley, 2008. DEITEL, H. M.; DEITEL, P. J.; CHOFINES, D. R. Sistemas operacionais. São Paulo: Pearson Prentice-Hall, 2005. DEMARTINI, F. Linux e Android têm mais falhas críticas que o Windows, aponta estudo. Canal Tech, 10 mar. 2020. Disponível em: https://canaltech.com.br/seguranca/linux-e-android-tem-mais-falhas- criticas-que-o-windows-aponta-estudo-161592/. Acesso em: 8 jun. 2020. FRANCIS, D. Mastering Active Directory. Birmingham: Packt Publishing, 2017. 211 GEISSHIRT, K. Pluggable authentication modules. Packt Publishing: Birmingham, 2007. GNU. Filosofia do Projeto GNU. [s.d.]. Disponível em: https://www.gnu.org/philosophy/philosophy.html. Acesso em: 17 set. 2020. GRAVES, M. W. Digital archaeology: the art and science of digital forensics. Upper Saddle River: Addison-Wesley, 2013. HAEDER, A. et al. LPI Linux Certification in a Nutshell: a desktop quick reference. 3. ed. Sebastopol: O’Reilly, 2010. HUNTER, L. E.; ALLEN, R. Active Directory Cookbook. 3. ed. Sebastopol: O’Reilly, 2009. INDIANA UNIVERSITY. Active Directory security and distribution groups. 2019. Disponível em: https:// kb.iu.edu/d/ajlt. Acesso em: 4 set. 2020. INDIANA UNIVERSITY. Group policies in Microsoft Active Directory. 2018. Disponível em: https://kb.iu. edu/d/ajgk. Acesso em: 5 set. 2020. JANG, M. H.; MESSIER, R. Security strategies in Linux platforms and applications. 2. ed. Burlington: Jones & Barlett Learning, 2017. KARGER, P. A.; SCHELL, R. R. Multics security evaluation: vulnerability analysis. Electronic Systems Division, v. II, jun. 1974. Disponível em: http://csrc.nist.gov/publications/history/karg74.pdf. Acesso em: 8 jun. 2020. KASPERSKY. O que são ataques de DDoS? [s.d.]. Disponível em: https://www.kaspersky.com.br/resource- center/threats/ddos-attacks. Acesso em: 9 set. 2020. KROPIWIEC, D. D.; GEUS, P. L. Paradigmas de segurança em sistemas operacionais. Campinas: Unicamp, 2004. Disponível em: https://www.lasca.ic.unicamp.br/paulo/papers/2004-WSeg-diogo.kropiwiec- sistemas.operacionais.pdf. Acesso em: 9 jun. 2020. LAWRENCE, T. Understanding PAM. A. P. Lawrence, 2005. Disponível em: https://www.aplawrence.com/ Basics/understandingpam.html. Acesso em: 14 ago. 2020. MACHADO, F. B.; MAIA, L. P. Arquitetura de sistemas operacionais. 5. ed. Rio de Janeiro: LTC, 2013. MACKIN, J. C.; THOMAS, O. Exam Ref 70-412: configuração dos serviços avançados do Windows Server 2012 R2. Porto Alegre: Bookman, 2016. MICROSOFT. Active Directory Certificate Services Overview. 2016a. Disponível em: https://docs. microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/ 212 hh831740(v=ws.11)#:~:text=AD%20CS%20is%20the%20Server,signature%20capabilities%20for%20 your%20organization. Acesso em: 3 set. 2020. MICROSOFT. Active Directory Collection. 2014. Disponível em: https://docs.microsoft.com/en-us/ previous-versions/windows/it-pro/windows-server-2003/cc780036(v=ws.10)?redirectedfrom=MSDN# w2k3tr_ad_over_qbjd. Acesso em: 3 set. 2020. MICROSOFT. Active Directory Domain Services Overview. 2016b. Disponível em: https://docs.microsoft. com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh831484(v=ws.11). Acesso em: 3 set. 2020. MICROSOFT. Active Directory Security Groups. 2017. Disponível em: https://docs.microsoft.com/en-us/ windows/security/identity-protection/access-control/active-directory-security-groups. Acesso em: 5 set. 2020. MICROSOFT. Mount a drive in a folder. 2020. Disponível em: https://docs.microsoft.com/en-us/ windows-server/storage/disk-management/assign-a-mount-point-folder-path-to-a-drive. Acesso em: 10 set. 2020. MICROSOFT. Netdom join. 2016c. Disponível em: https://docs.microsoft.com/en-us/previous-versions/ windows/it-pro/windows-server-2012-r2-and-2012/cc788049(v=ws.11). Acesso em: 31 ago. 2020. MICROSOFT. New-SmbShare. [s.d.]. Disponível em: https://docs.microsoft.com/en-us/powershell/ module/smbshare/new-smbshare?view=win10-ps. Acesso em: 13 set. 2020. MICROSOFT. Requisitos do Sistema para o Windows Server Essentials. 2013. Disponível em: https:// docs.microsoft.com/pt-br/windows-server-essentials/get-started/system-requirements. Acesso em: 31 ago. 2020. MICROSOFT. Windows Server 2012 R2 and Windows Server 2012. 2016d. Disponível em: https:// docs.microsoft.com/pt-br/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/ hh801901(v=ws.11). Acesso em: 8 jun. 2020. MIGHT, M. Shell programming with bash: by example, by counter-example. [s.d.]. Disponível em: http:// matt.might.net/articles/bash-by-example/. Acesso em: 17 set. 2020. MIKKEY, M. G. Bash programming: introduction HOW-TO. TLDP, 27 jul. 2000. Disponível em: http://tldp. org/HOWTO/Bash-Prog-Intro-HOWTO.html#toc6. Acesso em: 17 set. 2020. MINASI, M. et al. Mastering Windows Server 2012 R2. Indianapolis: John Wiley & Sons, 2014. NEGUS, C. Linux, a Bíblia: o mais abrangente e definitivo guia sobre Linux. Rio de Janeiro: Alta Books, 2014. 213 NEMETH, E.; SNYDER, G.; HEIN, T. R. Manual completo de Linux: guia do administrador. São Paulo: Pearson, 2007. NIKKEL, B. J. Forensic analysis of GPT disks and GUID partition tables. Digital Investigation, v. 6, 2009, p. 39-47. NIST. An introduction to computer security: the NIST handbook. 1995. Washington: Pubs, 1995. Disponível em: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-12r1.pdf. Acesso em: 26 abr. 2020. PANEK, C. Security fundamentals. Indianapolis: Sybex, 2020. PANEK, W. MCSA: Windows Server 2012 R2 Installation and Configuration Study Guide – Exam 70- 410. Indianapolis: Sybex, 2015. PETTERS, J. A. Guide to group policy and why it matters for data security. Varonis, 2020. Disponível em: https://www.varonis.com/blog/group-policy/. Acesso em: 5 ago. 2020. QA STACK. Usando o bit setuid corretamente. [s.d.]. Disponível em: https://qastack.com.br/unix/166817/ using-the-setuid-bit-properly. Acesso em: 9 set. 2020. REARDON, J. Secure data deletion. Cham: Springer, 2016. RUSSEL, C. Exam Ref 70-411: administração do Windows Server 2012 R2. Porto Alegre: Bookman, 2015. SAMMES, A.; JENKINSON, B. Forensic computing. 2. ed. Londres: Springer, 2007. SILBERSCHATZ, A.; GALVIN, P. B.; GAGNE, G. Fundamentos de sistemas operacionais. 9. ed. Rio de Janeiro: LTC: 2015. SMITH, R. Make the most of large drives with GPT and Linux. IBM, 2009. Disponível em: https://
Compartilhar