sudo: Jack of all trades, master of some

Restricciones de envío y recepción a dominios cu con Postfix

22 comentarios

Sí, una de las primeras tareas que se asignan a los administradores de red en empresas, para muchos una política un poco restrictiva (mi opinión es neutral): permitir a cierto de grupo de usuarios enviar y recibir correo a cualquier dominio y a otro grupo solo .cu.
Quizá sea una tarea bastante engorrosa o por lo menos para entenderla al inicio es un poco difícil, es por ello que en esta entrada trataré de explicar cómo implementar estas políticas con Postfix.

Clases de restricciones

El primer paso es crear clases de restricciones, en este caso usando expresiones regulares.

Agregar las siguientes líneas en el archivo principal de configuración de Postfix (/etc/postfix/main.cf)

smtpd_restriction_classes = cu-in, cu-out, int-in, int-out

cu-in = check_sender_access regexp:/etc/postfix/cu, reject
cu-out = check_recipient_access regexp:/etc/postfix/cu, reject
int-in = check_sender_access regexp:/etc/postfix/int, reject
int-out = check_recipient_access regexp:/etc/postfix/int, reject

La clase cu-in se encargará de filtrar el remitente y cu-out el destinatario, lo mismo pasa con int-in e int-out.

Crear los archivos con las expresiones regulares.

/etc/postfix/cu

/\@*\.cu$/      RELAY
/\@*/           REJECT El mensaje no fue entregado: ACCESO DENEGADO

/etc/postfix/int

/\@*/   	RELAY

Ejemplo:

El usuario foo tiene permisos para enviar y recibir correo solamente a dominios .cu y desea enviar un mensaje a bar@dominio.tld.

Cabeceras del mensaje

...
From: foo@dominio.cu
To: bar@dominio.tld
...

Postfix filtra del encabezado el campo To (destinatario) porque el mensaje saldría de nuestro SMTP. Como la dirección de correo del destinatario no coincide con la expresión regular, Postfix lo rechaza inmediatamente.

De otro modo si alguien con dirección de correo bar@dominio.tld envía un mensaje a foo@dominio.cu, Postfix chequea el From (remitente) y como no coincide con la expresión regular entonces el mensaje es rechazado de la misma manera.

Base de datos con los nombres de usuarios que son afectados por las políticas

La base de datos que contiene el par dirección de correo y restricción puede ser de tipo, hash, MySQL, LDAP, sqlite, en este caso usaremos hash.

Agregar las siguientes líneas en el archivo de configuración principal de Postfix, dentro de las secciones smtpd_sender_restrictions y smtpd_recipient_restrictions respectivamente.

smtpd_sender_restrictions =
	...
	check_sender_access hash:/etc/postfix/access-out.cf,
	...

smtpd_recipient_restrictions =
	...
	check_recipient_access hash:/etc/postfix/access-in.cf,
	...

Posteriormente crear los archivos /etc/postfix/access-out.cf y /etc/postfix/access-in.cf con el siguiente contenido.

/etc/postfix/access-out.cf

foo@dominio.cu	cu-out
bar@dominio.cu	int-out

/etc/postfix/access-in.cf

foo@dominio.cu	cu-in
bar@dominio.cu	int-in

En este caso el usuario foo solo puede enviar y recibir a dominios .cu y el usuario bar puede enviar y recibir de cualquier dominio.

Por último generar las bases de datos y recargar Postfix

postmap /etc/postfix/access-in.cf
postmap /etc/postfix/access-out.cf

postfix reload

Comprobaciones

Para comprobar que las restricciones funcionan lo podemos hacer a través del comando postmap

postmap -q foo@dominio.tld regexp:/etc/postfix/int
RELAY

postmap -q foo@dominio.cu regexp:/etc/postfix/int
RELAY

postmap -q foo@dominio.tld regexp:/etc/postfix/cu
REJECT El mensaje no fue entregado: ACCESO DENEGADO

postmap -q foo@dominio.cu regexp:/etc/postfix/cu
RELAY

postmap -q foo@domain.cu hash:/etc/postfix/access-in.cf
cu-in

postmap -q foo@domain.cu hash:/etc/postfix/access-out.cf
cu-out

postmap -q bar@domain.cu hash:/etc/postfix/access-in.cf
int-in

postmap -q bar@domain.cu hash:/etc/postfix/access-out.cf
int-out

Notas:

Estas restricciones pueden ser bastante flexibles y lograr otras cosas como filtrar por dirección de correo o dominios exactos.

Comentarios desactivados
  1. Ricardo 6 años atrás

    Esta semana a través de los sitios que lee “elcolimador” descubrí este blog (muy bueno, sobre todo porque nos permite a los usuario que solo tenemos navegación nacional acceder a contenidos “educativos – instructivos” que normalmente son muy frecuentes en internet) y creo que ya me he leído todos los artículos. Con el tema de Postfix primeramente quisiera publicar la forma en que tengo implementado las restricciones para enviar / recibir de dominios diferentes al .cu:

    smtpd_restriction_classes = local_only, input_local_only
    local_only = check_recipient_access hash:/etc/postfix/local_domains, reject
    input_local_only = check_sender_access hash:/etc/postfix/local_domains, reject

    smtpd_sender_restrictions =
    check_recipient_access hash:/etc/postfix/restricted_users_input,
    permit_mynetworks,
    pcre:/etc/postfix/sender_access_prohibido

    smtpd_recipient_restrictions =
    check_sender_access hash:/etc/postfix/restricted_senders
    #permit_sasl_authenticated
    permit_mynetworks
    #check_relay_domains
    reject_unauth_destination
    #reject_unknown_recipient_domain

    Donde los las bases de datos hash lo que contiene es: usuario@mydominio local_only y usuario@mydominio input_local_only para enviar y recibir respectivamente.

    Ahora lo que quisiera implementar desde el Postfix, no desde el servidor de correo (tengo Exchange) es limitar a un grupo de usuarios el envío y recepción incluso al dominio .cu es decir este grupo de usuarios solo tendría correo dentro de mi dominio.

    Nuevamente gracias por el Blog

    1. @Ricardo

      Gracias por el comentario, lo que quieres se puede hacer fácilmente con Postfix, permitir a ciertos usuarios en envío y recepción de correos dentro de tu dominio. En cuanto tenga el tiempo armo el post.

      Saludos

      EDITADO:

      Como mismo se explicó en el post se puede resolver el problema, solamente se necesita crear otras clases de restricciones y en los filtros usar lo siguiente:

      /\@tudominio\.cu$/ RELAY
      /\@*/ REJECT El mensaje no fue entregado: ACCESO DENEGADO

      Claro, aplicar las restricciones al grupo de usuarios que se afectarán.

      1. Ricardo 6 años atrás
        @oneohthree

        En estos momentos lo estoy probando. Muchas gracias.

      2. Ricardo 6 años atrás
        @oneohthree

        Listo! Muchas gracias, mira el mensaje que me devuelve el postfix cuando intento mandar desde el correo de un usuario con la restruccion de solo en el dominio: mydomain

        Algunos de los destinatarios no recibieron su mensaje.

        Asunto: test
        Enviado el: 26/06/2014 12:58

        No se puede localizar a los destinatarios siguientes:

        usuariox@nomydomain en 26/06/2014 11:58
        No tiene permiso para enviar a este destinatario. Póngase en contacto con el administrador del sistema para obtener ayuda.
        <servidorexchange.mydomain #5.7.1 smtp;554 5.7.1 : Sender address rejected: El mensaje no fue entregado: ACCESO DENEGADO FUERA DE DOMINIO MYDOMAIN>

        Nuevamente gracias

        1. @Ricardo

          Un placer haber sido útil.

    2. Emiliano 5 años atrás
      @Ricardo

      Buscando en internet encontre este post
      les pido ayuda
      tengo un correo de nauta
      lleve mi celular a revisar 3 veces me dicen que esta bien..
      el tema es que no recibe los email internacionales
      que puedo hacer..me han mandado de varios lugares diferentes
      y no los recibo en cambio yo escribo y llegan sin problemas
      Saludos
      ENP

      1. @Emiliano

        Te pudiera sugerir varias cosas, entre ellas:

        Ir a las oficinas de Cubacel/ETECSA y plantearles el problema.
        Verificar que la persona que te escribe esté usando correctamente tu dirección de correo.
        Probar la línea (SIM) en otro teléfono para descartar.
        Verificar que la configuración de la aplicación del correo electrónico es la correcta.

  2. Tengo una dudita cuando le doy
    postmap -q jessy@xxxxx.cu regexp:/etc/postfix/data_postfix/usuarios/users_access_in
    me devuelve
    postmap: warning: regexp map /etc/postfix/data_postfix/usuarios/users_access_in, line 1: ignoring unrecognized request
    en dicha linea tengo puesto esto
    jessy@arnac.cu nac_in
    porque yo declare nac_in y nac_out como reglas creo que no tiene nada que ver

  3. enrique 5 años atrás

    Muy util la guia y facil de implementar. Me funciono perfcto
    ahora bien si quiciera agregar otra restriccion adicional por ejemplo tengo usuarios nacionales e internacionales hasta ahora con esta explicacion lo logre implementar, pero tengo otros usuarios que necesitan enviar y recibir de ciertos dominios especificos, pero que no son considerados que tengan correo nacional o internacional, o sea usuarios locales que necesitan por su trabajo mandarle correos a algunos dominios. como podria agregar esa regla o restrccion adicional y quizas en unfuturo seguir agregando posibles reglas de acuerdo a las necesidades de loque me pidan.

    1. @enrique

      Exactamente como dice la guía, pero atendiendo a las expresiones regulares que ya no serían por dominio, serían por direcciones, por ejemplo: foo@bar\.tld

      1. enrique 5 años atrás
        @oneohthree

        oneohthree Por favor serias amable de citar un ejemplo de como agregar una restriccion mas sumado a las restricciones de nacional e internacional, ya que como te decia en mi comentario anterior tengo usuarios que no son nacionales ni internacionales, pero que necesitan enviar mensajes de correo a ciertos dominion completos /\@dominio\.co\.cu$/ por ejemplo, estoy intentando agregarla corrigeme si estoy en lo correcto o no.
        ssmtpd_restriction_classes = cu-in, cu-out, int-in, int-out, bcc-in, bcc-out

        bcc-in = check_sender_access regexp:/usr/pbi/postfix-amd64/etc/postfix/bcc, permit
        bcc-out = check_recipient_access regexp:/usr/pbi/postfix-amd64/etc/postfix/bcc, permit
        cu-in = check_sender_access regexp:/usr/pbi/postfix-amd64/etc/postfix/cu, reject
        cu-out = check_recipient_access regexp:/usr/pbi/postfix-amd64/etc/postfix/cu, reject
        int-in = check_sender_access regexp:/usr/pbi/postfix-amd64/etc/postfix/int, reject
        int-out = check_recipient_access regexp:/usr/pbi/postfix-amd64/etc/postfix/int, reject

        Ahora en los ficheros access-in.cf
        usuario@midominio.cu bcc-in
        y access-out.cf usuario@midominio.cu bcc-out para especificar que usuarios tienen o no permisos a enviar a esos dominios
        en el fichero: /usr/pbi/postfix-amd64/etc/postfix/bcc agrego:
        /\@dominio1\.co\.cu$/ RELAY
        /\@dominio2\.com$/ RELAY
        dime por favor si asi puedo insorporar esa regla para permitir que los usuarios especificados puedan mandar correos a esos dominios
        saludos

        1. @enrique

          Para cada usuario que entre en este tipo de restricciones se deben crear nuevas clases de restricciones, por ejemplo:

          smtpd_restriction_classes = foo-in, foo-out

          foo-in = check_sender_access regexp:/etc/postfix/foo, reject
          foo-out = check_recipient_access regexp:/etc/postfix/foo, reject

          Archivo /etc/postfix/foo:

          /direccion\@dominio\.tld$/ RELAY
          /@otrodominio\.tld$/ RELAY
          /\@*/ REJECT El mensaje no fue entregado: ACCESO DENEGADO

          En este caso, el usuario que entre en las restricciones foo-in y foo-out podrá enviar y recibir de la dirección direccion@dominio.tld y de cualquier dirección del dominio otrodominio.tld

          Por supuesto, es necesario actualizar los archivos access-in.cf y access-out.cf con los usuarios afectados respectivamente.

  4. enrique 5 años atrás

    Entonces creo estar en lo correcto, rectificame esto por favor:

    # resticciones #
    smtpd_restriction_classes = bcc-in, bcc-out, cu-in, cu-out, int-in, int-out
    bcc-in = check_sender_access regexp:/usr/pbi/postfix-amd64/etc/postfix/bcc, reject
    bcc-out = check_recipient_access regexp:/usr/pbi/postfix-amd64/etc/postfix/bcc, reject
    cu-in = check_sender_access regexp:/usr/pbi/postfix-amd64/etc/postfix/cu, reject
    cu-out = check_recipient_access regexp:/usr/pbi/postfix-amd64/etc/postfix/cu, reject
    int-in = check_sender_access regexp:/usr/pbi/postfix-amd64/etc/postfix/int, reject
    int-out = check_recipient_access regexp:/usr/pbi/postfix-amd64/etc/postfix/int, reject
    # fin restricciones #

    smtpd_sender_restrictions = reject_non_fqdn_sender,
    check_sender_access hash:/usr/pbi/postfix-amd64/etc/postfix/access-out.cf,
    reject_unknown_sender_domain,
    reject_unauth_pipelining,
    reject_multi_recipient_bounce,
    permit

    t

    smtpd_recipient_restrictions = permit_mynetworks,
    reject_unauth_destination,
    reject_unauth_pipelining,
    check_recipient_access hash:/usr/pbi/postfix-amd64/etc/postfix/access-in.cf,
    check_client_access pcre:/usr/pbi/postfix-amd64/etc/postfix/cal_pcre,
    check_client_access cidr:/usr/pbi/postfix-amd64/etc/postfix/cal_cidr,
    check_sender_access hash:/usr/pbi/postfix-amd64/etc/postfix/sender_access,
    reject_non_fqdn_helo_hostname,
    reject_unknown_recipient_domain,
    reject_non_fqdn_recipient,
    reject_multi_recipient_bounce,
    reject_unverified_recipient,
    reject_spf_invalid_sender,
    permit

    Gracias de antemano muy agradecido por este blog un saludo

    1. @enrique

      Realmente no veo nada que tenga que ver con lo que hablablas en el otro comentario. A no ser la clase bcc y esta parte:

      permit

      t

      Una ‘t’ de más ¿no?

  5. aaron83 5 años atrás

    Al pie de la letra y nada…no me funciona

  6. Cristian 5 años atrás

    Estoy comenzando a ver las reglas que se pueden configurar en postfix en zimbra y estoy tratando de hacer lo siguiente:
    La idea es que postofix detecte direcciones de correos a las cuales esta prohibido enviar correo desde nuestro servidor.

    Por ejemplo: si usuario@midominio.com trata de enviar un correo a cuenta_probida@dominiox.algo, que postfix lo detecte y elimine o impida que ese correo salga a esa direccion.

    Cualquier ayuda me vendria de diez.

    Muchas gracias.-

  7. Usando postfix, cuando confirmo el recibo de un correo me da el siguiente error.

    Error SMTP (554): No se ha podido establecer destinatario “usuario.1@empreza.organismo.cu” (5.7.1 : Sender address rejected: Esta cuenta no puede enviar ni recibir correo internacional.).

  8. Muy buen Dato,

    Tengo una pregunta, tal vez me puedes dar una guia, en mi postfix necesito bloquear que los usuarios envien correo a determinada cuenta, dentro del mismo servidor, es decir, xxx@dominio.com envie a todos@dominio.com, “todos” hace referecia a una lista donde tengo a todos los usuarios del SRV, lo que necesito es que una determinada cuenta: info@dominio.com envie unica y exclusivamente a todos@dominio.com, y que nadie mas pueda enviar correo a “todos”

    1. @carlos

      Con el mismo principio de lo que se describe en la entrada puedes lograrlo, de hecho uso esto mismo para lo que quieres, exactamente lo que pides.

  9. machoperez 5 años atrás

    solo piensan en restringir?

  10. yg0nz4l3z 5 años atrás

    Salud2s
    El blog esta muy bueno.
    Una duda. Estoy implementado un servidor de correo con postfix y dovecot mi proveedor de datos es etecsa alguien sabe que valor tengo que poner en el relay para poder entregar porque lo tengo sin relay y los correos se quedan perdidos y no salen ya que intenta conectarse a la ip de mi wan por el 25 y me devuelve Connection refused)

    1. @yg0nz4l3z

      Si tu MX está directo a Internet no es necesario un relayhost.