350 likes | 462 Views
Segurança e auditoria de sistemas. Carlos Oberdan Rolim Ciência da Computação Sistemas de informação. Segurança em sistemas operacionais Unix. Motivação . Por que é importante conhecer sistemas unix ?. Histórico Unix.
E N D
Segurança e auditoria de sistemas Carlos Oberdan Rolim Ciência da Computação Sistemas de informação
Motivação Por que é importante conhecer sistemas unix ?
Histórico Unix • As raízes do UNIX datam dos meados dos anos 60, quando a AT&T, Honeywell, GE e o MIT embarcaram em um massivo projeto para desenvolvimento de um utilitário de informação, chamado Multics (Multiplexed Information and Computing Service). • Em 1969, o projeto estava muito atrasado em relação ao seu cronograma e a AT&T resolveu abandona-lo. O projeto continuou no MIT. • Neste mesmo ano, Ken Thompson, um pesquisador da AT&T que havia trabalhado no Projeto Multics, pegou um computador PDP-7 para pesquisar algumas idéias do Multics por conta própria. Logo Dennis Ritchie, que também trabalhou no Multics, se juntou a ele. Enquanto Multics tentava fazer várias coisas, UNIX tentava fazer uma coisa bem: rodar programas.
Histórico Unix 1972 - Ken Thompson e Dennis M. Ritchie com um PDP-11
Histórico Unix • Este pequeno escopo era todo ímpeto que os pesquisadores precisavam. Em 1971 saiu a primeira versão do UNIX, V1, muitos meses antes do Multics, em assembler em um computador PDP-11 da Digital. Incluía sistema de arquivos, fork(), roff, ed. Era utilizado como uma ferramenta de processamento de texto para a preparação de patentes. Pipe() apareceu na V2. • Em 1973 o UNIX foi reescrito em C, talvez o fato mais importante da história deste sistema operacional. Isto significava que o UNIX poderia ser portado para novo hardware em meses, e que mudanças eram fáceis. A linguagem C foi projetada para o sistema operacional UNIX, e portanto há uma grande sinergia entre C e UNIX.
Histórico Unix • Em 1975 foi lançada a V6. Disponível para universidades • Em 1978 Berkley Software Distribuition lança a série 2.xBSD para PDP - 11 (a versão 2.11 foi lançada em 1992). Nesta versão saiu o csh. Neste ano também saiu a série 3BSD, que teve uma importante contribuição, virtual memory. • Em 1979 saiu a V7 e o Unix foi portado para o novo VAX da Digital. Esta versão incluia C K&R completo, uucp, Bourne Shell. O kernel tinha meramente 40 bytes! Esta foi a primeira versão vendida comercialmente do sistema, mas usada principalmente por universidades. • Em 1983 é lançado o System V da AT&T e o 4.2 BSD. O SV incluía o pacote IPC (shm, msg, sem) para comunicação entre processos. Surgiram outras versões do SV com a inclusão de novas características como sharedlibs no SVR4.
Histórico Unix • O 4.2BSD foi talvez uma das mais importantes versões do UNIX. O seu software de conexão de redes tornava muito fácil a tarefa de conectar computadores UNIX a redes locais. Nessa versão é que foram integrados os softwares que implementam TCP/IP e sockets. • Em 1988 foi lançado o SVR4. Este sistema era um merge de releases anteriores do SV, BSD e SunOs, uma implementação decendente de BSD. Neste release foram incorporados as seguintes características: • BSD: TCP/IP, sockets, csh, ... • SVR3: sysadmin, ... • SunOs: NFS, OpenLook GUI, X11/NeWS, virtual memory subsystem with memoy mapped files, shared libraries (!= SVR3) • ksh
Histórico Unix • O 4.4BSD foi lançado em 1992 para várias plataformas: HP 9000/300, Sparc, 386, DEC e outras, mas não em VAX. Entre as novas características estão: • Novo sistema de memória virtual baseado em Mach 2.5 • Suporte ISO/OSI (baseado em ISODE) • A Sun Microsystem também lançou a sua versão do UNIX a partir do BSD. Isto ocorreu até a versão SunOs 4.x. A nova versão, SunOs 5.x está baseada no SVR4, embora tenha herdado algumas características do SunOs 4.x. O novo sistema operacional da Sun, Solaris 2.x, é um SO que engloba SunOs 5.x, Open Network Computing e Open Windows. É o solaris que provê o pacote de compatibilidade entre os BSD/SunOs e o SVR4/SunOs 5.x.
Linux • O Kernel do Linux foi, originalmente, escrito por Linus Torvalds do Departamento de Ciência da Computação da Universidades de Helsinki, Finlândia, com a ajuda de vários programadores voluntários através da Internet. • Linus Torvalds iniciou cortando (hacking) o kernel como um projeto particular, inspirado em seu interesse no Minix, um pequeno sistema UNIX desenvolvido por Andy Tannenbaum. Ele se limitou a criar, em suas próprias palavras, "um Minix melhor que o Minix" ("a better Minix than Minix"). E depois de algum tempo de trabalho em seu projeto, sozinho, ele enviou a seguinte mensagem para comp.os.minix:
Linux “Você suspira por melhores dias do Minix-1.1, quando homens serão homens e escreverão seus próprios "device drivers" ? Você está sem um bom projeto e esta morrendo por colocar as mãos em um S.O. no qual você possa modificar de acordo com suas necessidades ? Você está achando frustrante quando tudo trabalha em Minix ? Chega de atravessar noites para obter programas que trabalhem correto ? Então esta mensagem pode ser exatamente para você.Como eu mencionei há um mês atrás, estou trabalhando em uma versão independente de um S.O. similar ao Minix para computadores AT-386. Ele está, finalmente, próximo do estágio em que poderá ser utilizado (embora possa não ser o que você esteja esperando), e eu estou disposto a colocar os fontes para ampla distribuição. Ele está na versão 0.02... contudo eu tive sucesso rodando bash, gcc, gnu-make, gnu-sed, compressão, etc. nele. “ From Linus Benedict Torvalds to comp.os.minix newsgroup 5 Oct 91 05:41:06 GMT
Linux • No dia 5 de outubro de 1991 Linus Torvalds anunciou a primeira versão "oficial" do Linux, versão 0.02. Desde então muitos programadores têm respondido ao seu chamado, e têm ajudado a fazer do Linux o Sistema Operacional que é hoje.
Kernel • O Kernel de um sistema operacional é entendido como o núcleo deste ou, numa tradução literal, cerne. Ele representa a camada de software mais próxima do hardware, sendo responsável por gerenciar os recursos do sistema computacional como um todo. • A responsabilidade do kernel consiste, tradicionalmente (particularmente no kernel monolítico), em abstrair a interface do hardware, permitindo que processos utilizem este recurso concorrentemente, de forma segura e padronizada. • Computador carrega o kernel no momento do boot
Kernel • Implementa o sistema de arquivos: • Permite processos criar, ler, escrever e acessar estes arquivos • Gerencia Daemons: • Move páginas do disco para memória • Prioridades • Gerencia drivers de dispositivos • Gerencia software de rede que implementa serviços de rede • Gerencia facilidades de comunicação entre processos • Provê facilidades para criar, examinar e modificar processos • Provê funções de gerenciamento do sistema • Provê funções miscelâneas que tornam os recursos do sistema disponíveis aos processos, como, por exemplo: memória
Shell • Shell é um programa que conecta e interpreta os comandos digitados por um usuário. É a interface que o usuário utiliza para enviar comandos para o sistema. • Dos vários programas shell existentes, o Bourne shell, o Korn shell e o C shell se destacam por serem os mais utilizadas e conhecidos. Mas qualquer programador pode fazer o seu shell. Estes shells tornaram-se conhecidos pois já vinham com o sistema, exceto o Korn que tinha que ser adquirido separadamente. O Bourne shell vinha com o SV e C shell com o BSD. O Korn shell é uma melhoria do Bourne shell.
Usuários e grupos • Cada usuário registrado possui um nome de login, uma senha e um identificador numérico associado (UID). • Os usuários são organizados em grupos. • Um usuário sempre pertence a um grupo primário e pode pertencer a outros grupos secundários. • Cada grupo é identificado por um nome e um identificador de grupo (GID). • O comando iduser permite visualizar as informações de usuários e grupos. • O comando fingeruser oferece informações adicionais sobre o usuário. • Arquivos /etc/passwd - /etc/shadow /etc/group
Usuários e grupos • O usuário root e outros usuários especiais • O usuário com UID = 0 é chamado “root” e possui poderes especiais no sistema: • Acesso a todos os arquivos e diretórios • Reboot/shutdown do sistema • Lançamento e cancelamento de qualquer processo • Montagem de diretórios de rede e de dispositivos externos • Assim, torna-se óbvio que a senha de root é de grande importância para a segurança do sistema. • Além do root, outros usuários são definidos para a implantação de serviços específicos. Esse é o caso dos usuários “bin”, “daemon”,“lp”, “mail”, “news”, “ftp” e “nobody”, que não correspondem a seres humanos. Normalmente esses usuários não são acessíveis via login, existindo apenas internamente no sistema.
Sistema de arquivos • O UNIX tem uma organização de diretórios hierárquica em formato de árvore conhecida como filesystem • O acesso a arquivos é organizado através de propriedades e proteções. Toda segurança do sistema depende, em grande parte, da combinação entre a propriedade e proteções setadas em seus arquivos e suas contas de usuários e grupos. • Enfatizando: • Tudo em UNIX é um arquivo • Unix tem uma organização hierárquica de arquivos chamada de filesystem • Acesso aos arquivos é organizado através de propriedades e proteções
Sistema de arquivos • Um inodo é uma estrutura de dados em disco que descreve e armazena os atributos do arquivo, incluindo sua localização: • Campos de um inode • user e group • tipo do arquivo • tempo de criação, acesso e modificação (modo) • número de links • tamanho • endereço no disco
Sistema de arquivos • Tipos de arquivos • Arquivos comuns • Diretórios • Especiais • utilizados para I/O de dispositivos no UNIX. • Links • Hard: associa dois ou mais filenames com o mesmo inodo. Hard links compartilham o mesmo bloco de dados embora funcionando como entradas de diretório independentes • Simbolic: são pointers files que apontam para outro filename no filesystem
Sistema de arquivos • Arquivos especiais: • Sockets • tipo especial de arquivo utilizado para comunicação entre processos. São parte da funcionalidade de interconectividade TCP/IP, primeiramente disponível nos sistemas BSD, mas parte de qualquer versão moderna hoje • Named pipes • são canais abertos pelo nome por aplicações. São características do SV que migraram para todas as versões de UNIX. Named pipes frequentemente residem no diretório /dev, e eles servem como outro mecanismo para facilitar a comunicação entre processos.
Sistema de arquivos • Principais diretórios • /home: raiz dos diretórios home dos usuários. • /boot: arquivos de boot (núcleo do sistema, etc) • /var: arquivos variáveis, áreas de spool (impressão, e-mail, news), arquivos de log • /etc: arquivos de configuração dos serviços • /usr: aplicações voltadas aos usuários • /tmp: arquivos temporários • /mnt: montagem de diretórios compartilhados temporários • /bin: aplicações de base para o sistema • /dev: arquivos de acesso aos dispositivos físicos e conexões de rede • /lib: bibliotecas básicas do sistema
Sistema de arquivos • Permissões: • são conjuntos de direitos que são aplicados a arquivos ou diretórios do sistema de arquivo. Elas garantem que um usuário que não se enquadre nas permissão atribuídas a um arquivo, não tenha acesso ao mesmo, ou não possa executá-lo, ou ainda alterá-lo • Duas formas definir permissões: • Extendida e Octal
Sistema de arquivos • Exemplo:$ ls –l -rw-r--r-- 1 root root 2149 2006-11-07 10:50 adduser.conf-rw-r--r-- 1 root root 47 2008-09-23 13:38 adjtime-rw-r--r-- 1 root root 209 2008-08-23 21:54 aliasesdrwxr-xr-x 2 root root 4096 2008-07-02 22:44 alternativesdrwxr-xr-x 3 root root 4096 2006-11-07 14:20 apt { r w x } – {r w x } – { r w x } Owner Grupo Others
Sistema de arquivos • Forma extendida $ chmod u=rw,g=rw,o= arquivo $ ls -l -rw-rw---- 1 coletivo coletivo 4096 2006-11-07 14:20 arquivo • Forma octal $ chmod 755 arquivo $ ls –l-rwxr-xr-x 1 coletivo coletivo 4096 2006-11-07 14:20 arquivo • Suid • Para encontrar suid/sgid files # find / \( -perm -004000 -o -perm -002000 \) -type f -print • Cuidado com o /tmp
Processos • Um processo é um simples programa que está rodando em seu espaço de endereçamento virtual próprio. • Daemons • Atributos • Process ID (PID) • Parent process (PPID) • TTY • UID real e efetiva (RUID, EUID) • GID real e efetiva (RGID, EGID) • Cuidado com processos startados pelo usuário root
Processos $ ps -auxx USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND root 49070 79,2 0,2 3896 2032 pk- R Ter15 868:15,58 -su (bash) root 782 2,0 0,3 5960 2660 ?? Ss 5Set08 610:40,10 /usr/bin/perl root 68077 1,1 0,1 2392 980 ?? Ss 6Set08 382:05,17 /usr/local/sb • User = usuarioPid = identificacao do processo%cpu e %mem = %consumidoVsz = virtual size em kbytesRss = tamanho do processo residente em memóriaTt = terminal de controleStat = Status do processoStart time = tempo de inicioCommand = comando rodando • Cuidado com processos startados pelo usuário root
Interfaces de rede • Comunicação com o mundo externo • Kernel reconhece e gerencia as interfaces de rede • Comandos a nível de usuário para interagir com interfaces • Exemplo: eth0 Link encap:Ethernet HWaddr 00:50:04:99:25:7B inet addr:200.200.200.2 Bcast:200.200.200.255 Mask:255.255.255.0 inet6 addr: fe80::250:4ff:fe99:257b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:33642869 errors:0 dropped:0 overruns:5738 frame:0 TX packets:37327420 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:310178592 (295.8 MiB) TX bytes:1866164000 (1.7 GiB) Interrupt:193 • Interface de loopback lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host Cuidado: Interfaces em modo promiscuo
Sistema de logs • Sistema mantém controle sobre tarefas executadas pelo sistema e por seus usuários • Daemon responsável por logs • Syslog • Diretório /var/log • Sempre ficar de olhos nos arquivos nesse diretório • Alternativa ideal: logs centralizados
Sistema de logs • Inicio de uma sessão Sep 23 08:17:01 localhost CRON[18951]: (pam_unix) session opened for user root by (uid=0) Sep 23 08:17:01 localhost CRON[18951]: (pam_unix) session closed for user root • Tentativa de invasão BREAKIN ATTEMPT! Sep 23 08:27:21 localhost sshd[19022]: Illegal user blair from 83.138.128.119 Sep 23 08:27:21 localhost sshd[19022]: reverse mapping checking getaddrinfo for fw.prescreen.co.uk failed - POSSIBLE BREAKIN ATTEMPT!
Agendamento de tafefas • Cron: • daemon responsável pela execução de tarefas agendadas • /etc/crontab #minute hour mday month wday who command # Rotate log files every hour, if necessary. 0 * * * * root newsyslog # Script que roda como root 0/15 * * * * root /bin/sh /tmp/danger.sh >> /dev/null Cuidado com scripts de usuários que rodam com permissão de root
Firewall • Têm por função regular o tráfego de dados entre redes distintas e impedir a transmissão e/ou recepção de acessos nocivos ou não autorizados de uma rede para outra. • Baseado em fluxos de dados: • Tipos de pacotes • Protocolos. Portas, enderecos de origem / destino • Exemplos: • Iptables • Ipchains • Ipf • Pf • Ipfw
Inetd • Chamado de ``Super-Servidor Internet'' porque ele gerencia conexões para diversos daemons • O inetd atua como um servidor gerenciador para outros daemons. Quando uma conexão é recebida pelo inetd, ele determina para qual daemon a conexão é destinada e executa o daemon correspondente e a ele delega o socket. Executar uma instância do inetd reduz a carga no sistema de forma geral, comparado a se executar cada daemon individualmente. • Uma entrada de exemplo para o daemon ftpd usando IPv4: ftp stream tcp nowait root /usr/libexec/ftpd ftpd –l • E se fosse feita a seguinte entrada ??? Afff.. 1008 stream tcp nowait root /bin/sh sh