





























































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Apostila Linux Avançada
Tipologia: Notas de estudo
1 / 69
Esta página não é visível na pré-visualização
Não perca as partes importantes!






























































Kernel de um sistema operacional é entendido como o núcleo deste ou, numa tradução literal, cerne. Ele representa a camada mais baixa de interface com o Hardware, sendo responsável por gerenciar os recursos do sistema computacional como um todo. É no kernel que estão definidas funções para operação com periféricos (mouse, disco, impressora, interface serial/interface paralela), gerenciamento de memória, entre outros. Resumidamente, o kernel é um conjunto de programas que fornece para os programas de usuário (aplicativos) uma interface para utilizar os recursos do sistema. Quanto à sua arquitetura, o kernel pode ser monolítico - em um único bloco, com todas as funcionalidades carregadas na memória - ou modular (micro-kernel) - com os módulos específicos para cada tarefa carregados opcionalmente, dinamicamente. O kernel é a parte mais importante do sistema operacional, pois, sem ele, a cada programa novo que se criasse seria necessário que o programador se preocupasse em escrever as funções de entrada/saída, de impressão, entre outras, em baixo nível, causando uma duplicação de trabalho e uma perda enorme de tempo. Como o kernel já fornece a interface para que os programas possam acessar os recursos do sistema de um nível mais alto e de forma transparente, fica resolvido o problema da duplicação do trabalho. Quando há periféricos ou elementos de um sistema computacional que o kernel não cobre, então se faz necessário escrever a interface para eles, os chamados device drivers. Geralmente, os kernels oferecem uma função para se executar chamadas de sistema, como por exemplo a ioctl(), função essa que podemos denominar de I/O Control do Linux. Valendo-se dessa função, podem-se escrever rotinas para qualquer dispositivo. 1.1 Kernel monolítico. Kernel monolítico ou mono-bloco é um kernel que implementa um interface de alto nível para possibilitar chamadas de sistema específicas para gestão de processos, concorrência e gestão de memória por parte de módulos dedicados que são
executados com privilégios especiais. Alguns exemplos deste tipo de kernel:
utilizaremos a seguinte linhas de comando:
Para facilitar, criaremos um link simbólico do diretório nos quais os fontes do kernel foram extraidos.
No proximo passo, iniciaremos a configuração para posteriormente compilarmos o kernel.
É extremamente necessário que você tenha todo o conhecimento sobre o hardware utilizado no computador, e serviços para os quais ele deverá atender. Para verificarmos uma listagem simplificada de hardware, utilizaremos o segundo terminal disponível, apertando as teclas Alt+F2. Em seguida, digitaremos o seguinte comando:
Desta forma saberemos quais são os principais hardwares instalados no computador para que possamos passar informações corretas ao kernel. Sabendo qual é o tipo de hardware existente no computador, retornaremos à janela de configuração do kernel pressionando as teclas Alt+F1. Dentro das configurações do kernel Linux, podemos setar as opções como build in (compilado diretamente dentro de uma única estrutura do kernel, sendo carregado sempre que o computador for iniciado e é representado por um *) ou podemos ainda setar as opções como modules (modulos que podem ou não ser carregados pelo kernel em sua inicialização e é representado pela letra M). Após todas as modificações necessárias, iremos salvar o arquivo de configuração selecionando a opção “ Save Configuration to an Alternate File” Agora iremos salvar as configurações do kernel com o nome de config-meu-kernel (pode ser qualquer outro nome desde que se recorde posteriormente).
Agora é necesário criarmos uma imagem initrd, que é uma imagem relativa aos procedimentos de inicialização do sistema, para isso usaremos o seguinte comando:
Para organizar a estrutura de kernels, uma vez que pode-se ter mais de um no sistema operacional GNU/Linux, vamos criar links simbólicos no diretório raiz com os seguintes comandos:
Agora é só adicionar as linhas no /etc/lilo.conf e redar o comando lilo ou adicionar em menu.lst dentro do diretório /boot/grub/ conforme já aprendido acima. CUIDADO!!! Lembre-se de sempre adicionar uma nova entrada em seu arquivo de configuração do kernel, não é seguro substituí-las, pois, o novo kernel pode não funcionar após a próxima reinicialização.
O DHCP (Dynamic Host Control Protocol) é um protocolo utilizado para endereçamento dinâmico de hosts. Através do DHCP, é possível endereçar uma grande quantidade de hosts de uma rede, sem perder um grande tempo configurando estações de trabalho. Existe um serviço no GNU/LINUX chamado dhcpd que pode ser configurado para fornecer endereços IP's automaticamente para os clientes da rede. Com isso, o administrador da rede ganha tempo, tem uma configuração mais confiável e muito mais estável em todas as suas estações. Além disso, é possível ter um controle dos endereços utilizados pelos hosts da rede e fornecer algumas configurações adicionais, tais como, endereço de gateway, servidor de DNS primário, servidor de DNS secundário, entre outros. 2.1 Instalando o servidor e cliente dhcp. Para instalar o servidor e o cliente de dhcp, devemos usar o seguinte comando:
Instalado o servidor, daremos início à sua configuração, seu arquivo encontra-se dentro do diretório /etc/dhcp3/dhcpd.conf As linhas que contiverem # na frente, não serão lidas pelo servidor DHCP, pois estarão comentadas.
ddns-update-style none; Esta opção especifica se o servidor DHCP deverá tentar atualizar o DNS quando um arrendamento é aceito ou devolvido. Na implementação da ISC, esta opção é obrigatória. option domain-name "marcioleonardi.com.br";
O endereço MAC de um sistema (de forma que o servidor DHCP possa reconhecê- lo quando dele receber uma solicitação). Especifica que o sistema sempre deve receber o mesmo endereço IP. Note que um hostname funciona aqui, desde que o servidor DHCP seja capaz de resolver o nome via DNS antes de responder à solicitação com as informações do arrendamento. Desta forma estará finalizada a configuração do seu servidor DHCP devendo iniciá- lo através do seguintes comandos:
FTP significa File Transfer Protocol (Protocolo de Transferência de Arquivos), e é uma forma bastante rápida e versátil de transferir arquivos, sendo uma das mais usadas na internet. Pode referir-se tanto ao protocolo quanto ao programa que implementa este protocolo (neste caso, tradicionalmente aparece em letras minúsculas, por influência do programa de transferência de arquivos do Unix). A transferência de dados em redes de computadores envolve normalmente transferência de arquivos e acesso a sistemas de arquivos remotos (com a mesma interface usada nos arquivos locais). O FTP (RFC 959) é baseado no TCP, mas é anterior à pilha de protocolos TCP/IP, sendo posteriormente adaptado para o TCP/IP. É o standard da pilha TCP/IP para transferir arquivos, é um protocolo genérico independente de hardware e do sistema operacional e transfere arquivos por livre arbítrio, tendo em conta restrições de acesso e propriedades dos arquivos. Existem diversos servidores FTP disponível para GNU/Linux, vamos utilizar o ProFTPd como exemplo para nossa experiência. 3.1 Instalando o ProFTPd. Como já vimos antes, vamos instalar o servidor através do comando apt, com os seguintes parâmetros:
3.2 Configurando o ProFTPd. Como todo daemon de um sistema GNU/Linux e Unix, o ProFTPd é configurado através de um arquivo texto, o /etc/proftpd.conf. Com um simples editor de texto é possível efetuar sua configuração. É interessante observar que o ProFTPd apenas lê seu arquivo de configuração ao ser iniciado. Portanto após cada modificação deveremos reiniciá-lo. A sintaxe do arquivo /etc/proftpd.conf é simples. O ProFTPd usa o conceito de contextos em sua configuração e nestes contextos temos as chamadas diretivas. Contexto é uma configuração global de um certo comportamento do ProFTPd
especifica #User nobody #Group nobody #Autenticação de usuário...utilizando o usuário do própio server GNU/Linux AuthUserFile /etc/passwd #login como root RootLogin on #Faz com que o usuário apenas acesse seu diretório $HOME DefaultRoot ~
Todas as devias alterações realizadas vamos reiniciar o processo com o seguinte comando:
Algumas diretivas do contexto principal:
O Secure Shell ou SSH é, simultaneamente, um programa de computador e um protocolo de rede que permite a conexão com outro computador na rede, de forma a executar comandos de uma unidade remota. Possui as mesmas funcionalidades do TELNET, com a vantagem da conexão entre o cliente e o servidor ser criptografada. As redes de computadores são uma mídia inerentemente insegura. A menos que você tem certeza que seus pacotes nunca irão passar por um roteador ou computador que você não controle direto sobre, seus dados não estão seguros. Eles podem ser visualizados por sysadmins pouco confiáveis ou por um script kiddie, ele pode ser alterado em trânsito, ou pode ser interceptado e trocado por dados completamente diferentes. 4.1 Criptografia e Assinaturas Digitais. Como mensionado anteriormente, você não pode simplesmente confiar em qualquer dado que passe pela Internet sem algum método para garantir que o dado que você envia é o mesmo dado que é recebido do outro lado. Isto parece paranóico, e na maioria dos casos é, mas é sempre melhor estar seguro que ter problemas. É muito fácil para qualquer um falsificar os seus dados durante o trânsito. E se você tem dados que são sensíveis ou privados, certamente você não vai querer que J. Random Hacker ou H. Bored Sysadmin leia o mesmo. É aqui onde a criptografia e a assinatura digital entram. Vejamos um exemplo concreto de um problema típico de segurança. Suponha que o servidor A deseje envia uma mensagem ao servidor B. Se a mensagem for enviada descriptografada e passa pelo roteador C, qualquer informação enviada é visível a root@C. Se root@C é hostil, ele pode resolver ler o que o servidor A está tentando enviar para o servidor B, e, em vez de repassar a mensagem, enviar uma mensagem falsa para B, e fazer a mesma coisa no retorno de B para A. Este é o ataque conhecido como "man-in-the-midle" ou "intermediário".
Dados Sensíveis Tipicamente os pacotes enviados pela Internet viajam por vários roteadores antes de chegar a seu destino. Cada um destes roteadores é um perigo potencial e possui completo acesso a seus dados. Esta é, claramente, uma situação inaceitável para muitos dados importantes ou sensíveis. Infelizmente as pessoas constantemente estão enviando segredos da empresa, informações pessoais, senhas, números de cartão de crédito, e outros dados privados não criptografados pela internet. Ou elas não percebem o perigo disto ou simplesmente não acreditam que valha o esforço a própria proteção. Autenticação Outra área em que a técnica de criptografia é usada é na área de autenticação - como eu fico sabendo que você é quem você diz ser? Um nome de login e senha podem ter sido seguros há 20 anos atrás, mas eles são facilmente roubados ou violados. E um esquema de login e senha pode fornecer um serviço básico de autenticação, mas uma vez autenticado, eles não garantem que os dados recebidos sejam exatamente os mesmos que foram enviados. Criptografia e assinaturas digitais são extremamente importantes para resolver estes problemas (particularmente sistemas de chave pública). Criptografia de Chave Privada vs. Pública Tradicionalmente a criptografia têm se baseado em um segredo compartilhado, conhecido como chave. Esta chave é usada em uma fórmula matemática para embaralhar a informação em questão de forma que ela não possa ser desembaralhada facilmente sem o conhecimento da chave secreta. Enquanto esta técnica pode ser bem segura quando estiver em uso um bom algoritmo e uma chave de tamanho razoável, ela introduz o problema da troca de chaves. Como você pode se comunicar com um host remoto na Internet quando você não tem um canal seguro de comunicação que você possa utilizar para transferir a chave de criptografia em primeiro lugar? Este problema tem sido resolvido tipicamente pela transferência das chaves pessoalmente. A presunção que a criptografia requer o compartilhamento do conhecimento de uma chave está tão entranhado que ele geralmente não é reconhecido. Simplesmente é assumido pela maioria que este é um defeito das técnicas de criptografia. Entretanto, tudo mudou em 1976 quando Martin Hellman, Whitfield Diffie, e Ralph Merkle apresentaram a idéia da criptografia de chave pública na Stanford University. A criptografia de chave pública aborda o problema de um ângulo completamente diferente. Aqui temos 2 chaves - uma chave privada, que é protegida cuidadosamente, e uma chave pública, que pode ser passada a quem a quiser. A chave pública pode ser derivada da chave privada, mas não vice-versa. Os
email pelo mesmo algoritmo de hash. Se o hash resultante é idêntico ao hash descriptografado, a pessoa B pode confiar que o email não foi adulterado durante o transporte. Mesmo pequenas alterações, como o acréscimo de pontuações ou espaços irá resultar em um hash completamente diferente. Assinaturas digitais são uma exigência legal em alguns estados por que são (praticamente) impossíveis de serem forjadas - certamente são muito mais difíceis de forjar que uma assinatura física. Uma aplicação popular para a criação e verificação de assinaturas digitais (bem como criptografar e descriptografar) é o PGP, ou sua alternativa livre, o GnuPG. 4.2 Instalação do OpenSSH Para instalarmos o OpenSSH, serão necessários 3 (três) pacotes, que deverão ser instalados via apt-get com o seguinte comando:
4.3 OpenSSH Básico O OpenSSH é uma implementação livre dos protocolos SSH, versão 1 e 2. O nome secure shell é um pouco equivocado, uma vez que o mesmo não é um shell da mesma forma que o bash ou do tcsh são shell, mas é mais do tipo do rsh. Ele é usado quando é preciso fazer um acesso remoto seguro a uma máquina Unix, mas devido à prevalência de script kiddies que adorariam conseguir sua senha e ober acesso livre a teus servidores, é uma boa idéia usar o mesmo sempre que você precisar fazer algum acesso remoto. O uso mais básico do ssh, e a forma que ele é usado pela maioria das pessoas, é como substituto do telnet. O telnet transmite toda comunicação, incluindo o login e senha, em texto plano, e esta informação pode facilmente ser interceptadapor qualquer um que tenha acesso físico a qualquer rede ou roteador em que os seus pacotes passarem. Qualquer coisa transmitida pela Internet em texto plano é jogo fácil para qualquer um, por isto você tem que ser cuidadoso. Usar o ssh ao invés do telnet torna muito mais difícil sua informação ser capturada. O uso básico do ssh é simples. Vamos por exemplo conectar via SSH no nosse endereço de loop-back 127.0.0.1, e com nosso usuário comum desta forma você pode usar o seguinte comando: $ ssh [email protected]. Dependendo de sua versão do ssh, você pode também ver uma mensagem mostrando a fingerprint da chave do host remoto. Esta está ligada a um hash da chave, e se você estiver sendo extremamente cuidadoso você vai trocar as fingerprints com o administrador do host remoto através de uma linha segura (tipo um telefone ou pessoalmente) antes de fazer a conexão, e então verificar se as
fingerprints são idênticas. Isto é para proteger-se de um ataque "man-in-the-middle" que eu discuti acima, onde alguém fica entre você e o servidor, trocando as chaves e criptografando e descriptografando suas comunicações de uma forma que é transparente tanto para você quanto para o servidor, mas permitindo-o ver (e alterar) toda a comunicação. Uma vez que o ssh tenha feito a conexão, ele irá pedir pela sua senha. Esta é a senha associada à conta de usuário na máquina remota que é idêntica ao username que você forneceu ao ssh (se você não fornecer um username, o ssh assume que você quer usar o username no qual você está logado atualmente na sua máquina). Quando você informar a senha, o ssh criptografa a mesma e a envia para o servidor remoto. Se a senha for idêntica à senha associada à conta remota, o ssh cria um login shell e loga você na máquina remota. A partir deste ponto, você pode usar a máquina como se estivesse logado no console. Existem duas versões diferentes do protocolo ssh - ssh1 e ssh2 (ambos são suportados pelo OpenSSH). Várias vulnerabilidades foram descobertas no ssh1, e a recomendação em geral é que se use o ssh2. 4.4 SSH Port Forwarding O telnet e outros mecanismos de login estão longe de serem os únicos protocolos de rede que tem o mau hábito de transmitir informações descriptografadas. Muitos protocolos comuns, como HTTP, POP3, ou IMAP, transmitem as informações em texto plano, possivelmente incluindo logins e senhas. Enquanto cada um destes protocolos tem uma versão protegida pelo SSL, as versões seguras não são tão comuns quanto as versões não protegidas. Além disto, a instalação de versões protegidas pelo SSL requer o uso de privilégios de superusuário, e se, por exemplo, você lê seu email via IMAP de um servidor remoto para o qual você não tem controle direto, você não pode instalar o IMAP-S. O SSH vem para o resgate aqui. Desde que você tenha acesso shell ao servidor que você deseja se conectar, o SSH pode criar um tunel criptografado para você usar como canal para suas conexões de rede. Ele faz isto criando uma conexão segura ao servidor, abrindo uma porta na sua máquina local, e canalizando tudo que recebe na porta local para uma porta específica no servidor remoto. Vamos usar o IMAP com exemplo, já que é ele que eu uso para verificar meu email. Digamos que você queira recuperar seus emails de um servidor de nome "vacuum". vacuum está rodando um servidor IMAP, mas não um protegido pelo SSL, e você prefere não transmitir seu username e senha descriptografados. Você pode chamar o ssh com o seguinte comando: $ ssh -L2001:vacuum:143 bob@vacuum