giovedì 23 giugno 2011

Installazione di SOGo con Integrazione Active Directory

Hai un dominio Active Directory, non hai un sistema di gestione dalla posta elettronica e ne vorresti uno che ti permetta di condividere calendari e contatti con i tuoi colleghi senza dover accendere un mutuo per acquistare Exchange?

Vedremo ora tutto il processo di installazione e configurazione di SOGo con login degli utenti da Active Directory.
SOGo per funzionare ha bisogno di:
  • Un Database (io ho scelto MySQL, potete anche usare PostgreSQL o Oracle)
  • Un server LDAP (nel nostro caso Microsoft Active Directory. Potete utilizzare OpenLDAP o 389 Directory Server)
  • Un server IMAP (io ho scelto Dovecot, ma va bene anche Cyrus)
  • Un server SMTP (Postfix, ma se volete farvi del male usate pure Sendmail)

1. Preparazione

Prima di arrivare alla configurazione vera e propria di SOGo, è necessario avere una infrastruttura di posta elettronica funzionante. Dobbiamo quindi avere un server IMAP e un server SMTP funzionanti.
Seguendo la guida linkata qui sotto arriverete ad avere una buona base di partenza.

Mailbox Virtuali con Dovecot, Postfix e Active Directory

Configurate il DNS: la risoluzione DNS deve funzionare. Aggiungete un record nel DNS, che punta all'ip del vostro server SOGo, che risponda al nome di sogoserver, o quello che vi pare: l'importante è che vi ricordiate di sostituire col vostro nome all'occorrenza.

2. Aggiunta dei Repository

Se utilizzate CENTOS 6

Aggiungiamo il repository di inverse a YUM.
Creiamo il file /etc/yum.repos.d/inverse.repo.


[SOGo]
name=Inverse SOGo repository
baseurl=http://inverse.ca/downloads/SOGo/RHEL6/$basearch
gpgcheck=0


Potete tranquillamente saltare alla sezione successiva


Se utilizzate CENTOS 5

aggiungiamo il repository di inverse a YUM.
Creiamo il file /etc/yum.repos.d/inverse.repo.


[SOGo]
name=Inverse SOGo repository
baseurl=http://inverse.ca/downloads/SOGo/CentOS5/$basearch
gpgcheck=0


In CentOS 5 la semplice aggiunta del repository non è sufficiente, bisogna effettuare alcune modifiche a yum:

Installiamo il plugin yum-protectbase:


yum install yum-protectbase


Modifichiamo il file /etc/yum.repos.d/CentOS-Base.repo:

#Aggiungere nella sezione base
#[base]
protect=1

#Aggiungere nella sezione updates
#[update]
protect=1


Abilitiamo i repository RPMForge:
Modifichiamo il file /etc/yum.repos.d/rpmforge.repo


#Aggiungere nella sezione rpmforge-base
#[rpmforge-base]
exclude=memcached*



4. Configurazione di MySQL

Installiamo MySQL server:


yum install mysql-server


Modifichiamo il file /etc/my.cnf in modo da impostare come set di caratteri predefinito UTF-8.


[mysqld]
character_set_server=utf8
character_set_client=utf8

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


Avviamo mysql:


service mysqld start


Entriamo in mysql, creiamo il database per SOGo e creiamo un utente sogo che abbia tutti i privilegi sul database:

mysql
CREATE DATABASE sogo CHARSET='UTF8';
GRANT ALL PRIVILEGES ON sogo.* @'localhost' IDENTIFIED BY 'sogopassword';
quit;


4. Configurazione di SOGo

Installiamo SOGo e il connettore per il database (nel nostro caso MySQL):

yum install sogo
yum install sope49-gdl1-mysql;


Configurazione di Base:

Creiamo una configurazione di base per il nostro SOGo, inseriamo la timezone, la lingua predefinita


su - sogo
defaults write sogod SOGoTimeZone "Europe/Rome"
defaults write sogod SOGoMailDomain "brick.local"
defaults write sogod SOGoLanguage Italian
defaults write sogod SOGoAppointmentSendEMailNotifications YES
defaults write sogod SOGoFoldersSendEMailNotifications YES
defaults write sogod SOGoACLsSendEMailNotifications YES
exit



Aggancio del Server LDAP

SOGo può utilizzare uno o più server (o meglio query) LDAP come database per l'autenticazione o elenchi di indirizzi. Aggiungiamo quindi il server LDAP come sorgente per gli utenti di SOGo.

Se non lo avete già fatto create un utente in Active Directory. L'utente deve poter effettuare delle query su LDAP. Io ho creato l'utente adquery con password password.


su - sogo
defaults write sogod SOGoUserSources '({type=ldap; CNFieldName = cn; IDFieldName = cn; UIDFieldName = sAMAccountName; baseDN = "dc=brick,dc=local"; bindDN = "adquery@brick.local"; bindFields = (sAMAccountName); bindPassword = password; canAuthenticate = YES; displayName = "Active Directory"; hostname = brick.local; id = directory; isAddressBook = YES; port = 389;});'
exit



Database MySQL


su - sogo
defaults write sogod SOGoProfileURL 'mysql://sogo:sogopassword@localhost:3306/sogo/sogo_user_profile'
defaults write sogod OCSFolderInfoURL 'mysql://sogo:sogopassword@localhost:3306/sogo/sogo_folder_info'
defaults write sogod OCSSessionsFolderURL 'mysql://sogo:sogopassword@localhost:3306/sogo/sogo_sessions_folder'
exit



Server SMTP


su - sogo
defaults write sogod SOGoMailingMechanism smtp
defaults write sogod SOGoSMTPServer localhost



Server IMAP


su - sogo
defaults write sogod SOGoDraftsFolderName Drafts
defaults write sogod SOGoSentFolderName Sent
defaults write sogod SOGoTrashFolderName Trash
defaults write sogod SOGoIMAPServer localhost
exit



Utente Amministratore

Dobbiamo dire a SOGo quale sarà l'utente amministratore che avrà il privilegio di gestire le condivisioni tramite Web UI.

su - sogo
defaults write sogod SOGoSuperUsernames
"(Administrator)"



6. Configurazione di Apache

Per far funzionare la WEB UI, modifichiamo il file /etc/httpd/conf.d/SOGo.conf

RequestHeader set "x-webobject-server-port" "80"
RequestHeader set "x-webobject-server-name" "sogoserver"
RequestHeader set "x-webobject-server-url" "http://sogoserver"


7. Avvio dei servizi

Avviamo i servizi:

service sogod start
service httpd start

Poi aprite il vostro browser preferito e puntatelo su http://sogoserver/sogo. Se appare la schermata di login accedete col vostro utente di prova e fatevi un giretto nella WEB UI.

Aggiungiamo poi i servizi appena installati all'avvio automatico:

chkconfig mysqld on
chkconfig sogod on
chkconfig httpd on


Ora provate a puntare il browser all'indirizzo http://sogoserver/SOGo (attenzione che SOGo deve essere scritto proprio così) e controllate la vostra mail!

lunedì 13 giugno 2011

Mailbox Virtuali con Dovecot, Postfix e Active Directory

Seguendo questa piccola guida realizzeremo un sistema di posta basato su Dovecot e Postfix, su server Linux, con autenticazione e gestione delle informazioni utente tramite Active Directory.



Il prodotto finito sarà funzionante ma estremamente semplice: solo IMAP e SMTP, nessun filtraggio dei contenuti, nessuna implementazione di comunicazione sicura. Diciamo che sarà una buona base per ulteriori implementazioni.

Premesse
  • Le configurazioni lato linux qui proposte sono realizzate su CentOS.
  • Il mio dominio Windows è BRICK.LOCAL. Sostituitelo con il vostro nome di dominio nei file di configurazione.
  • In Active Directory abbiamo un utente testuser con password testpassword.
  • Il mio indirizzamento di rete è 192.168.98.0/24
  • I DNS devono essere configurati correttamente.
  • Gli orologi del Domain Controller Active Directory e del server Linux devono essere sincronizzati, o deve esserci una differenza massima di 5 minuti.
  • Tenete d'occhio il file /var/log/maillog, è pieno di informazioni utili!
  • Dotatevi di un browser LDAP (JXPlorer, ADSI Edit o Softerra LDAP Browser).

1. Installazione dei Pacchetti

Installiamo i pacchetti necessari:

yum install postfix dovecot krb5-workstation pam-krb5

2. Configurazione di Kerberos

Configuriamo kerberos per autenticarsi con Active Directory:
Modifichiamo il file  /etc/krb5.conf

 
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log 

[libdefaults]
default_realm = BRICK.LOCAL
dns_lookup_realm = true
dns_lookup_kdc = true

[realms]
BRICK.LOCAL = {
kdc = brick.local:88
admin_server = brick.local:749
default_domain = brick.local
}

[domain_realm]
.brick.local = BRICK.LOCAL
brick.local = BRICK.LOCAL

[kdc]
profile = /var/kerberos/krb5kdc/kdc.conf

[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}


Ho messo nel campo kdc il nome di dominio perché nella configurazione standard del DNS di Active directory al nome di dominio corrisponde il primo Domain Controller disponibile. Provate con il comando "nslookup brick.local"

Testiamo poi il funzionamento di kerberos con il comando:

host -t any _kerberos._tcp.brick.local

Se produce una risposta del tipo "_kerberos._tcp.brick.local has SRV record …" è tutto a posto, altrimenti c'è bisogno di ricontrollare la configurazione DNS.

Poi proviamo ad autenticarci:

kinit testuser

Quando ci viene chiesto digitiamo la password. Se il comando non produce nessun output con kerberos abbiamo finito, altrimenti ricontrolliamo la configurazione.



3. Configurazione di Dovecot

Configuriamo l'autenticazione PAM per dovecot, sostituendo il contenuto del file /etc/pam.d/dovecot con:

auth sufficient pam_krb5.so no_user_check validate
account sufficient pam_permit.so



Creiamo un utente vmail:

useradd vmail -m -s /sbin/nologin -d /var/vmail


Annotiamoci uid e gid dell'utente vmail, ci tornerà utile dopo. Lanciamo il comando

getent passwd | grep vmail



che produrrà un output di questo tipo:

vmail:x:501:501:/var/vmail:/sbin/nologin



Per gli utenti di Dovecot 1.x , modifichiamo il file /etc/dovecot.conf

protocols = imap
auth_username_format = %Lu
auth_debug = yes
disable_plaintext_auth = no
ssl_disable = yes
mail_location = maildir:/var/vmail/%n/Maildir
first_valid_uid = 501
last_valid_uid = 501
first_valid_gid = 501
last_valid_gid = 501
valid_chroot_dirs = /var/vmail

protocol lda {
#L'indirizzo del Postmaster per il Local Delivery
        postmaster_address = administrator@brick.local
}

auth default {
        mechanisms = plain login
        passdb pam {
        }
        userdb static {
         args = uid=501 gid=501 home=/var/vmail/%Lu/Maildir/ allow_all_users=yes
        }

socket listen {
        client {
          #Parametri per dovecot-sasl, Postfix utilizza dovecot per inziare una sessione SMTP autenticata
          path = /var/spool/postfix/private/auth
          mode = 0660
          user = postfix
          group = postfix

        master {
          #Impostazioni per LDA
          path = /var/run/dovecot/auth-master
          mode = 0600
          user = vmail
          group = vmail
        }
}

}


Per gli utenti di Dovecot 2.x, dal momento che lo schema dei file di configurazione è cambiato, bisognerà procedere modificando diversi file:


File /etc/dovecot/conf.d/10-auth.conf

auth_username_format = %Lu
auth_debug = yes
ssl = no
first_valid_uid = 501
last_valid_uid = 501
first_valid_gid = 501
last_valid_gid = 501


File /etc/dovecot/conf.d/auth-system.conf.ext 

passdb {
         driver = pam
       }
userdb {
         driver = static
         args = uid=501 gid=501 home=/var/vmail/%Lu allow_all_users=yes
       }


File /etc/dovecot/conf.d/10-master.conf

service auth {
               unix_listener auth-userdb {
                                           mode = 0600
                                           user = vmail
                                           group = vmail
                                         }
               unix_listener /var/spool/postfix/private/auth {
                                           mode = 0660
                                           user = postfix
                                           group = postfix
                                         }
}

File /etc/dovecot/conf.d/15-lda.conf

postmaster_address = administrator@brick.local


Avviamo poi Dovecot con il comando

service dovecot start

Testiamo se l'autenticazione funziona (digitate solo i comandi in grassetto):

telnet localhost 143
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
* OK Dovecot ready.
a LOGIN testuser testpassword
a OK Logged in.
a EXAMINE INBOX
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS ()] Read-only mailbox.
* 0 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1307972331] UIDs valid
* OK [UIDNEXT 1] Predicted next UID
a OK [READ-ONLY] Select completed.
a LOGOUT
* BYE Logging out
a OK Logout completed.
Connection closed by foreign host.


Se il server vi risponde come sopra è tutto ok, altrimenti ricontrollate i file di configurazione e spulciatevi i log.

Per configurare Dovecot in modalità Multi-Tenant, fate riferimento a questo articolo


4. Configurazione di Postfix

Per fare in modo che Postfix riconosca se un indirizzo mail è esistente o meno nella nostra organizzazione, impostiamo un lookup su Active Directory tramite LDAP.

Creiamo prima un utente in Active Directory la cui funzione sarà quella di effettuare le query su LDAP.
Io ho creato l'utente adquery con password password e l'ho messo nell'unità organizzativa System Users.

Il bind DN con Active Directory può essere esplicitato in 3 modi:
  1. Utilizzando la sintassi LDAP, nel nostro caso CN=adquery,OU=System Users,DC=brick,DC=local
  2. Utilizzando la la forma utente\DOMINIO, nel nostro caso adquery\BRICK
  3. Utilizzando la forma utente@dominio, nel nostro caso adquery@brick

Creiamo il file /etc/postfix/ldap-users.cf:

server_host = brick.local
search_base = DC=brick,DC=local

bind = yes
bind_dn = adquery@brick.local
bind_pw = querypassword

query_filter = (&(objectclass=person) (mail=%s))
result_attribute = sAMAccountName
version = 3
result_format=%s/Maildir/ 



Configuriamo il delivery transport di Dovecot, aggiungendo in fondo al file /etc/postfix/master.cf

# Dovecot LDA
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${recipient}


Modificate il file /etc/postfix/main.cf:

mynetworks_style = subnet
mynetworks = 127.0.0.0/8,192.168.98.0/24

myhostname = mail.brick.local
myorigin = $mydomain

#Autenticazione SASL (postfix utilizza dovecot, che a sua volta si appoggia a Kerberos di Active Directory
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,reject_unauth_destination

alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
daemon_directory = /usr/libexec/postfix

# Usiamo dovecot lda per recapitare i messaggi nelle mailbox, il transport dovecot è definito nel file /etc/postfix/master.cf

virtual_transport=dovecot
dovecot_destination_recipient_limit=1

virtual_mailbox_domains = brick.local
virtual_mailbox_base = /home/vmail/
 

#Lo UID e il GID dell'utente vmail, ve lo siete annotati?
virtual_uid_maps = static:501
virtual_gid_maps = static:501

# Controlliamo che l'indirizzo del destinatario sia valido e facciamo in modo che dovecot LDA recapiti il messaggio nella posizione corretta


virtual_alias_maps = ldap:/etc/postfix/ldap-users.cf
virtual_mailbox_maps = ldap:/etc/postfix/ldap-users.cf

Riavviamo Postfix:

service postfix restart


E Proviamo a inviare un messaggio (digitiamo i comandi in grassetto):
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.brick.local ESMTP Postfix
HELO brick.local
250 mail.brick.local
mail from brick@brick.local
250 2.1.0 Ok
RCPT TO: testuser@brick.local
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
Subject: La vispa...
...Teresa avea tra l'erbetta a volo sorpresa gentil farfalletta ...
.

250 2.0.0 Ok: queued as A6DF511804D
quit
221 2.0.0 Bye
Connection closed by foreign host.


Poi controllate sul server IMAP se c'è posta. Se non vi ha scritto nessuno ricontrollate i file di configurazione e buttate un occhio sui log.
Magari, se vi è venuta la sindrome da tunnel carpale a forza di comandi telnet, potete anche configurare il vostro client di posta preferito, così potete testare anche l'autenticazione SMTP. Io vi consiglio Mozilla Thunderbird!

Se tutto funziona, possiamo aggiungere all'avvio automatico Dovecot e Postfix:


chkconfig dovecot on
chkconfig postfix on


Ed ecco pronto il nostro server di posta.

Fonti:
Shami's Blog: FreeBSD, Postfix, Dovecot, and Active Directory
Active Directory and Dovecot PAM Authentication