Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Apostila Linux Avançada, Notas de estudo de Cultura

Apostila Linux Avançada

Tipologia: Notas de estudo

2012

Compartilhado em 06/06/2012

carlos-rosa-17
carlos-rosa-17 🇧🇷

5

(2)

16 documentos

1 / 69

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
A P O S T I L A
D E
G N U / L I N U X
1. KERNEL
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
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25
pf26
pf27
pf28
pf29
pf2a
pf2b
pf2c
pf2d
pf2e
pf2f
pf30
pf31
pf32
pf33
pf34
pf35
pf36
pf37
pf38
pf39
pf3a
pf3b
pf3c
pf3d
pf3e
pf3f
pf40
pf41
pf42
pf43
pf44
pf45

Pré-visualização parcial do texto

Baixe Apostila Linux Avançada e outras Notas de estudo em PDF para Cultura, somente na Docsity!

D E

G N U / L I N U X

1. KERNEL

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

D E

G N U / L I N U X

executados com privilégios especiais. Alguns exemplos deste tipo de kernel:

  • BSD
  • Linux 1.2 Micro-Kernel. Micro-kernel é um termo usado para caracterizar o sistema cujas funcionalidades do sistema saíram do kernel e foram para servidores, que se comunicam com um núcleo mínimo, usando o mínimo possível o "espaço do sistema" (nesse local o programa tem acesso a todas as instruções e a todo o hardware) e deixando o máximo de recursos rodando no "espaço do usuário" (no espaço do usuário, o software sofre algumas restrições, não podendo acessar alguns hardwares, nem tem acesso a todas as instruções). Alguns exemplos deste tipo de kernel:
  • Hurd
  • Minix
  • Microsoft Windows NT

D E

G N U / L I N U X

utilizaremos a seguinte linhas de comando:

cd /usr/src

tar -xvjf linux-v.x.y.z.tar.bz

Para facilitar, criaremos um link simbólico do diretório nos quais os fontes do kernel foram extraidos.

ln -s linux-v.x.y.z linux

No proximo passo, iniciaremos a configuração para posteriormente compilarmos o kernel.

cd linux

make menuconfig

É 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:

lspci

D E

G N U / L I N U X

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).

D E

G N U / L I N U X

cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-v.x.y.z

cp /usr/src/linux/System.map /boot

cp /usr/src/linux/config-meu-kernel /boot

Agora é necesário criarmos uma imagem initrd, que é uma imagem relativa aos procedimentos de inicialização do sistema, para isso usaremos o seguinte comando:

mkinitrd /lib/modules/v.x.y.z/ -o /boot/initrd-v.x.y.z.img

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:

ln -s /boot/vmlinuz-v.x.y.z /

ln -s /boot/initrd.v.x.y.z.img /

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.

D E

G N U / L I N U X

2. SERVIDOR DHCP

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:

apt-get install dhcp3-server dhcp3-common dhcp-client

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.

vi /etc/dhcp3/dhcpd.conf

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";

D E

G N U / L I N U X

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:

/etc/init.d/dhcp3-server stop

/etc/init.d/dhcp3-server start

D E

G N U / L I N U X

3. SERVIDOR FTP

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:

apt-get install proftpd proftpd-common

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

D E

G N U / L I N U X

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:

/etc/init.d/proftpd stop

/etc/init.d/proftpd start

D E

G N U / L I N U X

Algumas diretivas do contexto principal:

D E

G N U / L I N U X

4. SERVIDOR OPENSSH

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".

D E

G N U / L I N U X

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

D E

G N U / L I N U X

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:

apt-get install openssh-server openssh-client ssh

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

D E

G N U / L I N U X

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