sábado, 30 de janeiro de 2010

Rodando seu script como "service"

No directório /etc/rc.d/init.d, crie ou copie o seu script. Com o seu script pronto e copiado no directório indicado, segue abaixo exemplo com comentários sobre cada linha.

No exemplo abaixo altere as linhas e conteúdos para melhor adaptar as suas necessidades.

#!/bin/bash

#!/bin/bash
#
# chkconfig: 2345 25 40
#
#description: Firewall CMM
#
# processname: firewall
# pidfile: /var/run/firewall.pid
# config: /etc/rc.d/firewall

# biblioteca Source function.
# Função que habilita a opções de botão - OK
. /etc/rc.d/init.d/functions

# Se você utiliza o chkconfig para habilitar serviços a linhas abaixo permite que ele
# inicie na posição ou ordem de 97 e seja inicializado no level 3 e 5.
####Also, if the script name ends in .sh, the script will be sourced in runlevel S rather than being run in a forked subprocess, but will be explicitly run by sh in all other runlevels.

iniciar(){

    #######################
    ###     Flush as regras          ###
    #######################
    iptables -F
    iptables -Z
    iptables -X
    iptables -t nat -F
    echo "*******************************************************"
    echo "**  Iniciar configuração da firewall do Seridor WEB  **"
    echo "*******************************************************"
    #    Desactiva o suporte a ICMP redirects uma vez que o servidor não actua como rooter
    #     este recurso quando ligado alerta os outros servidores que existe um caminho melhor para um determinado endereço ou rede, mas não reencaminha pacotes.
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects

    #    Desativa o suporte a ping broadcasts, um recurso que tem poucos usos legítimos e pode ser usado
    #     para fazer com que servidores participem involuntariamente de ataques DoS,
    #    enviando grandes quantidades de pings a outros servidores dentro da mesma faixa de endereços.
    echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

    #    desativa o suporte ao source routing
    #    Este é um recurso usado para testes de routers
    #    permite ao emissor especificar qual o caminho que o pacote tomará até o destino e também o caminho de volta
    echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route

    #    O servidor WEB não deverá compartilhar a conexão,
    #    nem encaminhar pacotes de outros hosts. Devemos desactivar o suporte a ip_forward:
    echo 0 > /proc/sys/net/ipv4/ip_forward

    #    Uma conexão TCP é iniciada através da troca de três pacotes entre o emissor e o destinatário, o famoso "three-way handshake".
    #    O emissor envia um pacote SYN, o destinatário responde com um pacote SYN/ACK e o emissor confirma, também enviando um pacote ACK.
    #    Se o servidor recebe um pacote SYN solicitando a abertura da conexão, mas não recebe o pacote ACK de resposta, ele é obrigado a esperar até que o tempo limite seja atingindo, mantendo a conexão aberta.
    #    Como existe um limite de conexões TCP que o servidor pode manter ativas simultaneamente, um grande volume de pacotes SYN podem estourar o limite de conexões, fazendo com que o servidor deixe de responder a novas conexões, mesmo que exista banda disponível.
    #    ativa o uso de SYN Cookies, um recurso oferecido diretamente pelo Kernel
    #    Ao ativar o recurso, o sistema passa a responder ao pacote SYN inicial com um cookie, que identifica o cliente
    echo 1 > /proc/sys/net/ipv4/tcp_syncookies

    #    Regras que ativam o uso do rp_filter, de forma que o firewall sempre responda aos pacotes na mesma interface da qual eles foram originados.
    #    Previne ataques diversos que tentem tirar proveito da regra que permite conexões na interface de loopback
    echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

    #    O bloqueio de pacotes inválidos,  melhora a segurança contra ataques diversos,
    #    incluindo pacotes enviados sem serem precedidos pelo envio do pacote SYN e da abertura da conexão
    iptables -A INPUT -m state --state INVALID -j DROP

    # Abre para a interface de loopback:
    #########################
    ### liberta o loopback ###
    #########################
    iptables -A INPUT -p tcp -i lo -j ACCEPT
    #iptables -A OUTPUT -p tcp --syn -s 127.0.0.1/255.0.0.0 -j ACCEPT

    # Bloqueia um determinado IP. Use para bloquear hosts específicos:
    #iptables -A INPUT -p ALL -s 88.191.79.206 -j DROP

    # Abre as portas referentes aos serviços usados:
    echo "**"
    # SSH:
    #-j LOG gera um log em /var/log/messages
    iptables -A INPUT -p tcp --dport 22 -j LOG
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT

    echo "**"
    # DNS:
    iptables -A INPUT -p tcp --dport 53 -j ACCEPT
    iptables -A INPUT -p udp --dport 53 -j ACCEPT

    echo "**"
    # HTTP e HTTPS:
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT

    #Limita as respostas aos pings a 1 resposta por segundo 
    iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    echo "**"
    # Bloqueia conexões nas demais portas:
    iptables -A INPUT -p tcp --syn -j DROP

    # Garante que o firewall permitirá pacotes de conexões já iniciadas:
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    # Bloqueia as portas UDP de 0 a 1023 (com exceção das abertas acima):
    iptables -A INPUT -p udp --dport 0:1023 -j DROP
    echo "*******************************************************"
    echo "**                                                   **"
    echo "**                Firewall configurada               **"
    echo "*******************************************************"

}
parar(){
    iptables -F
    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
}

case "$1" in
    "start") iniciar ;;
    "stop") parar ;;
    "restart") parar; iniciar ;;
    *) echo "Use os parâmetros 'start' 'stop' ou 'restart' \n Ex:# firewall.sh start"
esac

#sleep 120
#./cleanfirewall.sh


exit 0

 

Para habilitar o script utilize da maneira que melhor se adapte, seguem exemplos.

Começamos por installar o nosso secript como um serviço:

# install -o root -g root -m 755 firewall /etc/rc.d/init.d

 

Adicionamos e inicializamos o serviço:

# chkconfig --add firewall

# service firewall start

# chkconfig firewall on

 

 

Podemos verificar que o serviço está activo com o comando:
# ntsysv

 

 

 

 

chkconfig -level 35 "meuscript" on
ou
# ntsysv -level 35 

Executando e analisando:

# service firewall start

Iniciando o Serviço ###TESTE###: [  OK  ]

Copiando Arquivo                 [  OK  ]

# service firewall stop

Parando o Serviço ###TESTE###:   [  OK  ]

# service firewall restart

Parando o Serviço ###TESTE###:   [  OK  ]

Iniciando o Serviço ###TESTE###: [  OK  ]

Copiando Arquivo                 [  OK  ]

 

Você poderá inserir quantos comandos quiser, tanto no start quanto no stop.

Um Erro clássico: service XYZ does not support chkconfig

Você faz um script shell, e ao tentar colocar ele na lista dos serviços de start e stop do servidor, recebe a mensagem do título deste post, veja como resolver, de forma simples.

Construindo scripts compatíveis com o SYSV:

1 - O script precisa começar (primeira linha) com

#!/bin/bash

ou

#!/bin/sh

 

2 - O script precisa ter a seguinte linha

# chkconfig: 2345 85 15

É isso mesmo, mais números :^)

Essa linha significa:
chkconfig --> aplicação que vai adicionar o script no SYSV 2345 --> níveis (diretórios) aonde o link para o script vai ser adicionado para start
85 --> sequência de "start"
15 --> sequência de "stop"

Vale lembrar que os níveis que não forem adicionados para start (S) serão automaticamente marcados para stop (K), no nosso caso será 016 (0,1 e 6).

3 - O script precisa ter uma descrição
# description: Aqui você coloca a descrição do seu script

4 - O script pode executar o script de funções do sistema
"/etc/rc.d/init.d/functions" para poder mostrar as mensagens de "OK", "FAILED" e "PASSED", existem outras funções que podem ser utilizadas, recomendo uma breve "fuçada" nesse script.

Lembre-se que isso é opcional, mas o seu uso é recomendado.

4- O script precisa ter sessões de "start" e "stop" (outras são opcionais).

OBS: Todas as linhas que tem sustenido (#) no início precisam realmente estar comentadas.

0 comentários :

Enviar um comentário