anúncios

terça-feira, 27 de dezembro de 2016

Instalando e Configurando Servidor de E-mail Postfix

O presente Howto será explicado a instalação e configuração do servidor de e-mail Postfix no GNU/Linux Debian 8.5.

Note que você precisará configurar o DNS do domínio o qual irá criar as caixas de e-mail. Para tal você pode utilizar qualquer serviço que lhe permita configurar as entradas do tipo A, MX e TXT.

Neste howto será explicado como instalar e configurar o Postfix, Dovecot com SASL, filtros de e-mail ClamAV, Spamassassin e o Webmail Roundcube.

Observação: O editor de texto usado para configurar os arquivos de configuração foi o Vim, então o atalho para salvar e sair é ESC +:x ou ESC + :wq

1. Configuração do Servidor Mail
Hostname: mailserver
Domínio: saitam.int
1.1 Editar o arquivo /etc/hosts
# vim /etc/hosts
IP     mailserver.saitam.int     mailserver
1.2 Editar o arquivo /etc/hostname
# vim /etc/hostname
mailserver
# hostname -F /etc/hostname

2. Instalação dos pacotes do MTA Postfix
# apt-get update
# apt-get install postfix postfix-doc dovecot-imapd dovecot-pop3d amavisd-new arj cabextract cpio lzop nomarch ripole tnef unrar zoo

Durante a instalação do pacote do Postfix será questionado quanto ao tipo de mail server que estará configurando, selecione Internet Site. Também será questionado sobre o nome do mail server, digite no campo o seu hostname.

Observa os screenshots abaixo:




2.1 Criar o aliases
# vim /etc/aliases
postmaster: root
root: saitam
3. Criar certificados SSL auto-assinados
# apt-get install openssl ca-certificates

Para ter uma maior segurança é necessário criar um certificado digital SSL por você mesmo ou comprar um assinado, porém para fins didáticos será usado o openssl.

#openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/mailserver.saitam.int.key -out /etc/ssl/certs/mailserver.saitam.int.crt

3.1 Ajuste de permissão
chmod 600 /etc/ssl/private/mailserver.saitam.com.br.key
chmod 600 /etc/ssl/certs/mailserver.saitam.int.crt


4. Configuração do Postfix
Antes é bom fazer o backup do arquivo original
# mv /etc/postfix/main.cf /etc/postfix/main.cf.orig
Agora criar o arquivo main.cf novo com as suas configurações
# vim /etc/postfix/main.cf
# Informações de domínio, hostname, redes de acesso ao e-mail e o mailbox
mydomain = saitam.int
myhostname = mailserver.$mydomain
myorigin = $mydomain
mydestination = $myhostname, $mydomain, localhost.saitam.int, localhost
mynetworks = 127.0.0.0/8, 192.168.1.0/24, 192.168.10.0/24
home_mailbox = ~/Maildir/
#mailbox_command = procmail -a "$EXTENSION"
#espaço de 1GB = 1024*1024*1024
mailbox_size_limit = 1073741824
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

# indica quem irá armazenar os e-mails
virtual_transport = dovecot

# SASL parameters
smtpd_sasl_auth_enable = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_authenticated_header = yes
broken_sasl_auth_clients = yes

# TLS parameters
# smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls = yes
smtpd_tls_auth_only = yes
smtpd_tls_cert_file =  /etc/ssl/certs/mailserver.saitam.int.crt

smtpd_tls_key_file = /etc/ssl/private/mailserver.saitam.com.br.key

smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache

#Segurança
# Aceitar ligacoes apenas a partir da rede local
smtpd_client_restrictions = permit_mynetworks,
  reject

# Clientes locais podem enviar emails para qualquer endereco
smtpd_recipient_restrictions = permit_mynetworks,
  reject_unauth_destination

# Rejeitar ligacoes de clientes que nao saibam o seu hostname
smtpd_helo_restrictions = reject_unknown_sender_domain

# Rejeitar email de dominios que nao existem
smtpd_sender_restrictions = reject_unknown_sender_domain

4.1Configuração do SMTP com autenticação SASL
Antes o backup do arquivo original
# cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig # vim /etc/dovecot/dovecot.conf Descomentar a linha 33
base_dir = /var/run/dovecot
4.2 Alterações internas do Dovecot localizadas em /etc/dovecot/conf.d/
Editar o arquivo /etc/dovecot/conf.d/10-auth.conf
# vim /etc/dovecot/conf.d/10-auth.conf Descomentar a linha 10
disable_plaintext_auth = no
4.3 Habilitar o local das mensagens por usuário
Editar o arquivo /etc/dovecot/conf.d/10-mail.conf
# vim /etc/dovecot/conf.d/10-mail.conf Adicionar a linha abaixo
mail_location = maildir:~/Maildir 
4.4 Habilitar os protocolos pop3 e imap
Editar o arquivo /etc/dovecot/conf.d/10-master.conf
# vim /etc/dovecot/conf.d/10-master.conf
Descomentar/Adicionar as linhas correspondentes abaixo
 
service imap-login {
  inet_listener imap {
    port = 143
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }

service pop3-login {
  inet_listener pop3 {
    port = 110
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
4.5 Habilitar o SSL

O Dovecot apenas aceita as extensões .pem do SSL, no caso será feito uma cópia dos arquivos .crc e .key gerados via openssl no item 3.


# cp /etc/ssl/certs/mailserver.saitam.int.crt /etc/ssl/certs/mailserver.saitam.int.pem
# cp /etc/ssl/private/mailserver.saitam.int.key /etc/ssl/private/mailserver.saitam.int.pem
Editar o arquivo /etc/dovecot/conf.d/10-ssl.conf
# vim /etc/dovecot/conf.d/10-ssl.conf
Adicione o caminho correspondente ao certificado e chave do OpenSSL
ssl_cert = < /etc/ssl/certs/mailserver.saitam.int.pem
ssl_key = < /etc/ssl/private/mailserver.saitam.int.pem
5. SMTP Relay
Para enviar um e-mail para uso externo, precisa resolver os seguintes itens:
  • O servidor SMTP do fornecedor de acesso Internet (ISP) deve aceitar conexão ao servidor.
  • O endereço do remetente deve ser de um domínio registrado para poder receber respostas.
Para contornar esses itens, nada mais simples do que utilizar servidores e endereços válidos. Com isso ao enviar e-mails para uso externo, precisa fazer isso.
  • O servidor deverá enviar e-mail através de um servidor SMTP externo. Caso necessário deverá autenticar-se como utilizador válido.
  • O endereço e-mail deverá ser substituído por outro e-mail válido no uso externo.
Será usado o servidor SMTP do GMail (smtp.gmail.com)
Adicione no arquivo /etc/postfix/main.cf para o relay SMTP
# vim /etc/postfix/main.cf
#relay
relayhost = [smtp.gmail.com]
5.1 Configurar a ligação TLS com SASL_AUTH
Configurar a ligação encriptada (TLS) e autenticada (SASL_AUTH), também o arquivo que contém os dados de autenticação (password_maps)
# vim /etc/postfix/main.cf
# SASL SUPPORT FOR SERVERS
#
# The following options set parameters needed by Postfix to enable
# Cyrus-SASL support for authentication of mail servers.
#
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
Os dados de autenticação no servidor SMTP do GMail encontra-se no arquivo /etc/postfix/sasl/sasl_passwd
[smtp.gmail.com] seuemail@gmail:PasswordGMail
Ajuste de permissão para segurança
# chmod 600 /etc/postfix/sasl/sasl_passwd

A cada alteração do arquivo /etc/postfix/sasl/sasl_passwd deve atualizar a base de dados correspondente.
# postmap /etc/postfix/sasl/sasl_passwd

6. Mapeamento de endereços de e-mails
Ao enviar e-mails para o exterior, os endereços internos (saitam@saitam.int) devem ser substituídos por endereços externos (seuemail@gmail.com)
O Postfix deve ser configurado para usar o arquivo de mapeamento de endereços, o que é feito no arquivo /etc/postfix/main.cf
# vim /etc/postfix/main.cf Adicionar a linha abaixo
smtp_generic_maps = hash:/etc/postfix/generic
O arquivo com mapeamento de endereços consiste em uma lista de endereços locais e os correspondentes endereços externos.
O tamanho da lista não está limitado, podendo ser aumentada para conter os endereços dos diversos utilizadores locais.
Adapte para o seu usuário local e externo do SMTP
# vim /etc/postfix/generic
saitam@saitam.int seuemail@gmail.com
A cada alteração do arquivo /etc/postfix/generic deve atualizar a base de dados correspondente # postmap /etc/postfix/generic

7. Filtros de E-mail

O uso de filtros no servidor de e-mail permite as implementações de anti-vírus e anti-spam.
Esses filtros podem ser complementados com a ligação a um sistema anti-vírus, com o clamav e/ou sistema anti-spam, como o spamassassin.

7.1 Amavisd-new
# apt-get install amavisd-new
Editar o arquivo /etc/postfix/main.cf
Incluir no final do arquivo
# vim /etc/postfix/main.cf
# amavisd-new scanner
#
content_filter = amavis:[127.0.0.1]:10024
receive_override_options = no_address_mappings
Em seguida configurar o serviço do postfix para receber os e-mails filtrados do amavisd-new
Incluir no final do arquivo
# vim /etc/postfix/master.cf
# amavisd-new scanner
#
amavis unix - - - - 2 smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20
  -o smtp_generic_maps=

127.0.0.1:10025 inet n - - - - smtpd
  -o content_filter=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_end_of_data_restrictions=
  -o smtpd_restriction_classes=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
  -o local_header_rewrite_clients=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o strict_rfc821_envelopes=yes
7.2 Filtro Anti-vírus ClamAV
Instalação do ClamAV
# apt-get install clamav clamav-docs clamav-daemon clamav-freshclam
Editar o arquivo /etc/amavis/conf.d/15-content_filter_mode
# vim /etc/amavis/conf.d/15-content_filter_mode
# Default antivirus checking mode
# Please note, that anti-virus checking is DISABLED by
# default.
# If You wish to enable it, please uncomment the following lines:

@bypass_virus_checks_maps = (
  \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);
Criar usuário clamav ao grupo amavis
# adduser clamav amavis

Reiniciar os serviços
# service amavis restart
# service clamav-daemon restart


7.3 Filtro Anti-spam Spamassassin
# apt-get install spamassassin spamc
Ativar o daemon spamassassin no boot
# systemctl enable spamassassin.service

Editar o arquivo /etc/default/spamassassin para as regras de filtro
# vim /etc/default/spamassassin
# Cronjob
# Set to anything but 0 to enable the cron job to automatically update
# spamassassin's rules on a nightly basis
CRON=1
Reiniciar os serviços
# service spamassassin restart
# service postfix restart
# service dovecot restart

Na configuração por default, os e-mails considerados spam são colocados em quarentena e nenhuma informação chega ao destinatário. Nesta configuração queremos que os emails indiquem apenas as probabilidades de serem spam, deixando ao utilizador a escolha das acções a realizar.

As configurações personalizadas encontra-se no arquivo /etc/amavis/conf.d/50-user

# vim /etc/amavis/conf.d/50-user
use strict;

#
# Place your configuration directives here. They will override those in
# earlier files.
#
# See /usr/share/doc/amavisd-new/ for documentation and examples of
# the directives you can use in this file

$sa_spam_subject_tag = '***SPAM*** ';
$sa_tag_level_deflt = undef; # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 9999; # triggers spam evasive actions

#------------ Do not modify anything below this line -------------
1; # insure a defined return

A “sensibilidade” do filtro anti-spam pode ser afinada alterando o valor de $sa_tag2_level_deflt: Com um valor mais baixo, serão necessários menos indicadores para que a mensagem seja considerada spam. No entanto, este valor não deve ser inferior a 5, ou corremos o risco de todas as mensagens, mesmo as mais legítimas, começarem a ser classificadas como spam.

Reiniciar o serviço amavisd-new
# service amavis restart

8. Descarga de E-mail

Por fim, o servidor deverá descarregar as mensagens dos servidores remotos para o servidor local, de um modo automatizado.

8.1 Fetchmail
Instalação do pacote fetchmail
# apt-get install fetchmail

Criar um arquivo em algum lugar do servidor
# vim /home/usuario/.fetchmailrc
poll pop.gmail.com proto pop3 user "seuemail" pass "password" is "usuario@saitam.int" options ssl keep
Neste exemplo, o fetchmail irá descarregar o email do utilizador seuemail do servidor pop.gmail.com, utilizando o protocolo pop3 e uma ligação ssl e reencaminha-o para o utilizador usuario@saitam.int

A opção keep mantém as mensagens no servidor, o que é útil em fase de testes. Posteriormente, essa opção poderá ser retirada. Com alguns servidores pop3, é necessário acrescentar a opção uidl, que força o lado cliente a manter uma lista das mensagens já descarregadas e que garante que apenas as novas mensagens serão descarregadas.

Ajuste de permissão #chmod 600 /home/usuario/.fetchmailrc
Execução automatizada
Adicionar no cron para execução do fetchmail a cada 5 minutos
# contrab -e
# m h dom mon dow command
*/5 * * * * /usr/bin/fetchmail &> /dev/null
9. Criação de usuário e diretório da caixa de e-mail
9.1 Criação de usuário
# adduser saitam --shell=/bin/false
# adduser taise --shell=/bin/false

9.2 Criação dos diretórios para recebimento de e-mail do usuário
# mkdir /home/saitam/Maildir
# mkdir /home/saitam/Maildir/cur
# mkdir /home/saitam/Maildir/new
# mkdir /home/saitam/Maildir/tmp

# mkdir /home/taise/Maildir
# mkdir /home/taise/Maildir/cur
# mkdir /home/taise/Maildir/new
# mkdir /home/taise/Maildir/tmp

9.3 Criar o grupo email
# groupadd email
9.4 Setar permissão aos diretórios de usuários
# chown saitam:email /home/saitam/Maildir
# chown saitam:email /home/saitam/Maildir/cur
# chown saitam:email /home/saitam/Maildir/new
# chown saitam:email /home/saitam/Maildir/tmp

# chown taise:email /home/taise/Maildir
# chown taise:email /home/taise/Maildir/cur
# chown taise:email /home/taise/Maildir/new
# chown taise:email /home/taise/Maildir/tmp

OBS: A caixa postal do usuário deve ser criada para cada novo usuário do sistema.

10. WebMail
O WebMail, permite consultar o e-mail de forma pela interface web
. Atualmente existem dois: Squirrelmail e Roundcube. No presente howto será utilizado o Roundcube

O Roundcube é a aplicação web utilizada como webmail. Para que os usuários do servidor de e-mail não sejam obrigados a utilizar uma aplicação cliente como Thunderbird ou Outlook;

10.1 Instalação dos pacotes pré-requisitos
Necessário instalar o Apache, PHP e MySQL
# apt-get install apache2 php5 php5-cli mysql-server php5-curl php5-gd php5-imap php5-mcrypt php5-mysql
Também outros pacotes
# apt-get install php5-sasl php-auth-sasl php-net-smtp libnet-smtp-server-perl libnet-smtp-ssl-perl libidn2-0-dev libemail-mime-perl php-mail-mime php-mail-mimedecode
E o Net_IDNA2 do Perl
# pear install Auth_SASL Net_SMTP Net_IDNA2-0.1.1 Mail_mime Mail_mimeDecode

10.2 Ajustes de parâmetros no PHP
Edite o arquivo /etc/php5/apache2/php.ini para ajustar os parâmetros do PHP conforme abaixo:
# vim /etc/php5/apache2/php.ini
# Ajuste de memória máxima utilizada nas aplicações web 
memory_limit = 128M 
# Ajuste o tamanho máximo do arquivo aceito pelo PHP. # anexos maiores que 2MB upload_max_filesize = 16M post_max_size = 16M
# Ajuste básicos de segurança, para não identificar que esteja #
executando PHP no servidor expose_php = Off # Ajuste para não perder a sessão o tempo todo (tempo em segundos) session.gc_maxlifetime = 21600 # Ajuste de fuso horário # Lista de timezones http://php.net/manual/en/timezones.php date.timezone = America/Sao_Paulo
10.3 Criação do VirtualHost no Apache para o WebMail Roundcube
Criar o diretório webmail no root do Apache
# mkdir /var/www/html/webmail
# vim /var/www/html/webmail/mailserver.conf
< VirtualHost *:80>
  ServerAdmin root@saitam.int
  ServerName mailserver.saitam.int
  DocumentRoot /var/www/html/webmail
  < Directory /var/www/html/webmail>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  Allow from all
  < /Directory>
  ErrorLog ${APACHE_LOG_DIR}/error-mailserver.log
  LogLevel warn
  CustomLog ${APACHE_LOG_DIR}/access-mailserver.log combined
< /VirtualHost>

< IfModule mod_ssl.c>
  
  # Se possuir um IP específico comente a linha acima e descomente abaixo
  # Ajustando o IP
  ServerAdmin root@saitam.int
  ServerName mailserver.saitam.int
  DocumentRoot /var/www/html/webmail
  < Directory /var/www/html/webmail>
  Options Indexes FollowSymLinks MultiViews
  AllowOverride All
  Order allow,deny
  allow from all
  < /Directory>
  ErrorLog ${APACHE_LOG_DIR}/error-mailserver.log
  CustomLog ${APACHE_LOG_DIR}/ssl-mailserver.log combined
  SSLEngine on
  # Caminhos para os dados de certificado
  SSLCertificateFile /etc/ssl/certs/mailserver.saitam.int.crt
  SSLCertificateKeyFile /etc/ssl/private/mailserver.saitam.int.key
  # Em alguns casos é preciso ajustar os certificados de cadeia ou de autoridade,
  # verifique com sua certificadora os detalhes
  #SSLCACertificateFile /etc/ssl/certs/cacert.pem
  #SSLCertificateChainFile /path/to/my/ca-bundle.crt
  # Ajustes para o Internet Explorer
  BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
  BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
  < /VirtualHost>
< /IfModule>
10.4 Habilitar a porta 443 do VirtualHost
Edite o arquivo /etc/apache2/ports.conf para configurar o ServerName do VirtualHost
# vim /etc/apache2/ports.conf
ServerName mailserver
NameVirtualHost *:80
Listen 80
< IfModule mod_ssl.c>
  NameVirtualHost *:443
  # Nota: Clientes com Windows XP não suportam SNI 
  #e portanto você não pode usar um
  # mesmo IP para mais de um virtualhost!
  Listen 443
< /IfModule>
10.5 Habilitar o VirtualHost e SSL
Habilita o VirtualHost # a2ensite mailserver.conf
Habilita SSL
# a2enmod rewrite ssl
Reinicia o Apache
# service apache2 restart

10.6 Configuração de informação de Banco de Dados
Criando o banco de dados roundcube no MySQL
# mysql -u root -p
Enter password: < digite a senha de root que foi definida na instalação do MySQL >
# mysql> create database roundcube character set utf8;

Criado o usuário roundcube com sua respectiva senha para o banco criado anteriormente
# mysql> GRANT ALL on roundcube.* to roundcube@localhost identified by ‘roundcube_senha’;
Query OK, 0 rows affected (0.00 sec)
# mysql> quit
Bye

# cp /var/www/html/webmail/config/config.inc.php.sample /var/www/html/webmail/config/config.inc.php
Editar /var/www/html/webmail/config/db.inc.php.
# vim /var/www/html/webmail/config/config.inc.php
$config['db_dsnw'] = 'mysql://roundcube:roundcube@roundcube_senha@localhost/roundcube';
Ajuste de permissão do diretório de instalação por segurança
# chmod 000 /var/www/html/webmail/installer/

10.7 Instalação do Roundcube
Acessar até o diretório /var/www/html/webmal
#cd /var/www/html/webmail
Download: #wget -c 'https://sourceforge.net/projects/roundcubemail/files/roundcubemail/1.1.4/roundcubemail-1.1.4.tar.gz/download' -O roundcubemail-1.1.4.tar.gz
Extração:
#tar xvzf roundcubemail-1.1.4.tar.gz
Mover para o diretório raiz do Roundcube
#mv roundcubemail-1.1.4/* .
Mover o arquivo .htaccess para o diretório raiz do Roundcube
#mv roundcubemail-1.1.4/.htaccess .
Remover o arquivo o diretório diretório roundcubemail-1.1.4/ e compactado
#rm -rf roundcubemail-1.1.4/ roundcube.tar.gz
Ajuste de permissão
#chown www-data:www-data temp/ logs/
Importação da base do roundcube # mysql -u roundcube -p
Enter password: < digite a senha definida para roundcube, a mesma colocada no arquivo config.inc.php >
# mysql> use roundcube;
# mysql> source /var/www/html/webmail/SQL/mysql.initial.sql ;
# mysql> quit
Bye


Acesse no browser http://mailserver.saitam.int/webmail/installer/ e verifique se há algum detalhe faltando na configuração do servidor.
Se tiver OK, o botão NEXT será liberado e assim processguir nas etapas solicitadas com base do servidor
Acesse no browser em outro computador https://mailserver.saitam.int/webmail



Referências
[1] http://www.postfix.org/
[2] http://www.postfix.org/postconf.5.html
[3] http://www.postfix.org/postconf.5.html
[4] http://www.postfix.org/SASL_README.html#client_sasl
[5] http://www.postfix.org/SASL_README.html#client_sasl
[6] http://postfix.state-of-mind.de/patrick.koetter/smtpauth/smtp_auth_mailservers.html
[7] http://postfix.state-of-mind.de/patrick.koetter/smtpauth/smtp_auth_mailservers.html
[8] http://www.dovecot.org/
[9] https://www.openssl.org/
[10] https://www.linode.com/docs/email/clients/install-roundcube-on-ubuntu-14-04

Feito!

terça-feira, 20 de dezembro de 2016

Instalando, Configurando e Provisionando o Samba4 como Controlador de Domínio Active Directory (AD)

O presente Howto mostra os procedimentos necessários para instalação e configuração do Samba 4 como controlador de domínio Active Directory (AD) realizada nas distros Debian 8 e CentOS 7.

Observação: Recomendado usar a versão 4.4.5 por ser a mais estável no momento em ambiente de produção.

1. Configuração do servidor Samba
Hostname: samba4dc
Tipo de Serviço (Role): Domain Controler
Endereço IP: 192.168.1.4
Domínio: saitam.int
DNS Cliente: 192.168.1.4
Gateway default: 192.168.1.1

1.1 Criar o mapeamento do servidor
# vim /etc/hostname
samba4dc
# vim /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.1.4 samba4dc.saitam.int samba4dc

# /etc/init.d/hostname.sh restart

2. Instalação dos pacotes pré-requisitos para o Samba4
No Debian:
# apt-get install acl attr autoconf bison gcc g++ debhelper dnsutils docbook-xml docbook-xsl flex gdb krb5-user libacl1-dev libaio-dev libattr1-dev libblkid-dev libbsd-dev libcap-dev libcups2-dev libgnutls28-dev libjson-perl libldap2-dev libncurses5-dev libpam0g-dev libparse-yapp-perl libpopt-dev libreadline-dev perl perl-modules pkg-config python-all-dev python-dev python-dnspython python-crypto xsltproc zlib1g-dev libgpgme11-dev python-gpgme python-m2crypto winbind libpam-winbind libnss-winbind
Durante o setup do Kerberos, preencha conforme solicitado
Reino por omissão do Kerberos versão 5: SEUDOMINIO.INT
No meu caso, coloquei SAITAM.INT
Servidores Kerberos para seu realm: 127.0.0.1
Servidor administrativo para seu realm Kerberos: 127.0.0.1

No CentOS:
# yum install perl gcc attr libacl-devel libblkid-devel gnutls-devel readline-devel python-devel gdb pkgconfig krb5-workstation zlib-devel setroubleshoot-server libaio-devel setroubleshoot-plugins policycoreutils-python libsemanage-python perl-ExtUtils-MakeMaker perl-Parse-Yapp perl-Test-Base popt-devel libxml2-devel libattr-devel keyutils-libs-devel cups-devel bind-utils libxslt docbook-style-xsl openldap-devel autoconf python-crypto pam-devel

3. Download e instalação do Samba4
# mkdir /opt/samba4 && cd /opt/samba4
# wget -c "https://download.samba.org/pub/samba/stable/samba-4.4.5.tar.gz"
# tar -xzvf samba-4.4.5.tar.gz
# cd samba-4.4.5

Checa as dependências
# ./configure
'configure' finished successfully (7m45.311s)

Se ocorrer OK no passo anterior, execute o make para compilação
# make
No meu caso em Debian 8.5 ocorreu o seguinte erro abaixo no final da compilação.
Build failed: -> task failed (err #139): {task: manpages/smb.conf.5 smb.conf.5.xml,parameters.all.xml -> smb.conf.5}
Depois de uma pesquisa, descobri que era o bug do pacote docbook-xsl na versão 1.78.1+dfsg-1, a solução foi remover esse pacote via APT, fazer o download deste pacote na versão corrente e instalar via dpkg.
Segue os procedimentos:
# aptitude remove docbook-xsl
# cd /opt/samba4
# wget -c "http://ftp.br.debian.org/debian/pool/main/d/docbook-xsl/docbook-xsl_1.79.1+dfsg-2_all.deb"
# dpkg -i docbook-xsl_1.79.1+dfsg-2_all.deb

Executar novamente o # make
NOTA: Esse pacote docbook-xsl está na versão TESTING do Debian até a data de publicação deste post.
Após o término de compilação
Waf: Leaving directory `/opt/samba4/samba-4.4.5/bin'
'build' finished successfully (1h2m12.706s)

A instalação propriamente
# make install
Após o término de instalação
Waf: Leaving directory `/opt/samba4/samba-4.4.5/bin'
'install' finished successfully (28m41.800s)

3.1 Adicionar os comandos do Samba no PATH do sistema
# export PATH=/usr/local/samba/bin/:/usr/local/samba/sbin/:$PATH

4. Download e instalação do Bind 9.9.9-P4
Foi necessário instalar o Bind de forma compilada para adicionar parâmetros para o Samba 4 necessários para usar o BIND9_DLZ
Dependências necessárias:
# apt-get install libglobus-gssapi-gsi-dev libgssapi-krb5-2 libkrb5-dev
# mkdir /opt/bind9 && cd /opt/bind9
# wget -c "http://ftp.isc.org/isc/bind9/9.9.9-P4/bind-9.9.9-P4.tar.gz"
# tar -xzvf bind-9.9.9-P4.tar.gz
# cd bind-9.9.9-P4
#./configure --prefix=/usr/local/bind9 --with-gssapi=/usr/include/gssapi --with-dlopen=yes
# make
# make install

4.1 Adicionar usuário e grupo para o Bind
# groupadd -g 35 named
# useradd -u 35 -g named -d /var/named -M -s /sbin/nologin named


4.2 Adicionar os comandos do Bind no PATH do sistema
#export PATH=/usr/local/bind9/bin/:/usr/local/bind9/sbin/:$PATH

5. Configuração do servidor DNS
Como o Bind foi compilado e instalado em /usr/local/bind9 os arquivos de configuração fica em /usr/local/bind9/etc que serve para as distros Debian e CentOS nesse caso.

5.1 Configuração dos arquivos essenciais do Bind
Download do servidor DNS Root
# wget -q -O /var/named/named.root https://www.internic.net/zones/named.root
# chown root:named /var/named/named.root
# chmod 640 /var/named/named.root


5.2 Configuração do arquivo named.conf
# vim /usr/local/bind9/etc/named.conf
# Global Configuration Options
options {

  auth-nxdomain yes;
  directory "/var/named";
  notify no;
  empty-zones-enable no;

  # IP addresses and network ranges allowed to query the DNS server:
  allow-query {
  127.0.0.1;   192.168.1.0/24;
  };

  # IP addresses and network ranges allowed to run recursive queries:
  # (Zones not served by this DNS server)
  allow-recursion {
  127.0.0.1;   192.168.1.0/24;
  };

  # Forward queries that can not be answered from own zones
  # to these DNS servers:
  forwarders {
  8.8.8.8;
  8.8.4.4;
  };

  # Disable zone transfers
  allow-transfer {
  none;
  };
 };

# Root Servers
# (Required for recursive DNS queries)
zone "." {
  type hint;
  file "named.root";
};

# Forward zone: localhost
zone "localhost" {
  type master;
  file "master/localhost.zone";
};

# Reverse zone: 127.0.0.
zone "0.0.127.in-addr.arpa" {
  type master;
  file "master/0.0.127.zone";
};

# Zona direta domínio rede local saitam.int
zone "saitam.in" {
  type master;
  file "master/db.saitam";
};
# Zona reversa 192.
zone "1.168.192.in-addr.arpa" {
  type master;
  file "master/db.192";
};

5.3 Configuração das zonas direta e reversa
Zona direta localhost
# vim /var/named/master/localhost.zone
$TTL 604800

@ IN SOA localhost. root.localhost. (
  2016121801 ; serial
  604800 ; refresh
  86400 ; retry
  2419200 ; expiry
  604800 ; minimum
  )
;
  NS localhost.

localhost. IN A 127.0.0.1
# chown named:named /var/named/master/localhost.zone
# chmod 640 /var/named/master/localhost.zone

Zona reversa localhost
# vim /var/named/master/0.0.127.zone
$TTL 604800

@ IN SOA localhost. root.localhost. (
  2016121801 ; Serial
  604800 ; Refresh
  86400 ; Retry
  2419200 ; Expire
  604800 ; Minimum TTL
  )
;
  IN NS localhost.

1 IN PTR localhost.
# chown named:named /var/named/master/0.0.127.zone
# chmod 640 /var/named/master/0.0.127.zone

Zona direta para domínio saitam.int
# vim /var/named/master/db.saitam
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA saitam.int. root.saitam.int. (
  2016121801 ; Serial
  604800 ; Refresh
  86400 ; Retry
  2419200 ; Expire
  604800 ) ; Negative Cache TTL
  IN A 192.168.1.4
;
@ IN NS saitam.int.

  IN MX 5 saitam.int.

www IN CNAME saitam.int.
mail IN A 192.168.1.4
router IN A 192.168.1.1
gateway CNAME router
gw CNAME router
# chown named:named /var/named/master/db.saitam
# chmod 640 /var/named/master/db.saitam

Zona reversa do domínio saitam.int
# vim /var/named/master/db.192
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA saitam.int. root.saitam.int. (
  2016120701 ; Serial
  604800 ; Refresh
  86400 ; Retry
  2419200 ; Expire
  604800 ) ; Negative Cache TTL
;
@ IN NS saitam.int.
4 IN PTR saitam.int.
1 IN PTR router.saitam.int.
# chown named:named /var/named/master/db.192
# chmod 640 /var/named/master/db.192


5.4 Configuração do BIND_DLZ
Incluir o /usr/local/samba/private/named.conf no /usr/local/bind9/etc/named.conf na linha 1 # vim /usr/local/bind9/etc/named.conf
include "/usr/local/samba/private/named.conf";
5.5 Adicionar a atualização DNS do Kerberos em options
# vim /usr/local/bind9/etc/named.conf
Quando provisionar o samba vai criar essa chave e precisa ser adicionada aqui o path completo
tkey-gssapi-keytab "/usr/local/samba/private/dns.keytab"; 
5.6 Habilitar o DLZ_BIND
Edite o arquivo /usr/local/samba/private/named.conf e descomente a linha conforme a versão do Bind instalada, nesse caso o Bind 9.9
# vim /usr/local/samba/private/named.conf
 # For BIND 9.9.x
  database "dlopen /usr/local/samba/lib/bind9/dlz_bind9_9.so";
5.7 Adicionar o domínio no arquivo /etc/resolv.conf
# vim /etc/resolv.conf
domain saitam.int
search saitam.int
nameserver 192.168.1.4
5.8 Iniciar o serviço do Bind
Estando com os comandos do Bind no PATH do sistema, conforme feito anteriormente pode executar de qualquer lugar no terminal, caso não tenha feito ainda, reveja o procedimento no item 4.2 ou terá que executar os comandos Bind dentro do diretório /usr/local/bind9/bin e /usr/local/bind9/sbin
# named -u named
Para parar o serviço do Bind é killall named
OBS: Fica a seu critério criar um script Shell com opção start|stop no diretório de inicialização no boot.

6. Instalar e Configurar o NTP
No Debian: # apt-get install ntp
No CentOS: # yum install ntp
# vim /etc/ntp.conf
# Relogio Local
server 127.127.1.0
fudge 127.127.1.0 stratum 10

6.1 Testar o NTP
# ntpq -p
remote refid st t when poll reach delay offset jitter

 ns507230.ip-192 137.146.28.85 2 u - 64 1 192.071 2.852 1.057
 vel.itat.io 162.23.41.10 2 u 2 64 1 257.998 0.743 1.999
 alpha.rueckgr.a 131.188.3.222 2 u 4 64 1 247.913 6.323 0.004
 c.st1.ntp.br .ONBR. 1 u 1 64 1 40.179 0.290 0.863
*LOCAL(0) .LOCL. 10 l 5 64 1 0.000 0.000 0.004
6.2 Reiniciar o serviço NTP
Debian: # /etc/init.d/ntp restart
CentOS: # systemctl restart ntp
[ ok ] Restarting ntp (via systemctl): ntp.service.
7. Proversionar o Samba4
Server role: dc
NIS extensão habilidada
DNS interno back end: BIND9_DLZ
Kerberos realm e AD DNS zona: samba4dc.saitam.int
NetBIOS domínio name: samba4dc
Administrador de domínio:

7.1 Prover o Samba AD no modo interativo
Estando com os comandos do Samba no PATH do sistema, conforme feito anteriormente pode executar de qualquer lugar no terminal, caso não tenha feito ainda, reveja o procedimento no item 3.1 ou terá que executar os comandos do Samba dentro do diretório /usr/local/samba/bin e /usr/local/samba/sbin
# samba-tool domain provision --use-rfc2307 --interactive
Realm [SAITAM.INT]
Domain [SAITAM]:
Server Role (dc, member, standalone) [dc]:
DNS backend (SAMBA_INTERNAL, BIND9_FLATFILE, BIND9_DLZ, NONE) [SAMBA_INTERNAL]: BIND9_DLZ
Administrador password:
Retype password:
Once the above files are installed, your Samba4 server will be ready to use
Server Role: active directory domain controller
Hostname: samba4dc
NetBIOS Domain: SAITAM
DNS Domain: saitam.int
DOMAIN SID: S-1-5-21-3436644580-1722986177-1604106671

8. Configuração do Kerberos
Primeiramente renomear o arquivo original do krb5.conf para backup
# mv /etc/krb5.conf /etc/krb5.conf.orig
Copiar o krb5.conf do Samba4 para /etc
# cp /usr/local/samba/private/krb5.conf /etc
Criar um link símbolico
# ln -sf /usr/local/samba/private/krb5.conf /etc/krb5.conf
Incluir as linhas caso não exista, adapte para domínio e endereço IP de sua rede.
# vim /usr/local/samba/private/krb5.conf
[realms]
SAITAM.INT = {
kdc = 192.168.1.4
admin_server = 192.168.1.4
}
9. Serviço Samba 4
No Debian:
# systemctl restart smbd
# systemctl restart nmbd
# systemctl restart winbind

No CentOS:
Reiniciar o daemon do SystemD
# systemctl daemon-reload
# systemctl enable samba-ad-dc
# systemctl start samba-ad-dc

10. Testes de comunicação
DNS
Verificar se o arquivo de zona direta e reversa contém erros # named-checkzone saitam.int /var/named/master/db.saitam
zone saitam.int/IN: loaded serial 2016121801
OK 
# named-checkzone 1.168.192.in-addr /var/named/master/db.saitam/db.192
zone 1.168.192.in-addr/IN: loaded serial 2016121801
OK
# host -t A saitam.int
saitam.int has address 192.168.1.4

# host -t SRV _ldap._tcp.saitam.int.
_ldap._tcp.saitam.int has SRV record 0 100 389 samba4dc.saitam.int.

# host -t SRV _kerberos._udp.saitam.int.
_kerberos._udp.saitam.int has SRV record 0 100 88 samba4dc.saitam.int.
10.1 Teste do mecanismos de autenticação Kerberos
# kinit administrator@SAITAM.INT
Password for administrator@SAITAM.INT:
Warning: Your password will expire in 41 days on Qua 01 Fev 2017 16:05:34 BRST
# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: administrator@SAITAM.INT

Valid starting       Expires              Service principal
20-12-2016 16:47:15  20-12-2016 02:47:15  krbtgt/SAITAM.INT@SAITAM.INT
        renew until 20-12-2016 16:46:57
10.2 Autenticação com controlador de domínio Samba 4
# smbclient //localhost/netlogon -UAdministrator -c 'ls'
Enter Administrator's password:
Domain=[SAITAM] OS=[Windows 6.1] Server=[Samba 4.4.5]
  .                                   D        0  Sat Dec 17 18:08:21 2016
  ..                                  D        0  Sat Dec 17 18:08:48 2016

                9961324 blocks of size 1024. 5006248 blocks available
11. Administração de usuários e grupos do Samba 4 AD pelo terminal

Os comandos do Samba foram adicionados no PATH do sistema, caso não tenha adicionado ainda, reveja o procedimento no item 3.1 ou terá que executar os comandos do Samba dentro do diretório /usr/local/samba/bin e /usr/local/samba/sbin

11.1 Criar usuário no Samba 4 DC AD
# samba-tool user add usuario
New Password:
Retype Password:
User 'usuario' created successfully
11.2 Criar Grupo RH, Financeiro, TI dos setores da empresa
# samba-tool group add RH
Added group RH
# samba-tool group add Financeiro
Added group Financeiro 
# samba-tool group add TI
Added group TI 
11.3 Adicionar o usuário criado no grupo TI
# samba-tool group addmembers TI usuario
Added members to group TI 
11.4 Listar usuários
# samba-tool user list

11.5 Listar grupos
# samba-tool group list

12. Criar o arquivo smb.conf para compartilhamento de arquivos
# vim /usr/local/samba/etc/smb.conf
Arquivo smb.conf
Reinicie o serviço do Samba para efeito do smb.conf

13. Ingressar máquinas Windows no domínio Samba4 como AD
Agora é necessário ingressar as máquinas Windows no domínio, segue os procedimentos abaixo:
Maneira 1:
Clica com botão direito o atalho Meu Computador depois em Propriedades
Na aba Nome do computador, clica no botão ID de rede
Irá abrir o Assistente para identificação da rede, clique em Avançar, marque a opção Este computador faz parte de uma rede corporativa e o utiliza para conectar-me a outros computadores no trabalho, clique em Avançar, marque a primeira opção, antes de prosseguir tenha em mente o usuário,senha e nome de domínio que será pedido, clique em Avançar, e digite os dados respectivamente.
Maneira 2:
Clica com botão direito o atalho Meu Computador depois em Propriedades
Na aba Nome do computador, clica no botão Alterar, digite o nome de domínio, e OK.
No final do processo irá aparecer Bem-vindo ao domínio e avisará que deverá reiniciar o computador.

13.1 Cliente Windows 7 no domínio Samba 4 como AD


14. Instalação do RSAT no Windows 7 para gerenciar o Samba4 como se fosse o AD

Uma forma de gerenciar as novas GPOs de Windows 7 é com a ferramenta RSAT Segue abaixo o link para download e o processo de instalação/ativação caso você ainda não o conheça.

14.1. Faça o download do RSAT para Windows 7 SP1 através do link Tools RSAT for Windows 7 , respeitando o idioma e arquitetura da sua versão de Windows.
14.2.Instale esse pacote no seu PC.
14.3. Clique no botão Iniciar do Windows 7, digite Ativar Recursos e selecione “Ativar ou desativar recursos do Windows” .
14.4.Marque as opções desejadas em “Ferramentas de Administração de Servidor Remoto”, como na figura abaixo (você pode aproveitar e habilitar outros recursos como o Cliente Telnet) e clique em OK:
Após a instalação do RSAT por padrão o atalho para Ferramentas Administrativas já deve aparecer no seu Menu Iniciar do Windows.

Referências
[1] https://wiki.samba.org/index.php/Setting_up_Samba_as_an_Active_Directory_Domain_Controller
[2] https://wiki.samba.org/index.php/Time_Synchronisation
[3] https://wiki.samba.org/index.php/Setting_up_a_BIND_DNS_Server
[4] https://wiki.samba.org/index.php/BIND9_DLZ_DNS_Back_End
[5] https://wiki.samba.org/index.php/Adding_users_with_samba_tool

Feito!

domingo, 11 de dezembro de 2016

Gerenciando endereço IP com PHPIPAM

O que é PHPIPAM e para que serve?

O termo IPAM significa Internet Protocol Address Management, ou seja, é um sistema para gerenciamento dos números IPs de uma determinada rede. Com essa ferramenta o administrador de redes pode planejar, acompanhar e gerenciar a distribuição dos números IPs das redes ou subredes que ele administra.


PHPIPAM é uma ferramenta web para gerenciamento de endereços IP, opensource sob licença GPLv3, desenvolvido em PHP como Back-end e HTML5, CSS3, JS/jQuery como Front-end.

Características do PHPIPAM
  • Divisão de Sub-Redes
  • Suporte a IPv6
  • Autenticação LDAP/OpenLDAP
  • Notificação por e-mail
  • Verificação de host (Ping Check)
  • Calculadora Ipv4 / Ipv6
  • Gerenciamento de Ipv4 / Ipv6 e VLANs

Depois de conhecer o PHPIPAM e pra que serve, podemos seguir os procedimentos de instalação e configuração do PHPIPAM em seu servidor GNU/Linux Debian e/ou CentOS.

Observação: Testado no GNU/Linux Debian 8 (Jessie) / CentOS 7 e versão do PHPIPAM é 1.2.1 até a data de publicação deste post.

Instalação dos pacotes pré-requisitos do PHPIPAM
No Debian:
Atualizando o repositório de pacotes
# apt-get update
Instalando os pacotes pré-requisitos necessários
# apt-get install apache2 php5 php5-cli php5-mysql php5-mcrypt php5-json php-gettext php-xml-parser php5-gmp php5-ldap php-pear mysql-server openssl
No CentOS:
Atualizando o repositório de pacotes
#yum update
Instalando os pacotes pré-requisitos necessários
#yum install http php php-gd php-mysql mysql-server-devel mysql-server
Reiniciar o serviço do Apache e MySQL
# service httpd start
# service mysqld start


Download do PHPIPAM
# mkdir /tmp/phpipam && cd /tmp/phpipam
# wget -c "https://sourceforge.net/projects/phpipam/files/latest/download" -O phpipam-1.2.1.tar
# tar -xvf phpipam-1.2.1.tar -C /var/www/html

Parâmetros de Configuração
Informar as informações do nome da base de dados, usuário e senha no arquivo config.php localizado no diretório raíz do Apache dentro do diretório phpipam.
Antes renomeia o config.dist.php para config.php
# cd /var/www/html/phpipam
# mv config.dist.php config.php

Editar o arquivo config.php com as informações solicitadas
# vim config.php
$db['host'] = "localhost";
$db['user'] = "phpipam";
$db['pass'] = "phpipam_senha";
$db['name'] = "phpipam";

Na linha 51: define('BASE', "/phpipam");

Configuração da base de dados
Criando o banco de dados phpipam no MySQL
# mysql -u root -p
Enter password: < digite a senha de root que foi definida na instalação do MySQL >
# mysql> create database phpipam character set utf8;

Criado o usuário phpipam com sua respectiva senha para o banco criado anteriormente
# mysql> GRANT ALL on phpipam.* to phpipam@localhost identified by ‘phpipam_senha’;
Query OK, 0 rows affected (0.00 sec)
# mysql> quit
Bye

Importação da base SCHEMA.sql
# mysql -u phpipam -p
Enter password: < digite a senha definida para phpipam, a mesma colocada no arquivo config.php >
# mysql> use phpipam;
# mysql> source /var/www/html/phpipam/db/SCHEMA.sql;
# mysql> quit
Bye

Configuração do arquivo .htaccess
# vim /var/www/html/phpipam/.htaccess
Descomentar a linha e adicionar /phpipam como segue
RewriteBase /phpipam/

Criando VirtualHost no Apache
# vim /etc/apache2/sites-available/phpipam.conf

Options Indexes FollowSymLinks MultiViews
AllowOverride all
Order allow,deny
allow from all

Habilitar o VirtualHost criado anteriormente
# a2ensite phpipam
Habilitar o módulo ReWrite do Apache
# a2enmod rewrite
Reload do Apache
# service apache2 reload
Acesse no browser http://IPSERVIDOR/phpipam

No primeiro acesso o password default para o admin é ipamadmin que depois é solicitado a troca do password.


Referências
http://phpipam.net/documents/installation/
Feito!

domingo, 27 de novembro de 2016

Entendendo os benefícios e utilização do Docker

O que é Docker?

Antes esclarecemos uma dúvida comum aos novatos. Docker não é sistema de virtualização tradicional, pois em um sistema de virtualização tradicional temos um SO completo e isolado, já no Docker temos os recursos isolados que utilizam as bibliotecas do kernel em comum (host e contêiner). O Docker utiliza como backend o LXC.

Figura diferença entre Virtualização e Contêiner de [1]

Docker é uma plataforma open source escrito em Go, linguagem de programação de alto desempenho da Google, que facilita a criação e administração de ambientes isolados.

Vantagens de usar o Docker

O Docker permite o empacotamento de uma aplicação ou ambiente completo dentro de um contêiner, e a partir desse momento o ambiente completo torna-se portável para qualquer outro Host que contenha o Docker instalado.

Assim reduz drasticamente o tempo de deploy de alguma infraestrutura ou até mesmo da aplicação, pois não há necessidade de ajustes de ambiente para o correto funcionamento do serviço, o ambiente sempre é o mesmo, configure uma vez e replique quantas vez quiser.

Outra facilidade do Docker é poder criar imagens (contêiners prontos para deploy) por meio de arquivos de configuração Dockerfile.

Como o Docker funciona?

O Docker funciona como cliente e servidor (toda a comunicação entre o Docker Daemon e Docker Client é realizada através da API), basta apenas ter instalado o serviço do Docker e apontar o Docker Client para o servidor. A plataforma Docker utiliza alguns conjuntos de recursos, seja para criação ou administração dos containers. entre esses conjuntos destacamos a biblioteca libcontainer, que é responsável pela comunicação entre o Docker Daemon e o backend utilizado, e ela a responsável pela criação do container e através dela podemos setar os limites de recursos por container.

Instalação do Docker
Pré-requisitos: O Docker requer instalação das distros Linux com arquitetura 64 bits independente da versão e além disso, o kernel deve ter no mínimo 3.10.
No Debian
# apt-get purge "lxc-docker*"
#apt-get purge "docker.io*"
# apt-get install apt-transport-https ca-certificates
# echo "deb https://apt.dockerproject.org/repo debian-jessie main " > /etc/apt/sources.list.d/docker.list
#apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

Debian Wheezy (7)
# echo "deb https://apt.dockerproject.org/repo debian-wheezy main" >> /etc/apt/sources.list
Debian Jessie (8)
# echo "deb https://apt.dockerproject.org/repo debian-jessie main" >> /etc/apt/sources.list
Debian Stretch/Sid (9)
# echo "deb https://apt.dockerproject.org/repo debian-stretch main" >> /etc/apt/sources.list
Atualização do repositório
# apt-get update
Instalação do pacote Docker
# apt-get install docker-engine
Startar o serviço Docker
# service docker start

No CentOS
Adicionar no repositório
# tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

Instalar o pacote Docker
# yum install docker-engine
Habilitar o serviço Docker
# systemctl enable docker.service
Startar o serviço Docker
# systemctl start docker

No Ubuntu
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


Precise 12.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-precise main
Trusty 14.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-trusty main
Wily 15.10 deb https://apt.dockerproject.org/repo ubuntu-wily main
Xenial 16.04 (LTS) deb https://apt.dockerproject.org/repo ubuntu-xenial main
Adicione o repositório conforme a versão do Ubuntu, nesse caso adicionei a versão Xenial 16.04 LTS
$ echo "deb https://apt.dockerproject.org/repo ubuntu-xenial main" | sudo tee /etc/apt/sources.list.d/docker.list
Atualiza o repositório
$ sudo apt-get update
Instalação da imagem do kernel extra e virtual
$ sudo apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual
Instalação do pacote Docker
$ sudo apt-get install docker-engine
Start do serviço Docker
$ sudo service docker start

Comandos Docker
Build de uma imagem
docker build -t

Lembre que as imagens são compostas de camadas (layers) e que o Docker usa caching para fazer o build somente das camadas que tiveram alguma mudança. Recentemente, o Docker publicou uma Image Specification, que explica como tudo isso funciona. Para buildar uma imagem sem utilizar caching, adicione a opção --no-cache ao comando.

Executar um container
docker run -d -p : --name
Iniciar uma sessão bash em um container que esteja rodando
docker exec -it bash
Pesquisa de imagens
docker search nome-imagem
Encontrado a imagem, execute o comando pull para o download
docker pull nome-imagem
Remover um imagem
Localize o ID ou nome do repositório com o comando docker images.
Com o id ou o nome do repositório em mãos, utilize o comando rmi para excluir as imagens.
docker rmi ID_ou_nome_da_imagem
Ver os logs de um container
docker logs
Ver todas as imagens no host
docker images
Ver todos os containers
docker ps -a
Remover um container
docker rm -f
Remover TODOS os containers
docker rm -f $(docker ps -a -q)
Remover uma imagem
docker rmi -f
Remover dangling images
docker rmi $(docker images -q -f dangling=true)
"Dangling images" são, basicamente, imagens sem uma tag. Se você alguma(s) vez(es) rodou um Dockerfile que falhou, provavelmente você deve ter uma ou mais imagens sem tags.
Copiar um arquivo do container para o host
docker cp :/caminho/no/container /caminho/no/host

Monitoramento de containers
Visualizar estatísticas de um container
docker stats
Visualizar estatísticas de todos os containers executando no host
docker stats `docker ps | tail -n+2 | awk '{ print $NF }'

Repositório de imagens prontas do Docker
O site https://hub.docker.com/explore/ é onde estão as imagens prontas para usar usando os comandos informados.

Construindo sua própria imagem para seu ambiente em uma aplicação

O arquivo de manifesto do Docker é o Dockerfile, nele você coloca as instruções de como você quer que sua imagem seja construída. Você pode na construção da imagem setar outro arquivo com o parâmetro -f.

Abaixo temos um exemplo de Dockerfile, esse é um exemplo de um app em go já compilado para ubuntu então eu só preciso copiar o arquivo executável elasticpush para dentro do docker:

FROM debian:jessie
RUN mkdir /app
ENV ACCESS_TOKEN abc
ENV SECRET_TOKEN xyz
COPY ./bin/elasticpush /app/elasticpush
ENTRYPOINT [“/app/elasticpush”]


Detalhando os comandos utilizados:
FROM:

Este é o comando mais importante, pois ele especifica a imagem base para a construção de uma nova. Na maioria das vezes a imagem especificada vai ser uma distribuição linux, se essa imagem não for encontrada na máquina local, o docker tentará buscar em algum repository. Caso queira, por exemplo, fazer a build do seu app em GO dentro do container, você vai precisar de uma imagem que tenha o GO instalado e configurado. Outra forma também seria criar diversas instruções com o comando RUN para fazer essa instalação.

RUN:

Esse comando serve para executar outros comandos que a versão do sistema operacional permite. Por exemplo, se for Debian pode instalar apt-get, se for CentOS pode utilizar o yum para pegar as dependências que seu serviço precisa para rodar. Com o RUN você também pode criar arquivos, diretórios, enfim os mesmo comando do que executaria na sua máquina, logo você consegue fazer praticamente tudo, e deixar a sequência de comandos versionada aqui no container.

ENV:

Serve para setar variáveis de ambiente, assim pode tanto deixar essas variáveis setadas de forma fixa dentro do Dockerfile quanto passá-las dinamicamente na hora que instanciar o container. Para passar essas variáveis de ambiente na instanciação do container basta usar o parâmetro -e.

Exemplo: docker run -e ACCESS_TOKEN=abcd [nome da imagem]
COPY:

O COPY serve para poder copiar arquivos e diretório para dentro da imagem do Docker, nesse exemplo eu copiei o arquivo elasticpush que estava dentro do diretório bin na minha máquina local para dentro da pasta /app na imagem do docker.

ENTRYPOINT:

Com esse parâmetro pode setar se quer que algo seja executado na hora da instanciação do container. Então, quando for executar docker run nessa imagem, ela já vai instanciar e executar o programa que está no caminho que você colocar entre colchetes. No nosso caso queremos que essa imagem execute nossa aplicação do Elasticpush, o mesmo vale para quaisquer outros serviços como Redis, Elasticsearch, Nodejs, etc.

Após criar o arquivo Dockerfiles do seu ambiente de aplicação, execute:
docker build -t app/elasticpush

Considerações finais

O Docker é uma tecnologia da área de DevOps, sendo utilizada por muitas empresas, como Google, Yahoo, Microsoft e outras, dentro da metodologia ágil.

O Docker é uma ferramenta leve que permite executar containers de forma equivalente como se fosse máquinas virtuais, mas lembra da diferença de virtualização e containers na figura mencionada no início, então o Docker funciona dessa forma.

Por fim, espero que esse artigo tenha esclarecido sobre Docker e recomendo começar a utilizar nas aplicações de projetos que for desenvolver.

Referências
[1] http://www.mundodocker.com.br/o-que-e-docker/
[2] http://stefanteixeira.com.br/2015/03/17/comandos-essenciais-docker-monitoramento-containers/
[3] https://woliveiras.com.br/posts/comandos-mais-utilizados-no-docker/
[4] http://tableless.com.br/iniciando-com-o-docker-criando-suas-proprias-imagens/
[5] https://docs.docker.com/engine/installation/linux/debian/
[6] https://docs.docker.com/engine/installation/linux/centos/
[7] https://docs.docker.com/engine/installation/linux/ubuntulinux/
Feito!

terça-feira, 22 de novembro de 2016

Criando ambiente de desenvolvimento com Vagrant

O que é Vagrant ?

O Vagrant é um projeto que permite virtualizar o ambiente de desenvolvimento de forma simples. Com o Vagrant você pode executar máquinas virtuais utilizando o VirtualBox ou VMware, dentre muitas outras opções. Estas máquinas virtuais podem ter qualquer configuração e programas instalados e você pode, inclusive, criar a sua própria configuração com muita facilidade. Isso ajuda bastante quando um novo funcionário é contratado, por exemplo. Se todo o seu ambiente de desenvolvimento for baseado em boxes (box é o nome que o Vagrant utilizada para definir cada máquina virtual) personalizados, tudo o que ele precisa fazer é instalar o Vagrant e executar um único comando.

Depois de conhecer o Vagrant e pra que serve, podemos seguir os procedimentos de instalação e configuração do Vagrant em seu computador com SO Windows ou Linux.

Instalação do Vagrant

Como o Vagrant depende do VirtualBox ou VMWare, é necessário instalar um ou outro, nesse caso optei por instalar o VirtualBox.

Faça o download do VirtualBox conforme o SO que tem no seu PC no site:
https://www.virtualbox.org/wiki/Downloads e a instalação posteriormente.
Em seguida, faça o download do Vagrant conforme o SO que tem no seu PC no site: https://www.vagrantup.com/downloads.html e a instalação posteriormente.

Recomendo criar uma variável de ambiente VBox e Vagrant apontando para o caminho onde foi instalado o VirtualBox e Vagrant, depois aplicar essas variáveis de ambiente no PATH do SO.
Por que? Para poder executar de qualquer lugar no CMD ou terminal.

Vagrant na prática
Agora pesquise um ambiente pronto Vagrant (box) no site: https://atlas.hashicorp.com/boxes/search e depois execute conforme abaixo:
vagrant box add nome-box
Após o download do ambiente (box), inicie com o comando
vagrant init nome-box
Acesso ao ambiente (box) via SSH
vagrant@127.0.0.1 -p 2222 OU
vagrant ssh

Comandos Vagrant
  • vagrant ssh:
  • faz login na máquina virtual, não precisa de login ou senha
  • vagrant up:
  • faz o boot na máquina virtual e executa os provisioners definidos
  • vagrant reload:
  • reinicia a máquina virtual. Útil principalmente quando há mudanças no Vagrantfile
  • vagrant provision:
  • executa apenas os provisioners, sem reiniciar a máquina. Útil após fazer pequenas modificações no provisionamento
  • vagrant destroy:
  • destrói a máquina virtual. Use quando quiser começar do zero com um vagrant up vagrant halt - "desliga" a máquina, equivalente a um shutdown
  • vagrant suspend:
  • suspende a execução da máquina virtual salvando seu estado (ideal para o dia-a-dia quando desenvolvendo)
  • vagrant resume:
  • retoma uma máquina virtual previamente suspensa

Convertendo .OVA to .BOX

Na seção anterior você aprendeu a usar um ambiente Vagrant (box) já pronto do repositório, nessa seção aprenderá como gerar o arquivo box para usar no Vagrant.

Bom, primeiramente cria uma máquina virtual no VirtualBox, instale uma distro e configure todo o ambiente necessário, depois exporte essa máquina virtual para o formato .ova.

Importando VM com formato .ova no VirtualBox

.OVA é a VM exportada do VirtualBox
.BOX é a VM convertida do .OVA to .BOX para usar no Vagrant
Primeiro lista as VMs
$VBoxManage list vms
copia o serial da vm
$vagrant package --base < serial-copiado-vm > --output NOME.box
Transfira essa NOME.box para um servidor da rede. E de outra máquina com o VirtualBox e Vagrant instalados.
$vagrant box add NOME.box --name NOME
Cria o arquivo Vagrantfile
$vagrant init NOME

Vagrant.configure("2") do |config|
config.vm.box = "NOME"
# ...
end
Liga a VM: $vagrant up
Desliga a VM: $vagrant halt
Destroi a VM: $vagrant destroy

Referências:
http://blog.wfsneto.com.br/2014/08/22/como-criar-e-costumizar-box-vagrant-cloud
https://nandovieira.com.br/usando-o-vagrant-como-ambiente-de-desenvolvimento-no-windows
http://www.erikaheidi.com/pt_br/blog/vagrant-101-montando-seu-ambiente-de-desenvolvimento-portatil
Feito!

sábado, 19 de novembro de 2016

Instalando o ambiente gráfico MATE no Linux

O ambiente gráfico MATE é o fork do Gnome 2, então para aqueles que não curtiram o Gnome 3 e querem usar o Gnome 2, pode usar o MATE que lembrará muito a versão antecessor do Gnome 3. O presente Howto é destinado para as distribuições Linux Slackware 14.2, Debian 8, RHEL 7/CentOS 7/Fedora, Arch Linux, openSUSE 13.2/Leap 42.1/Tumbleweed e Ubuntu 16.04.1 LTS até a data de publicação deste post.

Slackware 14.2 (32 bits)
$ mkdir mate-desktop && cd mate-desktop/
$ lftp -c "open http://slackware.org.uk/msb/14.2/1.16/; mirror x86"
$ cd x86/
$ su
# upgradepkg --install-new deps/*.t?z
# upgradepkg --install-new base/*.t?z
# upgradepkg --install-new extra/*.t?z
# exit

Para selecionar o ambiente gráfico MATE por default no boot
# xwmconfig

Slackware 14.2 (64 bits)
$mkdir mate-desktop && cd mate-desktop/
$ lftp -c "open http://slackware.org.uk/msb/14.2/1.16/; mirror x86_64"
$ cd x86_64/
$ su
# upgradepkg --install-new deps/*.t?z
# upgradepkg --install-new base/*.t?z
# upgradepkg --install-new extra/*.t?z
# exit

Para selecionar o ambiente gráfico MATE por default no boot
# xwmconfig

Debian 8
Estando com o arquivo /etc/apt/sources.list conforme o arquivo sources.list segue:
#apt-get update
#apt-get install mate-desktop-environment
#apt-get install mate-desktop-environment-extras


RHEL 7 / CentOS 7 / Fedora
#yum groupinstall mate-desktop

Arch Linux
#pacman -Syy mate mate-extra

openSUSE 13.2
#zypper ar -r http://download.opensuse.org/repositories/X11:/MATE:/Current/openSUSE_13.2/X11:MATE:Current.repo
openSUSE Leap 42.1
#zypper ar -r http://download.opensuse.org/repositories/X11:/MATE:/Current/openSUSE_Leap_42.1/X11:MATE:Current.repo
openSUSE Tumbleweed
#zypper ar -r http://download.opensuse.org/repositories/X11:/MATE:/Current/openSUSE_Tumbleweed/X11:MATE:Current.repo

Ubuntu 16.04.1 LTS
sudo apt-add-repository ppa:ubuntu-mate-dev/ppa
sudo apt-add-repository ppa:ubuntu-mate-dev/trusty-mate
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install mate-desktop-environment-extras

Feito!

domingo, 30 de outubro de 2016

Instalando NVIDIA no Slackware

Quem tem placa de vídeo Nvidia no seu computador/notebook com GNU/Linux deve ter notado, que partir do Kernel 3.x.y do Linux, o driver da NVIDIA tem algum bloqueio nouveau embutido no seu Kernel, com isso ao executar o binário da Nvidia ocorre conflito, tendo que fazer parametrizações.

Notei isso quando usava a versão anterior do Slackware 14.x, que simplesmente após o download do binário do driver da Nvidia, desabilitando o X, setando permissão e executando o binário da Nvidia, que instalava sem nenhum conflito. Isso com o Kernel Linux anterior da versão 3.x.y.

Tendo selecionado as categorias A, AP, D, K, L, N, X, XAP, XFCE contido no DVD do Slackware que são essenciais para uso em Desktop. As categoriais D e K são as mais importantes para realizar a instalação do driver da Nvidia, nos procedimentos a seguir, essas categorias importantes correspondente os pacotes de desenvolvimento, incluindo compiladores C(gcc), C++(g++), libc, make, etc e o source do Kernel Linux localizado em /usr/src:

Segue os procedimentos para instalar a Nvidia no Slackware 14.2
Primeiramente acesse o site http://www.nvidia.com e faça o download do driver NVIDIA da versão correspondente de sua placa de vídeo que deve ser o binário .run
Remove o drive que ocorre conflito
# removepkg xf86-video-nouveau
Reinicie o sistema
# reboot
Os demais procedimentos deve ser realizado em init 3 (sem o X)
instale o pacote xf86-video-nouveau-blacklist-noarch-1-txz localizado no DVD extra/xf86-video-nouveau-blacklist

Verifique se tem a entrada dvdrom no arquivo /etc/fstab
Caso não tiver, adicione a linha
/dev/cdrom /mnt/cdrom auto noauto,owner,ro,comment=x-gvfs-show 0 0
Note que no arquivo /etc/fstab está configurado a montagem no diretório /mnt/cdrom no dispositivo /dev/cdrom
O diretório de montagem pode ser outro de sua preferência, mas nesse Howto será utilizado o /mnt/cdrom
Montar o DVD no /mnt/dvdrom
# mount /mnt/cdrom/
Instalação do pacote contido no DVD
# installpkg /mnt/cdrom/extra/xf86-video-nouveau-blacklist/xf86-video-nouveau-blacklist-noarch-1.txz
Acessar o diretório onde salvou o binário do driver NVIDIA e setar permissão
# chmod +x NVIDIA-Linux-x86-xx.xx.xx-pkg1.run
Executar o binário
# ./NVIDIA-Linux-x86-xx.xx.xx-pkg1.run
Reinicie o sistema e execute $ startx
Feito!

terça-feira, 25 de outubro de 2016

Instalando PHP 7 no Linux

O presente post, mostra os procedimentos para instalar o PHP 7 (lançado oficialmente em 2016), juntamente com o servidor Apache e o SGBD MySQL nas distros Ubuntu, Debian 8.x e CentOS 7.x
Observação: Não pode ter o PHP 5.x instalado, antes de seguir os procedimentos abaixo deve remover por completo o PHP 5.x, pois ocorre conflito. Para isso, basta executar no Debian e Ubuntu # apt-get purge php5-*
Segue os procedimentos conforme a distribuição Linux adotada:

No Ubuntu


sudo apt-get update
sudo apt-get install ca-certificates apache2 libapache2-mod-php php-cli php php-curl php-apcu php-gd php-imap php-ldap php-mysql php-cas php-soap php-mbstring php-xml php-xmlrpc mariadb-server


No Debian
Adicionar no arquivo /etc/apt/sources.list as linhas abaixo
deb http://ftp.br.debian.org/debian/ stable main contrib non-free
deb-src http://ftp.br.debian.org/debian/ stable main contrib non-free

deb http://ftp.br.debian.org/debian/ stable-updates main contrib non-free
deb-src http://ftp.br.debian.org/debian/ stable-updates main contrib non-free

deb http://security.debian.org/ stable/updates main contrib non-free
deb-src http://security.debian.org/ stable/updates main contrib non-free


Atualiza do repositório e instala os pacotes que compõe o ambiente de desenvolvimento web completo
# apt-get update
# apt-get install ca-certificates apache2 libapache2-mod-php php-cli php php-curl php-apcu php-gd php-imap php-ldap php-mysql php-cas php-soap php-mbstring php-xml php-xmlrpc mariadb-server


No RHEL/CentOS 7.x
No CentOS 7.x, foi adotado o SGBD MariaDB (fork do MySQL)
yum install httpd mariadb mariadb-server
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
yum install php70w


Feito!

sábado, 22 de outubro de 2016

Configurando RAID via software no Debian

Depois de conhecer o RAID e pra que ser serve no post anterior Entendendo RAID , podemos seguir os procedimentos de configuração do RAID via software em seu computador com SO GNU/Linux Debian Jessie, mas deve funcionar também em outra distro sem problemas, basta substituir pelo gerenciador de pacotes da distro que esta usando atualmente.
A ferramenta de gerenciamento RAID via software é mdadm, que poderá ser instalado facilmente por meio do gerenciador de pacotes da sua distro. No presente post, será utilizado o GNU/Linux Debian 8.5.
Primeiramente atualizando o repositório
root@Saitam:~# apt-get update
Instalação da ferramenta mdadm
root@Saitam:~# apt-get install mdadm
Sintaxe do mdadm:
mdadm [modo] [nome-array] [opções] [componentes-array]
O procedimento abaixo é apenas para fins didáticos como exemplo, nesse caso poderá ser usado uma máquina virtual e adicionar dois discos de 1GB ou outro tamanho, desde que os dois discos sejam de mesmo tamanho.
Após criar os 2 discos na máquina virtual em VirtualBox ou VMWare, segue os procedimentos abaixo:

RAID 0 e 1 via software
1. Criar partições nos discos
Verifique qual a nomenclatura do seu disco que foi usada com # fdisk -l
No presente exemplo foram: /dev/sdd e /dev/sde
Verificação dos discos a ser criados as partições
root@Saitam:~# fdisk -l /dev/sdd
Disk /dev/sdd: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
root@Saitam:~# fdisk -l /dev/sde
Disk /dev/sde: 1 GiB, 1073741824 bytes, 2097152 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disco 1: root@Saitam:~# cfdisk /dev/sdd
Criação da partição selecionando tipo fd (Linux RAID) no disco /dev/sdd

Disco 2: root@Saitam:~# cfdisk /dev/sde
Criação da partição selecionando tipo fd (Linux RAID) no disco /dev/sde

2. Criar o Array RAID
root@Saitam:~# mdadm -v -C /dev/md0 --chunk=64 --level=1 --raid-devices=2 /dev/sdd1 /dev/sde1

3. Adicionar o Array RAID no arquivo /etc/mdadm/mdadm.conf
root@Saitam:~# mdadm -Es | grep md >> /etc/mdadm/mdadm.conf

4. Criar o sistema de arquivos para o RAID criado. No caso será criado o sistema de arquivos ext4.
root@Saitam:~# mkfs.ext4 /dev/md0

5. Montar o Array RAID no /mnt/raid
root@Saitam:~# mkdir /mnt/raid
root@Saitam:~# mount -t ext4 /dev/md0 /mnt/raid


6. Adicionar no arquivo /etc/fstab
root@Saitam:~# echo "/dev/md0 /mnt/raid ext4 defaults 0 0" >> /etc/fstab

7. Verificar o ponto de montagem
root@Saitam:~# df -h

8. Verificar o funcionamento do arranjo RAID

root@Saitam:~# mdadm --detail /dev/md0
OU
root@Saitam:~# cat /proc/mdstat

Feito!

sexta-feira, 21 de outubro de 2016

Entendendo o RAID

O que é RAID ?
O RAID originalmente Redundant Array of Independent Disk (Arranjo Redundante de Discos Independentes) é um sistema de armazenamento composto de diversos discos rígidos individuais, com o objetivo de ganhar segurança e desempenho.
O RAID oferece segurança e confiabilidade por meio da adição de redundância. Se um disco falhar, o outro continua funcionando normalmente e o usuário nem percebe diferença. O administrador é avisado pelo sistema e substitui o disco que falhou. Apesar disso, o RAID não protege contra falhas de energia ou erros de operação ou contra a falha simultânea dos dois discos. Falhas de energia, código errado de núcleo ou erros operacionais podem danificar os dados de forma irrecuperável. Por este motivo, mesmo usando-se o RAID não se dispensa fazer backup por questão de garantia.

Como funciona o RAID ?
O RAID existe dois tipos de arquiteturas que pode ser implementado, via hardware e via software.

Implementação via Hardware:
Controladoras RAID em hardware usam layouts de disco proprietários (e diferentes). Por isso, normalmente não é possível misturar controladoras de fabricantes diferentes. Eles não utilizam recursos do processador. O BIOS - Basic Input/Output System - pode iniciar (dar boot) por ela, e uma integração maior com o driver de dispositivo pode oferecer um melhor tratamento de erros.

Uma implementação de RAID em hardware requer pelo menos uma controladora especialmente dedicada para isso. Em uma estação de trabalho (PC comum) isso pode ser uma placa de expansão PCI, PCI-e ou uma placa integrada à placa-mãe. Controladoras utilizando a maioria dos tipos de drive podem ser usadas - IDE/ATA, Serial ATA, SCSI, SSA, Fibre Channel, e às vezes uma combinação. A controladora e os discos utilizados devem estar isolados. Podem estar conectados diretamente ao computador, ou conectados via SAN. A controladora gerencia os drives e faz os cálculos de paridade necessários pelo nível de RAID escolhido.

A maioria das implementações em hardware proveem cache de leitura e escrita, o que (dependendo da carga de I/O) melhora a performance. Na maioria dos casos, o cache de escrita é não-volátil (protegido por bateria), e portanto, escritas pendentes não são perdidas no caso de uma falha no suprimento de energia. Implementações em hardware promovem performance garantida, não sobrecarregam o processador e podem suportar vários sistemas operacionais, já que a controladora apresentará ao sistema operacional um disco simples

Implementação via Software: 
Na implementação via software, o sistema operacional gerencia o RAID através da controladora de discos, sem a necessidade de um controlador de RAIDs, tornando-a mais barata.

Nesse tipo de implementação, todo o processamento necessário para o gerenciamento do RAID é feito pela CPU. Toda movimentação de dados(leitura e escrita) é feita por uma camada de software que faz a abstração entre a operação lógica (RAID) e os discos físicos, e é controlada pelo sistema operacional.

A configuração do RAID via software é feita pelo sistema operacional, que precisa ser implementado no próprio núcleo a utilização de RAIDs via software. É possível criar RAIDs via software no Mac OS X, Linux, FreeBSD, OpenBSD e no Windows Server. Alternativamente, podem ser criados com algum software especialmente dedicado a manutenção de discos rígidos do fabricante da placa mãe (quando há suporte para RAID, é claro).

Comparação entre as arquiteturas
Ao compararmos RAIDs por software e por hardware percebe-se que os implementados através de software são mais flexíveis que os via hardware. Por outro lado, os primeiros exigem da CPU mais tempo de processamento.

Comparando os dispositivos de blocos, os em software também são flexíveis podendo ser usados em discos inteiros, partições ou outro dispositivo de bloco.

Níveis de RAID
Os níveis de RAID são combinados os discos de diferentes maneiras e serão explicados a seguir:

RAID-Linear:  É uma simples concatenação de partições para criar uma grande partição virtual. 

Desvantagens: Não oferece redundância, isto é, se um disco falhar, a partição combinada irá falhar também.
Não há ganho de desempenho.

RAID-0: É bem parecido ao RAID-Linear, com exceção de os dados serem lidos e escritos em paralelo nos discos, o que aumenta o desempenho.

Vantagens:
  • acesso rápido as informações
  • custo baixo para expansão de memória. 
Desvantagens:
  • caso algum dos setores de algum dos HDs venha a apresentar perda de informações, o mesmo arquivo que está dividido entre os mesmos setores dos demais HDs não terão mais sentido existir, pois uma parte do arquivo foi corrompida, ou seja, caso algum disco falhe, não tem como recuperar; 
  • não é usada paridade.
RAID-1: Esse nível de RAID que implementa o espelhamento de disco Para esta implementação são necessários no mínimo dois discos ou mais desde que seja utilizado sempre um número par. O funcionamento deste nível é simples: todos os dados são gravados em dois discos diferentes; se um disco falhar ou for removido, os dados preservados no outro disco permitem a não descontinuidade da operação do sistema.

Vantagens:
  • caso algum setor de um dos discos venha a falhar, basta recuperar o setor defeituoso copiando os arquivos contidos do segundo disco;
  • segurança nos dados (com relação a possíveis defeitos que possam ocorrer no HD). 
Desvantagens:
  • custo relativamente alto se comparado ao RAID 0;
  • ocorre aumento no tempo de escrita;
RAID-2: O RAID 2 surgiu no final dos anos 80, onde os HDs não possuíam checagem de erros. Assim, pode-se dizer que o RAID 2 é similar ao RAID 0, mas possuindo algoritmos de Hamming ECC, que é a informação de controle de erros, no lugar da paridade. Além disso, pode-se ter várias configurações, como 10 discos normais + 4 discos somente para ECC. Este fato possibilita uma protecção adicional, porém o RAID 2 ficou obsoleto pelas novas tecnologias de disco já possuírem este tipo de correcção internamente. O RAID 2 origina uma maior consistência dos dados se houver queda de energia durante a escrita. Baterias de segurança e um encerramento correto podem oferecer os mesmos benefícios.

Vantagem:
  • usa ECC, diminuindo a quase zero as taxas de erro, mesmo com falhas de energia. 
Desvantagens:
  • hoje em dia, há tecnologias melhores para o mesmo fim.
  • dependendo da configuração e necessidade da empresa, era necessário a mesma quantidade de discos ECC para discos normais, isto é, desperdício de espaço que poderia ser usado para dados. 
RAID-3: O RAID 3 é uma versão simplificada do RAID nível 2. Nesse arranjo, um único bit de paridade é computado para cada palavra de dados e escrito em um drive de paridade. No primeiro momento, pode parecer que um único bit de paridade dá somente detecção de erro, e não correção de erro. Para o caso de erros aleatórios não detectados, essa observação é verdadeira. Todavia, para o caso de uma falha de drive, ela provê correção total de erros de um bit, uma vez que a posição do bit defeituoso é conhecida. Se um drive falhar, o controlador apenas finge que todos os seus bits são 0. Se uma palavra apresentar erro de paridade, o bit que vem do drive extinto deve ter sido um (1), portanto, é corrigido.

A fim de evitar o atraso em razão da latência rotacional, o RAID 3 exige que todos os eixos das unidades de disco estejam sincronizados. A maioria das unidades de disco mais recentes não possuem a opção de sincronização do eixo, ou se são capazes disto, faltam os conectores necessários, cabos e documentação do fabricante.

Vantagens:
  • leitura rápida;
  • escrita rápida;
  • possui controle de erros.

Desvantagem:
  • Montagem difícil via software.
RAID-4: O RAID 4 funciona com três ou mais discos iguais. Um dos discos guarda a paridade (uma forma de soma de segurança) da informação contida nos discos. Se algum dos discos avariar, a paridade pode ser imediatamente utilizada para reconstituir o seu conteúdo. Os discos restantes, usados para armazenar dados, são configurados para usarem segmentos suficientemente grandes (tamanho medido em blocos) para acomodar um registro inteiro. Isto permite leituras independentes da informação armazenada, fazendo do RAID 4 um array perfeitamente ajustado para ambientes transacionais que requerem muitas leituras pequenas e simultâneas.

O RAID 4 assim como outros RAIDs, cuja característica é utilizarem paridade, usam um processo de recuperação de dados mais envolvente que arrays espelhados, como RAID 1. Este nível também é útil para criar discos virtuais de grande dimensão, pois consegue somar o espaço total oferecido por todos os discos, exceto o disco de paridade. O desempenho oferecido é razoável nas operações de leitura, pois podem ser utilizados todos os discos em simultâneo.

Sempre que os dados são escritos no array, as informações são lidas do disco de paridade e um novo dado sobre paridade deve ser escrito para o respectivo disco antes da próxima requisição de escrita ser realizada. Por causa dessas duas operações de I/O, o disco de paridade é o fator limitante do desempenho total do array. Devido ao fato do disco requerer somente um disco adicional para proteção de dados, este RAID é mais acessível em termos monetários que a implementação do RAID 1.

Vantagens:
  • taxa de leitura rápida;
  • possibilidade do aumento de área de discos físicos. 
Desvantagens:
  • taxa de gravação lenta;
  • em comparação com o RAID 1, em caso de falha do disco, a reconstrução é difícil, pois o RAID 1 já tem o dado pronto no disco espelhado;
  • tecnologia não mais usada por haver melhores para o mesmo fim.
RAID-5: O RAID 5 é frequentemente usado e funciona similarmente ao RAID 4, mas supera alguns dos problemas mais comuns sofridos por esse tipo. As informações sobre paridade para os dados do array são distribuídas ao longo de todos os discos do array , ao invés de serem armazenadas num disco dedicado, oferecendo assim mais desempenho que o RAID 4, e, simultaneamente, tolerância a falhas.

Vantagens:
  • maior rapidez com tratamento de ECC;
  • leitura rápida (porém escrita não tão rápida). 
Desvantagem:
  • sistema complexo de controle dos HDs.(discos)
RAID-6: É um padrão relativamente novo, suportado por apenas algumas controladoras. É semelhante ao RAID 5, porém usa o dobro de bits de paridade, garantindo a integridade dos dados caso até 2 dos HDs falhem ao mesmo tempo. Mínimo de 4 HDs para ser implementado. Ao usar 8 HDs de 20 GB cada um, em RAID 6, teremos 120 GB de dados e 40 GB de paridade.

Vantagem:
  • possibilidade falhar 2 HDs ao mesmo tempo sem perdas. 
Desvantagens:
  • precisa de N+2 HDs para implementar por causa dos discos de paridade;
escrita lenta;
  • sistema complexo de controle dos HDs.
Referência
[1] http://www.thegeekstuff.com/2011/11/raid2-raid3-raid4-raid6/

No próximo post, será explicado a configuração do RAID via software no Linux.
Feito!