giovedì 31 ottobre 2013

Come creare un connettore che permetta il relay solo agli utenti autenticati tramite SMTP in exchange 2010

A volte ci si trova nella condizione di dover "aprire una porticina" a quella rete DMZ, si quella là dimenticata da Dio....
...anche se la nostra (mia) paranoia ci fa prudere da ogni parte del corpo, dobbiamo farlo.

Ecco un semplice modo per far prudere un po' meno e mandare a spasso quell'omino che continua a ripeterti "e se..." (oltre a smanettare una settimana sul firewall layer7, finchè non siamo rassicurati, ovviamente ;-) ).

Creiamo si, un connettore, per quell'host di quella rete, ma almeno richiediamo utente e password per poter spedire la posta all'esterno del nostro dominio... (non ci piacerebbe essere inseriti in una black-list di spammers, ve lo assicuro. Uscirne è comunque, sempre, critico.)

Ma come si fa? Ecco allora la mini guida che svela questi piccoli segreti del sistemista:
Dalla Exchange Management Console, recati su Microsoft Exchange on-premises (tuo org name).

Crea un nuovo ocnnettore di ricezione sul server che vai a puntare sulla porta 25, in server configuration->Hub transport-> il server che scegli (se ne hai uno non puoi sbagliare...).

Pannello a destra, quindi, clicca su: "new Receive Connector".

Nella finestra che si apre (fig 1), scegli un nome, poi NEXT


fig 1

Se vuoi restringere gli indirizzi su cui il server ASCOLTA sulla porta 25, puoi operare sulla parte "local Network Settings" (fig 2) in alto, rimuovendo  "all available ipv4" e aggiungendo un IP disponibile alla volta. altrimenti lascia "all".
Scegli quindi il nome con cui il server si presenterà ai client che si connettono su questo connettore. poi NEXT
fig 2


Nella scheda "Remote Network Settings"  (fig 3) scegli quali indirizzi IP  o reti sono abilitati a connettersi a questo connettore. ATTENZIONE: se degli indirizzi sono già presenti in altri connettori NON PUOI metterli qui. Poi NEXT.
fig 3


A questo punto clicca su "New" ed il tuo connettore è creato, ma dovrai fare delle altre modifiche prima di usarlo, quindi:

cliccaci sopra col destro e seleziona properties. (fig 4)
fig 4

A questo punto vai sulla scheda Authentication  (fig 5) e metti la spunta solo su Basic Authentication...
fig 5

poi vai sulla scheda Permission Groups (fig 6) e metti la spunta su "anonymous users" e su "Exchange Users".
ATTENZIONE: in questa ultima scheda si specifica chi può CONNETTERSI al connettore, non c'entra con la autenticazione che poi serve per fare relay.
fig 6


Ultima cosa: devi lanciare il comando powershell per permettere il relay attraverso questo connettore agli utenti o gruppi selezionati.
Ti consiglio di fare un gruppo in Active Directory e di usare quello, in modo da non dover rilanciare il comando powershell ogni volta che si aggiungono o si tolgono utenti a quel diritto.

Creato? allora il comando (da lanciare in Exchange Management Shell, ovviamente) è:

Get-ReceiveConnector ""| Add-ADPermission -User "" -ExtendedRights "ms-Exch-SMTP-Accept-Any-Recipient".

Fatto questo puoi proseguire e testare che tutto funzioni.


NOTA:
ATTENZIONE: per qualche motivo l'invio autenticato in SMTP da .NET C#, se si specificano lo user e la pw con la classe SmtpClient, passandoglieli come System.Net.NetworkCredential non FUNZIONA.
Per fare funzionare la classe dovrai specificare i parametri nel web.config sotto system.net->mailSettings.

Esempio di codice che NON FUNZIONA:
        nei sorgenti:
            SmtpClient smtpClient = new SmtpClient("hostnameServerOppureIP", 25);
                       
            smtpClient.Credentials = new System.Net.NetworkCredential("username", "password", "dominio");
            smtpClient.UseDefaultCredentials = true;
            smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtpClient.EnableSsl = false;
                   
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("prova@dominio.it", "il mio portale");
            mail.To.Add(new MailAddress("destinatario@ilSuoDominio.com", "destinatario@ilSuoDominio.com"));
            mail.Subject = "subject di test";
            mail.Body = "body di test";
            smtpClient.Send(mail);
           
           
           
Esmpio di codice che FUNZIONA:
        nei sorgenti:
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("prova@dominio.it", "il mio portale");
            mail.To.Add(new MailAddress("destinatario@ilSuoDominio.com", "destinatario@ilSuoDominio.com"));
            mail.Subject = "subject di test";
            mail.Body = "body di test";
            SmtpClient smtpClient = new SmtpClient();
            smtpClient.Send(mail);
       
        nel web.config:
            ...
           
               
                   
                       
                   

               

           

            ....
           
           
           
P.S. se qualcuno sa PERCHE' di preciso, mi erudisca, per favore. io ho provato a cambiare ogni parametro, mettere in base64 user e pw (per assurdo, perchè dovrebbe arrangiarsi lui), mettere il dominio nel nome utente, useDefault... false, e chi più ne ha più ne metta.


Ciao a tutti e buona serata!