|
Hi !
Demorei para escrever outro artigo pra revista assip por, primeiro, não ter definido uma linha para seguir, depois por falta de tempo. Acho importante não apenas eu escrever alguns bons papers sobre linux
e segurança e fazer cada um ter seu próprio sentido, mas sim fazê-los ter sentido e uma seqüência lógica juntos, também.
Sendo assim, estou aberto a sugestões e a todo tipo de critica, pois só assim vou saber, realmente, como estou escrevendo.
=) Dessa vez vou tentar passar algumas dicas úteis para usuários de linux.
Scripts rc's
Uma vez que o Linux é um sistema muito flexível, você pode fazê-lo ficar tanto seguro quanto inseguro, claro. Logo apos uma instalação é recomendável que você edite os scripts do seu linux.
Os scripts rc's são programinhas feitos em shell script para iniciarem os serviços de rede (apache, inetd, sendmail, smb, etc), os módulos do kernel para placas de rede, de som, etc. Shell script é uma
linguagem do linux como a usada nos arquivos de lote no dos (batchs).
Quando o Linux é instalado, os scripts rc's estão configurados para procurarem por vários tipos de dispositivos (ex. cartões pcmcia) e iniciar vários serviços de rede (ex. apache). É recomendável
que logo apos instalar o Linux, o usuário edite, se não todos, uma boa parte dos scripts rc's.
Scripts rc's do Slackware Linux e suas funções:
/etc/rc.d/rc.0 ------- > Atalho para o rc.6
/etc/rc.d/rc.4 ------- > Este script é executado quando o
/etc/inittab está configurado para iniciar o linux em modo xdm (interface
gráfica).
/etc/rc.d/rc.6 ------- > Script que é executado para reiniciar ou
derrubar o sistema.
/etc/rc.d/rc.K ------- > Este script é executado quando o sistema é
iniciado em modo monousuário (linux single no prompt do lilo ou init 1).
/etc/rc.d/rc.M ------- > Script do modo multiusuário. É executado
quando o sistema inicia em modo multiusuario (default).
/etc/rc.d/rc.S ------- > Script de inicialização do sistema.
/etc/rc.d/rc.atalk --- > Inicia os serviços de appletalk.
/etc/rc.d/rc.cdrom --- > Este script verifica se há um cd-rom no
derive, se houver, ele monta o cd-rom em /mnt, se não ele continua a
inicialização do sistema normalmente.
/etc/rc.d/rc.font ---- > Seleciona a fonte padrão que você escolheu
(ou nao) na instalação.
/etc/rc.d/rc.httpd --- > Inicia o apache.
/etc/rc.d/rc.ibcs2 --- > Inicia o 'Intel Binary Capability
Specification', serve para emular binários de plataformas Unix no linux.
/etc/rc.d/rc.inet1 --- > Atribui um endereço IP para a sua interface
de rede (se houver uma) e configura um gateway (se houver um, tb).
/etc/rc.d/rc.inet2 --- > Inicia vários serviços do inetd, named, nfs,
serviços de rpc (remote portmap control, se não me falha a memória =P),
etc.
/etc/rc.d/rc.local --- > Roda o gpm, mais nada...
/etc/rc.d/rc.modules - > Script de inicialização dos módulos do
kernel para a configuração de placas ethernet, som, etc.
/etc/rc.d/rc.pcmcia -- > Procura cartões pcmcia.
/etc/rc.d/rc.samba --- > Inicia o servidor samba (gosto do samba, mas
nao gosto de samba, percebe a diferença ? =D).
/etc/rc.d/rc.serial -- > Inicia as portas seriais.
Recomendo que você edite os esses scripts e tente entender o shell
script,
o que é bem fácil.
Para imprimir algo na tela, se usa echo "text", para testar uma
condição,
como, por exemplo, se um arquivo é ou não executável:
if [ -x file ];
Se, por um acaso, você quiser executar algo se o arquivo NAO for
executável,
adicione uma exclamação antes do -x:
if [ ! -x file ];
Pra executar um comando se o if for verdadeiro, use um then:
if [ -x file ]; then
. comando
Para executar um comando se o if for verdadeiro e outro se o if for
falso,
use else:
if [ -x file ]; then
. comando
else
. comando
fi
Um teste de condição com o if sempre termina com um fi. Um exemplo
prático:
#if [ -x /etc/rc.d/rc.inet1 ]; then
/etc/rc.d/rc.inet1
# . /etc/rc.d/rc.inet2
#else
# if [ -x /usr/sbin/syslogd ]; then
# /usr/sbin/syslogd
# sleep 1 # Prevents a race condition with SMP kernels
# /usr/sbin/klogd
# fi
# if [ -x /usr/sbin/lpd ]; then
# /usr/sbin/lpd
# fi
#fi
Essa é uma parte do meu /etc/rc.d/rc.M. Comentei tudo, menos o /etc/rc.d/rc.inet1, pq nao quero que ele teste condição alguma, somente execute o rc.inet1, pois é somente o que eu preciso. Este script,
primeiramente, verifica se o /etc/rc.d/rc.inet1 é executável, então executa o mesmo, seguido do /etc/rc.d/rc.inet2, depois para. Se o /etc/rc.d/rc.inet1 não for executável,
ele testa o /usr/sbin/syslogd. Se for verdadeiro (syslogd executável), ele executa o mesmo, aguarda 1 segundo (sleep 1) e em seguida executa o /usr/sbin/klogd e depois testa se o /usr/sbin/lpd é executável
e então executa o mesmo, senão para.
Claro que em meu sistema esse if nunca acontece, pois todas as linhas
menos a que executa o /etc/rc.d/rc.inet1 estão comentadas (com o # na frente). Resolvi explicar algo sobre shell script para que quem estiver lendo esse artigo saiba realmente o que está fazendo quando
estiver editando um script do linux, para nao fazer nenhuma besteira. Lembre-se que é sempre bom fazer uma copia do script que você for editar antes de qualquer alteração.
Em shell script, você pode executar qualquer comando que você costuma executar normalmente no console. Se você, por acaso, fizer um script que seja muito útil para você, copie ele para o /bin, assim
você nao precisa digitar sempre ./file para executa-lo.
Inetd
Nao basta você somente comentar o que você nao quer que seja executado nos scripts de inicialização, você deve também editar o arquivo de configuração do inetd (super server daemon). O
inetd é o responsável pelos servidores telnet, ftpd, talkd, time, daytime, echo, discard, shell, ntalk, talk, exec, klogin, eklogin, krbupdate, kpasswd, pop2, pop3, imap, uucp, tftp, bootps, finger,
systat, netstat, auth, netbios e alguns serviços de rpc. Fiz questão de
colocar todos os serviços para quem estiver lendo ter a visão de que o inetd nao é apenas mais um serviço do linux, mas sim um super servidor, como o próprio nome diz. O arquivo de configuração
do inetd é o /etc/inetd.conf. O Meu inetd.conf já não está mais default, então não posso afirmar com certeza quais serviços ele inicia logo apos a instalação. Mas dois deles (com
certeza) são o telnet e o ftpd. Para uma maquina pessoal, recomendo comentar todos os serviços do inetd. Aqui, uso telnet e ftp, somente estes estão descomentados no inetd.conf,
porém, na inicialização, configurei meus rcs para não executarem o inetd. Quando quero iniciar um servidor ftp ou telnet, executo o /usr/sbin/inetd, o qual habilitará o ftp e o telnet na minha
maquina. Assim, todas as portas estarão fechadas até que eu habilite algo. é bom sempre ter essa filosofia, primeiro feche tudo, depois habilite o que precisar.
Nuke de ICMP
Ainda assim, com tudo fechado, pode ter um usuário estúpido no irc que queira te derrubar com um simples nuke de icmp. Para que isso nao ocorra, você terá que bloquear a entrada e/ou a saída de
pacotes icmp. Nos kernels 2.0.*, o programa usado para se administrar um firewall é o ipfwadm, nos kernels 2.2.*, ipchains. Um tutorial de ipchains sairia muito grande, então vou mostrar apenas
como bloquear pacotes icmp. Lembre-se que o manual do ipchains pode ser lido pelo comando 'man ipchains'. Para incluir uma regra no firewall para bloquear a ENTRADA de pacotes, deve-se usar o comando
ipchains -A input. A opção -A significa append, ela serve para incluir uma regra de entrada ou saída, você deve incluir um 'input' se a regra for para a entrada de pacotes ou um 'output' para a saída
de pacotes. Para um simples bloqueio de pacotes icmp nao são necessárias muitas opções. Apos o -A input/output (lembre-se de observar a diferença entre maiúsculas e minúsculas), você
deve escolher o protocolo que você quer bloquear. No nosso caso, é o icmp, então use -p icmp, até agora nossa linha de comando ficou 'ipchains -A input -p icmp'. Agora temos que definir a ação para
ser tomada com a entrada de pacotes icmp. Existem três opções que podem ser usadas com o ipchains:
ACCEPT: aceita o pacote;
DENY: bloqueia o pacote, somente;
REJECT: bloqueia o pacote e avisa o host de origem que o bloqueou.
Dessas três opções, a que queremos é DENY. A opção que define a ação no
ipchains é o -j, sendo assim, -j DENY. Nossa linha de comando ficaria:
ipchains -A input -p icmp -j DENY
Isto bloqueará a entrada de pacotes icmp. Este comando nao retorna
nada,
então ver o que o ipchains está ou nao bloqueando, execute um ipchains -L. Lembre-se que você pode excluir uma regra do ipchains usando a mesma linha de comando pela qual vc a inseriu, substituindo
apenas o -A por -D (delete).
Finalizo por aqui este artigo. Espero receber criticas, sugestões e também dúvidas, procurarei responder na medida do possível. Tentarei aumentar a freqüência das matérias e adicionar algumas
news também.
[]s.. Arnaldo (n0fUn na brasnet)
arnaldo@assip.com.br
|