Mudanças entre as edições de "GER20706-2014-2"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 12: Linha 12:
  
 
== Material auxiliar ==
 
== Material auxiliar ==
*[[Media:Gerencia_de_redes.pdf | Apostila de Gerência de Redes do Prof. Odilson Tadeu Valle]]
+
* Valle, Odilson Tadeu.  [[Media:Gerencia_de_redes.pdf|Gerência de Redes]]. IFSC - Unidade São José. 2009.
*[http://wiki.sj.ifsc.edu.br/images/8/83/Comandosbasicoslinux.pdf Guia rápido de comandos básicos]
+
* [http://www.guiafoca.org/ Guia Foca Linux (intermediário ou avançado)]
*[http://wiki.sj.ifsc.edu.br/images/3/35/Comandos_basicos.pdf Guia rápido de manipulação de diretórios]
+
* Demais referências contidas na [[Gerência_de_Redes_(página)#Bibliografia_Recomendada|página principal de GER]].
*[http://gse.ufsc.br/~bezerra/disciplinas/Extensao/Linux/exercises/ex_vi.html Comandos essenciais do VI]
 
*[http://www.lagmonster.org/docs/vi.html Lista completa de comandos do VI]
 
  
 
== Aulas ==
 
== Aulas ==
 +
 +
== Aula 01 (09/08): Apresentação da Disciplina, Processo de Boot e Instalação de ''Software'' ==
 +
 +
=== Apresentação da Disciplina ===
 +
{{Collapse top | Roteiro}}
 +
# Auto apresentação
 +
# [http://wiki.sj.ifsc.edu.br Apresentação da Wiki]
 +
# Apresentação do modelo de aulas a ser adotado -- laboratório
 +
# Visão geral de Gerência de Redes
 +
## [[Gerência_de_Redes |Ementa e referências bibliográficas]]
 +
## Explanar os três blocos da disciplina: servidor, serviços, segurança e monitoramento de redes
 +
# Avaliação
 +
## Teórica
 +
## Prática
 +
## Recuperação de conteúdo e reavaliações
 +
# [[Curso_Superior_de_Tecnologia_em_Sistemas_de_Telecomunicações_(páginas_das_disciplinas)]]
 +
# [http://pt.wikipedia.org/wiki/M%C3%A1quina_virtual Conceituação das máquinas virtuais e seu uso]
 +
## Motivo de uso no laboratório
 +
{{Collapse bottom}}
 +
 +
=== O boot ===
 +
 +
{{Collapse top | Roteiro}}
 +
O processo de inicialização do sistema operacional, chamado de ''boot''. Tradicionalmente no Unix System V isto se faz com a definição de níveis de execução (''runlevels'') e uma tabela que descreve que processos ou serviços devem existir em cada nível. Os níveis de execução são:
 +
 +
# Monousuário (''single-user''), ou administrativo: usado para manutenção do sistema, admite somente o login do superusuário. Não inicia serviços de rede.
 +
# Multiusuário com rede (parcial): admite logins de usuários, mas não ativa acesso a recursos de rede (como sistemas de arquivo remotos)
 +
# Multiusuário com rede plena
 +
# Não usado
 +
# Multiusuário com rede plena e ambiente gráfico: ativa também o ambiente gráfico X11
 +
# Reinício do sistema (reboot)
 +
 +
As distribuições Linux em geral adotam a inicialização no estilo Unix System V. No entanto, o Ubuntu usa um outro processo chamado de [http://manpages.ubuntu.com/manpages/karmic/en/man7/upstart.7.html upstart]. Esse serviço de inicialização confere maior flexibilidade e mesmo simplicidade à definição de que serviços devem ser executados. O ''upstart'' não usa o conceito de níveis de execução, mas devido à sua flexibilidade ele pode emular esse estilo de inicialização. Para o ''upstart'', um serviço deve ser iniciado ou parado dependendo de uma combinação de eventos, sendo que um evento indica a ocorrência de uma etapa da inicialização.
 +
 +
O upstart é implementado pelo processo init (programa /sbin/init), que é o primeiro processo criado pelo sistema operacional. Quer dizer, logo após terminar a carga e inicialização do kernel, este cria um processo que executa o programa /sbin/init. O upstart lista o subdiretório /etc/init e procura arquivos com extensão .conf. Cada arquivo desses descreve um serviço a ser controlado pelo upstart. Por exemplo, o serviço tty2 é escrito no arquivo tty2.conf:
 +
 +
<syntaxhighlight lang=text>
 +
# tty2 - getty
 +
#
 +
# This service maintains a getty on tty2 from the point the system is
 +
# started until it is shut down again.
 +
 +
start on runlevel [23]
 +
start on runlevel [!23]
 +
 +
respawn
 +
exec /sbin/getty -8 38400 tty2
 +
</syntaxhighlight>
 +
 +
Abaixo segue o significado de cada linha:
 +
* ''start on runlevel [23]'': o serviço deve ser iniciado quando ocorrerem os eventos "runlevel 2" ou "runlevel 3"
 +
* ''stop on runlevel [!23]'': o serviço deve ser parado quando ocorrer qualquer evento "runlevel X", sendo X diferente de 2 e 3
 +
* ''respawn'': o serviço deve ser reiniciado automaticamente caso termine de forma anormal
 +
* ''exec /sbin/getty -8 38400 tty2'': a ativação do serviço implica executar o /sbin/getty -8 38400 tty2
 +
 +
Em linhas gerais, a descrição do serviço informa quando ele deve ser ativado (start), quando deve ser parado (stop), o tipo de execução (respawn para reinício automático, ou task para uma única execução), e que ação deve ser executada para ativar o serviço (exec para executar um programa, ou script .. end script para executar uma sequência de comandos de shell). Maiores detalhes podem ser lidos na [http://manpages.ubuntu.com/manpages/karmic/en/man5/init.5.html página de manual do init].
 +
 +
'''''Um exemplo de criação de serviço no upstart'''''
 +
====Atividade====
 +
#Analisar alguns serviços no /etc/init/ e verificar o conteúdo dos ''upstarts''. Tentar replicar a ideia para o faxineiro.
 +
#Criar um serviço chamado ''faxineiro'', para remover dos diretórios temporários (/var/tmp) todos os arquivos.
 +
#Configurar esse novo serviço para executar no boot, logo após o serviço '''mountall'''.
 +
#Reiniciar o sistema para testá-lo (executar ''reboot'')
 +
 +
'''Resposta'''
 +
 +
Foi proposta a criação de um serviço chamado '''faxineiro''', para remover dos diretórios temporários (/tmp e /var/tmp).
 +
 +
# Criar o arquivo /etc/init/faxineiro.conf
 +
# Adicionar o seguinte conteúdo a esse arquivo:<syntaxhighlight lang=text>
 +
start on startup
 +
script
 +
rm -rf /tmp/*
 +
rm -rf /var/tmp/*
 +
end script</syntaxhighlight>
 +
# Reiniciar o sistema para testá-lo (executar ''reboot'')
 +
 +
{{Collapse bottom}}
 +
 +
=== Instalação de software ===
 +
 +
{{Collapse top | Roteiro}}
 +
A instalação de software pode ser feita de diversas formas, dentre as quais serão destacadas três:
 +
 +
* '''Com utilitário ''apt-get''''': busca o software de um repositório de rede e o instala; dependências (outros softwares necessários) são automaticamente instaladas. Esses softwares buscados da rede estão no formato ''dpkg (Debian Package)''.
 +
 +
Exemplo de uso do apt-get:
 +
 +
** Instalar o navegador de texto lynx
 +
<!-- apt-get install lynx -->
 +
 +
** Testar o navegador lynx
 +
lynx http://www.ifsc.edu.br/
 +
 +
** Remover o lynx
 +
<!-- apt-get --auto-remove remove lynx -->
 +
 +
* '''Diretamente com utilitário [http://manpages.ubuntu.com/manpages/karmic/en/man1/dpkg.1.html dpkg]''': instala um software que está contido em um arquivo no formato ''dpkg''.
 +
 +
Exemplo de uso:
 +
 +
** Obter os pacotes Debian para o lynx
 +
wget ftp://ftp.cn.debian.org/ubuntu-old-releases/ubuntu/pool/main/l/lynx-cur/lynx_2.8.7pre6-1_all.deb
 +
wget ftp://mirror.linux.org.au/ubuntu/pool/main/l/lynx-cur/lynx-cur_2.8.7pre6-1_i386.deb
 +
 +
** Instalar os pacotes
 +
<!-- dpkg -i lynx-cur_2.8.7pre6-1_i386.deb lynx_2.8.7pre6-1_all.deb -->
 +
 +
** Testar o lynx
 +
lynx ...
 +
 +
** Remover os pacotes instalados
 +
<!-- dpkg -r lynx lynx-cur -->
 +
 +
 +
* '''A partir do código fonte''': busca-se manualmente na rede o código fonte do software desejado, que deve então ser compilado e instalado. Esta opção se aplica quando não existe o software no formato ''dpkg'', ou a versão disponível em formato ''dpkg'' foi compilada de uma forma que não atende os requisitos para seu uso em seu servidor.
 +
{{Collapse bottom}}
 +
 +
<!--
 +
== Aula 02 (20/02): RAID ==
 +
 +
{{Collapse top | Roteiro}}
 +
[http://en.wikipedia.org/wiki/RAID RAID (''Redundant Array of Independent Disks'')] se destina a combinar discos de forma a incrementar o desempenho de entrada e saída e, principalmente, segurança dos dados contra defeitos em discos. RAID pode ser provido via software ou hardware (melhor este último). O Linux possui implementação por software em seu kernel, e neste [http://tldp.org/HOWTO/Software-RAID-HOWTO.html HOWTO] há uma descrição resumida.
 +
 +
Há vários níveis RAID, que correspondem a diferentes combinações de discos e partições. São eles:
 +
* '''''LINEAR''''': concatena discos ou partições, mas não provê acréscimos de desempenho, nem de segurança dos dados (pelo contrário ! se um disco falhar, perdem-se todos os dados ...).
 +
* '''''RAID 0 (ou striping)''''':  combina discos ou partições de forma alternada, para distribuir os acessos entre eles (aumentar desempenho). Porém, se um disco falhar perdem-se todos os dados. Requer um mínimo de dois discos. <br>[[Imagem:RAID_0.png|100px]]
 +
* '''''RAID 1 (ou mirroring)''''': combina discos ou partições para espelhar dados (segurança). Requer o dobro de discos necessários para guardar os dados (ex: se há dois discos com dados, são necessários outros dois para espelhamento). Se todos os discos falharem, é possível continuar a operar usando os discos espelhados. Requer no mínimo dois discos. <br> [[Imagem:RAID_1.png|100px]]
 +
* '''''RAID 4 e 5''''': combina discos ou partições para ter redundância de dados (segurança), usando um esquema baseado em paridade. Se um disco falhar, é capaz de continuar operando (porém com desempenho reduzido até que esse disco seja reposto). RAID 4 na prática não se usa, pois apresenta um gargalo no disco onde residem os blocos de paridades. Requer no mínimo três discos. <br>[[Imagem:RAID_4.png|200px]] [[Imagem:RAID_5.png|200px]]
 +
* '''''RAID 6''''': combina discos ou partições para ter redundância de dados (segurança), usando um esquema baseado em paridade de forma duplicada. Isto garante que os dados se preservam mesmo que dois discos se danifiquem. Requer no mínimo quatro discos (pois há dois discos adicionais para paridades).<br>[[Imagem:RAID_6.png|200px]]
 +
* '''''RAID 10''''': combina RAID 1 e RAID 0, criando um volume com espelhamento (RAID 1), e depois fazendo o ''striping'' (RAID 0). Requer no mínimo quatro discos. <br> [[Imagem:RAID_10.png|200px]]
 +
* '''''RAID 01''''': combina RAID 0 e RAID 1, criando um volume com ''striping'' (RAID 0), e depois fazendo o espelhamento (RAID 1). Requer no mínimo quatro discos. <br> [[Imagem:RAID_01.png|200px]]
 +
 +
Criação de um volume RAID no Linux:
 +
 +
# Usar o comando ''mdadm --create --verbose /dev/md0 --level=NIVEL_RAID --raid-devices=NUM_PARTICOES  PARTICAO_1  PARTICAO_2 ...''
 +
#*NIVEL_RAID pode ser ''linear'', ''0'', ''1'',  ''4'', ''5'', ''6'', ''10'', ''mp'', ''faulty'' (mais comuns são 0, 1 e 5).
 +
#*NUM_PARTICOES é a quantidade de partições usadas no volume.
 +
#*As partições são identificadas com o caminho (''pathname'') do dispositivo correspondente no Linux. Ex: a primeira partição do primeiro disco SCSI ou SATA é /dev/sda1, a segunda partição desse disco é /dev/sda2, a primeira partição do segundo disco SCSI ou SATA é /dev/sdb1, e assim por diante.
 +
#* /dev/md0 é o caminho do dispositivo que corresponde ao volume RAID a ser criado. O primeiro volume RAID é /dev/md0, o segundo é /dev/md1, e assim por diante.
 +
# Formatar o volume RAID: ''mkfs.ext4 -j /dev/md0''
 +
# Uma vez testado o volume RAID, sua configuração pode ser salva para posterior uso: ''mdadm --detail --scan >> /etc/mdadm/mdadm.conf''
 +
#* Isto é importante para que o volume possa ser ativado automaticamente no próximo ''boot''.
 +
 +
Para ativar um volume já criado, basta executar ''mdadm --assemble caminho_do_volume''. Ex: ''mdadm --assemble /dev/md0'', ''mdadm --assemble /dev/md1''.
 +
 +
'''''Atividade:'''''
 +
 +
# Dica: crie uma cópia de sua máquina virtual (snapshot - ferramenta do VirtualBox) antes de executar o roteiro, caso dê problemas a recuperação é muito simples.
 +
# Crie duas partições de mesmo tamanho no disco /dev/sdb usando o cfdisk. Marque-as como sendo do tipo Linux RAID (fdisk t = "fd").
 +
# Crie um volume RAID nível 1 com essas partições. Formate-o e monte-o em /mnt. Qual o tamanho total dele ?
 +
# Desmonte e Pare o volume existente, com ''mdadm -S /dev/md0''
 +
# Crie um volume RAID nível 0 com essas partições. Formate-o e monte-o em /mnt. Qual o tamanho total dele ?
 +
# Desmonte e Pare o volume existente, com ''mdadm -S /dev/md0''
 +
# Crie um volume RAID nível 5 com essas partições. Formate-o e monte-o em /mnt. Qual o tamanho total dele ?
 +
# Desmonte e Pare o volume existente, com ''mdadm -S /dev/md0''
 +
 +
'''''Desafio'''''
 +
# Crie dois novos discos (virtuais) no VirtualBox, no diretório do aluno (vai ser apagado no reboot da máquina) e associe a sua máquina virtual. Isto deverá ser feito com a máquina virtual desligada.
 +
# Crie uma partição em cada disco virtual, ocupando o tamanho total.
 +
# Crie duas partições de mesmo tamanho no disco /dev/sd? usando o cfdisk. Marque-as como sendo do tipo Linux RAID (fdisk t = "fd").
 +
# Crie um volume RAID nível 1 com essas partições. Formate-o e monte-o em /mnt.
 +
# Copie, crie uma série de arquivos ou diretórios nesta partição.
 +
# Desligue a máquina virtual e desassocie um dos discos.
 +
# Religue a máquina e verifique se os dados estão intactos.
 +
 +
{{Collapse bottom | Roteiro}}
 +
-->
 +
<!--
 +
== 23/09: LVM ==
 +
 +
Capítulo 15 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | Roteiro}}
 +
 +
Armazenamento com Gerenciador de Volumes Lógicos (LVM). Ver páginas 57 e 58 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
Há um [http://tldp.org/HOWTO/LVM-HOWTO HOWTO] com informação adicional sobre LVM no Linux, e [http://en.wikipedia.org/wiki/Logical_volume_management outro] com uma definição mais geral na Wikipedia.
 +
 +
LVM combina volumes físicos (ou PV, de Physical Volume), tais como discos, partições e volumes RAID, em uma abstração chamada ''grupo de volumes (ou VG, de Volume Group)''. Um VG funciona como um grande disco virtual, que pode ser dividido em volumes lógicos (LV, de Logical Volume). Cada LV pode ser usado para conter um sistema de arquivos, memória virtual (área de swap), ou qualquer outra finalidade de armazenamento (ex: área de dados de um banco de dados Oracle). A figura abaixo mostra
 +
a relação entre esses componentes, com exemplos de utilização dos LV:
 +
 +
[[Imagem:Lvm-lg.gif|640px]]
 +
<br>Diagrama  do LVM (obtido no [http://linuxdevcenter.com/pub/a/linux/2006/04/27/managing-disk-space-with-lvm.html?page=1 Linux DevCenter])
 +
<br><br>
 +
 +
Um resumo dos componentes do LVM segue abaixo:
 +
* '''VG''': Volume Group, que representa um disco lógico
 +
* '''PE''': Physical Extent, ou uma subdivisão do PV (são todas de mesmo tamanho), que funciona como unidade de alocação de espaço
 +
* '''LE''': Logical Extent, o equivalente ao PE, porém no contexto do LV
 +
* '''PV''': Physical Volume, ou uma partição física
 +
* '''LV''': Logical Volume, ou uma partição lógica criada dentro do VG
 +
 +
Em sua estrutura interna, o LVM divide cada PV em pequenas partições chamadas de PE (Physical Extent). Um tamanho típico para as PE é de 4 MB. Essas PE são usadas para alocar espaço para os LV, porém não há nenhuma relação entre a ordem física das PE nos PV e a ordem em que elas são alocadas aos LV - é normal inclusive PE de diferentes PV serem alocadas ao mesmo LV. Dentro de cada LV cada PE é chamada de LE (Logical Extent). A figura abaixo relaciona as PE com as LE dos LV:
 +
 +
[[Imagem:Lvm1-linux.png]]
 +
<br>Diagrama para LVM versão 1 (LVM1) no Linux.<br><br>
 +
 +
=== Criação do LVM no Linux ===
 +
 +
A sequência de criação de um VG e seus LV é a seguinte:
 +
# Criar partições físicas do tipo 8E (Linux LVM), que serão usadas para serem os PV
 +
# Preparar essas partições para serem usadas como PV, usando o comando ''lvm pvcreate caminho_partição (ex: lvm pvcreate /dev/sdb1)''
 +
# Criar o VG, usando o comando ''lvm vgcreate nome_vg pv1 [pv2 ...] (ex: lvm vgcreate meu_vg /dev/sdb1 /dev/sdb2)''
 +
# Criar os LV, com o comando ''lvm lvcreate nome_vg -L tamanho_LV -n nome_LV (ex: lvm lvcreate meu_vg -L 512M -n teste)''
 +
# Formatar os LV (ex: ''mke4fs -j /dev/meu_vg/teste'', para formatar com sistema de arquivos ext4)
 +
 +
Abaixo segue um exemplo de uma sequência de comandos relacionados com LVM, desde o particionamento de um disco até o redimensionamento de um  LV existente:
 +
 +
<syntaxhighlight lang=bash>
 +
# Prepara as partições (devem ser do tipo 8E (Linux LVM)
 +
fdisk /dev/sdb
 +
 +
# Prepara essas duas partições para serem usadas como volumes físicos
 +
lvm pvcreate /dev/sdb1
 +
lvm pvcreate /dev/sdb2
 +
 +
# Cria o volume group "vg"
 +
lvm vgcreate vg /dev/sdb1 /dev/sdb2
 +
 +
# Cria dentro do volume group "vg" um volume lógico "dados" com 512 MB iniciais
 +
lvm lvcreate vg -L 512M -n dados
 +
 +
# Cria dentro do volume group "vg" um volume lógico "teste" com 256 MB iniciais
 +
lvm lvcreate vg -L 256M -n teste
 +
 +
# Mostra informações sobre todos os volumes lógicos
 +
lvm lvs
 +
 +
# Mostra detalhes sobre o volume lógico "dados", que pertence ao volume group "vg"
 +
lvm lvdisplay /dev/vg/dados
 +
 +
# Formata o volume lógico "dados" com sistema de arquivos do tipo "ext4"
 +
mkfs.ext4 -j /dev/vg/dados
 +
 +
# Formata o volume lógico "teste" com sistema de arquivos do tipo "xfs"
 +
mkfs.xfs /dev/vg/teste
 +
 +
# Monta o Volume Lógico dados em /mnt
 +
mount /dev/vg/dados /mnt
 +
 +
# Confererência
 +
df -h
 +
 +
# Aumenta em 100 MB o tamanho do volume lógico "dados"
 +
lvm lvresize -L +100M /dev/vg/dados
 +
 +
# Aumenta o sistema de arquivos contido no volume lógico "dados", para adaptá-lo ao seu novo tamanho
 +
resize2fs /dev/vg/dados
 +
 +
</syntaxhighlight>
 +
 +
Questões importantes:
 +
# O que é LVM, e qual sua relação com os discos físicos ?
 +
# Para que usar LVM (o que se ganha com seu uso) ?
 +
# Existe algum problema que possa ocorrer com o uso do LVM ? Por exemplo, se um disco apresentar defeito ?
 +
 +
{{Collapse bottom | Roteiro}}
 +
-->
 +
<!--
 +
== 27/02: Usuários e grupos ==
 +
 +
Capítulos 16 e 17 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
{{Collapse top | Roteiro}}
 +
Criação de contas de usuários e de grupos, e seu uso para conferir permissões de acesso a arquivos, diretórios e recursos do sistema operacional.
 +
[[Media:Gerencia_de_redes.pdf|Apostila]], páginas 61 a 65.
 +
 +
Um usuário no Linux (e no Unix em geral) é definido pelo seguinte conjunto de informações:
 +
 +
* '''Nome de usuário (ou ''login''):''' um apelido que identifica o usuário no sistema
 +
* '''UID (User Identifier):''' um número único que identifica o usuário
 +
* '''GID (Group Identifier):''' o número do grupo primário do usuário
 +
* '''Senha (password):''' senha para verificação de acesso
 +
* '''Nome completo (''full name''):''' nome completo do usuário
 +
* '''Diretório inicial (''homedir''):''' o subddiretório pessoal do usuário, onde ele é colocado ao entrar no sistema
 +
* '''Shell:''' o programa a ser executado quando o usuário entrar no sistema
 +
 +
As contas de usuários, que contêm as informações acima, podem ficar armazenadas em diferentes bases de dados (chamadas de ''bases de dados de usuários''). Dentre elas, a mais simples é composta pelo arquivo [http://www.kernel.org/doc/man-pages/online/pages/man5/passwd.5.html ''/etc/passwd'']:
 +
 +
root:x:0:0:root:/root:/bin/bash
 +
sshd:x:71:65:SSH daemon:/var/lib/sshd:/bin/false
 +
suse-ncc:x:105:107:Novell Customer Center User:/var/lib/YaST2/suse-ncc-fakehome:/bin/bash
 +
wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false
 +
man:x:13:62:Manual pages viewer:/var/cache/man:/bin/bash
 +
news:x:9:13:News system:/etc/news:/bin/bash
 +
uucp:x:10:14:Unix-to-Unix CoPy system:/etc/uucp:/bin/bash
 +
roberto:x:1001:100:Roberto de Matos:/data1/roberto:/bin/bash
 +
 +
Acima um exemplo de arquivo ''/etc/passwd''
 +
 +
Cada linha desse arquivo define uma conta de usuário no seguinte formato:
 +
 +
''nome de usuário:senha:UID:GID:Nome completo:Diretório inicial:Shell''
 +
 +
O campo ''senha'' em ''/etc/passwd'' pode assumir os valores:
 +
* ''x'': significa que a senha se encontra em ''/etc/shadow''
 +
* ''*'': significa que a conta está bloqueada
 +
* ''senha encriptada'': a senha de fato, porém encriptada usando algoritmo hash [http://pt.wikipedia.org/wiki/Md5 MD5] ou [http://www.kernel.org/doc/man-pages/online/pages/man3/crypt.3.html crypt]. Porém usualmente a senha fica armazenada no arquivo ''/etc/shadow''.
 +
 +
O arquivo ''/etc/shadow'' armazena exclusivamente as informações relativas a senha e validade da conta. Nele cada conta possui as seguintes informações:
 +
* Nome de usuário
 +
* Senha encriptada (sobrepõe a senha que porventura exista em ''/etc/passwd'')
 +
* Data da última modificação da senha
 +
* Dias até que a senha possa ser modificada (validade mínima da senha)
 +
* Dias após que a senha deve ser modificada
 +
* Dias antes da expiração da senha em que o usuário deve ser alertado
 +
* Dias após a expiração da senha em que a conta é desabilitada
 +
* Data em que a conta foi desabilitada
 +
 +
Um exemplo do arquivo ''/etc/shadow'' segue abaixo:
 +
 +
root:$2a$05$8IZNUuFTMoA3xv5grggWa.oBUBfvrE4MfgRDTlUI1zWDXGOHi9dzG:13922::::::
 +
suse-ncc:!:13922:0:99999:7:::
 +
uucp:*:13922::::::
 +
wwwrun:*:13922::::::
 +
roberto:$1$meoaWjv3$NUhmMHVdnxjmyyRNlli5M1:14222:0:99999:7:::
 +
 +
''Exercício: quando a senha do usuário ''roberto'' irá expirar ?''
 +
 +
Um grupo é um conjunto de usuários definido da seguinte forma:
 +
* '''Nome de group (group name):''' o nome que identifica o grupo no sistema
 +
* '''GID (Group Identifier):''' um número único que identifica o grupo
 +
* '''Lista de usuários:''' um conjunto de usuários que são membros do grupo
 +
 +
Assim como as contas de usuários, os grupos ficam armazenados em bases de dados de usuários, sendo o arquivo ''/etc/group'' a mais simples delas:
 +
 +
root:x:0:
 +
trusted:x:42:
 +
tty:x:5:
 +
utmp:x:22:
 +
uucp:x:14:
 +
video:x:33:roberto
 +
www:x:8:roberto
 +
users:x:100:
 +
radiusd:!:108:
 +
vboxusers:!:1000:
 +
 +
Os membros de um grupo são os usuários que o têm como grupo primário (especificado na conta do usuário em ''/etc/passwd''), ou que aparecem listados em ''/etc/group''.
 +
 +
=== Gerenciamento de usuários e grupos ===
 +
 +
Para gerenciar usuários e grupos podem-se editar diretamente os arquivos ''/etc/passwd'', ''/etc/shadow'' e ''/etc/group'', porém existem utilitários que facilitam essa tarefa:
 +
 +
* '''useradd''' ou '''adduser''': adiciona um usuário
 +
** Ex: ''useradd -c "Roberto de Matos" -m roberto'' : cria o usuário ''roberto'' com nome completo "Roberto de Matos"
 +
** Ex: ''useradd -c "Roberto de Matos" -g users -u 5000 -d /usuarios/roberto -s /bin/tcsh -m roberto'' : cria o usuário ''roberto'' com nome completo "Roberto de Matos", UID 5000, grupo ''users'', diretório inicial /usuarios/roberto e shell /bin/tcsh
 +
* '''userdel:''' remove um usuário
 +
** Ex: ''userdel roberto'' : remove o usuário ''roberto'', porém preservando seu diretório home
 +
** Ex: ''userdel -r roberto'' : remove o usuário ''roberto'', incluindo seu diretório home
 +
* '''usermod:''' modifica as informações da conta de um usuário
 +
** Ex: ''usermod -u 5001 roberto'' : modifica o UID do usuário ''roberto''
 +
** Ex: ''usermod -g wheel roberto'' : modifica o GID do usuário ''roberto''
 +
** Ex: ''usermod -G users,wheel roberto'' : modifica os grupos secundários do usuário ''roberto''
 +
** Ex: ''usermod -d /contas/roberto roberto'' : modifica o diretório inicial do usuário ''roberto'' (mas não copia os arquivos ...)
 +
* '''groupadd:''' adiciona um grupo
 +
** Ex: ''groupadd -g 4444 ger'': cria o grupo ''ger'' com GID 4444
 +
* '''groupdel:''' remove um grupo
 +
** Ex: ''groupdel ger'': remove o grupo ''ger''
 +
* '''groupmod:''' modifica um grupo
 +
** Ex: ''groupmod -g 5555 ger'': modifica o GID do grupo ger
 +
** Ex: ''groupmod -A roberto ger'': adiciona o usuário ''roberto'' ao grupo ger
 +
** Ex: ''groupmod -R roberto ger'': remove o usuário ''roberto'' do grupo ger
 +
 +
Esses utilitários usam os arquivos ''/etc/login.defs'' e ''/etc/default/useradd'' para obter seus parâmetros padrão. O ''/etc/adduser.conf'' tem o mesmo intuito mas é seta exclusivamente os parâmetros do comando ''adduser''. O arquivo /etc/login.defs contém uma série de diretivas e padrões que serão utilizados na criação das próximas contas de usuários. Seu principal conteúdo é:
 +
 +
MAIL_DIR dir # Diretório de e-mail
 +
PASS_MAX_DAYS 99999 #Número de dias até que a senha expire
 +
PASS_MIN_DAYS 0 #Número mínimo de dias entre duas trocas senha
 +
PASS_MIN_LEN 5 #Número mínimo de caracteres para composição da senha
 +
PASS_WARN_AGE 7 #Número de dias para notificação da expiração da senha
 +
UID_MIN 500 #Número mínimo para UID
 +
UID_MAX 60000 #Número máximo para UID
 +
GID_MIN 500 #Número mínimo para GID
 +
GID_MAX 60000 #Número máximo para GID
 +
CREATE_HOME yes #Criar ou não o diretório home
 +
 +
Como o login.defs o arquivo /etc/default/useradd contém padrões para criação de contas. Seu principal conteúdo é:
 +
 +
GROUP=100 #GID primário para os usuários criados
 +
HOME=/home #Diretório a partir do qual serão criados os “homes”
 +
INACTIVE=-1 #Quantos dias após a expiração da senha a conta é desativada
 +
EXPIRE=AAAA/MM/DD #Dia da expiração da conta
 +
SHEL=/bin/bash #Shell atribuído ao usuário.
 +
SKEL=/etc/skel #Arquivos e diretórios padrão para os novos usuários.
 +
GROUPS=video,dialout
 +
CREATE_MAIL_SPOOL=no
 +
 +
O /etc/adduser.conf também possui uma série de padrões que funcionam especificamente para o comando adduser:
 +
DSHELL=/bin/bash #Shell atribuído ao usuário.
 +
DHOME=/home #Diretório a partir do qual serão criados os “homes”
 +
SKEL=/etc/skel #Arquivos e diretórios padrão para os novos usuários.
 +
FIRST_UID=1000 #Número mínimo para UID
 +
LAST_UID=29999 #Número máximo para UID
 +
FIRST_GID=1000 #Número mínimo para GID
 +
LAST_GID=29999 #Número máximo para GID
 +
QUOTAUSER="" #Se o sistema de cotas estiver funcional, pode atribuir quota ao usuário criado.
 +
 +
=== Permissões ===
 +
 +
Há uma maneira de restringir o acesso aos arquivos e diretórios para que somente determinados usuários possam acessá-los. A cada arquivo e diretório é associado um conjunto de permissões. Essas permissões determinam quais usuários podem ler, e escrever (alterar) um arquivo e, no caso de ser um arquivo executável, quais usuários podem executá-lo. Se um usuário tem permissão de execução para um diretório, significa que ele pode realizar buscas dentro daquele diretório, e não executá-lo como se fosse um programa.
 +
 +
Quando um usuário cria um arquivo ou um diretório, o LINUX determina que ele é o proprietário (owner) daquele arquivo ou diretório. O esquema de permissões do LINUX permite que o proprietário determine quem tem acesso e em que modalidade eles poderão acessar os arquivos e diretórios que ele criou. O super-usuário (root), entretanto, tem acesso a qualquer arquivo ou diretório do sistema de arquivos.
 +
 +
O conjunto de permissões é dividido em três classes: proprietário, grupo e usuários. Um grupo pode conter pessoas do mesmo departamento ou quem está trabalhando junto em um projeto. Os usuários que pertencem ao mesmo grupo recebem o mesmo número do grupo (também chamado de Group Id ou GID). Este número é armazenado no arquivo /etc/passwd junto com outras informações de identificação sobre cada usuário. O arquivo /etc/group contém informações de controle sobre todos os grupos do sistema. Assim, pode -se dar permissões de acesso diferentes para cada uma destas três classes.
 +
 +
Quando se executa ''ls -l'' em um diretório qualquer, os arquivos são exibidos de maneira semelhante a seguinte:
 +
 +
> ls -l
 +
total 403196
 +
drwxr-xr-x 4 odilson admin 4096 Abr 2 14:48 BrOffice_2.1_Intalacao_Windows/
 +
-rw-r--r-- 1 luizp admin 113811828 Out 31 21:28 broffice.org.2.0.4.rpm.tar.bz2
 +
-rw-r--r-- 1 root root 117324614 Dez 27 14:47 broffice.org.2.1.0.rpm.tar.bz2
 +
-rw-r--r-- 1 luizp admin 90390186 Out 31 22:04 BrOo_2.0.4_Win32Intel_install_pt-BR.exe
 +
-rw-r--r-- 1 root root 91327615 Jan 5 21:27 BrOo_2.1.0_070105_Win32Intel_install_pt-BR.exe
 +
>
 +
 +
As colunas que aparecem na listagem são:
 +
# Esquema de permissões;
 +
# Número de ligações do arquivo;
 +
# Nome do usuário dono do arquivo;
 +
# Nome do grupo associado ao arquivo;
 +
# Tamanho do arquivo, em bytes;
 +
# Mês da criação do arquivo; Dia da criação do arquivo;
 +
# Hora da criação do arquivo;
 +
# Nome do arquivo;
 +
 +
O esquema de permissões está dividido em 10 colunas, que indicam se o arquivo é um diretório ou não (coluna 1), e o modo de acesso permitido para o proprietário (colunas 2, 3 e 4), para o grupo (colunas 5, 6 e 7) e para os demais usuários (colunas 8, 9 e 10).
 +
 +
Existem três modos distintos de permissão de acesso: leitura (read), escrita (write) e execução (execute). A cada classe de usuários você pode atribuir um conjunto diferente de permissões de acesso. Por exemplo, atribuir permissão de acesso irrestrito (de leitura, escrita e execução) para você mesmo, apenas de leitura para seus colegas, que estão no mesmo grupo que você, e nenhum acesso aos demais usuários. A permissão de execução somente se aplica a arquivos que podem ser executados, obviamente, como programas já compilados ou script shell. Os valores válidos para cada uma das colunas são os seguintes:
 +
*1 d se o arquivo for um diretório;-se for um arquivo comum;
 +
*2,5,8 r se existe permissão de leitura;-caso contrário;
 +
*3,6,9 w se existe permissão de alteração;-caso contrário;
 +
*4,7,10 x se existe permissão de execução;-caso contrário;
 +
 +
A permissão de acesso a um diretório tem outras considerações. As permissões de um diretório podem afetar a disposição final das permissões de um arquivo. Por exemplo, se o diretório dá permissão de gravação a todos os usuários, os arquivos dentro do diretório podem ser removidos, mesmo que esses arquivos não tenham permissão de leitura, gravação ou execução para o usuário. Quando a permissão de execução é definida para um diretório, ela permite que se pesquise ou liste o conteúdo do diretório.
 +
 +
A modificação das permissões de acesso a arquivos e diretórios pode ser feita usando-se os utilitários:
 +
* '''[http://manpages.ubuntu.com/manpages/karmic/en/man1/chmod.1.html chmod]:''' muda as permissões de acesso (também chamado de modo de acesso). Somente pode ser executado pelo dono do arquivo ou pelo superusuário
 +
** Ex: ''chmod +x /home/usuario/programa'' : adiciona para todos os usuários a permissão de execução ao arquivo /home/usuario/programa
 +
** Ex: ''chmod -w /home/usuario/programa'' : remove para todos os usuários a permissão de escrita do arquivo /home/usuario/programa
 +
** Ex: ''chmod o-rwx /home/usuario/programa'' : remove todas as permissões de acesso ao arquivo /home/usuario/programa para todos os usuários que não o proprietário e membros do grupo proprietário
 +
** Ex: ''chmod 755 /home/usuario/programa'' : define as permissões rwxr-xr-x para o arquivo /home/usuario/programa
 +
* '''[http://manpages.ubuntu.com/manpages/karmic/en/man1/chown.1.html chown]:''' muda o proprietário de um arquivo. Somente pode ser executado pelo superusuário.
 +
** Ex: ''chown roberto /home/usuario/programa'': faz com que o usuário ''roberto'' seja o dono do arquivo
 +
* '''[http://manpages.ubuntu.com/manpages/hardy/pt/man1/chgrp.1.html chgrp]''': muda o grupo dono de um arquivo. Somente pode ser executado pelo superusuário.
 +
** Ex: ''chgrp users /home/usuario/programa'': faz com que o grupo ''users'' seja o grupo dono do arquivo /home/usuario/programa
 +
 +
Há também o utilitário [http://manpages.ubuntu.com/manpages/karmic/en/man1/umask.1posix.html umask], que define as permissões default para os novos arquivos e diretórios que um usuário criar. Esse utilitário define uma máscara (em octal) usada para indicar que permissões devem ser removidas. Exemplos:
 +
 +
* ''umask 022'': tira a permissão de escrita para group e demais usuários
 +
* ''umask 027'': tira a permissão de escrita para group, e todas as permissões para demais usuários
 +
 +
=== Atividade ===
 +
 +
# Crie o grupo turma.
 +
# Crie o diretório /home/contas.
 +
# Faça cópia dos arquivos a serem alterados: /etc/login.defs e /etc/default/useradd.
 +
# Faça com que o diretório home dos  usuários, a serem criados a partir de agora, seja por padrão dentro de /home/contas.
 +
# Faça com que os usuários sejam criados com o seguinte perfil, por padrão:
 +
## Expiração de senha em 15 dias a partir da criação da conta;
 +
## Usuário possa alterar senha a qualquer momento;
 +
## Data do bloqueio da conta em 7 dias após a expiração da senha.
 +
## Inicie os avisos de expiração da senha 4 dia antes de expirar.
 +
## Iniciar a numeração de usuários (ID) a partir de 1500.
 +
# Crie um usuário com o nome de manoel, pertencente ao grupo turma.
 +
# Dê ao usuário manoel a senha mane123.
 +
# Acrescente ao perfil do usuário seu nome completo e endereço: Manoel da Silva, R. dos Pinheiros, 2476666.
 +
# Verifique o arquivo /etc/passwd.
 +
# Mude, por comandos, o diretório home do manoel de /home/contas/manoel para /home/manoel.
 +
# Mude o login do manoel para manoelsilva.
 +
# Logue como manoelsilva.
 +
# Recomponha os arquivos originais do item 3.
 +
 +
Permissionamento de arquivos e grupos de usuários
 +
# Crie a partir do /home 3 diretórios, um com nome aln (aluno), outro prf (professor) e o último svd (servidor).
 +
# Crie 3 grupos com os mesmos nomes acima.
 +
# Crie 3 contas pertencentes ao grupo aln: aluno1, aluno2, aluno3. Estas contas deverão ter seus diretórios homes criados por comando dentro do diretório /home/aln/. Por exemplo para o aluno1 teremos /home/aln/aluno1.
 +
# Crie 3 contas pertencentes ao grupo prf: prof1, prof2, prof3. Estas contas deverão ter seus diretórios homes criados  por comando dentro do diretório /home/prf/.
 +
# Crie 3 contas pertencentes ao grupo svd: serv1, serv2, serv3. Estas contas deverão ter seus diretórios homes criados por comando dentro do diretório /home/svd/.
 +
# Os diretórios dos alunos, e todo o seu conteúdo, devem ser visíveis e editáveis aos membros do próprio grupo, visíveis mas não apagáveis a todos os demais usuários da rede.
 +
# Já os diretórios dos professores e servidores, devem ser mutuamente visíveis, mas não apagáveis, entre os membros dos grupos professores e servidores mas não deve ser sequer visível aos membros do grupo alunos.
 +
{{Collapse bottom | Roteiro}}
 +
-->
 +
<!--
 +
== 06/03: Quotas de disco e Agendamento de Tarefas==
 +
 +
Capítulos 18 e 19 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | Quotas de disco}}
 +
 +
[http://en.wikipedia.org/wiki/Disk_quota Quotas de disco] servem para limitar o uso de espaço pelos usuários. Ver também [[Media:Gerencia_de_redes.pdf|Apostila de Gerência de Redes]], páginas 68 a 70.
 +
 +
Em servidores não se pode correr o risco de poucos usuários utilizarem tanto espaço de disco que impeça outros usuários de trabalharem. Quer dizer, deve-se implantar algum mecanismo que limite o espaço a ser usado por cada usuário, para evitar que o espaço livre no volume se esgote. Quotas de disco é um mecanismo simples para impor tal limitação, estando disponível em todos os sistemas operacionais usados em servidores.
 +
 +
Os sistemas operacionais Linux oferecem um [http://www.faqs.org/docs/Linux-mini/Quota.html mecanismo simples para impor quotas]. Para cada sistema de arquivos é possível ativar ou não o uso de quotas, e fazer um controle de quota por usuário ou grupo. Os sistemas de arquivos de uso mais difundido, tais como EXT3FS, EXT4FS, XFS, ReiserFS e JFS, suportam o uso de quotas (o que não é o caso de VFAT, usado majoritariamente em ''pendrives'' atualmente, por exemplo). O sistema operacional controla diretamente o uso do espaço, evitando que o limite estabelecido seja ultrapassado. Desta forma, se um arquivo estiver sendo gravado e o limite de espaço for atingido, a operação de escrita é abortada com um erro de quota excedida (como resultado, o arquivo ficaria truncado). Mas como essa forma de impor um limite pode ser muito estrita, o sistema de quotas define na verdade dois limites:
 +
 +
* '''''soft limit:''''' pode ser ultrapassado, no entanto gera um alerta para o usuário. No entanto, se o espaço total usado pelo usuário ficar acima desse limite continuamente por um número predefinido de dias, esse limite se torna estrito (quer dizer, se torna um ''hard limit'').
 +
* '''''hard limit:''''' não pode ser ultrapassado, gerando um erro de escrita.
 +
 +
Abaixo pode-se ver um exemplo do uso de disco pelo usuário ''roberto'', em um sistema de arquivos com quotas ativadas. Nesse caso, ''roberto'' está usando em torno de 30 MB dentro do sistema de arquivos contido no dispositivo /dev/sdb2, e que está montado em /usuarios. O uso total atual está na coluna ''blocos'' (1 kB cada), ''soft limit'' aparece na coluna ''quota'' e o ''hard limit'' está em ''limite'':
 +
 +
roberto@ger:~$ quota -v roberto
 +
Sistema de arquivos  blocos  quota  limite  grace arquivos  quota  limite  grace
 +
      /dev/sdb2      30724  100000  150000                2      0      0     
 +
 +
roberto@ger:~$ ls -l /usuarios/roberto/teste
 +
total 30720
 +
-rw-r--r-- 1 roberto roberto 62914560 2010-02-28 19:32 teste
 +
 +
Além disto, note-se que há outras colunas reportadas acima, tais como ''grace'' e ''arquivos''. A coluna ''grace'' informa quantos dias o usuário ainda tem de prazo, caso esteja acima do ''soft limit'', antes que ele se torne um ''hard limit'' (normalmente iniciando com 7 dias). Além disso, é possível limitar também a quantidade de arquivos por ele mantidos. A coluna ''arquivos'' informa quantos arquivos e diretórios um usuário possui, e as colunas que a sucedem informam seus limites.
 +
 +
A decisão de que limites devem ser impostos aos usuários é de grande importância, pois devem-se conciliar as necessidades desses usuários e a quantidade de espaço em disco disponível para eles. Uma política para uso de espaço seria dividir a capacidade total do volume pela quantidade de usuários. Porém sabe-se que usuários têm diferentes práticas de uso dos recursos de rede, incluindo as áreas de armazenamento de arquivos. Muitos usuários fazem pouco uso do espaço disponível, enquanto outros realmente aproveitam tudo que lhes for alocado. Assim, uma outra política seria definir um limite individual maior, mesmo que a soma dos limites de usuários exceda a capacidade total do volume. Não é incomum que a soma das quotas individuais seja o dobro ou mais do espaço total existente. Cabe ao administrador o bom senso e, principalmente, o conhecimento sobre o padrão de uso de seus usuários, para melhor definir as quotas e assim o aproveitamento dos discos dos servidores.
 +
 +
Por fim, quotas não implicam nenhuma reserva de espaço em disco para os usuários.
 +
 +
=== Implantação de quotas ===
 +
 +
Vários passos são necessários para implantar quotas em um sistema de arquivos. Em primeiro lugar, deve-se certificar de que os utilitários necessários para sua configuração estejam instalados:
 +
 +
apt-get install quota
 +
 +
# mostra a man page do utilitário quota
 +
man quota
 +
 +
Cada sistema de arquivos onde se desejam ativar quotas deve ser montado com a opção ''quota''. Assim, a linha do arquivo [https://help.ubuntu.com/community/Fstab /etc/fstab] correspondente a um sistema de arquivos desses deve ser similar a:
 +
 +
/dev/sdb2 /usuarios  ext4  defaults,quota  0 1
 +
 +
Ao montar o sistema de arquivos pela primeira vez, devem-se tanto atualizar manualmente as informações permanentes sobre quotas (mantidas em um arquivo ''aquota.user'', que fica na raiz do sistema de arquivos), quanto ativar manualmente as quotas:
 +
 +
# Monta o sistema de arquivos /usuarios (só funciona assim por que ele está descrito em /etc/fstab)
 +
mount /usuarios
 +
 +
# Atualiza as informações sobre quotas: isto varre todo o sistema de arquivos para contabilizar quanto espaço cada usuário  possui, e grava
 +
# o resultado no arquivo aquota.user
 +
quotacheck -f /usuarios
 +
 +
# Ativa as quotas no sistema de arquivos
 +
quotaon -v /usuarios
 +
 +
# Gera uma listagem das quotas dos usuarios
 +
repquota -v /usuarios
 +
 +
Uma vez estando o sistema de arquivos definido com a opção ''quota'', as quotas serão ativadas automaticamente no ''boot'' do sistema. O procedimento acima é necessário somente na implantação das quotas.
 +
 +
Uma vez estando as quotas ativadas, podem-se editar as quotas de usuaŕios com o utilitário ''edquota''.
 +
 +
edquota roberto
 +
 +
Esse utilitário executa um  editor de texto comum para editar as quotas, e então grava o resultado no arquivo ''aquota.user''. O editor de texto executado é aquele indicado na variável de ambiente EDITOR (ex: nano, vim, ...). Abaixo pode-se ver o editor ''vi'' sendo chamado para editar as quotas:
 +
 +
[[Imagem:Edquota2.png|600px]]
 +
 +
Uma prática comum para automatizar a edição de quotas (e fazê-la de forma não-interativa) é definir alguns usuários que servem como perfis (ex: ''aluno'', ''professor'', ''funcionario''), e definir as quotas para cada um deles. Assim , cada novo usuário que for criado pode ter suas quotas copiadas a partir de um desses perfis, usando-se ''edquota -p'':
 +
 +
# copia as quotas do usuário professor para roberto
 +
edquota -p professor roberto
 +
 +
Outra forma de definir quotas de forma não-interativa (bom para ''shell scripts'' ou outros programas que automatizem o gerenciamento de usuários) é com o utilitário ''setquota''. Com esse programa devem-se informar diretamente na linha de comando os limites tanto de espaço em disco quanto de arquivos:
 +
 +
# Define quotas para o usuário roberto:
 +
# espaço em disco: soft limit = 100 MB, hard limit = 150 MB
 +
# quantidade de arquivos: ilimitado
 +
setquota -u roberto 100000 150000 0 0 /usuarios
 +
 +
Finalmente, os usuários que excederam seus ''soft limit'' podem ser alertado por email pelo utilitário ''warnquota''. Esse programa pode ser executado periodicamente pelo agendador de tarefas (ex: diariamente).
 +
 +
'''''Sumário de utilitários sobre quotas'''''
 +
 +
* [http://manpages.ubuntu.com/manpages/karmic/man1/quota.1.html quota]: visualização de quotas
 +
* [http://manpages.ubuntu.com/manpages/karmic/man8/quotaon.8.html quotaon]: ativação de quotas em sistemas de arquivos (executado normalmente no ''boot'')
 +
* [http://manpages.ubuntu.com/manpages/karmic/man8/quotacheck.8.html quotacheck]: verificação dos dados sobre quotas (contidos no arquivo aquota.user)
 +
* [http://manpages.ubuntu.com/manpages/karmic/man8/edquota.8.html edquota]: edição de quotas de usuários e grupos
 +
* [http://manpages.ubuntu.com/manpages/karmic/man8/setquota.8.html setquota]: outro utilitário para editar quotas
 +
* [http://manpages.ubuntu.com/manpages/karmic/man8/repquota.8.html repquota]: relatório de quotas de todos os usuários
 +
* [http://manpages.ubuntu.com/manpages/karmic/man8/warnquota.8.html warnquota]: alerta usuários com quotas excedidas
 +
 +
=== Atividade ===
 +
 +
# Configure o Linux para permitir o uso de quotas de usuários no “/home”.
 +
# Estabeleça para os usuários do tipo alunos a seguinte quota: blocos (soft = 500 e hard = 1000).
 +
# Estabeleça para os usuários do tipo professores e servidores a seguinte quota: blocos (soft = 600 e hard = 800).
 +
# Logue como estes usuários e crie ou copie vários arquivos dentro de seus homes e verifique as mensagens de estouro de quotas de usuários.
 +
# Crie um usuário chamado ''operador'', e defina que sua quota é ilimitada. Crie arquivos para esse usuário, e verifique se há alguma restrição do sistema de quotas.
 +
# Em um servidor se deseja limitar que alunos no total não excedam 100 MB, e professores e servidores estejam limitados a 200 MB. Quer dizer, todos os alunos juntos não podem execeder esse limite, assim como profesores e funcionários. Pesquise como implementar isto com o sistema de quotas do Linux (dica: veja quotas para grupos).
 +
{{Collapse bottom | Quotas de disco}}
 +
 +
{{Collapse top | Agendamento de tarefas}}
 +
 +
Agendamento de tarefas administrativas com crontab. Apostila de Gerência de Redes, capítulo 19.
 +
 +
O [http://manpages.ubuntu.com/manpages/karmic/en/man8/cron.8.html cron] é um programa de agendamento de tarefas. Com ele pode-se fazer a programação para execução de qualquer programa numa certa periodicidade ou até mesmo em um exato dia, numa exata hora. Um uso comum do '''cron''' é o agendamento de tarefas administrativas de manutenção do seu sistema, como por exemplo, análise de segurança w backup. Estas tarefas são programadas para, todo dia, toda semana ou todo mês, serem automaticamente executadas através da ''crontab'' e um script shell comum. A configuração do '''cron''' geralmente é chamada de ''crontab''.
 +
 +
Os sistemas Linux possuem o '''cron''' na instalação padrão. A configuração tem duas partes: uma global, e uma por usuário. Na global, controlada pelo root, o [http://manpages.ubuntu.com/manpages/karmic/en/man5/crontab.5.html crontab] pode ser configurado para executar qualquer tarefa de qualquer lugar, como qualquer usuário. Já na parte por usuário, cada usuário tem seu próprio ''crontab'', sendo restringido apenas ao que o usuário pode fazer (e não tudo, como é o caso do root).
 +
 +
=== Uso do crontab ===
 +
 +
Para configurar um crontab por usuário, utiliza-se o comando [http://manpages.ubuntu.com/manpages/karmic/en/man5/crontab.1.html crontab], junto com um parâmetro, dependendo do que se deseja fazer. Abaixo uma relação:
 +
 +
* '''crontab -e''': Edita a crontab atual do usuário logado
 +
* '''crontab -l''': Exibe o atual conteúdo da crontab do usuário
 +
* '''crontab -r''': Remove a crontab do usuário
 +
 +
Se você quiser verificar os arquivos crontab dos usuários, você precisará ser root. O comando '''crontab''' coloca os arquivos dos usuários no diretório ''/var/spool/cron/crontabs'' . Por exemplo, a crontab do usuário ''aluno'' estará no arquivo ''/var/spool/cron/crontabs/aluno''.
 +
 +
Existe também uma crontab global, que fica no arquivo ''/etc/crontab'', e só pode ser modificado pelo root.
 +
Vamos estudar o formato da linha do crontab, que é quem vai dizer o que executar e quando. Vamos ver um exemplo:
 +
 +
<syntaxhighlight lang=text>
 +
30 12,22 * * *  /home/aluno/scripts/backup.sh >/dev/null 2>&1
 +
</syntaxhighlight>
 +
 +
A linha é dividida em campos separados por tabs ou espaço:
 +
 +
{| border="1" cellpadding="2"
 +
!Campo
 +
!Função
 +
|-
 +
|1o || Minuto
 +
|-
 +
|2o|| Hora
 +
|-
 +
|3o || Dia do mês
 +
|-
 +
|4o || Mês
 +
|-
 +
|5o || Dia da semana
 +
|-
 +
|6o || Programa a ser executrado
 +
|}
 +
 +
Todos estes campos, sem contar com o 6o., são especificados por números. Veja a tabela abaixo para os valores destes campos:
 +
 +
 +
{| border="1" cellpadding="2"
 +
!Campo
 +
!Função
 +
|-
 +
|Minuto || 0-59
 +
|-
 +
|Hora || 0-23
 +
|-
 +
|Dia do mês || 1-31
 +
|-
 +
|Mês || 1-12
 +
|-
 +
|Dia da semana || 0-6 (0=domingo, 6=sábado)
 +
|}
 +
 +
Além destes temos também alguns parâmetros ativos:
 +
 +
@reboot = run at boot and reboot only
 +
 +
@yearly = run at midnight Jan 1 each year (equiv to 0 0 1 1 *)
 +
 +
@annually = run at midnight Jan 1 each year (equiv to 0 0 1 1 *)
 +
 +
@monthly = run at midnight on the first day of each month (equiv to 0 0 1 * *)
 +
 +
@weekly = run at midnight each Sunday (equiv to 0 0 * * 0)
 +
 +
@daily = run at midnight each day (equiv to 0 0 * * *)
 +
 +
@ midnight = run at midnight each day (equiv to 0 0 * * *)
 +
 +
@ hourly = run on the first second of every hour (equiv to 0 * * * *)
 +
 +
 +
Então o que nosso primeiro exemplo estava dizendo? A linha está dizendo: "Execute o comando ''/root/scripts/backup.sh'' às 12:30 h e às 22:30h, todos os dias".
 +
 +
Vamos analisar mais alguns exemplos:
 +
 +
1,21,41 *      *      *      *      echo "Meu crontab rodou mesmo!"
 +
 +
Aqui está dizendo: "Executar o comando do sexto campo toda hora, todo dia, nos minutos 1, 21 e 41".
 +
 +
30      4      *      *      1      rm -rf /tmp/*
 +
 +
Aqui está dizendo: "Apagar todo conteúdo do diretório /tmp toda segunda-feira, as 4:30 da manhã."
 +
 +
45      19      1,15    *      *      /usr/local/bin/backup
 +
 +
Aqui está dizendo: "Executar o comando 'backup' todo dia 1 e 15 às 19:45.".
 +
 +
E assim pode-se ir montando inúmeros jeitos de agendamento possível. No arquivo do crontab global, o sexto campo pode ser substituído pelo nome do usuário, e um sétimo campo adicionado com o programa para a execução, como mostrado no exemplo a seguir:
 +
 +
*/5 * * * * root /usr/bin/mrtg /etc/mrtg/mrtg.cfg
 +
 +
Aqui está dizendo: "Executar o mrtg como usuário root, de 5 em 5 minutos sempre."
 +
 +
0      19-23/2      *    *      *      /root/script
 +
 +
Aqui está dizendo: “Executar o 'script' entre as 19 e 23 de 2 em duas horas.”
 +
 +
=== Atividade ===
 +
 +
# Agende o comando '''date''' para escrever/adicionar sua saída ao arquivo ''/root/date'' a cada minuto.
 +
# Pressuponha que o script '''/root/abacaxi.sh''' exista, agende o mesmo para ser executado:
 +
## De dois em dois dias às 11 h e 55 min.
 +
## Todo dia 5 às 3 h e 50 min.
 +
## No dia 14 de cada mês entre as 8 e 18 h, de hora em hora.
 +
{{Collapse bottom | Agendamento de tarefas}}
 +
-->
 +
<!--
 +
== 20/3: Shell Scripts para automatizar tarefas ==
 +
Capítulo 21 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
{{Collapse top | Shell Scripts}}
 +
 +
* '''Shell scripts:''' programas interpretados pelo shell (no nosso caso, [http://manpages.ubuntu.com/manpages/karmic/man1/bash.1.html bash])
 +
* '''Estrutura de um shell script:''' <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
# Este programa diz alo
 +
echo "Alo $LOGNAME, tenha um bom dia!"
 +
</syntaxhighlight>
 +
* '''Variáveis:'''
 +
** Definição de variáveis
 +
***Passando parâmetros/variáveis para o script<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
echo Entre com o parâmetro
 +
read par
 +
echo O parâmetro passado é $var
 +
</syntaxhighlight>
 +
** Mostrando o valor de variáveis<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
dir=/home/aluno
 +
desktop=$dir/Desktop
 +
 +
echo Seu diretorio home é $dir
 +
echo Sua área de trabalho do ambiente gráfico fica no diretório $desktop
 +
</syntaxhighlight>
 +
*** Forma alternativa de mostrar valores de variáveis:<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
dir=/home/aluno
 +
desktop=${dir}/Desktop
 +
 +
echo Seu diretorio home é ${dir}
 +
echo Sua área de trabalho do ambiente gráfico fica no diretório ${desktop}
 +
</syntaxhighlight>Repare nas chaves em volta do nome da variável. Isto é particularmente necessário quando se deseja delimitar o nome da variável, como no exemplo abaixo:<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
basedir=/home/aluno
 +
 +
# a sentença abaixo funciona como esperado
 +
echo aluno1 tem diretório home ${basedir}1 
 +
 +
# ... mas esta a seguir não !
 +
echo aluno1 tem diretório home $basedir1 
 +
</syntaxhighlight>
 +
** Argumentos de execução do shell<syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
echo Quantidade de argumentos: $#
 +
echo Os argumentos são: $*
 +
echo Nome do script: $0
 +
echo Primeiro argumento: $1
 +
echo Segundo argumento: $2
 +
</syntaxhighlight>
 +
** Mostrando parte do conteúdo de uma variável (o equivalente a substrings): <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
letras=abcdefghjijklmnopqrstuvwxyz
 +
 +
echo Todas as letras: ${letras}
 +
echo Quantidade de caracteres na variável letras: ${#letras}
 +
echo a primeira letra: ${letras:0:1}
 +
echo 5 primeiras letras: ${letras:0:5}
 +
echo a última letra: ${letras:${#letras}-1}
 +
echo 5 últimas letras: ${letras:${#letras}-5:${#letras}} 
 +
echo ... ou ... ${letras:${#letras}-5}
 +
echo a primeira metade das letras: ${letras:0:${#letras}/2}
 +
echo a segunda metade das letras: ${letras:${#letras}/2}
 +
</syntaxhighlight>
 +
** Idem acima, mas passando as letras como parâmetro do script: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
letras=$1
 +
 +
echo Todas as letras: ${letras}
 +
echo Quantidade de caracteres na variável letras: ${#letras}
 +
echo a primeira letra: ${letras:0:1}
 +
echo 5 primeiras letras: ${letras:0:5}
 +
echo a última letra: ${letras:${#letras}-1}
 +
echo 5 últimas letras: ${letras:${#letras}-5:${#letras}} 
 +
echo ... ou ... ${letras:${#letras}-5}
 +
echo a primeira metade das letras: ${letras:0:${#letras}/2}
 +
echo a segunda metade das letras: ${letras:${#letras}/2}
 +
</syntaxhighlight>
 +
** Tratando variáveis que podem estar indefinidas ou vazias: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
x=ok
 +
 +
echo Variavel x=${x}
 +
 +
# Mostra o valor "vazia", porque y é uma variável indefinida, mas não altera y
 +
echo Variavel y=${y:-vazia}
 +
echo Variavel y=${y}
 +
 +
# Mostra o valor "vazia", porque y é uma variável indefinida, e faz com que y="vazia"
 +
echo Variavel y=${y:=vazia}
 +
echo Variavel y=${y}
 +
</syntaxhighlight>
 +
** Variáveis predefinidas: LOGNAME, HOME, PATH, MAIL, EDITOR, PAGER, SHELL, TERM, HOST, ...
 +
** Captura do resultado da execução de comandos <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
resultado=$(ls $HOME | wc -l)
 +
 +
echo Existem $resultado arquivos ou diretórios em $HOME
 +
</syntaxhighlight>
 +
** Expressões aritméticas: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
x=1
 +
y=3
 +
 +
# Abaixo apenas concatena os valores de x e y
 +
echo x + y = ${x} + ${y}
 +
 +
# Abaixo faz a soma de x e y
 +
echo x + y = $((${x} + ${y}))
 +
</syntaxhighlight>
 +
** Idem acima com variáveis obtidas pelos parâmetros: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
x=$1
 +
y=$2
 +
 +
# Abaixo apenas concatena os valores de x e y
 +
echo x + y = ${x} + ${y}
 +
 +
# Abaixo faz a soma de x e y
 +
echo x + y = $((${x} + ${y}))
 +
</syntaxhighlight>
 +
 +
* '''Estruturas condicionais:'''
 +
** Teste de condição: se condição então ... senão ... fimSe <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
# Este programa também diz alo
 +
if [ "$LOGNAME" = "root" ]; then
 +
  echo "Alo SENHOR, tenha um bom dia ... e às suas ordens !"
 +
else
 +
  echo "Alo $LOGNAME, tenha um bom dia."
 +
fi
 +
</syntaxhighlight>
 +
*** Condições a serem usadas no if ... then ... else se baseiam no programa [http://manpages.ubuntu.com/manpages/karmic/en/man1/test.1posix.html test]. Alguns exemplos: <syntaxhighlight lang=bash>
 +
x=0
 +
y=1
 +
 +
# operador -eq: igualdade numerica
 +
if [ $x -eq 0 ]; then
 +
  echo Variavel x zerada
 +
fi
 +
 +
# operador -o: OU logico
 +
if [ $x -eq 1 -o $y -eq 1 ]; then
 +
  echo Uma das variáveis x ou y tem valor diferente de zero
 +
fi
 +
 +
# operador -a: E logico
 +
if [ $x -eq 1 -a $y -eq 1 ]; then
 +
  echo Ambas variáveis x ou y tem valor diferente de zero
 +
fi
 +
 +
# operador -le: <= (less or equal)
 +
if [ $x -le 10 ]; then
 +
  echo Variável x menor ou igual a 10
 +
fi
 +
 +
# operador -lt: < (less than)
 +
if [ $x -lt 10 ]; then
 +
  echo Variável x menor que 10
 +
fi
 +
 +
# operador -ge: >= (greater or equal)
 +
if [ $x -ge 10 ]; then
 +
  echo Variável x maior ou igual a 10
 +
fi
 +
 +
# operador -gt: > (greater than)
 +
if [ $x -gt 10 ]; then
 +
  echo Variável x maior que 10
 +
fi
 +
 +
# operador !: NEGACAO
 +
if [ ! $x -gt 10 ]; then
 +
  echo Variável x menor ou igual a 10
 +
fi
 +
</syntaxhighlight>
 +
*** Variações do uso do teste condicional: <syntaxhighlight lang=bash>
 +
if comando
 +
then
 +
  comandos executados se "comando" retornar status "ok" (0)
 +
else
 +
  comandos executados se "comando" retornar status "não ok" (diferente de 0)
 +
fi
 +
## Exemplo de uso:
 +
#!/bin/bash
 +
 +
if cat /etc/shadow > /dev/null
 +
then
 +
  echo sou root
 +
else
 +
  echo sou usuário comum
 +
fi
 +
</syntaxhighlight>
 +
** Selecionando entre múltiplos valores: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
x=$1
 +
 +
case $x in
 +
  0)
 +
  echo x=zero
 +
  ;;
 +
  1)
 +
  echo x=um
 +
  ;;
 +
  *)
 +
  echo x desconhecido: $x
 +
  ;;
 +
esac
 +
</syntaxhighlight>
 +
 +
*'''Estruturas de repetição:'''
 +
#for: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
for dir in /home/*; do
 +
  echo Diretório: ${dir}
 +
done
 +
 +
for x in 1 2 3 4 5; do
 +
  echo x = ${x}
 +
done
 +
 +
for (( x=1; $x < 5; x=$x+1 )); do
 +
  echo x=$x
 +
done
 +
 +
</syntaxhighlight>
 +
#while: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
# enquanto x <= 5
 +
while [ ${x} -le 5 ]; do
 +
echo $x
 +
x=$(($x+1))
 +
done
 +
 +
# Mostra os processos do usuario aluno, enquanto ele estiver logado
 +
while (who | grep aluno > /dev/null); do
 +
  date
 +
  ps aux | grep aluno
 +
  echo ""
 +
  sleep 5
 +
done
 +
</syntaxhighlight>
 +
 +
 +
 +
=== Programas úteis ===
 +
 +
Os programas utilitários abaixo são comumente usados em shell scripts:
 +
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/basename.1.html basename:] mostra o prefixo de um  pathname (ex: ao executar ''dirname /home/aluno/Desktop'' se obtém ''/home/aluno'')
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/dirname.1.html dirname:] mostra o último componente de um  pathname (ex: ao executar ''basename /home/aluno/Desktop'' se obtém ''Desktop'')
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/cut.1.html cut:] divide as linhas dos arquivos em colunas, e mostra colunas específicas
 +
* [http://pt.wikipedia.org/wiki/AWK awk:] linguagem de programação, muito útil para filtrar conteúdo de arquivos (ex: cat /etc/passwd | awk -F: '{print $ 1 "\t" $5}')
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/grep.1.html grep:] mostra linhas de arquivos que contenham determinada palavra ou padrão de caracteres
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/sort.1.html sort:] ordena as linhas de um arquivo
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/paste.1.html paste:] combina linhas de arquivos
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/wc.1.html wc:] conta linhas, palavras e caracteres
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/tail.1.html tail:] mostra as últimas linhas de um arquivo
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/head.1.html head:] mostra as primeiras linhas de um arquivo
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/du.1.html du:] mostra a utilização de disco de um determinado arquivo ou diretório
 +
 +
 +
=== Atividade ===
 +
# Faça um script que mostre os 5 diretórios que estão ocupando mais espaço no diretório /var/
 +
# Modifique o script acima para que a quantidade de diretório mostrada seja parametrizada.
 +
# Faça um script mostrando o nome completo do usuário, a partir do argumento "login".
 +
# Faça um script mostrando os grupos que o usuário está incluído. Esse script deve consultar os arquivos /etc/group.
 +
# Faça um script que utilize um usuário padrão chamado "modelo" para estabelecer cotas a todos os usuários comuns (não do sistema) cadastrados na sua máquina.
 +
# Em um diretório existem diversos arquivos compactados com zip, como se pode ver abaixo: <syntaxhighlight lang=bash>
 +
$ ls
 +
arq1.zip
 +
banana.zip
 +
laranja.zip
 +
$
 +
</syntaxhighlight> Faça um script que descompacte cada arquivo desses em um subdiretório que tenha o nome do arquivo em questão, porém excluída sua extensão (ex: para banana.zip, deve-se descompactá-lo dentro de "banana"). Dica: use o esqueleto de script mostrado abaixo: <syntaxhighlight lang=bash>
 +
#!/bin/bash
 +
 +
for arq in *.zip; do
 +
  echo $arq
 +
done
 +
</syntaxhighlight>
 +
 +
 +
{{Collapse bottom | Shell Scripts}}
 +
-->
 +
<!--
 +
== 27/3: Políticas de Backup e revisão ==
 +
 +
Capítulo 20 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
-->
 +
<!--
 +
== 3/4: Avaliação ==
 +
-->
 +
<!--
 +
== 10/4 Configuração de interface de rede, rotas estáticas e NAT ==
 +
 +
Ver capítulo 22 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
{{Collapse top | Rede}}
 +
Visão geral de serviços e funções de rede típicos:
 +
Configuração de interfaces de rede. Noções de roteamento.
 +
 +
=== Visão geral de serviços de rede ===
 +
 +
[[Imagem:Rede-servicos.jpg]]
 +
 +
* '''DHCP:''' configuração automática de endereços IP em máquinas clientes
 +
* '''DNS:''' serviço de nomes, que associa nomes a endereços IP, entre outras finalidades.
 +
* '''LDAP:''' serviço de diretórios (um banco de dados hierárquico), para guardar informações administrativas, tais como usuários, grupos e contatos de email, usadas por outros serviços de rede.
 +
* '''HTTP:''' acesso a documentos em geral (uso mais notório para acesso a páginas Web)
 +
* '''FTP:''' transferência de arquivos
 +
* '''SMTP, IMAP4, POP3, LMTP:''' protocolos para envio de email e acesso a caixas de entrada
 +
* '''NFS e Samba:''' sistemas de arquivos de rede
 +
* '''Web proxy:''' controle de acesso e cache para acesso a WWW
 +
* '''NAT:''' tradução transparente de endereços IP, para mascarar endereços internos de uma rede (função de rede)
 +
* '''Filtro IP:''' restrições aplicadas a tráfego IP, visando melhorar o nível de segurança (função de rede)
 +
* '''SSH:''' acesso remoto seguro ao shell em um servidor
 +
* '''VPN:''' redes privativas virtuais
 +
 +
=== Interfaces de rede ===
 +
 +
Qualquer dispositivo (físico ou lógico) capaz de transmitir e receber datagramas IP. Interfaces de rede ethernet são o exemplo mais comum, mas há também interfaces PPP (seriais), interfaces tipo túnel e interfaces ''loopback''. De forma geral, essas interfaces podem ser configuradas com um endereço IP e uma máscara de rede, e serem ativadas ou desabilitadas. Em sistemas operacionais Unix a configuração de interfaces de rede se faz com o programa [http://manpages.ubuntu.com/manpages/karmic/pt_BR/man8/ifconfig.8.html ifconfig]:
 +
 +
Para mostrar todas as interfaces:
 +
 +
<syntaxhighlight lang=bash>
 +
root@gerencia:~> ifconfig -a
 +
dsl0      Link encap:Point-to-Point Protocol
 +
          inet addr:189.30.70.200  P-t-P:200.138.242.254  Mask:255.255.255.255
 +
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1492  Metric:1
 +
          RX packets:34260226 errors:0 dropped:0 overruns:0 frame:0
 +
          TX packets:37195398 errors:0 dropped:0 overruns:0 carrier:0
 +
          collisions:0 txqueuelen:3
 +
          RX bytes:19484812547 (18582.1 Mb)  TX bytes:10848608575 (10346.0 Mb)
 +
 +
eth1      Link encap:Ethernet  HWaddr 00:19:D1:7D:C9:A9
 +
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
 +
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 +
          RX packets:37283974 errors:0 dropped:0 overruns:0 frame:0
 +
          TX packets:42055625 errors:0 dropped:0 overruns:0 carrier:0
 +
          collisions:0 txqueuelen:1000
 +
          RX bytes:20939614658 (19969.5 Mb)  TX bytes:18284980569 (17437.9 Mb)
 +
          Interrupt:16 Base address:0xc000
 +
 +
lo        Link encap:Local Loopback
 +
          inet addr:127.0.0.1  Mask:255.0.0.0
 +
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
 +
          RX packets:273050 errors:0 dropped:0 overruns:0 frame:0
 +
          TX packets:273050 errors:0 dropped:0 overruns:0 carrier:0
 +
          collisions:0 txqueuelen:0
 +
          RX bytes:21564572 (20.5 Mb)  TX bytes:21564572 (20.5 Mb)
 +
root@gerencia:~>
 +
</syntaxhighlight>
 +
 +
Para configurar uma interface de rede (que fica automaticamente ativada):
 +
 +
<syntaxhighlight lang=bash>
 +
root@gerencia:~> ifconfig eth1 192.168.1.100 netmask 255.255.255.0
 +
</syntaxhighlight>
 +
 +
Para desativar uma interface:
 +
 +
<syntaxhighlight lang=bash>
 +
root@gerencia:~> ifconfig eth1 down
 +
</syntaxhighlight>
 +
 +
Para ativar uma interface:
 +
 +
<syntaxhighlight lang=bash>
 +
root@gerencia:~> ifconfig eth1 up
 +
</syntaxhighlight>
 +
 +
Ao se configurar uma interface de rede, cria-se uma rota automática para a subrede diretamente acessível via aquela interface. Isto se chama '''''roteamento mínimo'''''.
 +
 +
<syntaxhighlight lang=bash>
 +
root@gerencia:~> ifconfig eth1 192.168.10.0 netmask 255.255.0.0
 +
root@gerencia:~> netstat -rn
 +
Kernel IP routing table
 +
Destination    Gateway        Genmask        Flags  MSS Window  irtt Iface
 +
192.168.0.0    0.0.0.0        255.255.0.0    U        0 0          0 eth1
 +
127.0.0.0      0.0.0.0        255.0.0.0      U        0 0          0 lo
 +
root@gerencia:~>
 +
</syntaxhighlight>
 +
 +
Pode-se associar mais de um endreço a uma mesma interface de rede. Isto se chama '''''IP alias''''':
 +
 +
<syntaxhighlight lang=bash>
 +
root@gerencia:~> ifconfig eth1:0 192.168.1.110 netmask 255.255.255.0
 +
root@gerencia:~> ifconfig eth1:1 192.168.2.100 netmask 255.255.255.0
 +
root@gerencia:~> ifconfig -a
 +
eth1      Link encap:Ethernet  HWaddr 00:19:D1:7D:C9:A9
 +
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
 +
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 +
          RX packets:37295731 errors:0 dropped:0 overruns:0 frame:0
 +
          TX packets:42068558 errors:0 dropped:0 overruns:0 carrier:0
 +
          collisions:0 txqueuelen:1000
 +
          RX bytes:20942258027 (19972.0 Mb)  TX bytes:18294794452 (17447.2 Mb)
 +
          Interrupt:16 Base address:0xc000
 +
 +
eth1:0    Link encap:Ethernet  HWaddr 00:19:D1:7D:C9:A9
 +
          inet addr:192.168.1.110  Bcast:192.168.1.255  Mask:255.255.255.0
 +
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 +
          Interrupt:16 Base address:0xc000
 +
 +
eth1:1    Link encap:Ethernet  HWaddr 00:19:D1:7D:C9:A9
 +
          inet addr:192.168.2.100  Bcast:192.168.2.255  Mask:255.255.255.0
 +
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
 +
          Interrupt:16 Base address:0xc000
 +
root@gerencia:~>
 +
</syntaxhighlight>
 +
 +
==== Configuração no boot ====
 +
 +
Todo sistema operacional possui alguma forma de configurar suas interfaces de rede, para que sejam automaticamente ativadas no boot com seus endereços IP. Por exemplo, em sistemas Linux Ubuntu (descrito em maiores detalhes em seu [https://help.ubuntu.com/9.10/serverguide/C/network-configuration.html manual online]).
 +
 +
A configuração de rede se concentra no arquivo [http://manpages.ubuntu.com/manpages/karmic/man5/interfaces.5.html /etc/network/interfaces]:
 +
 +
<syntaxhighlight lang=text>
 +
# This file describes the network interfaces available on your system
 +
# and how to activate them. For more information, see interfaces(5).
 +
 +
# The loopback network interface
 +
auto lo eth1
 +
iface lo inet loopback
 +
        address 127.0.0.1
 +
        netmask 255.0.0.0
 +
 +
# a interface ethernet eth1
 +
iface eth1 inet static
 +
address 192.168.1.100
 +
netmask 255.255.255.0
 +
gateway 192.168.1.254
 +
 +
# apelido para eth1
 +
iface eth1:0 inet static
 +
      address 192.168.5.100
 +
      netmask 255.255.255.0
 +
</syntaxhighlight>
 +
 +
No Ubuntu deve-se em primeiro lugar desabilitar um serviço automático de atualização do '''/etc/resolv.conf''', através do comando '''dpkg-reconfigure resolvconf''', escolhendo a primeira opção como '''yes''' e as demais opções deixando o padrão. Em seguida edita-se o arquivo '''/etc/resolv.conf''':
 +
 +
<syntaxhighlight lang=text>
 +
nameserver 200.135.37.65
 +
nameserver 8.8.8.8
 +
</syntaxhighlight>
 +
 +
 +
Esses arquivo é lido pelos scripts [http://manpages.ubuntu.com/manpages/karmic/en/man8/ifup.8.html ifup] e [http://manpages.ubuntu.com/manpages/karmic/en/man8/ifdown.8.html ifdown]. Esses scripts servem para ativar ou parar interfaces específicas, fazendo todas as operações necessárias para isto:
 +
 +
<syntaxhighlight lang=bash>
 +
# Ativa a interface eth1
 +
ifup eth1
 +
 +
# Desativa a interface eth1
 +
ifdown eth1
 +
</syntaxhighlight>
 +
 +
Para ativar, desativar ou recarregar as configurações de todas as interfaces de rede:
 +
 +
<syntaxhighlight lang=bash>
 +
# desativa todas as interfaces de rede
 +
sudo /etc/init.d/networking stop
 +
 +
# ativa todas as interfaces de rede
 +
sudo /etc/init.d/networking start
 +
 +
# recarrega as configurações de todas as interfaces de rede
 +
sudo /etc/init.d/networking restart
 +
</syntaxhighlight>
 +
 +
=== Rotas estáticas ===
 +
 +
Ver capítulo 23 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
Rotas estáticas podem ser adicionadas a uma tabela de roteamento. Nos sistemas operacionais Unix, usa-se o programa [http://manpages.ubuntu.com/manpages/karmic/en/man8/route.8.html route]:
 +
 +
<syntaxhighlight lang=bash>
 +
# adiciona uma rota para a rede 10.0.0.0/24 via o gateway 192.168.1.254
 +
route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.1.254
 +
 +
# adiciona uma rota para a rede 172.18.0.0/16 via a interface PPP pp0
 +
route add -net 172.18.0.0 netmask 255.255.0.0 dev ppp0
 +
 +
# adiciona a rota default via o gateway 192.168.1.254
 +
route add default gw 192.168.1.254
 +
 +
# adiciona uma rota para o host 192.168.1.101 via o gateway 192.168.1.253
 +
route add -host 192.168.1.101 gw 192.168.1.253
 +
</syntaxhighlight>
 +
 +
A tabela de rotas pode ser consultada com o programa [http://manpages.ubuntu.com/manpages/karmic/en/man8/netstat.8.html netstat]:
 +
 +
<syntaxhighlight lang=bash>
 +
root@gerencia:~> netstat -rn
 +
Kernel IP routing table
 +
Destination    Gateway        Genmask        Flags  MSS Window  irtt Iface
 +
10.0.0.0        192.168.1.254  255.255.255.0  U        0 0          0 eth1
 +
192.168.1.101  192.168.1.253  255.255.255.0  UH        0 0          0 eth1
 +
172.18.0.0      0.0.0.0        255.255.0.0    U        0 0          0 ppp0
 +
192.168.1.0    0.0.0.0        255.255.255.0  U        0 0          0 eth1
 +
127.0.0.0      0.0.0.0        255.0.0.0      U        0 0          0 lo
 +
0.0.0.0        192.168.1.254  0.0.0.0        U        0 0          0 eth1
 +
</syntaxhighlight>
 +
 +
Rotas podem ser removidas também com '''''route''''':
 +
 +
<syntaxhighlight lang=bash>
 +
# remove a rota para 10.0.0.0/24
 +
route delete -net 10.0.0.0 netmask 255.255.255.0
 +
 +
# remove a rota para o host 192.168.1.101
 +
route delete -host 192.168.1.101
 +
</syntaxhighlight>
 +
 +
=== Coleta e análise de tráfego ===
 +
 +
Uma ferramenta básica de análise de tráfego de rede faz a coleta das PDUs por interfaces de rede, revelando as informações nelas contidas. Dois programas bastante populares
 +
para essa finalidade são:
 +
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man8/tcpdump.8.html tcpdump]: um analisador de tráfego em modo texto<syntaxhighlight lang=bash>
 +
lab01:/data/tmp # tcpdump -i dsl0 -ln tcp port 80
 +
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
 +
listening on dsl0, link-type LINUX_SLL (Linux cooked), capture size 96 bytes
 +
22:14:37.797702 IP 74.125.47.136.80 > 201.35.226.9.21688: F 3660173220:3660173220(0) ack 4262495618 win 122 <nop,nop,timestamp 403588225 348814601>
 +
22:14:37.836844 IP 201.35.226.9.21688 > 74.125.47.136.80: . ack 1 win 54 <nop,nop,timestamp 348874613 403588225>
 +
22:14:38.410477 IP 201.35.226.9.21688 > 74.125.47.136.80: F 1:1(0) ack 1 win 54 <nop,nop,timestamp 348874756 403588225>
 +
22:14:38.770653 IP 74.125.47.136.80 > 201.35.226.9.21688: . ack 2 win 122 <nop,nop,timestamp 403589203 348874756>
 +
22:14:39.906734 IP 64.233.163.83.80 > 201.35.226.9.23018: P 534213879:534214123(244) ack 1779175654 win 133 <nop,nop,timestamp 2294865159 348870211>
 +
</syntaxhighlight>
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/wireshark.1.html wireshark]: o equivalente em modo gráfico (porém com muitas outras funcionalidades)
 +
 +
Outros programas úteis (ou ao menos interessantes):
 +
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man8/iptraf.8.html iptraf]: gera estatísticas de tráfego por interfaces de rede
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man8/iftop.8.html iftop]: mostra os fluxos em uma interface de rede
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/nstreams.1.html nstreams]: analisa a saída do ''tcpdump'', e revela os fluxos em uma rede
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man1/driftnet.1.html driftnet]: analisa o tráfego em uma interface, e captura imagens, videos e audio
 +
 +
=== NAT ===
 +
 +
A tradução de endereço de rede (NAT - Network Address Translation), proposta pela [http://www.faqs.org/rfcs/rfc1631.html RFC 1631] em 1994, é uma função de rede criada para contornar o problema da escassez de endereços IP. Com a explosão no crescimento da Internet, e o mau aproveitamento dos endereços IP (agravado pelo endereçamento hierárquico), percebeu-se que o esgotamento de endereços poderia ser logo alcançado a não ser que algumas medidas fossem tomadas. Esse problema somente seria eliminado com a reformulação do protocolo IP, de forma a aumentar o espaço de endereços, que resultou na proposta do [http://www.faqs.org/rfcs/rfc2460.html IPv6] em 1998. Porém no início dos anos 1990 a preocupação era mais imediata, e pensou-se em uma solução provisória para possibilitar a expansão da rede porém reduzindo-se a pressão por endereços IP. O NAT surgiu assim como uma técnica com intenção de ser usada temporariamente, enquanto soluções definitivas não se consolidassem. Ainda hoje NAT é usado em larga escala, e somente deve ser deixado de lado quando IPv6 for adotado mundialmente (o que deve demorar).
 +
 +
NAT parte de um princípio simples: endereços IP podem ser compartilhados por nodos em uma rede. Para isto, usam-se endereços IP ditos não roteáveis (também chamados de inválidos) em uma rede, sendo que um ou mais endereços IP roteáveis (válidos) são usados na interface externa roteador que a liga a Internet. Endereços não roteáveis pertencem às subredes 10.0.0.0/8, 192.168.0.0/16 e 172.16.0.0/12, e correspondem a faixas de endereços que não foram alocados a nenhuma organização e, portanto, não constam das tabelas de roteamento dos roteadores na Internet. A figura abaixo mostra uma visão geral de uma rede em que usa NAT:
 +
 +
[[Imagem:Nat-exemplo.png]]
 +
 +
Para ser possível compartilhar um endereço IP, NAT faz mapeamentos ''(IP origem, port origem, protocolo transporte)'' -> ''(IP do NAT, port do NAT, , protocolo transporte)'', sendo ''protocolo de transporte'' TCP ou UDP. Assim, para cada par ''(IP origem, port origem TCP ou UDP)'' o NAT deve associar um par ''(IP do NAT, port do NAT TCP ou UDP)'' (que evidentemente deve ser único). Assim, por exemplo, se o roteador ou firewall onde ocorre o NAT possui apenas um endeerço IP roteável, ele é capaz em tese de fazer até 65535 mapeamentos para o TCP (essa é a quantidade de ports que ele pode possui), e o mesmo para o UDP. Na prática é um pouco menos, pois se limitam os ports que podem ser usados para o NAT. Note que o NAT definido dessa forma viola a independência entre camadas, uma vez que o roteamento passa a depender de informação da camada de transporte.
 +
 +
==== NAT no Linux ====
 +
 +
Ver capítulo 35, seção 4, da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
O NAT no Linux se configura com [http://manpages.ubuntu.com/manpages/jaunty/man8/iptables.8.html iptables]. As regras devem ser postas na tabela ''nat'', e aplicadas a chain ''POSTROUTING'', como no seguinte exemplo:
 +
 +
<syntaxhighlight lang=bash>
 +
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
 +
</syntaxhighlight>
 +
 +
A regra acima faz com que todo o tráfego originado em 192.168.1.0/24, e que sai pela interface ''eth0'' deve ser mascarado com o endereço IP dessa interface. Esta regra diz o seguinte: todos os pacotes que passarem (POSTROUTING) por esta máquina com origem de 192.168.1.0/24 e sairem pela interface eth0 serão mascarados, ou seja sairão desta máquina com o endereço de origem como sendo da eth0. O alvo ''MASQUERADE'' foi criado para ser usado com links dinâmicos (tipicamente discados ou ADSL), pois os mapeamentos se perdem se o link sair do ar. Para uso mais geral, com links permanentes, deve-se usar o alvo ''SNAT'':
 +
 +
<syntaxhighlight lang=bash>
 +
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 200.135.37.66
 +
</syntaxhighlight>
 +
 +
Uma outra possibilidade é mapear para um endereço da rede interna um tráfego originado externamente. Por exemplo, pode haver um servidor na rede interna que precisa ser acessado externamente, porém ele não possui um endereço IP roteável. O NAT no Linux possui a função DNAT que pode fazer essa tarefa:
 +
 +
<syntaxhighlight lang=bash>
 +
iptables -t nat -A PREROUTING -p tcp -d 200.135.37.66 --dport 8080 -i eth0 -j DNAT --to-destination 192.168.1.10:80
 +
</syntaxhighlight>
 +
 +
Nesse exemplo, datagramas com IP destino 200.135.37.66 e contendo um segmento TCP com port 8080 são desviados para o port 80 no IP 192.168.1.10. Quer dizer, o IP de destino desses datagramas é de fato substituído por 192.168.1.10, e o port de destino é mudado para 80.
 +
 +
Note que DNAT é aplicado a chain ''PREROUTING''.
 +
 +
Com estas configurações o cliente acessa qualquer site na internet mas não pode ser acessado. Por isto alguns textos colocam NAT na categoria de técniccas de segurança. Apesar de NAT prover o isolamento entre rede externa e interna, a não ser para os tráfegos mapeados, não se pode usá-lo sozinho como proteção de uma rede. Quer dizer, não se pode
 +
prescindir de um bom firewall e políticas de segurança adequadas.
 +
 +
=====Verificando as tabelas=====
 +
A ferramenta [http://manpages.ubuntu.com/manpages/lucid/man8/conntrack.8.html conntrack] permite o monitoramento da tabela ativa, ou seja, é possível visualizar quais as conexões abertas que estão fazendo uso do NAT. Exemplo:
 +
conntrack -L --src-nat
 +
 +
=== Atividade ===
 +
 +
'''A)''' Configurar interface de rede
 +
 +
# Verifique a configuração de sua interface de rede eth0 e/ou eth1, na sua máquina virtual. Se necessário corrija-a assim: ip 192.168.3.X, sendo X o número do computador + 100 (exemplo: para o micro 2 X=102), roteador default = 192.168.3.1.
 +
## Teste a comunicação do seu computador, fazendo ''ping 192.168.3.1''. Tente pingar outras máquinas da rede.
 +
## Tente também pingar o IP 200.135.37.65.
 +
## Veja a tabela de rotas, usando ''netstat -rn''.
 +
## Verifique a rota seguida pelos datagramas enviados, usando ''traceroute -n 200.135.37.65''.
 +
# Configure sua máquina virtual para que a informação de rede, configurada manualmente acima, fique permanente. Quer dizer, no próximo boot essa configuração deve ser ativada automaticamente.
 +
# Adicione um ''IP alias'' a sua interface eth0 ou eth1. Esse novo IP deve estar na subrede 10.0.0.0.0/24
 +
## Tente pingar os computadores de seus colegas, usando ambos endereços: da rede 192.168.3.0/24 e da rede 10.0.0.0/24.
 +
## Enquanto acontecem os pings, visualize o tráfego pela interface eth0 ou eth1, usando o programa [http://manpages.ubuntu.com/manpages/karmic/en/man8/tcpdump.8.html tcpdump]: <syntaxhighlight lang=bash>
 +
# Mostra o tráfego ICMP que passa pela interface eth1
 +
tcpdump -i eth1 -ln icmp
 +
</syntaxhighlight>
 +
## Pense em uma utilidade para ''IP alias'' ...
 +
 +
'''B)''' Coleta de tráfego
 +
#Faça um ou mais pings para algum(ns) sítios e, com o uso de parâmetros apropriados, faça com que o tcpdump:
 +
#Capture todos os pacotes da rede.
 +
#Capture somente os pacotes gerados por sua máquina.
 +
#Capture somente pacotes destinados à sua máquina.
 +
#Capture pacotes destinados ou originados da máquina 200.135.37.65.
 +
#Faça com que os pacotes capturados anteriormente sejam salvos num arquivo, chamado “pacotes_capturados“.
 +
#Se desejar instale e capture pacotes com o WireShark.
 +
 +
'''C)''' Tabelas estáticas de roteamento
 +
 +
[[Imagem:Diagrama_para_construir_tabelas_de_roteamento_com_maquinas_virtuais.jpg]]
 +
 +
#Configure as interfaces de rede (uma interface virtual – ip alias) de sua máquina servidora, conforme números de IPs sugeridos na. Todas as máscaras de rede devem ser 255.255.255.0 ou /24. Neste caso o gateway será: 192.168.3.101.
 +
#Configure sua máquina virtual servidora para rotear pacotes.
 +
#Configure sua máquina virtual cliente para ser seu cliente de rede, conforme Figura.
 +
#Montar as tabelas estáticas de roteamento de modo que todas as máquinas tenham acesso entre si (“pingando” ente elas).
 +
#Faça testes. Se houver problemas usar tcpdump para monitorar individualmente as interfaces e verificar onde está o problema. Lembre-se que os pacotes devem ter rota de ida e volta, portanto o problema pode ser no seu roteador ou de seu vizinho. Uma boa sequência de testes é:
 +
##Pingar entre cliente e roteador.
 +
##Do cliente pingar a interface externa do roteador.
 +
##Do cliente pingar a máquina do professor. Se funcionar até aqui seu roteador estará corretamente configurado.
 +
##Do roteador pingar a interface externa de outro roteador.
 +
##Do roteador pingar outro cliente.
 +
##Do seu cliente pingar outro cliente.
 +
 +
'''D)''' NAT
 +
#Desfaça as tabelas de roteamento e configure a máquina servidora para fazer NAT, nos mesmos moldes do item '''C)'''.
 +
#Faça testes “pingando” para redes externas e para as redes dos colegas.
 +
#Qual é a diferença de “comportamento” quando comparado ao cenário das tabelas estáticas de roteamento?
 +
 +
{{Collapse bottom | Rede}}
 +
-->
 +
<!--
 +
== 17/04: DNS ==
 +
 +
Ver capítulo 25 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
{{Collapse top | DNS}}
 +
 +
'''DNS ''(Domain Name System)''''' é uma base de dados distribuída e hierárquica. Nela se armazenam informações para mapear nomes de máquinas da Internet para endereços IP e vice-versa, informação para roteamento de email, e outros dados utilizados por aplicações da Internet.
 +
 +
A informação armazenada no DNS é identificada por nomes de domínio que são organizados em uma árvore, de acordo com as divisões administrativas ou organizacionais. Cada nodo dessa árvore, chamado de ''domínio'', possui um rótulo. O nome de domínio de um nodo é a concatenação de todos os rótulos no caminho do nodo até a raiz. Isto é representado como uma ''string'' de rótulos listados da direita pra esquerda e separados por pontos (ex: ifsc.edu.br, sj.ifsc.edu.br). Um rótulo precisa ser único somente dentro do domínio pai a que pertence.
 +
 +
Por exemplo, um nome de domínio de uma máquina no IFSC pode ser ''mail.ifsc.edu.br.'', em que o ''"."'' (último) significa o ''root level domain''  ''.br'' é o domínio do topo da hierarquia (no Brasil feito em [https://registro.br/])ao qual ''mail.sj.ifsc.edu.br'' pertence. ''.ifsc.edu'' é um subdomínio de ''.br.'', e ''mail'' o nome da máquina em questão.
 +
 +
Por razões administrativas, o espaço de nomes é dividido em áreas chamadas de ''zonas'', cada uma iniciando em um nodo e se estendendo para baixo para os nodos folhas ou nodos onde outras zonas iniciam. Os dados de cada zona são guardados em um ''servidor de nomes'', que responde a consultas sobre uma zona usando o protocolo DNS.
 +
 +
Clientes buscam informação no DNS usando uma biblioteca de resolução (''resolver library''), que envia as consultas para um ou mais servidores de nomes e interpreta as respostas.
 +
 +
[[Imagem:hierarquia-DNS.gif|400px]]
 +
 +
(tirado do [http://www.bind9.net/manual/bind/9.3.2/Bv9ARM.ch01.html#id2546234 manual do BIND9])
 +
 +
Ver também o [http://my.safaribooksonline.com/0-596-00158-4/dns4-CHP-2 livro sobre DNS e BIND] da O'Reilly.
 +
 +
=== Registros DNS ===
 +
 +
Cada rótulo na hierarquia DNS possui um conjunto de informações associadas a si. Essas informações são guardas em registros
 +
de diferentes tipos, dependendo de seu significado e propósito. Cada consulta ao DNS retorna assim as informações do registro pedido associado ao rótulo. Por exemplo, para ver o registro de endereço IP associado a www.ifsc.edu.br pode-se executar esse comando (o resultado teve alguns comentários removidos):
 +
 +
<syntaxhighlight lang=bash>
 +
root@freeman:~$ dig sj.ifsc.edu.br mx
 +
 +
;; QUESTION SECTION:
 +
;sj.ifsc.edu.br. IN MX
 +
 +
;; ANSWER SECTION:
 +
sj.ifsc.edu.br. 3600 IN MX 10 hendrix.sj.ifsc.edu.br.
 +
 +
;; AUTHORITY SECTION:
 +
sj.ifsc.edu.br. 3600 IN NS ns.pop-udesc.rct-sc.br.
 +
sj.ifsc.edu.br. 3600 IN NS ns.pop-ufsc.rct-sc.br.
 +
sj.ifsc.edu.br. 3600 IN NS hendrix.sj.ifsc.edu.br.
 +
 +
;; ADDITIONAL SECTION:
 +
hendrix.sj.ifsc.edu.br. 3600 IN A 200.135.37.65
 +
ns.pop-ufsc.rct-sc.br. 11513 IN A 200.135.15.3
 +
ns.pop-udesc.rct-sc.br. 37206 IN A 200.135.14.1
 +
</syntaxhighlight>
 +
 +
Cada uma das informações acima mostra um determinado registro e seu conteúdo, como descrito na tabela abaixo:
 +
 +
{| border="1" cellpadding="2"
 +
!Nome
 +
!TTL
 +
!Classe
 +
!Registro
 +
!Conteúdo do registro
 +
|-
 +
|hendrix.sj.ifsc.edu.br.||3600||IN||A||200.135.37.65
 +
|-
 +
|sj.ifsc.edu.br.||3600||IN||NS||hendrix.sj.ifsc.edu.br.
 +
|-
 +
|sj.ifsc.edu.br.||3600||IN||MX||10 hendrix.sj.ifsc.edu.br.
 +
|}
 +
 +
Obs: ''TTL'' (''Time To Live'') é o tempo de validade (em segundos) da informação retornada do servidor de nomes, e ''classe'' é o tipo de endereço (no caso IN equivale a endereços Internet).
 +
 +
Os tipos de registros mais comuns são:
 +
 +
{| border="1" cellpadding="2"
 +
!Registro
 +
!Descrição
 +
!Exemplo
 +
|-
 +
|A || Endereço (Address) || www.sj.ifsc.edu.br IN A 200.135.37.66
 +
|-
 +
|NS|| Servidor de nomes (Name Server) || sj.ifsc.edu.br IN NS hendrix.sj.ifsc.edu.br.
 +
|-
 +
|CNAME || Apelido (Canonical Name) || mail.sj.ifsc.edu.br IN CNAME hendrix.sj.ifsc.edu.br.
 +
|-
 +
|MX || Roteador de email (Mail Exchanger) || sj.ifsc.edu.br IN MX mail.sj.ifsc.edu.br.
 +
|-
 +
|SOA || dados sobre o domínio (Start of Authority)||sj.ifsc.edu.br IN SOA hendrix.sj.ifsc.edu.br. root.sj.ifsc.edu.br. 2009120102 1200 120 604800 3600
 +
|-
 +
|PTR || Ponteiro para nome (Pointer) || 65.37.135.200.in-addr.arpa IN PTR hendrix.sj.ifsc.edu.br.
 +
|-
 +
|TXT || Texto genérico (Text) || sj.ifsc.edu.br IN TXT "v=spf1 a mx ~all"
 +
|}
 +
 +
Uma zona assim é composta de um conjunto de registros com todas as informações dos domínios nela contidos. O conteúdo de uma zona, contendo o domínio ''example.com'', pode ser visualizado abaixo:
 +
 +
<syntaxhighlight lang=text>
 +
example.com  86400  IN SOA ns1.example.com. hostmaster.example.com. (
 +
      2002022401 ; serial
 +
      10800 ; refresh
 +
      15 ; retry
 +
      604800 ; expire
 +
      10800 ; minimum
 +
    )
 +
      IN  NS    ns1.example.com.
 +
      IN  NS    ns2.smokeyjoe.com.
 +
      IN  MX  10 mail.another.com.
 +
      IN  TXT  "v=spf1 mx -all"
 +
 +
ns1    IN  A      192.168.0.1
 +
www    IN  A      192.168.0.2
 +
ftp    IN  CNAME  www.example.com.
 +
 +
bill  IN  A      192.168.0.3
 +
fred  IN  A      192.168.0.4
 +
</syntaxhighlight>
 +
 +
=== Atividade ===
 +
 +
O objetivo é montar a seguinte estrutura:
 +
 +
[[Arquivo:Diagrama_DNS.png]]
 +
 +
Vamos configurar e testar um servidor DNS. Para tanto montaremos a estrutura indicada no diagrama, onde cada máquina será um servidor DNS, com um domínio próprio e, ao mesmo tempo, será cliente do servidor DNS da máquina 192.168.3.101. Esta, por sua vez, será servidor: um servidor master do domínio redes.edu.br e servidor escravo, recebendo automaticamente uma cópia das zonas dos servidores masters, de todos os demais domínios criados. Esta, será também a única máquina com servidor DNS com zona reversa. Sendo assim todos os domínios, diretos e reversos, serão visíveis por meio deste servidor.
 +
 +
# Entendendo o serviço DNS. Antes de qualquer reconfiguração faça testes usando a ferramenta “dig”: <syntaxhighlight lang=bash>
 +
dig -x 200.135.37.65;
 +
dig www.das.ufsc.br;
 +
dig +trace www.polito.it;
 +
dig @200.135.37.65 www.polito.it.</syntaxhighlight>
 +
# Siga o roteiro da apostila e inicialize o servidor DNS, criando o domínio redesX.edu.br (onde X é o último dígito do ip de sua máquina). Por questões práticas, acima mencionadas, não crie zona reversa. Adaptações para a nova versão do Bind juntamente com Ubuntu:
 +
## apt-get install bind9. Instalando o Bind.
 +
## vi /etc/bind/named.conf.local. Editando o equivalente ao named.conf da apostila.
 +
##  vi /etc/bind/db.redesX. Editando o equivalente ao /var/lib/named/var/named/master/redesX.zone da apostila.
 +
# O servidor DNS deverá responder pelos nomes: da própria máquina: m2 à m15, www, ftp e mail, todos apontando para o mesmo IP.
 +
# No ''/etc/resolv.conf'' declare nameserver 192.168.3.101.
 +
# Faça testes “pingando” nos nomes, ex: <syntaxhighlight lang=bash>
 +
ping www.redes4.edu.br
 +
ping m4.redes4.edu.br
 +
ping www.redes3.edu.br
 +
</syntaxhighlight>
 +
# Teste o DNS reverso.
 +
# Faça testes usando a ferramenta “dig”: <syntaxhighlight lang=bash>
 +
dig -x número.do.ip
 +
dig maquina.dominio.extensao.br;
 +
dig +trace maquina.dominio.extensao.br;
 +
dig @servidor.de.nomes maquina.dominio.extensao.br.
 +
</syntaxhighlight>
 +
 +
=== Gabarito para Bind9 em Ubuntu Server 12.04 ===
 +
 +
*vim /etc/bind/named.conf.locaL
 +
<code>
 +
zone "redes4.edu.br" {
 +
  type master;
 +
  file "/etc/bind/db.redes4";
 +
  allow-transfer {
 +
    192.168.3.101;
 +
  };
 +
};
 +
 +
</syntaxhighlight>
 +
 +
*vim /etc/bind/db.redes4
 +
<code>
 +
@  IN    SOA  ns.redes4.edu.br. admin.redes4.edu.br. (
 +
                              2014040902; serial
 +
                              3H ; refresh
 +
                              60 ; retry
 +
                              1W ; expire
 +
                              3W ; minimum
 +
                            )
 +
@      IN  NS    ns.redes4.edu.br. ; este é o servidor master deste domínio
 +
@      IN  MX    10 mail.redes4.edu.br.
 +
$ORIGIN redes4.edu.br.
 +
m4  A 192.168.3.104
 +
mail A 192.168.3.104
 +
www  A 192.168.3.104
 +
ftp  A 192.168.3.104
 +
ns  A 192.168.3.104
 +
</syntaxhighlight>
 +
 +
*vim /etc/resolv.conf
 +
<code>
 +
nameserver 192.168.3.101
 +
</syntaxhighlight>
 +
 +
* Utilitário para testar o arquivo que contém o conteúdo de uma zona:
 +
# named-checkzone nome_do_dominio arquivo_da_zona
 +
# Assume que você esteja no diretório onde está o redes.zone
 +
named-checkzone redes4.edu.br db.redes4
 +
 +
* Utilitário para testar a configuração do BIND:
 +
# Assume que você esteja no diretório onde está o named.conf
 +
named-checkconf -z
 +
 +
* Restart do serviço:
 +
service bind9 restart
 +
 +
* Verificando se está tudo certo:
 +
tail -n 200 /var/log/syslog. Se necessário filtre por named.
 +
 +
* Seqüênica de Testes:
 +
dig redes4.edu.br soa
 +
dig mail.redes4.edu.br a
 +
ping mail.redes4.edu.br
 +
 +
==== Arquivos na máquina '''Professor''' ====
 +
 +
/etc/named/named.conf.local
 +
<code>
 +
//
 +
// Do any local configuration here
 +
//
 +
 +
// Consider adding the 1918 zones here, if they are not used in your
 +
// organization
 +
//include "/etc/bind/zones.rfc1918";
 +
 +
zone "redes1.edu.br" {
 +
        type master;
 +
        file "/etc/bind/db.redes1";
 +
};
 +
zone "3.168.192.in-addr.arpa" IN {
 +
        type master;
 +
        file "/etc/bind/db.3.168.192";
 +
};
 +
 +
zone "redes2.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes2";
 +
        masters { 192.168.3.102; };
 +
};
 +
 +
zone "redes3.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes3";
 +
        masters { 192.168.3.103; };
 +
};
 +
 +
zone "redes4.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes4";
 +
        masters { 192.168.3.104; };
 +
};
 +
 +
zone "redes5.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes5";
 +
        masters { 192.168.3.105; };
 +
};
 +
 +
zone "redes6.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes6";
 +
        masters { 192.168.3.106; };
 +
};
 +
 +
zone "redes7.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes7";
 +
        masters { 192.168.3.107; };
 +
};
 +
 +
zone "redes8.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes8";
 +
        masters { 192.168.3.108; };
 +
};
 +
 +
zone "redes9.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes9";
 +
        masters { 192.168.3.109; };
 +
};
 +
 +
zone "redes10.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes10";
 +
        masters { 192.168.3.110; };
 +
};
 +
 +
zone "redes11.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes11";
 +
        masters { 192.168.3.111; };
 +
};
 +
zone "redes12.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes12";
 +
        masters { 192.168.3.112; };
 +
};
 +
 +
zone "redes13.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes13";
 +
        masters { 192.168.3.113; };
 +
};
 +
 +
zone "redes14.edu.br" IN {
 +
        type slave;
 +
        file "/var/cache/bind/slaves/db.redes14";
 +
        masters { 192.168.3.114; };
 +
};
 +
</syntaxhighlight>
 +
/etc/named/db.redes1
 +
<code>
 +
; BIND reverse data file for empty rfc1918 zone
 +
;
 +
; DO NOT EDIT THIS FILE - it is used for multiple zones.
 +
; Instead, copy it, edit named.conf, and use that copy.
 +
;
 +
$TTL 86400
 +
@ IN SOA m1.redes1.edu.br. root (
 +
    2014040900 ; Serial
 +
604800 ; Refresh
 +
  86400 ; Retry
 +
2419200 ; Expire
 +
  86400 ) ; Negative Cache TTL
 +
;
 +
@ IN NS m1.redes1.edu.br.
 +
@ IN MX 10 mail.redes1.edu.br.
 +
$ORIGIN redes1.edu.br.
 +
m1 A 192.168.3.101
 +
www A 192.168.3.101
 +
ftp A 192.168.3.101
 +
mail A 192.168.3.101
 +
</syntaxhighlight>
 +
 +
/etc/named/db.3.168.192 (Zona reversa)
 +
<code>
 +
$TTL 86400
 +
@ IN SOA m1.redes1.edu.br. root (
 +
    2014040900 ; Serial
 +
604800 ; Refresh
 +
  86400 ; Retry
 +
2419200 ; Expire
 +
  86400 ) ; Negative Cache TTL
 +
;
 +
IN      NS      m1.redes1.edu.br.
 +
101      IN      PTR    m1.redes1.edu.br.
 +
102      IN      PTR    m2.redes2.edu.br.
 +
103      IN      PTR    m3.redes3.edu.br.
 +
104      IN      PTR    m4.redes4.edu.br.
 +
105      IN      PTR    m5.redes5.edu.br.
 +
106      IN      PTR    m6.redes6.edu.br.
 +
107      IN      PTR    m7.redes7.edu.br.
 +
108      IN      PTR    m8.redes8.edu.br.
 +
109      IN      PTR    m9.redes9.edu.br.
 +
110      IN      PTR    m10.redes10.edu.br.
 +
111      IN      PTR    m11.redes11.edu.br.
 +
112      IN      PTR    m12.redes12.edu.br.
 +
113      IN      PTR    m13.redes13.edu.br.
 +
114      IN      PTR    m14.redes14.edu.br.
 +
</syntaxhighlight>
 +
{{Collapse bottom | DNS}}
 +
-->
 +
<!--
 +
== 24/4: Servidor web Apache ==
 +
 +
Ver capítulo 26 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
{{Collapse top | Apache}}
 +
 +
O servidor [http://httpd.apache.org/ABOUT_APACHE.html Apache] (''Apache server'') é o mais bem sucedido servidor web livre. Foi criado em 1995 por Rob McCool, então funcionário do NCSA (''National Center for Supercomputing Applications''), Universidade de Illinois. Ele descende diretamente do [http://en.wikipedia.org/wiki/NCSA_HTTPd NCSA httpd], um servidor web criado e mantido por essa organização. Seu nome vem justamente do reaproveitamento do ''NCSA httpd'' (e do fator de tê-lo tornado modular) fazendo um trocadilho com a expressão "''a patchy httpd'' (um httpd remendável). Para ter ideia de sua popularidade, em maio de 2010, o Apache serviu aproximadamente 54,68% de todos os sites e mais de 66% dos milhões de sites mais movimentados. O servidor é compatível com o protocolo HTTP versão 1.1. Suas funcionalidades são mantidas através de uma estrutura de módulos, podendo inclusive o usuário escrever seus próprios módulos — utilizando a API do software. É disponibilizado em versões para os sistemas Windows, Novell Netware, OS/2 e diversos outros do padrão POSIX (Unix, GNU/Linux, FreeBSD, etc).
 +
 +
Um servidor web é capaz de atender requisições para transferência de documentos. Essas requisições são feitas com o protocolo HTTP (''HyperText Transfer Protocol''), e se referem a documentos que podem ser de diferentes tipos. Uma requisição HTTP simples é mostrada abaixo:
 +
 +
<syntaxhighlight lang=text>
 +
GET / HTTP/1.1 Host: www.ifsc.edu.br
 +
</syntaxhighlight>
 +
 +
Para o servidor Web, os principais componentes de uma requisição HTTP são o método HTTP a executar e o localizador do documento a ser retornado (chamado de URI - ''Uniform Resource Indicator''). No exemplo acima, a requisição pede o método ''GET'' aplicado à URI ''/''. O resultado é composto do status do atendimento, cabeçalhos informativos e o conteúdo da resposta. No exemplo, o status é a primeira linha (''HTTP/1.1 200 OK''), com os cabeçalhos logo a seguir. Os cabeçalhos terminam ao aparecer uma linha em branco, e em seguida vem o conteúdo (ou corpo) da resposta.
 +
 +
Todo documento possui um especificador de tipo de conteúdo, chamado de [http://en.wikipedia.org/wiki/Internet_media_type ''Internet media Type'']. O cabeçalho de resposta ''Content-type'' indica o ''media type'', para que o cliente HTTP (usualmente um navegador web) saiba como processá-lo. No exemplo acima, o documento retornado é do tipo ''text/html'', o que indica ser um texto HTML. Outros possíveis ''media types'' são: ''text/plain'' (texto simples), ''application/pdf'' (um texto PDF), ''application/x-gzip'' (um conteúdo compactado com gzip).
 +
 +
Um documento no contexto do servidor web é qualquer conteúdo que pode ser retornado como resposta a uma requisição HTTP. No caso mais simples, um documento corresponde a um arquivo em disco, mas também podem ser gerados dinamicamente. Existem diversas tecnologias para gerar documentos, tais como PHP, JSP, ASP, CGI, Python, Perl, Ruby, e possivelmente outras. Todas se caracterizam por uma linguagem de programação integrada intimamente ao servidor web, obtendo dele informação sobre como gerar o conteúdo da resposta. Atualmente, boa parte dos documentos que compõem um site web são gerados dinamicamente, sendo PHP, JSP e ASP as tecnologias mais usadas.
 +
 +
=== Informações gerais sobre Apache no Ubuntu ===
 +
 +
* Instalação: <syntaxhighlight lang=bash>
 +
sudo apt-get install apache2
 +
</syntaxhighlight>
 +
* Arquivos de configuração ficam em ''/etc/apache2'':
 +
** ''apache2.conf:'' a configuração inicia aqui
 +
** ''Diretório sites-available:'' configurações de hosts virtuais
 +
** ''Diretório sites-enabled:'' hosts virtuais atualmente ativados
 +
* Para iniciar o Apache: <syntaxhighlight lang=bash>
 +
sudo service apache2 start
 +
</syntaxhighlight>
 +
* ''Para testar o Apache:'' com um navegador acesse a URL http://192.168.2.X/ (X é 102 para o micro 2, 103 para o 3, e assim por diante).
 +
 +
=== Uma configuração básica ===
 +
 +
O servidor Apache precisa de algumas informações básicas para poder ativar um site:
 +
 +
* ''Qual seu nome de servidor:'' seu nome DNS , como ''www.sj.ifsc.edu.br''
 +
* ''Em que portas ele atende requisições:'' as portas TCP onde ele recebe requisições HTTP. Por default é a porta 80, mas outras portas podem ser especificadas.
 +
* ''Onde estão os documentos que compõem o site hospedado:'' o caminho do diretório onde estão esses documentos
 +
* ''Quem pode acessar os documentos:'' restrições baseadas em endereços IP de clientes e/ou nomes de usuários e grupos.
 +
 +
No exemplo abaixo, define-se um servidor WWW chamado ''www.ger.edu.br'', que atende requisições nos ports 8080.
 +
 +
Crie um arquivo /etc/apache2/sites-avaliable/ger, com o seguinte conteúdo:
 +
 +
<syntaxhighlight lang=text>
 +
# O nome de servidor
 +
ServerName www.ger.edu.br
 +
 +
# As portas onde se atendem requisições HTTP
 +
Listen 8080
 +
 +
# Onde estão os documentos desse site
 +
DocumentRoot /var/www/ger
 +
 +
# As restrições de acesso aos documentos
 +
<Directory /var/www/ger>
 +
  Options Indexes
 +
  DirectoryIndex index.html index.php
 +
  order allow,deny
 +
  allow from all
 +
</Directory>
 +
</syntaxhighlight>
 +
 +
Crie um link simbólico para o arquivo ger:
 +
ln -s /etc/apache2/sites-available/ger /etc/apache2/sites-enable/ger
 +
 +
Edite o arquivo /etc/hosts e acrescente:
 +
192.168.3.1X  www.ger.edu.br
 +
 +
Crie o diretório /var/www/ger e crie um arquivo de nome index.html com o seguinte conteúdo:<syntaxhighlight lang=text>
 +
<html><body><h1>GER!</h1>
 +
<p>Esta e minha pagina.</p>
 +
</body></html>
 +
</syntaxhighlight>
 +
 +
Restarte o Apache:
 +
service apache2 restart
 +
 +
Acesse 192.168.3.1X:8080
 +
 +
Além dessas configurações, diversas outras se referem a opções do Apache, tais como modos de operação, identificação de tipos de documentos, extensões (funcionalidades) suportadas, e outras. Usualmente essas configurações já estão definidas de forma conveniente no arquivo de configuração do Apache.
 +
 +
{{Collapse bottom | Apache}}
 +
-->
 +
<!--
 +
== 24/4: Email ==
 +
 +
Ver capítulo 27 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
 +
{{Collapse top | Email}}
 +
 +
O correio eletrônico (''email'') é um dos principais serviços na Internet. De fato foi o primeiro serviço a ser usado em larga escala. Trata-se de
 +
um método para intercâmbio de mensagens digitais. Os sistemas de correio eletrônico se baseiam em um modelo armazena-e-encaminha (''store-and-forward'') em que os servidores de email aceitam, encaminham, entregam e armazenam mensagens de usuários.
 +
 +
Uma mensagem de correio eletrônico se divide em duas partes:
 +
* ''Cabeçalhos:'' contém informações de controle e atributos da mensagem
 +
* ''Corpo:'' o conteúdo da mensagem
 +
 +
<syntaxhighlight lang=text>
 +
From: Roberto de Matos <roberto@eel.ufsc.br>
 +
Content-Type: text/plain;
 +
charset=iso-8859-1
 +
Content-Transfer-Encoding: quoted-printable
 +
X-Smtp-Server: smtp.ufsc.br:roberto.matos@posgrad.ufsc.br
 +
Subject: =?iso-8859-1?Q?Teste_Ger=EAncia?=
 +
Message-Id: <0595A764-EEAE-41E7-99F0-80DC11FB5327@eel.ufsc.br>
 +
X-Universally-Unique-Identifier: 684c3833-bbbe-420b-8b66-d92d9a419bc0
 +
Date: Wed, 20 Nov 2013 11:36:35 -0200
 +
To: Roberto de Matos <roberto.matos@ifsc.edu.br>
 +
Mime-Version: 1.0 (Mac OS X Mail 6.6 \(1510\))
 +
 +
Ol=E1 Pessoal,
 +
 +
Hoje vamos aprender o funcionamento do Email!!
 +
 +
Abra=E7o,
 +
 +
Roberto=
 +
</syntaxhighlight>
 +
 +
Na mensagem acima, os cabeçalhos são as linhas iniciais. Os cabeçalhos terminam quando aparece uma linha em branco, a partir de que começa o corpo da mensagem.
 +
 +
=== Funcionamento do email ===
 +
 +
Os componentes da infraestrutura de email são:
 +
* ''MUA (Mail User Agent):'' o aplicativo que o usuário usa para envio e acesso a mensagens. Atualmente é bastante comum MUA do tipo webmail, mas existem outros como Mozilla Thunderbird, KMail e Microsoft Outlook.
 +
* ''MDA (Mail Delivery Agent):'' o servidor responsável por receber dos usuários mensagens a serem enviadas. Assim, quando um usuário quer enviar uma mensagem, usa um MUA que contata o MDA para fazer o envio. Exemplos de software são Postfix, Sendmail, Qmail e Microsoft Exchange.
 +
* ''MTA (Mail Transport Agent):'' o servidor responsável por transmitir mensagens até seu destino, e receber mensagens da rede para seus usuários. Comumente faz também o papel de MDA. Exemplos de softwares são Postfix, Sendmail, Qmail e Microsoft Exchange.
 +
 +
A figura abaixo ilustra uma infraestrutura de email típica.
 +
 +
[[Imagem:Email-intro.png]]
 +
 +
Os protocolos envolvidos são:
 +
 +
* ''SMTP (Simple Mail Transfer Protocol):'' usado para envios de mensagens entre MTAs, e entre MUA e MDA/MTA.
 +
* ''IMAP (Internet Mail Access Protocol):'' usado por MUAs para acesso a mensagens armazenadas em caixas de email em servidores.
 +
* ''POP (Post Office Protocol):'' mesma finalidade que IMAP, porém com funcionalidade mais limitada. Se destina a situações em que o normal é copiar as mensagens parao computador do usuário, e então removê-las do servidor.
 +
* ''LMTP (Local Mail Transfer Protocol):'' usado para entrega de mensagens entre MTA e MDA/MTA, sendo que o servidor de destino não mantém uma fila de mensagens (quer dizer, ele entrega diretamente na caixa de entrada de um usuário ou a encaminha imediatamente).
 +
 +
=== Endereçamento ===
 +
 +
Endereços de email estão intimamente ligados ao DNS. Cada usuário de email possui um endereço único mundial, definido por um identificador de usuário e um domínio de email, escritos usando-se o símbolo especial ''@'' (lê-se ''at'', do original em inglês) para conectá-los:
 +
 +
tele@ifsc.edu.br
 +
 +
Nesse exemplo, o identificador de usuário é ''tele'', e o domínio é ''ifsc.edu.br''.
 +
 +
Os domínios de email tem correspondência direta com domínios DNS. De fato, para criar um domínio de email deve-se primeiro criá-lo no DNS. Além disto, o domínio DNS deve ter associado a si um ou mais registros MX (''Mail exchanger'') para apontar os MTAs responsáveis por receber emails para o domínio. Por exemplo, o domínio DNS ''ifsc.edu.br'' possui esse registro MX:
 +
 +
<syntaxhighlight lang=text>
 +
> dig ifsc.edu.br mx
 +
 +
;; QUESTION SECTION:
 +
;ifsc.edu.br.                  IN      MX
 +
 +
;; ANSWER SECTION:
 +
ifsc.edu.br.            3581    IN      MX      5 hermes.ifsc.edu.br.
 +
</syntaxhighlight>
 +
 +
... e o domínio ''gmail.com'':
 +
 +
<syntaxhighlight lang=text>
 +
> dig gmail.com mx
 +
 +
;; QUESTION SECTION:
 +
;gmail.com.                    IN      MX
 +
 +
;; ANSWER SECTION:
 +
gmail.com.              3600    IN      MX      20 alt2.gmail-smtp-in.l.google.com.
 +
gmail.com.              3600    IN      MX      30 alt3.gmail-smtp-in.l.google.com.
 +
gmail.com.              3600    IN      MX      40 alt4.gmail-smtp-in.l.google.com.
 +
gmail.com.              3600    IN      MX      5 gmail-smtp-in.l.google.com.
 +
gmail.com.              3600    IN      MX      10 alt1.gmail-smtp-in.l.google.com.
 +
</syntaxhighlight>
 +
 +
=== MTA Postfix ===
 +
 +
O primeiro software MTA usado em larga escala na Internet foi o [http://www.sendmail.org sendmail]. Esse MTA possui muitas funcionalidades, e enfatiza a flexibilidade em sua configuração. No entanto, configurá-lo e ajustá-lo não é tarefa fácil. Além disto, houve vários problemas de segurança no passado envolvendo esse software. Assim outras propostas surgiram, como [http://www.qmail.org qmail] e [http://www.postfix.org postfix]. Tanto ''qmail'' quanto ''postfix'' nasceram como projetos preocupados com a segurança nas operações de um MTA, e também se apresentaram como MTAs mais simples de configurar e operar. Em nossas aulas será usado o ''postfix'', mas recomenda-se experimentar usar as outras duas opcões citadas.
 +
 +
O ''postfix'' é um MTA modularizado, que divide as tarefas de processamento das mensagens em diversos componentes que rodam como processos separados. Isto difere bastante do ''sendmail'', que se apresenta como um software monolítico. No postfix, um conjunto de subsistemas cuida de processar cada etapa da recepção ou envio de uma mensagem, como mostrado na figura abaixo:
 +
 +
[[Imagem:Postfix_architecture.gif|400px]]
 +
 +
* [http://www.postfix.org/OVERVIEW.html Visão geral do processamento de mensagens no postfix]
 +
 +
==== Configuração ====
 +
 +
* [http://help.ubuntu.com/community/Postfix Guia de instalação no Ubuntu]
 +
 +
A configuração do ''postfix'' é armazenada em arquivos, que normalmente residem no diretório ''/etc/postfix''. Os dois principais são:
 +
 +
* ''master.cf:'' configurações para execução dos subsistemas do Postfix (define que subsistemas estão ativados, quantas instâncias rodar de cada um, e seus argumentos de execução)
 +
* ''main.cf:'' configurações usadas pelos subsistemas
 +
 +
No Ubuntu deve-se iniciar o uso do Postfix com esses comandos:
 +
 +
<syntaxhighlight lang=bash>
 +
sudo apt-get install -y postfix
 +
 +
# O comando abaixo deve ser usado se o postfix já foi instalado, mas deseja-se recriar sua configuração
 +
sudo dpkg-reconfigure postfix
 +
</syntaxhighlight>
 +
 +
As configurações iniciais informadas na instalação são suficientes para que o ''postfix'' possa ser iniciado. No entanto muitos detalhes provavelmente precisarão ser ajustados para que ele opere como desejado.
 +
 +
Para um rápido teste do ''postfix'' pode-se fazer a sequência abaixo:
 +
 +
<syntaxhighlight lang=bash>
 +
> sudo service postfix restart
 +
> telnet localhost 25
 +
220 ger ESMTP postfix (Ubuntu)
 +
helo mail
 +
250 ger
 +
mail from: aluno@ifsc.edu.br
 +
250 2.1.0 OK
 +
rcpt to: postmaster@ger.edu.br
 +
250 2.1.5 OK
 +
data
 +
354 End data with <CR><LF>.<CR><LF>
 +
subject: Teste
 +
 +
blabla
 +
.
 +
250 2.0.0 OK: queued as 71259CCA3
 +
quit
 +
221 2.0.0 Bye
 +
Connection closed by foreign host
 +
>
 +
</syntaxhighlight>
 +
 +
O resultado do teste (a mensagem entreguepara o usuário ''postmaster'') pode ser visto no arquivo de log do ''postfix''. No Ubuntu esse arquivo é ''/var/log/mail.log'' :
 +
 +
<syntaxhighlight lang=text>
 +
> tail /var/log/mail.log
 +
May  2 17:29:42 ger postfix/smtpd[1965]: 71259CCA3: client=localhost[127.0.0.1]
 +
May  2 17:30:48 ger postfix/cleanup[1970]: 71259CCA3: message-id=<20100502202942.71259CCA3@ger>
 +
May  2 17:30:48 ger postfix/qmgr[1894]: 71259CCA3: from=<aluno@ifsc.edu.br>, size=323, nrcpt=1 (queue active)
 +
May  2 17:30:48 ger postfix/local[1972]: 71259CCA3: to=<root@ger.edu.br>, orig_to=<postmaster@ger.edu.br>, relay=local, delay=102, delays=102/0.05/0/0.03, dsn=2.0.0, status=sent (delivered to mailbox)
 +
May  2 17:30:48 ger postfix/qmgr[1894]: 71259CCA3: removed
 +
May  2 17:31:25 ger postfix/smtpd[1965]: disconnect from localhost[127.0.0.1]
 +
>
 +
</syntaxhighlight>
 +
 +
A mensagem de teste foi entregue em ''/var/mail/root'':
 +
 +
<syntaxhighlight lang=bash>
 +
> sudo cat /var/mail/root
 +
From aluno@ifsc.edu.br  Sun May  2 17:30:48 2010
 +
Return-Path: <aluno@ifsc.edu.br>
 +
X-Original-To: postmaster@ger.edu.br
 +
Delivered-To: postmaster@ger.edu.br
 +
Received: from mail (localhost [127.0.0.1])
 +
        by ger (Postfix) with SMTP id 71259CCA3
 +
        for <postmaster@ger.edu.br>; Sun,  2 May 2010 17:29:06 -0300 (BRT)
 +
Subject: teste
 +
Message-Id: <20100502202942.71259CCA3@ger>
 +
Date: Sun,  2 May 2010 17:29:06 -0300 (BRT)
 +
From: aluno@ifsc.edu.br
 +
To: undisclosed-recipients:;
 +
 +
blabla
 +
 +
</syntaxhighlight>
 +
 +
Outra maneira para testar e um pouco mais amigável é utilizar a ferramenta mail. Instale o pacote:
 +
apt-get install mailutils
 +
Para enviar uma mensagem proceda do seguinte modo:<code>
 +
mail usuario@redesX.edu.br <Enter>,
 +
inserir o subjet <Enter>,
 +
inserir a mensagem, <Enter>
 +
<Ctrl>+<d>. //Finaliza e encaminha o Email
 +
</syntaxhighlight>
 +
Verifique o encaminhamento ou não em:
 +
tail -f /var/log/mail.log
 +
 +
=== Atividades ===
 +
 +
# Instale o postfix em sua máquina virtual. Configure-o para que se comunicar na Internet, criando o domínio de email ''redeX.edu.br'', sendo X o número do seu computador.
 +
# Teste o funcionamento do postfix, enviando um email para ''postmaster@redeX.edu.br''.
 +
# Teste o envio de mensagens para os domínios de seus colegas. Acompanhe o processamento das mensagens olhando o log do ''postfix''.
 +
 +
=== Dicas ===
 +
 +
Atenção para vários problemas comuns na implantação do correio eletrônico:
 +
* ''Domínio DNS sem registro MX'': sem isso os MTAs não sabem como enviar mensagens para esse domínio
 +
* ''Registro MX aponta um nome de host desconhecido:'' causa o mesmo problema acima
 +
* ''Nome de host configurado como localhost no Postfix:'' o nome de host (parâmetro ''myhostname'' em /etc/postfix/main.cf) deve ser o nome DNS do servidor onde roda o Postfix.
 +
* ''Erros de configuração (sintaxe) em /etc/postfix/main.cf'': tais erros podem fazer com que um dos subsistemas do Postfix aborte sua execução, impedindo que se processe uma mensagem. Por exemplo, se um parâmetro usado pelo subsistema ''smtpd''  (que recebe mensagens com protocolo SMTP) estiver errado, o ''smtpd'' não iniciam, ou termina abruptamente, abortando a recepção de mensagens.
 +
{{Collapse bottom | Email}}
 +
-->
 +
<!--
 +
== 8/8: Webmail ==
 +
 +
{{Collapse top | Webmail}}
 +
O objetivo é instalar o Webmail [http://roundcube.net/ RoundCube].
 +
Pré-requisitos: DNS, Postfix e Apache2 rodando
 +
#Ir para o diretório www: '''cd /var/www'''
 +
#Baixar o pacote: '''wget http://sourceforge.net/projects/roundcubemail/files/roundcubemail/1.0.0/roundcubemail-1.0.0.tar.gz'''
 +
#Desempacotar: '''tar -zxvf roundcubemail-1.0.0.tar.gz'''
 +
#Renomear para webmail: '''mv roundcubemail-1.0.0 webmail'''
 +
#Instalar o Dovecot. [https://help.ubuntu.com/community/Dovecot Dovecot] é um MDA de fácil instalação que suporta acessos com IMAP e POP3. As caixas de entrada podem  ser armazenadas nos formatos [http://www.linuxmail.info/mbox-maildir-mail-storage-formats/ mailbox ou Maildir].: '''apt-get install -y dovecot-imapd dovecot-pop3d'''
 +
#Configurar o Dovecot: '''vi /etc/dovecot/dovecot.conf''' e ajustar/criar os seguintes parâmetros:<syntaxhighlight lang=text>
 +
protocols = pop3 pop3s imap imaps
 +
pop3_uidl_format = %08Xu%08Xv
 +
mail_location = maildir:~/Maildir</syntaxhighlight>
 +
#Verificar se não há erros de sintaxe no arquivo de configuração: '''dovecote -F'''
 +
#Reconfigurar a conta do '''aluno''' com os comandos (isto deve ser feito a todos os usuários do sistema):<syntaxhighlight lang=text>
 +
maildirmake.dovecot /home/aluno/Maildir
 +
maildirmake.dovecot /home/aluno/Maildir/.Drafts
 +
maildirmake.dovecot /home/aluno/Maildir/.Sent
 +
maildirmake.dovecot /home/aluno/Maildir/.Trash
 +
maildirmake.dovecot /home/aluno/Maildir/.Templates
 +
chown -R aluno /home/aluno/Maildir/
 +
chmod -R go-rwx /home/aluno/Maildir</syntaxhighlight>
 +
#Reconfigurar o Postfix: '''vi /etc/postfix/main.cf''' acrescentando a diretiva:<syntaxhighlight lang=text>
 +
home_mailbox = Maildir/ </syntaxhighlight>
 +
#Reiniciar os serviços: '''service dovecot restart''' e '''service postfix restart'''
 +
#Atualize a base apt: '''apt-get update'''
 +
#Instalar os pacotes e dependências necessárias: '''apt-get install -y php5 sqlite php5-sqlite php-net-smtp php-mail-mime php-mdb2'''
 +
#Dentro de /var/www/webmail mudar as permissões: '''chmod 777 temp/  logs/'''
 +
#Mude as permissões: '''chmod 755 /var/www/webmail''' e '''chmod 777 /var/www/webmail/SQL/'''
 +
#Reinicie o Apache2: '''service apache2 restart'''
 +
#Acesso com um navegador a página: http://ip_do_seu_server/webmail/installer/
 +
#Verifique se há alguma pendência NÃO opcional ('''essencial'''), se houver resolva!
 +
#Clique em '''Next'''. No quadro '''Database setup''' ajuste somente '''SQLite database type''' e '''/var/www/webmail/SQL/sqlite.db DataBase Name''', os demais campos deixe em branco e clique em '''CREATE CONFIG'''.
 +
#Copie ou baixe os arquivos com os nomes indicado para /var/www/webmail/config/. Clique em '''CONTINUE'''.
 +
#Tenha CERTEZA que tudo esteja correto e, para poder continuar é imprescindível remover o diretório de instalação. Isto é quesito de segurança do RoundCube: '''rm -rf /var/www/webmail/installer'''
 +
#Acesse a página http://ip_do_seu_server/webmail/ e forneça o login e senha do aluno.
 +
#Faça testes enviando mensagens aos colegas. É possível enviar também para contas externas desde que não haja bloqueio por domínio inválido.
 +
 +
{{Collapse bottom | Webmail}}
 +
-->
 +
<!--
 +
== 8/5: Servidor de arquivos ==
 +
 +
{{Collapse top | Arquivos}}
 +
Um servidor de arquivos compartilha volumes (sistemas de arquivos) via rede. Para os computadores que acessam o servidor  de arquivos, os volumes compartilhados parecem ser locais e se integram  transparentemente às suas árvores de diretórios.
 +
 +
Um serviço de compartilhamento de sistema de arquivos possui algumas implicações:
 +
* '''Segurança:''' o servidor  de arquivos deve impor mecanismos para controle de acesso dos usuários remotos aos arquivos dos volumes compartilhados, de forma consistente com as restrições e direitos concedidos aos usuários locais. Para isso ser efetivo, torna-se necessário que os usuários da rede estejam  definidos em um domínio  administrativo.
 +
* '''Desempenho:''' os acessos remotos aos arquivos são efetuados no nível de sistema de arquivos, o que significa que as transferências de dados são orientadas a blocos. Como a leitura e escrita de blocos se faz via mensagens  na rede,  há que cuidar para que o tamanho de blocos seja adequado para agilizar as transferências. Além disso,  demais características  no acesso ao sistema  de arquivos remoto (atualização de atributos, gravação síncrona ou assíncrona) precisam ser ajustadas para reduzir os atrasos nas operações sobre arquivos e diretórios.
 +
* '''Integridade de dados:''' sendo o sistema de arquivos remoto,  e podendo  ser acessado por mais de um cliente simultaneamente, são necessários mecanismos para evitar inconsistências dos dados vistos pelos diversos  clientes. Outro detalhe a se cuidar trata de erros de transmissão e quedas ou interrupções momentâneas no servidor de arquivos.
 +
 +
Existem muitos tipos de sistemas de arquivos de rede, como  NFS, Coda, Andrew FS, SMB/CIFS, porém nos concentraremos nos dois mais usados:
 +
* '''NFS (Network File System):''' sistema de arquivos de rede nativo de muitos sistemas operacionais Unix
 +
* '''SMB/CIFS (Service Message Block/Common Internet  File System):''' mais conhecido como  ''compartilhamento de arquivos  e impressoras do Windows''
 +
 +
==== NFS  ====
 +
 +
[http://en.wikipedia.org/wiki/Network_File_System_%28protocol%29 NFS] é um sistema  de arquivos de rede criado pela [http://www.sun.com/ Sun Microsystems] em 1989, e descrito  na [http://tools.ietf.org/html/rfc1094 RFC 1094]. Seu uso predomina em sistemas operacionais Unix, porém há implementações para outras famílias de sistemas operacionais.
 +
 +
No NFS, um servidor compartilha um ou mais diretórios. Cada diretório compartilhado está sujeito a várias opções e restrições de acesso, como:
 +
* clientes permitidos
 +
* se são permitidos acessos como superusuário (''root'')
 +
* se modificações são síncronas ou assíncronas
 +
* protocolo de transporte usado (TCP ou UDP)
 +
* tamanho de bloco para leitura ou escrita
 +
* ... e outras
 +
 +
Para ter suporte ao serviço NFS, deve-se instalar o pacote ''nfs-kernel-server'': <syntaxhighlight lang=bash>
 +
apt-get install -y nfs-kernel-server
 +
</syntaxhighlight>
 +
 +
Um computador pode ser tanto servidor como cliente. Para o papel de servidor, uma tabela lista os diretórios a serem compartilhados e suas opções de compartilhamento. De forma geral, nos sistemas Unix essa tabela fica no arquivo ''/etc/exports'', como neste exemplo:
 +
 +
<syntaxhighlight lang=text>
 +
# Compartilha /home para os computadores da rede 192.168.3.0/24, em modo leitura-escrita, com acessos
 +
# como superusuário. Modificações em modo assíncrono.
 +
/home 192.168.3.0/24(rw,root_squash,async)
 +
 +
# Compartilha /data para os computadores da rede 192.168.3.0/24, em modo leitura-escrita, porém sem acessos
 +
# como superusuário. Modificações em modo assíncrono. Porém para 192.168.3.101 se permitem  acessos
 +
# como  superusuário.
 +
/data 192.168.3.101(rw,no_root_squash) 192.168.2.0/24(rw,root_squash,async)
 +
</syntaxhighlight>
 +
 +
Após editar esse arquivo, deve-se atualizar o serviço NFS com o comando [http://manpages.ubuntu.com/manpages/karmic/en/man8/exportfs.8.html ''exportfs'']: <syntaxhighlight lang=bash>
 +
exportfs -r
 +
</syntaxhighlight>
 +
 +
Podem-se ver os diretórios exportados com o comando [http://manpages.ubuntu.com/manpages/jaunty/man8/showmount.8.html ''showmount'']: <syntaxhighlight lang=bash>
 +
showmount -e
 +
</syntaxhighlight>
 +
 +
Para o lado cliente, primeiramente deve-se instalar um pacote para acesso remoto: '''apt-get install nfs-common'''
 +
 +
Os sistemas  de arquivos de rede a serem acessados são montados de forma semelhante a sistemas de arquivos locais (portanto, usando o comando ''mount'' e podendo ser incluídos em ''/etc/fstab''):
 +
 +
<syntaxhighlight lang=bash>
 +
# Monta o sistema de arquivos NFS IP_do_servidor:/home no ponto de montagem  /home. Quer dizer,
 +
# esse sistema  de arquivos vai aparecer em /home. Usa blocos de 4kB para leitura e escrita.
 +
$ mount IP_do_servidor:/home /dir_de_montagem
 +
$ mount IP_do_servidor:/data /dir_de_montagem2
 +
</syntaxhighlight>
 +
 +
Para que esse sistema de arquivos possa ser sempre montado quando o computador reiniciar, ele deve ser incluído em ''/etc/fstab'':
 +
 +
<syntaxhighlight lang=text>
 +
IP_do_servidor:/home  /home  nfs  rsize=4096,wsize=4096,async  0  0
 +
</syntaxhighlight>
 +
 +
===== Atividade =====
 +
 +
# Monte o diretório NFS /dados, que se encontra no servidor 192.168.3.101. Tente criar arquivos e diretórios.
 +
# Compartilhe para a rede 192.168.3.0/24 o diretório /home de seu servidor, porém sem  permitir  acessos como superusuário. Use a outra máquina virtual  para ser o cliente NFS, montando lá esse diretório.
 +
 +
==== Servidor de arquivos: Samba ====
 +
 +
[http://www.samba.org/ Samba] é originalmente uma implementação de código aberto para o serviço de compartilhamento de arquivos e impressoras do Microsoft Windows. Porém  atualmente esse software evoluiu a tal ponto que pode ser usado como  controlador de domínio Windows,  além  de possuir algumas funções e recursos não existentes no Windows (integração com Unix, flexibilidade de uso de diferentes bases administrativas, entre outros). Além de funcionar como  um servidor, pode ter também papel de cliente e usar o serviço de autenticação de um  servidor Windows. Seu uso se mostra razoavelmente simples, com  complexidade proporcional à configuração desejada. Assim, Samba tem  grande popularidade por possibilitar integrar os mundos do Windows e do Unix.
 +
 +
O Samba é dividido a grosso modo em duas partes principais:
 +
 +
* Servidor de arquivos, impressoras, e de autenticação (serviços [http://msdn.microsoft.com/en-us/library/aa365233%28VS.85%29.aspx SMB/CIFS]): programa  [http://manpages.ubuntu.com/manpages/karmic/man8/smbd.8.html smbd]
 +
* Servidor de nomes WINS (Windows Name Service): programa [http://manpages.ubuntu.com/manpages/karmic/man8/nmbd.8.html nmbd]
 +
 +
Esse software pode ser instalado tanto a partir do código-fonte, obtido no [http://www.samba.org/ site oficial], quanto por pacote pre-compilado. No caso do Ubuntu, sua instalação pode ser feita assim:
 +
 +
<syntaxhighlight lang=bash>
 +
apt-get install -y samba samba4-clients smbfs
 +
</syntaxhighlight>
 +
 +
A configuração do Samba se faz por meio de arquivos, que normalmente ficam em ''/etc/samba''. O principal deles se chama ''smb.conf'', e uma configuração muito simplificada segue abaixo:
 +
 +
<syntaxhighlight lang=text>
 +
[global]
 +
  workgroup = GER
 +
  server string = Servidor %h (GER - IFSC)
 +
  netbios name = GER
 +
  dns proxy = no
 +
  log file = /var/log/samba/log.%m
 +
  encrypt passwords = true
 +
  passdb backend = tdbsam
 +
  obey pam restrictions = yes
 +
 +
[homes]
 +
  comment = Lares dos usuarios
 +
  browseable = no
 +
  read only = no
 +
  create mask = 0700
 +
  directory mask = 0700
 +
 +
[software]
 +
        comment = Softwares
 +
path = /dados/software
 +
invalid users = login_usuario_sem_permissao
 +
valid users = login_usuario_com_permissao1, login_usuario_com_permissao2
 +
force user = login_usuario
 +
force group = grupo
 +
force create mode = 0555
 +
force directory mode = 0555
 +
writable = yes ;Para permitir escrita na pasta
 +
</syntaxhighlight>
 +
 +
Esse arquivo se organiza em seções. A seção ''[global]'' contém opções válidas globalmente, e as demais seções definem compartilhamentos e suas respectivas opções. Algumas seções são especiais,  como '[homes]'',  que corresponde aos diretórios ''home'' dos usuários.
 +
 +
Para usar a ferramenta de amdinistração web ''Swat'':
 +
# Instalar o ''swat'': <syntaxhighlight lang=text>
 +
apt-get install -y swat
 +
</syntaxhighlight>
 +
# Ativar o serviço ''openbsd-inetd'': <syntaxhighlight lang=text>
 +
service openbsd-inetd start
 +
</syntaxhighlight>
 +
# Modifique a senha de root (administrador) do ''Swat'': <syntaxhighlight lang=text>
 +
echo root:nova_senha | chpasswd
 +
</syntaxhighlight>
 +
# Acessar a seguinte URL (use a senha de ''root''): <syntaxhighlight lang=text>
 +
http://ip_do_server:901/
 +
</syntaxhighlight>
 +
 +
=== Atividade ===
 +
 +
# Instale o Samba em sua máquina virtual.
 +
# Configure seu Samba para que use nome de servidor ''servidorX'', sendo X o número de seu computador. O domínio (opção ''workgroup'') deve ser GER.
 +
# Crie  contas de usuários samba, usando esse comando: <syntaxhighlight lang=bash>
 +
smbpasswd -a usuario
 +
</syntaxhighlight>...sendo '''usuario''' um usuário do Linux.
 +
# Ative o Samba: <syntaxhighlight lang=bash>
 +
service smbd restart
 +
</syntaxhighlight>
 +
# Teste o acesso a seus compartilhamentos. Você pode usar esse comando: <syntaxhighlight lang=bash>
 +
# Para listar os compartilhamentos de seu servidor
 +
smbclient -L ip_do_servidor -U usuario
 +
#Para acessar o compartilhamento
 +
smbclient //ip_do_servidor/nome_compartilhamento -U usuario
 +
</syntaxhighlight>
 +
# Monte um compartilhamento em sua árvore de diretórios. Para isso,  use o tipo de sistema  de arquivos ''cifs'' no comando ''mount'': <syntaxhighlight lang=bash>
 +
mount -t cifs -o username=usuario,password=senha //ip_do_servidor/nome_compartilhamento /ponto/de/montagem
 +
</syntaxhighlight>
 +
{{Collapse bottom | Arquivos}}
 +
-->
 +
<!--
 +
== 15/5: Servidor DHCP ==
 +
 +
Ver capítulo 31 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | DHCP}}
 +
Em nosso experimento será usado o [http://www.isc.org/software/dhcp servidor DHCP desenvolvido pelo ISC]. Para usá-lo devem-se seguir os passos descritos abaixo.
 +
 +
# Instalar o serviço: <syntaxhighlight lang=bash>
 +
apt-get install -y dhcp3-server
 +
</syntaxhighlight>
 +
# Configurar em ''/etc/dhcp/dhcpd.conf''. Definir as configurações globais e as redes onde o servidor DHCP irá ofertar endereços. Apague todo o conteúdo do arquivo original: <syntaxhighlight lang=text>
 +
default-lease-time 600;
 +
max-lease-time 7200;
 +
option subnet-mask 255.255.255.0;
 +
option broadcast-address 192.168.3.255;
 +
option routers 192.168.3.1;
 +
option domain-name-servers 200.135.37.65;
 +
option domain-name "ger.edu.br";
 +
 +
subnet 192.168.3.0 netmask 255.255.255.0 {
 +
  range 192.168.3.X1 192.168.3.X9;
 +
}
 +
</syntaxhighlight>
 +
# Editar a interface que vai atender ao DHPD: <syntaxhighlight lang=text>
 +
vi /etc/default/isc-dhcp-server
 +
    INTERFACES="eth0" </syntaxhighlight>
 +
# Iniciar o servidor DHCP: <syntaxhighlight lang=text>
 +
service isc-dhcp-server restart
 +
</syntaxhighlight>
 +
# Use o utilitário o '''dhclient''' de sua máquina virtual com ambiente gráfico como cliente para testes <syntaxhighlight lang=bash>
 +
apt-get install isc-dhcp-client
 +
dhclient -v eth0 </syntaxhighlight>
 +
# Verifique o log e observe a troca de mensagens entre o cliente e o servidor: <syntaxhighlight lang=text>
 +
tail /var/log/syslog </syntaxhighlight>
 +
# Verifique os aluguéis no seu servidor com: <syntaxhighlight lang=text>
 +
cat /var/lib/dhcp/dhcpd.leases </syntaxhighlight>
 +
# Como fixar IP para uma determinada máquina?
 +
 +
Maiores detalhes sobre esse servidor DHCP:
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man8/dhcpd.8.html dhcpd - o servidor DHCP]
 +
* [http://manpages.ubuntu.com/manpages/dapper/en/man5/dhcpd.conf.5.html dhcpd.conf - o arquivo de configuração do DHCP]
 +
* [http://manpages.ubuntu.com/manpages/karmic/en/man5/dhcp-options.5.html Opções do protocolo DHCP]
 +
* [http://manpages.ubuntu.com/manpages/dapper/en/man8/dhclient.8.html dhclient - o cliente DHCP]
 +
{{Collapse bottom | DHCP}}
 +
-->
 +
<!--
 +
== 15/5: Servidor FTP ==
 +
Ver capítulo 32 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | FTP}}
 +
#Instale o servidor FTP <syntaxhighlight lang=text> apt-get install vsftpd </syntaxhighlight>
 +
#Teste como ''anonymous'' conectando do terminal da máquina real. Tente criar arquivos e pastas e fazer o download de arquivos. Verifique o conteúdo do diretório da máquina remota e também da máquina local. Digite '''help''' no terminal ftp para saber como. <syntaxhighlight lang=text> ftp 192.168.3.1X </syntaxhighlight>
 +
#Configure o diretório padrão do ''anonymous'' (desafio), e coloque algum arquivo neste diretório.
 +
#Reinicie o serviço <syntaxhighlight lang=text>
 +
service vsftpd restart </syntaxhighlight>
 +
#Teste
 +
#Configure para os usuários da máquina poderem acessar o FTP <syntaxhighlight lang=text>
 +
vi /etc/vsftpd.conf
 +
      local_enable=YES </syntaxhighlight>
 +
#Reinicie o serviço <syntaxhighlight lang=text>
 +
service vsftpd restart </syntaxhighlight>
 +
#Teste.
 +
#Observe o log <syntaxhighlight lang=text>
 +
tail /var/log/vsftpd.log </syntaxhighlight>
 +
{{Collapse bottom | FTP}}
 +
-->
 +
<!--
 +
== 15/5: Servidor SSH ==
 +
 +
Ver capítulo 33 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | SSH}}
 +
#Instale o SSH em sua máquina.
 +
#Habilite e desabilite o login do root.<syntaxhighlight lang=text>
 +
vi /etc/ssh/sshd_config
 +
  PermitRootLogin yes </syntaxhighlight>
 +
#Reinicie o serviço <syntaxhighlight lang=text>
 +
service ssh restart </syntaxhighlight>
 +
#De sua máquina real conecte e faça testes. <syntaxhighlight lang=text>
 +
ssh aluno@192.168.3.1X </syntaxhighlight>
 +
#Habilite o acesso somente para um conjunto de usuários (desafio).
 +
#Teste.
 +
#Desfaça o anterior. Bloqueie o acesso para um conjunto de usuários (desafio).
 +
#Teste.
 +
#Instale o SSH em sua máquina virtual com ambiente gráfico.
 +
#Habilite e desabilite o '''X11Forwarding'''.
 +
#Teste esta funcionalidade: <syntaxhighlight lang=text>
 +
ssh -X aluno@192.168.3.1X
 +
  firefox </syntaxhighlight>
 +
#Teste a funcionalidade do '''scp''', copiando arquivos locais para o servidor e vice-versa.
 +
#Configure seu par de máquinas, cliente e servidor, para conexão direta, sem pedido de senha (desafio).
 +
#Teste a conexão direta.
 +
#Teste a execução de comandos no seu servidor, sem "sair" do cliente.
 +
#Faça uns teste fornecendo usuário e/ou senha errados e verifique o ''log'': <syntaxhighlight lang=text>
 +
tail /var/log/auth.log </syntaxhighlight>
 +
{{Collapse bottom | SSH}}
 +
-->
 +
<!--
 +
== 22/5: Servidor DHCP, FTP, SSH ==
 +
-->
 +
<!--
 +
== 29/5: Avaliação ==
 +
-->
 +
<!--
 +
== 29/5: Squid ==
 +
 +
Ver capítulo 34 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | Squid}}
 +
 +
#Instalar o [http://www.squid-cache.org/ Squid]: <syntaxhighlight lang=text>
 +
apt-get install squid </syntaxhighlight>
 +
#Reiniciar o serviço: <syntaxhighlight lang=text>
 +
service squid3 restart </syntaxhighlight>
 +
#Verificar os logs do mesmo: <syntaxhighlight lang=text>
 +
tail /var/log/squid3/cache.log
 +
tail /var/log/squid3/access.log
 +
tail /var/log/upstart/squid3.log </syntaxhighlight>
 +
#Edite o '''/etc/squid3/squid.conf''' e descomente as regras explicitadas na apostila.
 +
#Edite o '''/etc/squid3/squid.conf''' e inclua as regras abaixo. Observe que a primeira regra de cada bloco já exite no arquivo, crie as demais. A ordem sequencial é fundamental. <syntaxhighlight lang=text>
 +
.....
 +
acl localhost src 127.0.0.1/32 ::1
 +
acl redelocal src 192.168.3.0/24
 +
.....
 +
http_access allow localhost
 +
http_access allow redelocal </syntaxhighlight>
 +
#Restarte o serviço
 +
#Siga o roteiro da apostila a configure o navegador da máquina real para utilizar o Squid de seu servidor, substituindo ''localhost'' por 192.168.3.1X.
 +
#faça o download de algum arquivo que não seja maior que o '''maximum_object_size''' configurado e procure o mesmo (por tamanho) no /var/spool/squid3 com os comandos: <syntaxhighlight lang=text>
 +
du -sh /var/spool/squid3/*
 +
du -sh /var/spool/squid3/00/* </syntaxhighlight>
 +
#Faça testes de bloqueio para algum sítio de sua preferência. Teste.
 +
#Bloqueie o acesso a sítios que contenham a palavra uol. Teste acessando http://www.folha.uol.com.br/ !
 +
#Bloqueie o acesso à rede no horário atual (veja a hora de sua máquina). Teste!
 +
{{Collapse bottom | Squid}}
 +
-->
 +
<!--
 +
== 5/6: iptables ==
 +
Ver capítulo 35 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | iptables}}
 +
#Configure seu servidor como roteador.
 +
#Configure no Ubuntu Gráfico como roteador padrão seu servidor.
 +
#Instale o iptables. <syntaxhighlight lang=text>
 +
apt-get install iptables </syntaxhighlight>
 +
#Configure uma regra que impeça seu cliente de acessar qualquer porta da máquina www.ifsc.edu.br.
 +
#Repita a regra, mas agora mandando um aviso ao cliente.
 +
#Proíba o seu cliente de fazer ping para qualquer máquina, liberando todos os demais serviços.
 +
#Limpe a regra anterior.
 +
#Permita que seu cliente acesse qualquer máquina na porta 80, mas somente nesta porta.
 +
#Limpe todas as regras.
 +
#Mude a política para DROP e permita que o seu cliente acesse somente www.ifsc.edu.br.
 +
#De seu cliente, faça um ataque do tipo ''ping of death'' em seu servidor: <syntaxhighlight lang=text>
 +
ping -f 192.168.3.1X </syntaxhighlight>
 +
#Iniba ataques do tipo ''ping of death'' na chain INPUT do seu servidor.
 +
#Teste novamente com seu cliente e tente perceber a diferença no comportamento dos dois ataques.
 +
{{Collapse bottom | iptables}}
 +
-->
 +
<!--
 +
== 5/6: VPN ==
 +
Ver capítulo 38 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | VPN}}
 +
#Siga o roteiro da apostila com as seguintes diferenciações. Instale o OpenVPN <syntaxhighlight lang=text>
 +
apt-get install openvpn </syntaxhighlight>
 +
#Crie uma VPN entre sua máquina servidora e cliente com criptografia de dados. Siga o roteiro da apostila. NÃO defina os parâmetros ''user openvpn'' e ''group openvpn'', conforme pedido na apostila.
 +
#Configure sua máquina servidora para ser a matriz. Após o ''start'', verifique se está tudo correto em /var/log/syslog.
 +
#Configure sua máquina cliente para ser a filial.
 +
#Dê ping nas interfaces 192.168.10.1 ou 2 e 192.168.3.1X
 +
#Com o tcpdump, capture pacotes na interface tun0/1 e eth0.
 +
{{Collapse bottom | VPN}}
 +
-->
 +
<!--
 +
== 12/6: SNMP ==
 +
Ver capítulo 39 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | SNMP}}
 +
Mais detalhes podem obtidos em [http://wiki.sj.ifsc.edu.br/index.php/GER-2010-1#21.2F06:_SNMP SNMP].
 +
#Para monitorar-se uma máquina ubuntu por meio de consultas SNMP (''Simple Network Management Protocol'') devemos instalar o snmpd na máquina a ser monitorada: <syntaxhighlight lang=text>
 +
apt-get install snmp snmpd snmp-mibs-downloader </syntaxhighlight>
 +
#Para liberar a consulta remota ao SNMP deve-se reconfigurar o arquivo '''/etc/snmp/snmpd.conf''', comentando a primeira linha abaixo (original) e descomentando a segunda: <code>
 +
#agentAddress  udp:127.0.0.1:161
 +
agentAddress udp:161,udp6:[::1]:161 </syntaxhighlight>
 +
#e: <code>
 +
#rocommunity public  default    -V systemonly
 +
rocommunity public  0.0.0.0/0 </syntaxhighlight>
 +
#Reincia-se o serviço snmp: <code>
 +
service snmpd restart </syntaxhighlight>
 +
#Busca-se por possíveis erros de configuração: <code>
 +
tail /var/log/syslog </syntaxhighlight>
 +
#Pode-se testar o serviço com uma consulta a partir de uma máquina remota, por exemplo o terminal da máquina real. Este comando retornará todos os parâmetros SNMP da máquina consultada: <code>
 +
snmpwalk -v1 -c public 192.168.3.1X | more</syntaxhighlight>
 +
{{Collapse bottom | SNMP}}
 +
-->
 +
<!--
 +
== 26/6:  Cacti ==
 +
Ver capítulo 41 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | Cacti}}
 +
No Ubuntu a instalação se mostra muito simplificada, pois o sistema de pacotes já configura todos os detalhes do Cacti após a instalação.
 +
 +
# Instale o Cacti: <syntaxhighlight lang=bash>
 +
apt-get install cacti
 +
</syntaxhighlight>
 +
# Serão apresentadas telas com questões sobre a configuração do Cacti:
 +
## Selecione  '''Sim''' para ''Configurar a base de dados para cacti com dbconfig-common?''
 +
## Forneça uma senha do administrador do MySQL (aluno)
 +
## Forneça uma senha (aluno) que será usada pelo usuário do Cacti no banco de dados. Essa será a senha do Cacti.
 +
## Selecione o uso do Apache.
 +
# Com um navegador acesse a URL ''http://192.168.3.1X/cacti''. Ali você deve dar continuidade ao processo de instalação:
 +
## Selecione "New Install"
 +
## Verifique na próxima tela se todas as opções mostradas estão corretas (se aparece '''''OK''''' em  verde ao lado).
 +
## Clique em ''Finish'', e na tela a seguir forneça o usuário ''admin'' e senha ''admin''.
 +
# Crie gráficos para monitorar a CPU, memória,  discos, processos e usuários do servidor onde reside o Cacti.
 +
# Visualize os gráficos criados.
 +
# Crie novos gráficos, porém coletando os dados da máquina do professor (192.168.3.101) também  via SNMP.
 +
## Crie um novo dispositivo ('''Create devices for network''') do tipo '''ucd/net SNMP Host'''.
 +
## Crie os gráficos ('''New Graphs''') para o ''device''.
 +
## Associe o ''host'' a árvore ('''Graph Trees''').
 +
## Visualize os gráficos.
 +
{{Collapse bottom | Cacti}}
 +
-->
 +
<!--
 +
== 26/6: Nagios ==
 +
Ver capítulo 40 da [[Media:Gerencia_de_redes.pdf|apostila]].
 +
{{Collapse top | Nagios}}
 +
Mais detalhes podem obtidos em [http://wiki.sj.ifsc.edu.br/index.php/GER-2010-1#28.2F06:_NMS_.28Network_Management_System.29:_Nagios Nagios].
 +
 +
#Tenha certeza que o SNMP de sua máquina esteja rodando: <code>
 +
snmpwalk -v1 -c public 192.168.3.1X </syntaxhighlight>
 +
#Instale o Nagios e dependências, definindo uma senha (aluno) para o '''nagiosadmin''': <code>
 +
apt-get install nagios3 nagios-nrpe-plugin nagios-nrpe-server nagios-plugins-extra </syntaxhighlight>
 +
#Edite o arquivo de configuração do Nagios para habilitar comandos externos: <code>
 +
vi /etc/nagios3/nagios.cfg
 +
    check_external_commands=1 </syntaxhighlight>
 +
#Adicione o usuário ''nagios'' no grupo ''www-data'': <code>
 +
usermod -G nagios www-data </syntaxhighlight>
 +
#Atribua uma senha (aluno) para o nagiosadmin: <code>
 +
htpasswd /etc/nagios3/htpasswd.users nagiosadmin </syntaxhighlight>
 +
#Adicione permissões de execução no diretório do Nagios: <code>
 +
chmod g+x /var/lib/nagios3/rw
 +
chmod g+x /var/lib/nagios3 </syntaxhighlight>
 +
#Restarte os serviços: <code>
 +
service nagios3 restart
 +
service apache2 restart </syntaxhighlight>
 +
#Procure por eventuais problemas: <code>
 +
tail /var/log/syslog </syntaxhighlight>
 +
#Com um navegador da máquina ubuntu gráfico acesse o sítio, informando o usuário (nagiosadmin) e a senha informada (aluno): <code>
 +
192.168.3.1X/nagios3 </syntaxhighlight>
 +
#Verifique quais são as máquinas e serviços rodando, clicando em '''Hosts''' e '''Services''' na lateral esquerda.
 +
#Adicione um novo host ao seu Nagios para monitorar a máquina do professor, criando o arquivo /etc/nagios3/conf.d/prof.cfg com o seguinte conteúdo: <code>
 +
#Definição da máquina do professor
 +
define host{
 +
        use                    generic-host            ; Name of host template to use
 +
        host_name              Prof
 +
        alias                  Máquina do professor
 +
        address                192.168.3.101
 +
} </syntaxhighlight>
 +
#Reinicie o Nagios:  <code>
 +
service nagios3 restart </syntaxhighlight>
 +
#Verifique o resultado no navegador clicando em '''Hosts'''.
 +
#Adicione o monitoramento 2 serviços da máquina do professor, criando o arquivo /etc/nagios3/conf.d/services_prof.cfg : <code>
 +
# Verifica se o Apache2 está rodando
 +
define service {
 +
        host_name                      Prof
 +
        service_description            HTTP
 +
check_command                  check_http
 +
        use                            generic-service
 +
notification_interval          0 ; set > 0 if you want to be renotified
 +
}
 +
 +
# Verifica se o servidor de SSH está rodando
 +
define service {
 +
        host_name                      Prof
 +
        service_description            SSH
 +
check_command                  check_ssh
 +
        use                            generic-service
 +
notification_interval          0 ; set > 0 if you want to be renotified
 +
} </syntaxhighlight>
 +
#Reinicie o Nagios:  <code>
 +
service nagios3 restart </syntaxhighlight>
 +
#Verifique o resultado no navegador clicando em '''Services'''.
 +
#No seu servidor derrube o serviço ssh de sua máquina: <code>
 +
service ssh stop </syntaxhighlight>
 +
#Verifique se o Nagios confirma que o serviço parou.
 +
#No navegador Firefox instale o plugin Nagios Checker.
 +
#Configure o ''plugin'' para acessar os dados do seu servidor: <code>
 +
Adicionar novo
 +
Aba Geral = Nome: Server
 +
Aba Interface Web do Nagios = http://192.168.3.1X/nagios3/ ; usuário: nagiosadmin, senha: aluno
 +
Aba URL do script de status = habilitar Definir URL manualmente; Caminho na URL:
 +
http://192.168.3.1X/nagios3/cgi-bin/status.cgi </syntaxhighlight>
 +
#Adicionar também ao Firefox o ''plugin''/complemento '''status-4-evar'''. Verifique o status na barra inferior criada.
 +
#A mesma configuração pode ser feita no ''Google Chrome'', adicionando o plugin '''Icinga Status'''.
 +
{{Collapse bottom | Nagios}}
 +
-->
 +
<!--
 +
== 3/7: Avaliação ==
 +
-->
 +
<!--
 +
== 11/7: Reavaliação ==
 +
-->

Edição das 17h23min de 6 de agosto de 2014

Informações da disciplina

Plano de aula

Cronograma

Material auxiliar

Aulas

Aula 01 (09/08): Apresentação da Disciplina, Processo de Boot e Instalação de Software

Apresentação da Disciplina

Roteiro
  1. Auto apresentação
  2. Apresentação da Wiki
  3. Apresentação do modelo de aulas a ser adotado -- laboratório
  4. Visão geral de Gerência de Redes
    1. Ementa e referências bibliográficas
    2. Explanar os três blocos da disciplina: servidor, serviços, segurança e monitoramento de redes
  5. Avaliação
    1. Teórica
    2. Prática
    3. Recuperação de conteúdo e reavaliações
  6. Curso_Superior_de_Tecnologia_em_Sistemas_de_Telecomunicações_(páginas_das_disciplinas)
  7. Conceituação das máquinas virtuais e seu uso
    1. Motivo de uso no laboratório

O boot

Roteiro

O processo de inicialização do sistema operacional, chamado de boot. Tradicionalmente no Unix System V isto se faz com a definição de níveis de execução (runlevels) e uma tabela que descreve que processos ou serviços devem existir em cada nível. Os níveis de execução são:

  1. Monousuário (single-user), ou administrativo: usado para manutenção do sistema, admite somente o login do superusuário. Não inicia serviços de rede.
  2. Multiusuário com rede (parcial): admite logins de usuários, mas não ativa acesso a recursos de rede (como sistemas de arquivo remotos)
  3. Multiusuário com rede plena
  4. Não usado
  5. Multiusuário com rede plena e ambiente gráfico: ativa também o ambiente gráfico X11
  6. Reinício do sistema (reboot)

As distribuições Linux em geral adotam a inicialização no estilo Unix System V. No entanto, o Ubuntu usa um outro processo chamado de upstart. Esse serviço de inicialização confere maior flexibilidade e mesmo simplicidade à definição de que serviços devem ser executados. O upstart não usa o conceito de níveis de execução, mas devido à sua flexibilidade ele pode emular esse estilo de inicialização. Para o upstart, um serviço deve ser iniciado ou parado dependendo de uma combinação de eventos, sendo que um evento indica a ocorrência de uma etapa da inicialização.

O upstart é implementado pelo processo init (programa /sbin/init), que é o primeiro processo criado pelo sistema operacional. Quer dizer, logo após terminar a carga e inicialização do kernel, este cria um processo que executa o programa /sbin/init. O upstart lista o subdiretório /etc/init e procura arquivos com extensão .conf. Cada arquivo desses descreve um serviço a ser controlado pelo upstart. Por exemplo, o serviço tty2 é escrito no arquivo tty2.conf:

# tty2 - getty
#
# This service maintains a getty on tty2 from the point the system is
# started until it is shut down again.

start on runlevel [23]
start on runlevel [!23]

respawn
exec /sbin/getty -8 38400 tty2

Abaixo segue o significado de cada linha:

  • start on runlevel [23]: o serviço deve ser iniciado quando ocorrerem os eventos "runlevel 2" ou "runlevel 3"
  • stop on runlevel [!23]: o serviço deve ser parado quando ocorrer qualquer evento "runlevel X", sendo X diferente de 2 e 3
  • respawn: o serviço deve ser reiniciado automaticamente caso termine de forma anormal
  • exec /sbin/getty -8 38400 tty2: a ativação do serviço implica executar o /sbin/getty -8 38400 tty2

Em linhas gerais, a descrição do serviço informa quando ele deve ser ativado (start), quando deve ser parado (stop), o tipo de execução (respawn para reinício automático, ou task para uma única execução), e que ação deve ser executada para ativar o serviço (exec para executar um programa, ou script .. end script para executar uma sequência de comandos de shell). Maiores detalhes podem ser lidos na página de manual do init.

Um exemplo de criação de serviço no upstart

Atividade

  1. Analisar alguns serviços no /etc/init/ e verificar o conteúdo dos upstarts. Tentar replicar a ideia para o faxineiro.
  2. Criar um serviço chamado faxineiro, para remover dos diretórios temporários (/var/tmp) todos os arquivos.
  3. Configurar esse novo serviço para executar no boot, logo após o serviço mountall.
  4. Reiniciar o sistema para testá-lo (executar reboot)

Resposta

Foi proposta a criação de um serviço chamado faxineiro, para remover dos diretórios temporários (/tmp e /var/tmp).

  1. Criar o arquivo /etc/init/faxineiro.conf
  2. Adicionar o seguinte conteúdo a esse arquivo:
    start on startup
    script
    rm -rf /tmp/*
    rm -rf /var/tmp/*
    end script
    
  3. Reiniciar o sistema para testá-lo (executar reboot)

Instalação de software

Roteiro

A instalação de software pode ser feita de diversas formas, dentre as quais serão destacadas três:

  • Com utilitário apt-get: busca o software de um repositório de rede e o instala; dependências (outros softwares necessários) são automaticamente instaladas. Esses softwares buscados da rede estão no formato dpkg (Debian Package).

Exemplo de uso do apt-get:

    • Instalar o navegador de texto lynx
    • Testar o navegador lynx
lynx http://www.ifsc.edu.br/
    • Remover o lynx
  • Diretamente com utilitário dpkg: instala um software que está contido em um arquivo no formato dpkg.

Exemplo de uso:

    • Obter os pacotes Debian para o lynx
wget ftp://ftp.cn.debian.org/ubuntu-old-releases/ubuntu/pool/main/l/lynx-cur/lynx_2.8.7pre6-1_all.deb
wget ftp://mirror.linux.org.au/ubuntu/pool/main/l/lynx-cur/lynx-cur_2.8.7pre6-1_i386.deb
    • Instalar os pacotes
    • Testar o lynx
lynx ...
    • Remover os pacotes instalados


  • A partir do código fonte: busca-se manualmente na rede o código fonte do software desejado, que deve então ser compilado e instalado. Esta opção se aplica quando não existe o software no formato dpkg, ou a versão disponível em formato dpkg foi compilada de uma forma que não atende os requisitos para seu uso em seu servidor.