Skip to content

Novidades sobre o curso “De A a Zabbix”

A_a_Zabbix

Olá!

Eu, André Déo e Adail Spinola, somos autores do livro “De A a Zabbix“.

Se você ainda não leu o livro ou deseja aprender mais sobre Zabbix (http://zabbix.com) pode participar de um curso presencial com um de nós.

Os cursos são presenciais realizados em datas e cidades diferentes, de acordo com a diponibilidade de cada autor (veja a ementa, preço e outras informações nos links abaixo).

Curso com Adail: http://spinola.net.br/blog/curso-de-a-a-zabbix/

Curso comigo: http://blog.aeciopires.com/curso-de-a-a-zabbix/

Curso com André: http://andredeo.blogspot.com.br/2016/05/curso-de-a-zabbix.html

Curso no CT- Novatec com um dos três autores: http://ctnovatec.com.br/cursos/trilha-redes-de-computadores/curso-monitoracao-de-redes-com-zabbix/

 

Os cursos são realizados com o mesmo padrão de qualidade que fez com que muitos leitores confiassem no que está escrito no livro, nos blogs, sites e slides, bem como no suporte cotidiano prestado por cada um de nós na comunidade Zabbix-BR (http://zabbixbrasil.org).

A ideia é extender a experiência escrita no livro, através de mais exemplos, exercícios, maiores detalhes e trocas de experiências.

Abraço e fica com Deus.

Primeiros passos com Docker

thumbnail2253

Olá!

Estou começando a dar os primeiros passos com o Docker e quero compartilhar os links que já estudei até aqui e que servem de bússola para quem quer começar a usá-lo também. Esta página será atualizada à medida que eu encontrar mais documentos relevantes.

O que é Docker? Por que usá-lo? Instalando o Docker:

Docker versus VmWare:

Documentos sobre Docker:

Slides e cursos:

Ambiente de teste para Docker:

Comunidade/Fórum Docker:

Livros:

Meus repositórios Docker:

Orquestração com Docker e interface web:

Configurando o Grafana para funcionar sobre HTTPS

Captura de tela de 2016-05-26 17:19:23

Neste tutorial http://zabbixbrasil.org/?p=1674, eu e André Déo mostramos como instalar o Grafana no Debian 8, CentOS 7 e Ubuntu 16.04 (ambos 64 bits). Nesse mesmo tutorial é mostrada a integração do Grafana com o Zabbix.

 

Agora será mostrado como configurar o Grafana para funcionar sobre HTTPS, usando um certificado auto-assinado.

 

Criando um certificado auto-assinado

Instale o pacote opensssl.

No Debian 8/Ubuntu 16.04:

sudo apt-get -y install openssl

No CentOS 7:

sudo yum install -y openssl

Agora crie uma chave privada RSA. Execute os comandos abaixo.

sudo mkdir /etc/certs
cd /etc/certs/
sudo openssl genrsa -aes256 -out server.key 2048
sudo cp server.key server.key.org
sudo openssl rsa -in server.key.org -out server.key
sudo rm server.key.org

Defina uma senha para a chave.

Agora crie uma requisição de assinatura de certificado com validade para 10 anos (ou 3650 dias). Execute o comando abaixo.

openssl req -new -sha256 -days 3650 -key server.key -out server.csr

Durante a execução do comando acima será solicitado a senha da chave privada e os dados do certificado e que serão exibidos no navegador do usuário. Veja o exemplo abaixo.

Country Name (2 letter code) [GB]:BR
State or Province Name (full name) [Berkshire]:Estado
Locality Name (eg, city) [Newbury]:Cidade
Organization Name (eg, company) [My Company Ltd]Minha empresa LTDA
Organizational Unit Name (eg, section) []:Meu setor de trabalho
Common Name (eg, your name or your server’s hostname) []:nomeservidor.empresa.com.br
Email Address []:email@empresa.com.br
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Agora assine o certificado.

sudo openssl x509 -req -days 3650 -sha256 -in server.csr -signkey server.key -out server.crt

Usando, o comando acima, você estará assinando o certificado com validade de 10 anos (aproximadamente 3650 dias). Se quiser mudar este tempo, altere a quantidade de dias no parâmetro -days.

Configurando o Grafana para funcionar sobre HTTPS

Quando o Grafana é instalado via pacote .deb, o arquivo de configuração fica em: /etc/grafana/grafana.ini.

Edite o arquivo /etc/grafana/grafana.ini e altere os parâmetro abaixo para ficar da seguinte maneira.

Antes:

;protocol = http
;http_port = 3000
;cert_file = 
;cert_key = 

Depois:

protocol = https

http_port = 3000

cert_file = /etc/certs/server.crt

cert_key = /etc/certs/server.key

Agora é só reiniciar o Grafana.

No Debian 8/Ubuntu 16.04:

sudo service grafana-server restart

No CentOS 7:

sudo systemctl restart grafana-server

O Grafana estará acessível na URL: https://ip-servidor:3000

Aceite o certificado no navegador, pois o mesmo vai reclamar que o site está usando um certificado auto-assinado.

Os passos acima pode ser adaptados para a sua realidade, caso possua um certificado válido.

Se quiser configurar o Grafana para disponibilizar dashboards para cada cliente, siga os passos deste tutorial: http://andredeo.blogspot.com.br/2016/12/zabbix-e-grafana-disponibilizando-um.html

Fonte:

http://www.akadia.com/services/ssh_test_certificate.html

http://docs.grafana.org/installation/configuration/

Customizando o Glassfish 4 no Ubuntu 16.04

Hoje (10/05/2016), a versão do Glassfish Open Source Edition mais recente e recomendada para uso em produção é a 4.1.1, que pode ser obtida nesta página: https://glassfish.java.net/download.html

Para usar o Glassfish 4 é necessário instalar o Java 8. O Java 8 da Oracle pode ser obtido neste link http://www.oracle.com/technetwork/java/javase/downloads/index.html e instalado no Ubuntu seguindo este tutorial: http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

O Glassfish padrão contém algumas vulnerabilidades de segurança e para minimizá-las é necessário customizá-lo. Os valores padrão do Glassfish estão nesta página https://docs.oracle.com/cd/E26576_01/doc.312/e24928/overview.htm#GSADG00695

Os manuais do Glassfish estão disponíveis nesta página: https://glassfish.java.net/documentation.html

Customizando o Glassfish

 

1- Foi obtido o Glassfish 4.1.1 acessando a página http://download.java.net/glassfish/4.1.1/release/glassfish-4.1.1.zip. Com isso foi baixado o arquivo glassfish-4.1.1.zip no diretório /home/aecio/Downloads.

2- Descompacte o arquivo glassfish-4.1.1.zip e altere o nome da pasta descompactada para glassfishv4.

cd /home/aecio/Downloads
unzip glassfish-4.1.1.zip
mv glassfish4/ glassfishv4

3- Algumas configurações de segurança são listadas nestas páginas:

https://glassfish.java.net/docs/4.0/security-guide.pdf

Hide Glassfish Server Information

https://community.oracle.com/thread/2362026?start=0&tstart=0

http://blog.eisele.net/2011/05/securing-your-glassfish-hardening-guide.html

https://dzone.com/articles/securing-your-glassfish

4- Mova o diretório glassfishv4 para o diretório /opt e aplique as permissões de acesso.

sudo mv /home/aecio/Downloads/glassfishv4 /opt
sudo chmod -R 700 /opt/glassfishv4
sudo chown -R root:root /opt/glassfishv4

5- Crie o arquivo /etc/init.d/glassfish com o seguinte conteúdo.

—————————- INICIO do /etc/init.d/glassfish ————————

#!/bin/bash
# chkconfig: 345 90 90
# description: glassfish (GLASSFISH) Web Server JAVA Aplication
#

### BEGIN INIT INFO
# Provides: glassfish
# Required-Start: $local_fs $network $syslog
# Should-Start: $remote_fs $named $time
# Required-Stop: $local_fs $network $syslog
# Should-Stop: $remote_fs $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: GLASSFISH
# Description: glassfish (GLASSFISH) Web Server JAVA Aplication
### END INIT INFO

#----------------------------------------------------
# informa se o usuario que estah rodando o comando eh root
isroot(){
MYUID=$(id | cut -d= -f2 | cut -d\( -f1)
[ $MYUID -eq 0 ] && echo YES || echo NO
}

#--------------------------------
getPID(){
PID=$(ps ax | pgrep -fl $GLASSFISHEXEC  | sed "s/^ *//" | cut --field=1 --delimiter=" ")
echo $PID > $PID_FILE
}

#--------------------------------
isRunning(){
local PID="$1"
[ -z "$PID" ] && return 1
ps -p $PID > /dev/null 2>&1 && return 0 || return 1
}

#--------------------------------
status(){
getPID

[ -f $PID_FILE ] || return 3
PID=$(cat $PID_FILE )

if [ -z "$PID" ]; then
   echo "[INFO] Glassfish is not running..." 
   return 1
fi

if isRunning $PID; then
   echo "[INFO] Glassfish is running: PID=$PID"
   return 0 
else
   echo "[INFO] Glassfish is not running..." 
   return 1
fi
}

#--------------------------------
stop(){

if [ ! -f $PID_FILE ]; then
   echo "[INFO] Glassfish is not running..."
   return 0
fi

PID=$(cat $PID_FILE )
[ -z "$PID" ] && return 0
if isRunning $PID ; then
   echo "[INFO] Stopping Glassfish..."
   kill -9 $PID
   sleep 2
   return 0
fi
}

#--------------------------------
start(){

if [ -f $PID_FILE ]; then
   PID=$(cat $PID_FILE )
   if [ -z "$PID" ]; then
      echo "[INFO] Starting Glassfish..."
      $GLASSFISH_ASADMIN start-domain
      getPID
      return 0
   fi

   if isRunning $PID; then
     echo "[INFO] Glassfish is already running. Use \"restart\""
     return 0
   else
     echo "[INFO] Starting Glassfish..."
     $GLASSFISH_ASADMIN start-domain
     getPID
     return 0
   fi
else
   echo "[INFO] Starting Glassfish..."
   $GLASSFISH_ASADMIN start-domain
   getPID
   return 0
fi
}

#--------------------------------
# MAIN
#--------------------------------

#----- Variaveis
GLASSFISHEXEC=glassfishv4
GLASSFISHDIR=/opt/glassfishv4
GLASSFISHBINDIR=/opt/glassfishv4/glassfish/bin
GLASSFISH_ASADMIN=$GLASSFISHBINDIR/asadmin
PID_FILE=/tmp/glassfish.pid


if [ $(isroot) = NO ] ; then
        echo "[ERROR] Voce deve ser root para executar este comando."
        echo "Execute o comando \"sudo $CMDLINE\""
        exit 4
fi

# Define usage string, used in more than one place.
usage="[INFO] Usage: $0 {start|stop|restart|status}"

# Check that we have one parameter: action
if [ $# -ne 1 ] ; then
  if [ $# -lt 1 -o "$1" = "" ] ; then
    echo "[ERROR] $0: action not specified"
  else
    echo "[ERROR] $0: too many parameters"
  fi
  echo "$usage"
  exit 2
fi
action="$1"



case $action in
start)
        start
        RETURN=$?
        ;;

stop)
        stop
        RETURN=$?
        ;;
restart)
        stop
        start
        RETURN=$?
        ;;

status)
        status
        RETURN=$?
        ;;
*)
        # If we don't recognize action, consider it an invalid argument.
        # If the standard adds actions we don't support, exit should be 3 for those.
        echo "[ERROR] $0: action \"$action\" not recognized"
        echo "$usage"
        exit 3
        ;;
esac
exit $RETURN

———————– FIM do /etc/init.d/glassfish ———————-

6- Dê permissão de execução ao script /etc/init.d/glassfish.

sudo chmod 755 /etc/init.d/glassfish
sudo chown root:root /etc/init.d/glassfish

7- Habilite a inicialização do Glassfish no boot do Sistema Operacional.

sudo update-rc.d -f glassfish defaults

8- Inicie o Glassfish com o comando abaixo.

sudo /etc/init.d/glassfish start

9- O log do Glassfish fica em: /opt/glassfishv4/glassfish/domains/domain1/logs/ A porta padrão do HTTP é 8080, a porta padrão do HTTPS  8181 e a porta padrão do console administrativo é 4848.

10- Por padrão, a primeira senha do usuário admin do Glassfishv4 eh vazia. Altere-a com os seguintes comandos.

sudo /opt/glassfishv4/glassfish/bin/asadmin --user admin --port 4848 change-admin-password
sudo /etc/init.d/glassfish restart

Para persistir a nova senha, execute o comando abaixo, informe o login admin e depois a nova senha.

sudo /opt/glassfishv4/glassfish/bin/asadmin login

11- Habilite o acesso remoto a interface web do Glassfish com o comando abaixo.

sudo /opt/glassfishv4/glassfish/bin/asadmin enable-secure-admin
sudo /etc/init.d/glassfish restart

12- Desabilite o uso dos protocolos SSLv2, SSLv3, TLSv1, TLSv1.1 e cifras fracas na porta HTTPS e do console administrativo com os comandos abaixo.

sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.http-listener-2.ssl.ssl2-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.http-listener-2.ssl.ssl3-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.tls-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.tls11-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set 'configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.ssl3-tls-ciphers=+TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,+TLS_DHE_DSS_WITH_AES_128_CBC_SHA,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA'
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.sec-admin-listener.ssl.ssl2-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.sec-admin-listener.ssl.ssl3-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set 'configs.config.server-config.network-config.protocols.protocol.sec-admin-listener.ssl.ssl3-tls-ciphers=+TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,+TLS_DHE_DSS_WITH_AES_128_CBC_SHA,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,+TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,+TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,+TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA'
sudo /etc/init.d/glassfish restart

13- Comandos para mudar a porta padrão do HTTP para 80 e HTTPS para 443.

sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.port=80

sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-2.port=443

sudo /etc/init.d/glassfish restart

14- Se deseja habilitar o uso do certificado emitido por uma autoridade certificado como a GlobalSign, siga os seguintes passos.

São necessários os seguintes arquivos:

GlobalSign.pem (certificado da entidade certificadora raíz).
intermediate.pem (certificado intermediário da entidade certificadora).
hostname.pfx (arquivo contendo as chaves pública e privada do certificado emitido para um host ou domínio).

Crie o diretório /etc/certs

sudo mkdir /etc/certs/

Copie os arquivos keystore.jks e cacerts.jks que existem no diretório do Glassfish.

cd /opt/glassfishv4/glassfish/domains/domain1/config/
sudo cp keystore.jks cacerts.jks /etc/certs/
cd /etc/certs/

Cadastrando o certificado emitido no keystore.jks e cacerts.jks
Etapa 1) Divida o certificado no formato pfx em dois arquivos: um no formato .crt e outro na chave privada no formato .key.

Como foi recebido o certificado hostname.pfx, será necessário extrair a partir dele os arquivos no formato .crt (certificado público) e .key (chave privada).

OBS.: Neste tutorial o arquivo hostname.pfx será chamado de homolog.pfx.

sudo openssl pkcs12 -in hostname.pfx -nocerts -nodes -out hostname.key
sudo openssl pkcs12 -in hostname.pfx -clcerts -nokeys -out hostname.crt

OBS.: Após cada comando acima informe a senha usada na emissão do certificado.

Etapa 2) Crie um arquivo keystore PKCS12 da chave privada e do certificado público.

De posse dos arquivos .crt e .key, será necessário criar um arquivo keystore PKCS12, para unir as duas chaves novamente, mas em outro formato: o .p12.

sudo openssl pkcs12 -export -name my-cert -in hostname.crt -inkey hostname.key -out keystore.p12

OBS.: Após o comando acima informe a senha usada na emissão do certificado.

Etapa 3) Converta a keystore PKCS12 em uma keystore JKS

De posse da keystore PKCS12, será necessário converter a chave do formato .p12 para o formato .jks (formato suportado pelo Glassfish). O comando abaixo vai gerar o arquivo keystore.jks.

OBS.: A senha usada no armazenamento dos certificados no arquivo keystore.jks é: changeit.

sudo keytool -importkeystore -destkeystore keystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias my-cert

Agora o arquivo keystore.jks está pronto.

Etapa 4) Importe os certificados das entidades certificadoras

Agora importe no arquivo cacerts.jks, os certificados das entidades certificadoras: GlobalSign.pem, intermediate.pem e o certificado público do domínio homolog.crt (que foi gerado no início do tutorial).

OBS.: A senha usada no armazenamento dos certificados no arquivo keystore.jks e cacerts é: changeit.

sudo keytool -import -v -trustcacerts -alias globalsignr3ca -file GlobalSign.pem -keystore cacerts.jks -storepass changeit


sudo keytool -import -v -trustcacerts -alias globalsignr3ca-inter -file intermediate.pem -keystore cacerts.jks -storepass changeit


sudo keytool -import -v -trustcacerts -alias my-cert -file homolog.crt -keystore cacerts.jks -storepass changeit

OBS.: A importar o certificado da GlobalSign, pode ser exibida a mensagem de que ele já está cadastrado no alias globalsignr3ca. Se isso acontecer apenas ignore e siga adiante.

Para listar o certificado importado, use o comando abaixo.

sudo keytool -list -keystore keystore.jks -alias my-cert -v

Etapa 5) Cadastrando o keystore.jks e cacerts.jks no Glassfishv4. Execute a sequencia de comandos abaixo, mas alterando os valores em negrito de acordo com o seu ambiente.

sudo /opt/glassfishv4/glassfish/bin/asadmin set 'configs.config.server-config.network-config.protocols.protocol.http-listener-2.ssl.cert-nickname=my-cert';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyStore=/etc/certs/keystore.jks';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyStorePassword=changeit';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.trustStore=/etc/certs/cacerts.jks';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.trustStorePassword=changeit';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=my-cert';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyStoreAlias=my-cert';
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options '-Djavax.net.ssl.keyAlias=my-cert';

Reinicie o Glassfish com o comando abaixo, que o certificado será aplicado e a aplicação passará a utilizá-lo nas requisições HTTPS.

sudo /etc/init.d/glassfish restart

15) Execute os comandos abaixo para aplicar configurações de segurança no Glassfish

#disable client-initiated renegotiation (to decrease the surface for DoS attacks)

sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options -Djdk.tls.rejectClientInitiatedRenegotiation=true
#get rid of http header field value "server" (Glassfish obfuscation)
sudo /opt/glassfishv4/glassfish/bin/asadmin create-jvm-options -Dproduct.name=""
#disable sending x-powered-by in http header (Glassfish obfuscation)
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.http-listener-1.http.xpowered-by=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.http-listener-2.http.xpowered-by=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.protocols.protocol.admin-listener.http.xpowered-by=false
#disable SSLv3 nas portas iiop
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.iiop-service.iiop-listener.SSL.ssl.ssl3-enabled=false
sudo /opt/glassfishv4/glassfish/bin/asadmin set server.iiop-service.iiop-listener.SSL_MUTUALAUTH.ssl.ssl3-enabled=false

#enable only access local at console Web Admin Glassfish

sudo /opt/glassfishv4/glassfish/bin/asadmin set server.network-config.network-listeners.network-listener.admin-listener.address=127.0.0.1

Reinicie o Glassfish com o comando abaixo, que o certificado será aplicado e a aplicação passará a utilizá-lo nas requisições HTTPS.

sudo /etc/init.d/glassfish restart

16) Execute a sequencia de comandos abaixo se quiser redirecionar todo o tráfego da porta 80 para 443 automaticamente.

sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol --securityenabled=false http-redirect
sudo /opt/glassfishv4/glassfish/bin/asadmin create-http-redirect --redirect-port 443 --secure-redirect true http-redirect
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol-filter --protocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpRedirectFilter redirect-filter
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol --securityenabled=false pu-protocol
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-listener-2 --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-finder
sudo /opt/glassfishv4/glassfish/bin/asadmin create-protocol-finder --protocol pu-protocol --targetprotocol http-redirect --classname org.glassfish.grizzly.config.portunif.HttpProtocolFinder http-redirect
sudo /opt/glassfishv4/glassfish/bin/asadmin set configs.config.server-config.network-config.network-listeners.network-listener.http-listener-1.protocol=pu-protocol

Reinicie o Glassfish com o comando abaixo, que o certificado será aplicado e a aplicação passará a utilizá-lo nas requisições HTTPS.

sudo /etc/init.d/glassfish restart

Criando um Pool de Acesso ao PostgreSQL no Glassfish

Se você tiver uma aplicação Web a ser implantada no Glassfish e que usa o banco de dados PostgreSQL, você pode usar os comandos para criar um recurso JDBC que usa o pool de conexões do Glassfish para gerenciar o acesso ao banco. Fazendo isso, será necessário que você ajuste o código da sua aplicação para ela usar o pool criado no Glassfish.

Abaixo estão os comandos para criar o pool e o recurso JDBC.

/opt/glassfishv4/glassfish/bin/asadmin create-jdbc-connection-pool --restype javax.sql.DataSource --datasourceclassname org.postgresql.ds.PGSimpleDataSource --maxpoolsize 100 --property "User=DBUSER:Password=DBPASSWORD:DatabaseName=DBASE:ServerName=DBHOST:PortNumber=DBPORTNUMBER" POOL_NAME
/opt/glassfishv4/glassfish/bin/asadmin create-jdbc-resource --connectionpoolid POOL_NAME RESOURCE_NAME
/etc/init.d/glassfish restart

Os comandos abaixo, confirguram a capacidade do pool de se reconectar ao banco de dados, em caso de perda de conexão.

/opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.connection-validation-method=custom-validation

/opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.validation-classname=org.glassfish.api.jdbc.validation.PostgresConnectionValidation

/opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.is-connection-validation-required=true

/opt/glassfishv4/glassfish/bin/asadmin set resources.jdbc-connection-pool.POOL_NAME.fail-all-connections=true
/etc/init.d/glassfish restart

Deploy e undeploy de aplicação no Glassfish

Abaixo estão os comandos para implantar (deploy) uma aplicação .war ou .ear no Glassfish.
/opt/glassfishv4/glassfish/bin/asadmin deploy --force=true --name=APP APP.war
/etc/init.d/glassfish restart
Abaixo estão os comandos para desimplantar (undeploy) uma aplicação no Glassfish.
/opt/glassfishv4/glassfish/bin/asadmin undeploy --name=APP 
/etc/init.d/glassfish restart

 

Fontes:

https://www.nabisoft.com/tutorials/glassfish/installing-glassfish-41-on-ubuntu
http://www.java-samples.com/showtutorial.php?tutorialid=1214
http://askubuntu.com/questions/587683/glassfish-ssl-console-handshake-exception
http://stackoverflow.com/questions/12860289/import-ssl-certificate-in-glassfish
https://www.nabisoft.com/tutorials/glassfish/installing-glassfish-41-on-ubuntu
http://grepthelinuxblog.blogspot.com.br/2012/02/glassfish-ssl-verisign-certificate.html
http://grburgos.blogspot.com.br/2010/07/glassfish-v3-with-ssl-using-verisign.html
https://glassfish.java.net/wiki-archive/How_to_ssl_versign.html
https://docs.oracle.com/cd/E19798-01/821-1751/ablqz/index.html
https://www.digicert.com/ssl-support/jks-import-export-java.htm
http://stackoverflow.com/questions/34726305/getting-ssl-certificate-to-work-with-payara-4-1/34808985
http://www.guj.com.br/t/sucesso-glassfish-v3-ssl-certificado-serasa-globalsign-etc/195965
http://www.denizoguz.com/2011/01/02/installing-godaddy-ssl-certificates-on-glassfish-v3-step-by-step/

 

Customizando o Tomcat 8

Informações iniciais

Hoje (03/08/2016), a versão do Tomcat mais recente e recomendada para uso em produção é a 8.5.4, que pode ser obtida nesta página: https://tomcat.apache.org/download-80.cgi

Para usar o Tomcat 8 é necessário instalar o Java 8. O Java 8 da Oracle pode ser obtido neste link http://www.oracle.com/technetwork/java/javase/downloads/index.html e instalado no Ubuntu seguindo este tutorial: http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html

O Tomcat padrão contém algumas vulnerabilidades de segurança e para minimizá-las é necessário customizá-lo.

1- Foi obtido o Tomcat 8.5.4 acessando a página https://tomcat.apache.org/download-80.cgiCom isso foi baixado o arquivo apache-tomcat-8.5.4.zip no diretório /home/aecio/Downloads.

2- Descompacte o arquivo apache-tomcat-8.5.4.zip e altere o nome da pasta descompactada para tomcat8.

cd /home/aecio/Downloads
unzip apache-tomcat-8.5.4.zip
mv apache-tomcat-8.5.4/ tomcat8

3- Algumas configurações de segurança são listadas nesta página: https://www.owasp.org/index.php/Securing_tomcat

4- Mantenha comentado todos os usuários listados no arquivo tomcat8/conf/tomcat-users.xml. Isso evitará que qualquer usuário possa gerenciar o Tomcat via Web. Todas as configurações no Tomcat devem ser feitas via linha de comando ou edição de arquivos.

5- Altere o arquivo tomcat8/conf/server.xml para conter:

Antes:

<Server port="8005" shutdown="SHUTDOWN">

Depois:

<Server port="-1" shutdown="Shutd0wn-ADICIONE-OUTRA-PALAVA-DIFICIL">

6- Altere a porta padrão do HTTP de 8080 para 80 no arquivo tomcat8/conf/server.xml .

Antes:

<Connector port="8080" protocol="HTTP/1.1"

Depois:

<Connector port="80" protocol="HTTP/1.1"

7- Remova os diretórios existentes dentro de tomcat8/webapps/.

rm -rf tomcat8/webapps/docs
rm -rf tomcat8/webapps/examples
rm -rf tomcat8/webapps/host-manager
rm -rf tomcat8/webapps/manager

8- Remova o diretório tomcat8/conf/Catalina/

rm -rf tomcat8/conf/Catalina

9- Oculte a versão do Tomcat.

cd tomcat8/lib
jar xf catalina.jar org/apache/catalina/util/ServerInfo.properties
cd org/apache/catalina/util/

Edite o arquivo ServerInfo.properties e altere a seguinte linha:

Antes:

server.info=Apache Tomcat/8.5.4.0

Depois:

server.info=Apache Tomcat

Empacote o arquivo novamente.

cd /home/aecio/Downloads/tomcat8/lib
jar uf catalina.jar org/apache/catalina/util/ServerInfo.properties
rm -rf org/
cd ..

10- Crie o usuario tomcat e defina uma senha difícil para ele.

sudo adduser tomcat

ou:

sudo useradd tomcat
sudo passwd tomcat

Mova o tomcat8 para o diretório /opt e aplique a permissão 700 para o usuário tomcat.

sudo mv /home/aecio/Downloads/tomcat8 /opt
sudo chmod -R 700 /opt/tomcat8
sudo chown -R tomcat:tomcat /opt/tomcat8

11- Se quiser habilitar a porta do HTTPS e usar um certificado válido emitido por uma autoridade certificadora como a GlobalSign ou outra, siga o seguintes passos:

a) Cadastre o o certificado emitido pela autoridade certificadora (no formato .pfx) num arquivo /etc/certs/keystore.jks e os certificados raíz e intermediário num arquivo/etc/certs/cacerts.jks (veja os links abaixo).

https://support.globalsign.com/customer/en/portal/articles/2121490-java-keytool—create-keystore

https://support.globalsign.com/customer/portal/articles/1352403-java-codesigning-jks-method—certificate-generation-and-installation

https://support.globalsign.com/customer/pt_br/portal/articles/1352403-assinatura-de-c%C3%B3digo-java-jks—gera%C3%A7%C3%A3o-e-instala%C3%A7%C3%A3o-de-certificado

https://support.globalsign.com/customer/pt_br/portal/articles/1223425-instalar-e-configurar-certificado-ssl—tomcat

https://docs.oracle.com/cd/E19798-01/821-1841/gjrgy/index.html

https://docs.oracle.com/cd/E19798-01/821-1751/ghlgv/index.html

Dê permissões de acesso ao usuário tomcat para o diretório /etc/certs.

sudo chmod -R 700 /etc/certs
sudo chown -R tomcat:tomcat /etc/certs

b) Habilite o HTTPS na porta 443 usando a configuração abaixo no arquivo tomcat8/server.xml. Isso dará suporte apenas ao protocolo TLS1.2 com cifras fortes.

 <Connector port="443" maxThreads="150" disableUploadTimeout="true"
 acceptCount="100" scheme="https" secure="true" clientAuth="false" 
 SSLEnabled="true" sslProtocol="TLSv1.2" sslEnabledProtocols="TLSv1.2" keyAlias="alias-cert" 
 keystoreFile="/etc/certs/keystore.jks" keystorePass="changeit" 
 keystoreType="JKS" truststoreFile="/etc/certs/cacerts.jks" 
 truststorePass="changeit" truststoreType="JKS"
 ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
 TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
 TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"
 />

Essas configurações de segurança do protocolo HTTPS foram obtidas em:

https://tomcat.apache.org/tomcat-8.0-doc/security-howto.html

https://www.owasp.org/index.php/Securing_tomcat

http://www.maximporges.com/2009/11/18/configuring-tomcat-ssl-clientserver-authentication/

Java based SSL connection to Tomcat with server and client certifications
Tomcat web application with SSL client certificates

https://blog.eveoh.nl/2014/02/tls-ssl-ciphers-pfs-tomcat/

https://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html

https://www.digicert.com/ssl-certificate-installation-tomcat.htm

https://www.mulesoft.com/tcat/tomcat-ssl

https://br.godaddy.com/help/como-gerenciar-uma-csr-e-instalar-um-certificado-ssl-no-tomcat-4x5x6x7x-5239

https://www.sslshopper.com/tomcat-ssl-installation-instructions.html

https://support.globalsign.com/customer/en/portal/articles/1223425-tomcat—install-ssl-certificate

http://www.mkyong.com/tomcat/how-to-configure-tomcat-to-support-ssl-or-https/

https://www.geocerts.com/install/tomcat

http://helpdesk.ssls.com/hc/en-us/articles/203505171-How-to-install-a-SSL-certificate-on-a-Tomcat-server

12- Crie o arquivo /etc/init.d/tomcat com o seguinte conteúdo.

----------------------------  /etc/init.d/tomcat  ------------------------
#!/bin/bash
# chkconfig: 345 88 88
# description: tomcat (TOMCAT) Tomcat

### BEGIN INIT INFO
# Provides: tomcat
# Required-Start: $local_fs $network $syslog
# Should-Start: $remote_fs $named $time
# Required-Stop: $local_fs $network $syslog
# Should-Stop: $remote_fs $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: TOMCAT
# Description: tomcat (TOMCAT) Tomcat
### END INIT INFO

#----------------------------------------------------
# informa se o usuario que estah rodando o comando eh root
isroot(){
MYUID=$(id | cut -d= -f2 | cut -d\( -f1)
[ $MYUID -eq 0 ] && echo YES || echo NO
}

#--------------------------------
getPID(){
#PID=$(ps ax | pgrep -fl $TOMCATEXEC  | sed "s/^ *//" | cut --field=1 --delimiter=" " | head -n1)
PID=$(ps aux | grep org.apache.catalina.startup.Bootstrap | grep -v grep | awk '{ print $2 }')
echo $PID > $PID_FILE
}

#--------------------------------
isRunning(){
local PID="$1"
[ -z "$PID" ] && return 1
ps -p $PID > /dev/null 2>&1 && return 0 || return 1
}

#--------------------------------
status(){
getPID

[ -f $PID_FILE ] || return 3
PID=$(cat $PID_FILE )

if [ -z "$PID" ]; then
   echo "[INFO] Tomcat is not running..." 
   return 1
fi
if isRunning $PID; then
   echo "[INFO] Tomcat is running: PID=$PID"
   return 0 
else
   echo "[INFO] Tomcat is not running..." 
   return 1
fi
}

#--------------------------------
stop(){

if [ ! -f $PID_FILE ]; then
   echo "[INFO] Tomcat is not running..."
   return 0
fi

PID=$(cat $PID_FILE )
[ -z "$PID" ] && return 0
if isRunning $PID ; then
   echo "[INFO] Stopping Tomcat..."
   kill -9 $PID
   sleep 2
   return 0
fi
}

#--------------------------------
start(){

if [ -f $PID_FILE ]; then
   PID=$(cat $PID_FILE )
   if [ -z "$PID" ]; then
      echo "[INFO] Starting Tomcat..."
      cd $TOMCATDIR
      $TOMCAT_SCRIPT_STARTUP > /dev/null 2>&1 &
      cd - > /dev/null &
      getPID
      return 0
   fi

   if isRunning $PID; then
     echo "[INFO] Tomcat is already running. Use \"restart\""
     return 0
   else
     echo "[INFO] Starting Tomcat..."
     cd $TOMCATDIR
     $TOMCAT_SCRIPT_STARTUP > /dev/null 2>&1 &
     cd - > /dev/null &
     getPID
     return 0
   fi
else
   echo "[INFO] Starting Tomcat..."
   cd $TOMCATDIR
   $TOMCAT_SCRIPT_STARTUP > /dev/null 2>&1 &
   cd - > /dev/null &
   getPID
   return 0
fi
}

#--------------------------------
# MAIN
#--------------------------------

#-----------Variaveis
TOMCATEXEC=tomcat
TOMCATDIR=/opt/tomcat8
TOMCAT_SCRIPT_STARTUP=/opt/tomcat8/bin/startup.sh
PID_FILE=/tmp/tomcat.pid


if [ $(isroot) = NO ] ; then
        echo "[ERROR] Voce deve ser root para executar este comando."
        echo "Execute o comando \"sudo $CMDLINE\""
        exit 4
fi

# Define usage string, used in more than one place.
usage="[INFO] Usage: $0 {start|stop|restart|status}"

# Check that we have one parameter: action
if [ $# -ne 1 ] ; then
  if [ $# -lt 1 -o "$1" = "" ] ; then
    echo "[ERROR] $0: action not specified"
  else
    echo "[ERROR] $0: too many parameters"
  fi
  echo "$usage"
  exit 2
fi
action="$1"



case $action in
start)
        start
        RETURN=$?
        ;;

stop)
        stop
        RETURN=$?
        ;;
restart)
        stop
        start
        RETURN=$?
        ;;

status)
        status
        RETURN=$?
        ;;
*)
        # If we don't recognize action, consider it an invalid argument.
        # If the standard adds actions we don't support, exit should be 3 for those.
        echo "[ERROR] $0: action \"$action\" not recognized"
        echo "$usage"
        exit 3
        ;;
esac
exit $RETURN
-----------------------  end of /etc/init.d/tomcat  ----------------------

13- Dê permissão de execução ao script /etc/init.d/tomcat.

sudo chmod 755 /etc/init.d/tomcat
sudo chown root:root /etc/init.d/tomcat

14- Habilite a inicialização do Tomcat no boot do Sistema Operacional.

No Debian/Ubuntu:

sudo update-rc.d -f tomcat defaults

No CentOS/RedHat 6.x:

sudo chkconfig --add /etc/init.d/tomcat
sudo chkconfig tomcat on

15- Inicie o Tomcat com o comando abaixo.

sudo /etc/init.d/tomcat start

 

Cluster Ativo/Passivo com PostgreSQL 9.3, Red Hat 6, pcs, Pacemaker, Corosync e DRBD

Introdução

Para a execução deste tutorial foram criadas duas máquinas virtuais com as configurações abaixo.
  • Processador: 1 vCPU com clock acima de 2.0 GHz.
  • Memória: 1 GB.
  • HD1: 50 GB (com duas partições: / de 42 GB e swap de 8 GB).
  • HD2: 20 GB (mas este não foi configurado durante a instalação do S.O).
  • 2 placas de rede.
  • S.O: Red Hat 6.8 64 bits com idioma em Inglês-US (UTF-8).

Cada VM possui duas placas de rede, mas apenas uma das placas de rede de cada VM foi configurada com IP fixo (também pode ser usado IPs distribuídos pelo serviço DHCP, desde que os IPs sejam associados ao MAC de uma placa de rede de cada VM).

As VMs são identificadas da seguinte forma:
  • db1.domain.com.br: 10.0.0.1/24 na interface eth0
  • db2.domain.com.br: 10.0.0.2/24 na interface eth0

Estas informações foram adicionadas no arquivo /etc/hosts de cada máquina. Veja o ambiente do cluster na figura abaixo.

cluster_db2

 

 

Após a instalação do S.O, é necessário que ele esteja registrado para poder acessar os repositórios oficiais da Red Hat. Veja nesta página como registrar o sistema: https://access.redhat.com/documentation/en-US/Red_Hat_Network_Satellite/5.3/html/Reference_Guide/ch-register.html

Também foi configurado a autenticação via par de chaves RSA para o usuário root de cada máquina acessar a outra via SSH sem senha. Aqui está o tutorial: https://goo.gl/NdLkD4

Instalação dos pacotes

Aviso: Os passos abaixo devem ser executados nas duas máquinas.

1- Crie o arquivo /etc/yum.repos.d/centos.repo e adicione o seguinte conteúdo.

[centos-6-base]
name=CentOS-$releasever
Base mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
baseurl=http://mirror.globo.com/centos/6.8/os/x86_64/
enabled=1

2- Execute os comandos abaixo para adicionar repositórios extras e autenticá-los.
rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm --import http://mirror.globo.com/centos/6.8/os/x86_64/RPM-GPG-KEY-CentOS-6
rpm -ivh https://download.postgresql.org/pub/repos/yum/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-2.noarch.rpm

3- Execute o comando abaixo para instalar os pacotes que usaremos ao longo do tutorial.

yum -y install pacemaker cman pcs ccs resource-agents ntsysv kmod-drbd84 drbd84-utils postgresql93-contrib postgresql93 postgresql93-server

Cada nó terá os seguintes componentes de software, a fim de trabalhar como membro do o cluster HA (High-availability).

Pacemaker => É um gestor de recursos do cluster, que executa scripts no momento em que os nós do cluster são inicializados ou desligados ou quando os recursos relacionados falham. Além disso, pode ser configurado para verificar periodicamente o estado de cada nó do cluster. Em outras palavras, o pacemaker será encarregado de dar a partida e parada dos serviços (como um servidor web ou de banco de dados, para citar um exemplo clássico) e irá implementar a lógica para garantir que todos os serviços necessários estão rodando em apenas um local, ao mesmo tempo a fim de evitar a corrupção de dados.

Corosync: Trata-se de um serviço de mensagens que irá fornecer um canal de comunicação entre os nós do cluster. Ele é essencial e funciona como um marca-passo que checa a disponibilidade de cada nó.

PCS: É uma ferramenta de configuração do corosync e pacemaker que permite a visualização, edição e criação de clusters. Ele é opcional, mas é bom instalá-lo para ajudar na configuração do Cluster.

Desabilitando o Selinux e Iptables

Como este tutorial tem objetivo apenas de criar um ambiente de teste, desabilite o SELinux e o Iptables para não interferir na comunicação dos nodes do cluster e na configuração dos serviços.

Instruções para desabilitar o SELinux:https://goo.gl/4McGVw
Instruções para parar o Iptables:http://goo.gl/uE3PP9

Configurando os dois nós do cluster para sincronizar a configuração

OBS.: Durante a execução dos comandos, deve ser utilizado o usuário root ou outro que possa executado o comando sudo.

Em cada máquina virtual foram executados os comandos abaixo, para iniciar o serviço pcsd e definir uma senha para o usuário hacluster, que será usado futuramente para sincronizar a configuração do cluster nas duas VMs. A senha do usuário hacluster deve ser a mesma em cada máquina.
service pcsd start
passwd hacluster

Adicionando os nós do cluster


Na VM db1, foram executados os comandos abaixo para adicionar os nós do cluster.
pcs cluster auth db1 db2
pcs cluster setup --name cluster-db db1 db2
pcs cluster start --all

OBS.: Durante a execução dos comandos será solicitado o login e senha do usuário hacluster

Os comandos abaixo configuram algumas das propriedades principais do cluster.

pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
pcs resource defaults migration-threshold=1
Em máquinas virtuais não dá para usar o STONITH (Shoot    The    Other    Node    In The    Head), que um dispositivo responsável por  evitar que dois nós ou membros de um cluster atuem como nó primário em um cluster do tipo HA. Isso ajuda a evitar a corrupção de dados. Este dispositivo “chuta” o nó slave para ser o prímario, quando há uma falha no nó master atual. Por isso no primeiro comando acima, ele foi desabilitado. O Fence é um processo de isolamento, ou a separação, de um nó do cluster ao usar os recursos ou iniciar serviços. Ele ajuda a evitar que um nó com defeito execute os recursos de cluster. Em alguns casos, se um nó do cluster parar de responder, o mesmo deve ser colocado como offline antes de outro nó assumir a execução dos recursos. O fence também é um mecanismo do STONITH.

 

O segundo comando acima evita que os recursos sejam iniciados em mais nós do que o desejado. É usado quando você tem um cluster com vários pares de nós (veja http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html/Clusters_from_Scratch/_perform_a_failover.html). Neste tutorial, a política de quorum foi desabilitada.

 

Já o terceiro comando acima, indica quantas falhas o cluster irá esperar que aconteça em um nó para mover os recursos para o próximo nó online.

 

Os comandos abaixo devem ser executados nas duas VMs para verificar o status do corosync e demais serviços do cluster.
corosync-cfgtool -s 
corosync-cpgtool
pcs status
Inicie os serviços dos cluster das duas máquinas.
service pcsd start
service corosync start
service cman start
service pacemaker start

Configure os serviços para serem inicializados no boot do S.O das duas máquinas

chkconfig pcsd on
chkconfig cman on
chkconfig pacemaker on
chkconfig corosync on

Visualizando a configuração do cluster

Quando quiser visualizar a configuração do cluster, use o comando abaixo.

pcs config

Comando para remoção da configuração do cluster

Se precisa remover a configuração do cluster, use os comandos abaixo nas duas VMs.

pcs cluster stop --force
pcs cluster destroy

Adicionando o IP do cluster como um recurso

Na VM db1 foi executado o comando abaixo para configurar o IP do cluster.

pcs resource create ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.1 cidr_netmask=24 nic=eth1 op monitor interval=10s
Com o comando acima será atribuído o IP 192.168.0.1/24 na interface de rede eth1 (das duas máquinas) e o recurso ClusterIP será monitorado a cada 10s.
Este IP será automaticamente configurado apenas em uma das máquinas por vez. Por padrão, apenas a máquina MASTER conterá o IP definido acima na segunda placa de rede (identificada no Red Hat 6 como eth1). Se o db1 ficar indisponível, este IP será configurado na máquina db2. Quando o master voltar ao normal, o IP continuará no db2 e só será migrado para o db1 em caso de problema no db2.
 

Execute o comando abaixo para visualizar a configuração.

ifconfig

Testando a migração do IP do cluster para a máquina db2. Na máquina db1 execute:

pcs cluster stop db1 --force

Na máquina db2, execute o comando abaixo para visualizar a configuração.

ifconfig

Na máquina db1, inicie o cluster.

pcs cluster start db1

Novamente execute o comando abaixo para visualizar a configuração.

ifconfig

Adicionando uma rota de saída do cluster como um recurso

Na VM db1 foi executado o comando abaixo para configurar a rota do cluster. É por essa rota que o cluster irá se comunicar com os hosts das demais redes.

pcs resource create DefRoute ocf:heartbeat:Route destination=default device=eth1 gateway=192.168.0.1 op monitor interval=10s

Adicionando um grupo de recursos

Para evitar que os recursos ClusterIP e DefRoute sejam iniciados em máquinas diferentes do cluster, podemos criar um grupo de recursos e incluí-los de forma que os dois sejam iniciados na mesma máquina. Para fazer isto, use os comandos abaixo:

pcs resource group add ClusterGrupoRecursos ClusterIP DefRoute
pcs resource manage ClusterIP DefRoute

Listando, atualizando e removendo um recurso

Se precisar listar os recursos ativos do cluster, use o comando abaixo.

pcs resource show
Se precisar atualizar um recurso. Use a opção update do comando pcs resource. Exemplo, o comando abaixo altera o IP do cluster.
 
pcs resource update ClusterIP ocf:heartbeat:IPaddr2 ip=192.168.0.75 cidr_netmask=24 nic=eth1 op monitor interval=10s

Se precisar remover um recurso do cluster, use o comando abaixo.

pcs resource delete NOMERECURSO
pcs resource cleanup NOMERECURSO

Se precisar ver a inicialização de um recurso no modo debug (depuração), use o comando abaixo:

pcs resource debug-start NOMERECURSO --full

Fonte: http://clusterlabs.org/doc/en-US/Pacemaker/1.1/html-single/Pacemaker_Explained/#ap-lsb

Se precisar consultar a lista de agentes do heartbeat, pacemaker ou LSB para configurar um recurso do cluster, use os comandos abaixo.

pcs resource agents ocf:heartbeat
pcs resource agents ocf:pacemaker
pcs resource agents lsb:

Configurando o DRBD nas duas máquinas

Os pacotes do DRBD já foram instalados no início do tutorial.

As duas VMs já possuem um segundo disco de 20 GB e que não foi usado durante a instalação. Esses discos serão usados pelo serviço DRBD para sincronizar os dados. O DRBD atuará como um cluster Ativo > Passivo. Os dados serão gravados apenas na máquina ativa do cluster. Na máquina passiva os dados serão sincronizados e o disco ficará apenas no modo leitura. O disco a ser usado pelo DRBD será montado no sistema como /database com o sistema de arquivos ext4 e será usado pelo PostgreSQL para armazenar os arquivos dos bancos de dados.

Em cada máquina, crie o arquivo /etc/drbd.d/disk_database.res com o conteúdo abaixo para configurar um recurso no DRBD que usará o disco disponível identificado no S.O como /dev/sdb1.

resource disk_database {
 protocol C;
 meta-disk internal;
 device /dev/drbd1;
 syncer {
   verify-alg sha1;
 }
 net {
   allow-two-primaries;
 }
 on db1 {
   disk   /dev/sdb;
   address  10.0.0.1:7789;
 }
 on db2 {
   disk   /dev/sdb;
   address  10.0.0.2:7789;
 }
}

O disco /dev/drdb1, configurado acima, é o disco DRBD que abstraí o uso do disco /dev/sdb1 de cada máquina.

Em cada máquina, ative o uso do recurso com os comandos abaixo.

drbdadm create-md disk_database
modprobe drbd
drbdadm up disk_database

Na máquina db1, force-a para ser o nó primário do DRBD.

drbdadm primary --force disk_database
Visualize a sincronização dos discos com o comandos abaixo.
 
 cat /proc/drbd
 A sincronização demorará alguns minutos.

Quando terminar a sincronização dos discos, execute o comando abaixo na máquina db1 para formatá-lo com o sistema de arquivos ext4.

mkfs.ext4 /dev/drbd1
Na máquina db1, teste o uso do disco /dev/drbd1.
 
mkdir /database
mount /dev/drbd1 /database
ls /database
mkdir /database/teste
touch /database/teste/a.txt

Configurando o DRBD para ser gerenciado pelo cluster

Na máquina db1, execute os comandos abaixo para configurar o recurso DRBD disk_database (configurado no arquivo /etc/drbd.d/disk_database.res) para ser gerenciado pelo Cluster.

pcs cluster cib drbd_cfg
pcs -f drbd_cfg resource create DBData ocf:linbit:drbd \
 drbd_resource=disk_database op monitor interval=60s
pcs -f drbd_cfg resource master DBDataClone DBData \
 master-max=1 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

Execute o comando abaixo para visualizar a configuração do recurso.

pcs -f drbd_cfg resource show

Execute o comando abaixo para salvar e habilitar a configuração do recurso.

pcs cluster cib-push drbd_cfg

Execute o comando abaixo para visualizar a configuração do cluster

pcs status

Habilite nas duas máquinas, o carregamento do módulo drbd no boot do S.O.

echo drbd > /etc/modprobe.d/drbd.conf

Configurando o Postgresql

O PostgreSQL já foi instalado no início do tutorial. Configure-o para usar o disco /dev/drbd1 montado na máquina db1 no diretório /database.
mkdir -p /database/pgsql
chown -R postgres:postgres /database/
chmod -R 0700 /database/
sudo -u postgres /usr/pgsql-9.3/bin/initdb -D /database/pgsql
Edite o script de inicialização do PostgreSQL, localizado em /etc/init.d/postgresql-9.3. No script mude apenas as variáveis citadas para conter os valores abaixo. Antes de editar o script, faça um backup do mesmo.
 
PGPORT=5433
PGDATA=/database/pgsql/
PGLOG=/database/pgsql/pgstartup.log
PGUPLOG=/database/pgsql/pgupgrade.log
Salve as alterações e copie-o para a máquina db2.
scp /etc/init.d/postgresql-9.3 root@db2:/etc/init.d/postgresql-9.3

Configurando recurso Postgresql no cluster

Na máquina db1, execute o comando abaixo para criar o recurso Postgresql que irá inicializar o serviço na máquina ativa do cluster, usando o script /etc/init.d/postgresql-9.3 (representado no comando abaixo por lsb:postgresql-9.3). É importante lembrar que ele não deve ser inicializado junto com o boot do sistema operacional. Apenas o cluster deve inicializá-lo.

pcs resource create Postgresql lsb:postgresql-9.3

Configurando a ordem de inicialização dos recursos no cluster

Configure o cluster para só inicializar o Postgresql depois de configurar o IP, a rota e montar o disco /dev/drbd1 em /database (usando o sistema de arquivos ext4) na máquina ativa. Execute os comandos abaixo apenas na máquina db1, pois a configuração será replicada para o db2.

pcs cluster cib fs_cfg
pcs -f fs_cfg resource create DBFS Filesystem \
 device="/dev/drbd1" directory="/database" fstype="ext4"
pcs -f fs_cfg constraint colocation add DBFS with DBDataClone INFINITY with-rsc-role=Master
pcs -f fs_cfg constraint order promote DBDataClone then start DBFS
pcs -f fs_cfg constraint colocation add ClusterIP with DefRoute INFINITY
pcs -f fs_cfg constraint order ClusterIP then DefRoute
pcs -f fs_cfg constraint colocation add DefRoute with DBFS INFINITY
pcs -f fs_cfg constraint order DefRoute then DBFS
pcs -f fs_cfg constraint colocation add Postgresql with DBFS INFINITY
pcs -f fs_cfg constraint order DBFS then Postgresql

Execute os comandos abaixo para revisar a configuração.

pcs -f fs_cfg constraint
pcs -f fs_cfg resource show

Execute o comando abaixo para salvar e habilitar a configuração do recurso.

pcs cluster cib-push fs_cfg

Execute o comando abaixo para visualizar a configuração do cluster

pcs status
 
Pronto! Agora é só realizar testes de funcionamento com o cluster.
 
OBS.: Para verificar o funcionamento do PostgreSQL, use o comando abaixo.
 
/etc/init.d/postgresql-9.3 status

Comandos úteis à gerência de configuração do cluster

Comandos para visualizar a configuração do cluster CIB (Cluster Information Base):
pcs cluster cib --config
pcs cluster cib
Comando para backup da configuração do cluster:
pcs config backup cluster_config_$(date +%Y-%m-%d)

Restaurando a configuração do cluster a partir do backup:1) Você precisa parar o serviço de cluster no nó, restaurar a configuração e iniciá-lo depois:

pcs cluster stop node --force
pcs config restore --local  cluster_config_$(date +%Y-%m-%d).tar.bz2
pcs cluster start node
Estes comandos restauram a configuração apenas no nó atual.
Para restaurar a configuração em todos os nós, use os comados abaixo.
pcs cluster stop node --force
pcs config restore cluster_config_$(date +%Y-%m-%d).tar.bz2
pcs cluster start node
Obtendo o relatório do cluster para análise de incidentes:
pcs cluster report [--from "YYYY-M-D  H:M:S"  [--to  "YYYY-M-D"  H:M:S"]]"  dest
Você também pode voltar a configuração do cluster para um determinado ponto. Para ver os pontos de configuração execute o comando:
pcs config checkpoint
Para visualizar a configuração de determinado ponto, use o comando abaixo:
pcs config  checkpoint view    <checkpoint_number>
Para voltar a usar a configuração de determinado ponto, use o comando:
pcs  config  checkpoint    restore    <checkpoint_number>
Para saber mais detalhes das sintaxes dos comandos e aprender mais sobre o assunto, recomendo a leitura das fontes e livros indicados no tutorial.

Fontes:

Sites:

http://blog.clusterlabs.org/blog/2010/pacemaker-heartbeat-corosync-wtf/

http://www.unixmen.com/configure-drbd-centos-6-5/

http://clusterlabs.org/quickstart-redhat-6.html

http://elrepo.org/tiki/tiki-index.php

http://drbd.linbit.com/en/doc/users-guide-84

http://clusterlabs.org/doc/en-US/Pacemaker/1.1-pcs/pdf/Clusters_from_Scratch/Pacemaker-1.1-Clusters_from_Scratch-en-US.pdf

CRMSH vs PCS: https://github.com/ClusterLabs/pacemaker/blob/master/doc/pcs-crmsh-quick-ref.md

http://www.picoloto.com.br/tag/mkfs-ext4

https://www.vivaolinux.com.br/artigo/Cluster-de-alta-disponibilidade-para-servidores-web-com-Debian-71-Corosync-Pacemaker-DRBD?pagina=1

http://asilva.eti.br/instalar-cluster-high-availbility-no-centos-7-com-pacemaker/

http://clusterlabs.org/quickstart-redhat.html

http://clusterlabs.org/wiki/Install

http://keithtenzer.com/2015/06/22/pacemaker-the-open-source-high-availability-cluster/

http://bigthinkingapplied.com/creating-a-linux-cluster-in-red-hatcentos-7/

https://bigthinkingapplied.com/tag/cluster/

http://www.tokiwinter.com/building-a-highly-available-apache-cluster-on-centos-7/

http://www.cloudera.com/documentation/enterprise/5-4-x/topics/admin_cm_ha_failover.html

http://jensd.be/156/linux/building-a-high-available-failover-cluster-with-pacemaker-corosync-pcs

Documentação Oficial sobre cluster no Red Hat 7:

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Overview/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Administration/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Load_Balancer_Administration/index.html

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/High_Availability_Add-On_Reference/index.html

Documentação geral do Red Hat 7:

https://access.redhat.com/documentation/en/red-hat-enterprise-linux/7/

Tutoriais de instalação do Zabbix 3.0

a b

Olá, pessoal!

Hoje (16/02/2016) foi lançado o Zabbix 3.0. Esta versão foi lançada com muitas novidades que podem ser conferidas nos links abaixo.

Os tutoriais de instalação do Zabbix Server, Agent, e Proxy 3.0 acabaram de sair do forno e podem ser baixados nos links abaixo.

 

Abraço e bons testes.

 

1º Conferência Latino-Americana sobre Zabbix

conf_banner_2016_br

 

Olá, pessoal!

Está se aproximando o dia da 1º Conferência Latino-Americana sobre Zabbix aqui no Brasil.

Será uma ótima oportunidade para aprender e compartilhar informações com quem usa muito esta ferramenta no dia a dia além de poder conversar pessoalmente com o criador do Zabbix e com funcionários da Zabbix SIA que trabalham no desenvolvimento e suporte a ferramenta. Além do que será uma oportunidade de conversar com os parceiros oficiais do Zabbix no Brasil e obter informações sobre como trazer esta ferramenta grátis e de código aberto para dentro do seu negócio.

O evento também é uma oportunidade para encontrar pessoas da comunidade que você só conhece através de postagens no fórum.

Além da palestras de alto nível, haverá um momento de integração entre os participantes e um passeio por Gramado-RS. 🙂 Não esqueçam de guardar dinheiro para comprar chocolate direto nas fábricas de Gramado.

Nesta primeira conferência haverão apenas 150 vagas, então se planeje e tente ir. Mais informações podem ser obtidas aqui: http://www.zabbix.com/conference_latam_2016.php

Abraço.

Configurando Link Failover no Mikrotik

rb2

Olá!
Estou compartilhando um documento elaborado por Victor Igor, que trabalha comigo.

Este documento ensina como configurar o mikrotik para verificar se um link está funcionando e, em caso de falha, redirecionar o tráfego da rede interna por outro link de redundância ou backup.

O documento também explica como implementar regras de NAT nos links de acesso a Internet. O texto está bem objetivo, mostra os comandos a serem usados e explica o que cada comando faz, de forma que uma pessoa iniciante possa entender e implementar esta solução sem muitas dificuldades.

Link para download do Tutorial de Failover Mikrotik