Linux



Scripts rc's




Voltar   


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


 

redação@assip.com.br
subir