项目作者: kurosaki1976

项目描述 :
Integración de proxy, correo y jabber con Samba4 AD DC
高级语言: Shell
项目地址: git://github.com/kurosaki1976/samba4-ad-dc-integrated-services.git
创建时间: 2019-08-13T19:59:56Z
项目社区:https://github.com/kurosaki1976/samba4-ad-dc-integrated-services

开源协议:GNU General Public License v3.0

下载


Guía para la implementación de servicios integrados a Samba como Active Directory Domain Controller (Samba AD DC) en Debian 11/12

Autores

Tabla de contenidos

Consideraciones previas

Esta guía no presenta configuraciones avanzadas, tales como filtrado de contenido web, técnicas de antispam y antivirus o filtrado de origen y
destino de email; sino que está enfocada en exponer la integración de servicios vitales -proxy, chat y correo electrónico-, en una red corporativa con el servicio de directorio Samba AD DC; aunque pudieran incluirse en futuras revisiones.

Tendiendo en cuenta esto, se pautan las siguientes premisas:

  • Sistema Operativo: Debian GNU/Linux 10/11 (instalación base)
  • Repositorio de paquetes distribución Debian GNU/Linux 10/11
  • Repositorio de paquetes Samba 4.9.6
  • Existencia de un servidor NTP superior
  • Existencia de un servidor proxy padre
  • Nombre de host Samba AD DC: dc
  • Dirección IP Samba AD DC: 192.168.0.1
  • Nombre de host Squid Proxy Server: proxy
  • Dirección IP Squid Proxy Server: 192.168.0.2
  • Nombre de host eJabberd XMPP Server: jb
  • Dirección IP eJabberd XMPP Server: 192.168.0.3
  • Nombre de host Postfix/Dovecot/Roundcube Mail Server: mail
  • Dirección IP Postfix/Dovecot/Roundcube Mail Server: 192.168.0.4
  • Nombre de dominio: example.tld
  • Los hosts miembros del dominio deben usar Samba AD DC como servidor DNS y de tiempo.

NOTA: La última premisa se logrará mediante la implementación de un servidor DHCP que permita las asiganción de parámetros de red dinámicos.

Configuración de los parámetros de red

Samba AD DC Server

  1. nano /etc/network/interfaces
  2. auto lo
  3. iface lo inet loopback
  4. auto enp0s3
  5. iface enp0s3 inet static
  6. address 192.168.0.1/24
  7. gateway 192.168.0.254
  8. dns-nameservers 127.0.0.1
  9. dns-search example.tld
  1. nano /etc/hosts
  2. 127.0.0.1 localhost
  3. 192.168.0.1 dc.example.tld dc
  1. nano /etc/resolv.conf
  2. domain example.tld
  3. nameserver 127.0.0.1

Squid Proxy Server

  1. nano /etc/network/interfaces
  2. auto lo
  3. iface lo inet loopback
  4. auto enp0s3
  5. iface enp0s3 inet static
  6. address 192.168.0.2/24
  7. gateway 192.168.0.254
  8. dns-nameservers 192.168.0.1
  9. dns-search example.tld
  1. nano /etc/hosts
  2. 127.0.0.1 localhost
  3. 192.168.0.2 proxy.example.tld proxy
  1. nano /etc/resolv.conf
  2. domain example.tld
  3. nameserver 192.168.0.1

eJabberd XMPP Server

  1. nano /etc/network/interfaces
  2. auto lo
  3. iface lo inet loopback
  4. auto enp0s3
  5. iface enp0s3 inet static
  6. address 192.168.0.3/24
  7. gateway 192.168.0.254
  8. dns-nameservers 192.168.0.1
  9. dns-search example.tld
  1. nano /etc/hosts
  2. 127.0.0.1 localhost
  3. 192.168.0.3 jb.example.tld jb
  1. nano /etc/resolv.conf
  2. domain example.tld
  3. nameserver 192.168.0.1

Postfix/Dovecot/Roundcube Mail Server

  1. nano /etc/network/interfaces
  2. auto lo
  3. iface lo inet loopback
  4. auto enp0s3
  5. iface enp0s3 inet static
  6. address 192.168.0.4/24
  7. gateway 192.168.0.254
  8. dns-nameservers 192.168.0.1
  9. dns-search example.tld
  1. nano /etc/hosts
  2. 127.0.0.1 localhost
  3. 192.168.0.4 mail.example.tld mail
  1. nano /etc/resolv.conf
  2. domain example.tld
  3. nameserver 192.168.0.1

Sincronización de tiempo

Utilizar el cliente NTP de systemd.

  1. timedatectl set-ntp true

Definir el servidor de tiempo superior.

  1. mv /etc/systemd/timesyncd.conf{,.org}
  2. nano /etc/systemd/timesyncd.conf

Samba AD DC Server

  1. [Time]
  2. NTP=ntp.tld

Squid Proxy Server

  1. [Time]
  2. NTP=dc.example.tld

eJabberd XMPP Server

  1. [Time]
  2. NTP=dc.example.tld

Postfix/Dovecot/Roundcube Mail Server

  1. [Time]
  2. NTP=dc.example.tld

Reiniciar el servicio cliente NTP de systemd.

  1. systemctl restart systemd-timesyncd

Verificar el estado de la sincronización.

  1. timedatectl status
  2. journalctl --since -1h -u systemd-timesyncd

NOTA: Es recomendable hacer coincidir la zona horaria de los hosts de acuerdo a la región en cuestión, ejecutando el comando dpkg-reconfigure tzdata. En plantillas de contenedores Debian 9/10, deben redefinirse los parámetros de idioma, mediante dpkg-reconfigure locales y luego de escoger el idioma de preferencia, ejecutar locale-gen, y reiniciar el CT. Para una mejor comprensión de los mensajes de error, se recomienda usar Inglés como el idioma predeterminado del sistema: localectl set-locale LANG=en_US.UTF8.

Instalación y configuración de Samba como AD DC

La distribución de Debian 12 cuenta en sus repositorios de paquetes con la versión de Samba 4.17, que contiene algunas mejoras para la gestión de Unidades Organizativas mediante la herramienta samba-tool; no obstante, se recomienda usar un repositorio de paquetes de la versión 4.18 o superior. En esta guía se usará el que proporciona el grupo francés Tranquil IT Systems.

Requerimientos de hardware

En entornos de producción, se recomienda un mínimo de 2Gb de RAM. En organizacones con un máximo de 100 usuarios 10Gb de espacio en disco duro, es suficiente; no obstante el almacenamiento estará condionado a particularidades como: niveles de registro y política de retención de registros, uso de imágenes (avatares) para identificar a los usuarios, y número de usuarios, máquinas y grupos. Con relación a CPU, para no más de 100 usuarios, es suficiente con 2.

Instalación de paquetes necesarios

Deshabilitar los protocolos de Apple avahi-daemon (mDNS / bonjour):

  1. systemctl stop avahi-daemon.service avahi-daemon.socket
  2. systemctl disable avahi-daemon.service avahi-daemon.socket

Deshabilitar la interacción de configuración y proceder con la instalación de paquetes indispensables para Samba4, y otros necesarios para la administración del sistema.

  1. export DEBIAN_FRONTEND=noninteractive
  2. apt install samba winbind libnss-winbind krb5-user smbclient ldb-tools python3-cryptography sudo screen nmap telnet tcpdump rsync net-tools dnsutils htop apt-transport-https vim gnupg lsb-release bind9
  3. unset DEBIAN_FRONTEND

Preparación del aprovisionamiento

Detener y deshabilitar todos los servicios relacionados con Samba.

  1. systemctl stop samba winbind nmbd smbd bind9
  2. systemctl disable samba winbind nmbd smbd bind9
  3. systemctl mask samba winbind nmbd smbd
  4. systemctl unmask samba-ad-dc
  5. systemctl enable samba-ad-dc

Opcionalmente se puede hacer una copia del archivo de configuración inicial de Samba ya que se sobrescribe durante el aprovisionamiento.

  1. mv /etc/samba/smb.conf{,.org}

Aprovisionamiento Samba Active Directory Domain Controller

Modo interactivo:

  1. samba-tool domain provision --use-rfc2307 --interactive

Aceptar los valores por defecto a menos que se desee lo contrario.

Modo no interactivo:

  1. samba-tool domain provision \
  2. --server-role=dc \
  3. --use-rfc2307 \
  4. --dns-backend=SAMBA_INTERNAL \
  5. --realm=EXAMPLE.TLD \
  6. --domain=EXAMPLE \
  7. --function-level=2008_R2 \
  8. --adminpass='P@s$w0rd.123'

Editar el fichero /etc/samba/smb.conf resultante.

  1. nano /etc/samba/smb.conf
  2. [global]
  3. dns forwarder = 127.0.0.1
  4. netbios name = DC
  5. realm = EXAMPLE.TLD
  6. server role = active directory domain controller
  7. server string = Samba4 %v AD DC
  8. workgroup = EXAMPLE
  9. idmap_ldb:use rfc2307 = yes
  10. ldap server require strong auth = no
  11. printing = bsd
  12. printcap name = /dev/null
  13. [netlogon]
  14. path = /var/lib/samba/sysvol/example.tld/scripts
  15. read only = No
  16. create mask = 0700
  17. directory mask = 0644
  18. [sysvol]
  19. path = /var/lib/samba/sysvol
  20. read only = No
  21. create mask = 0700
  22. directory mask = 0644

La directiva ldap server require strong auth = no en la sección [global] se utiliza para permitir el acceso por el puerto tcp\389.

Las directivas create mask = 0700 y directory mask = 0644 en las secciones [netlogon] y [sysvol] son para la correcta asignación de permisos tanto a ficheros como directorios.

Para habilitar la auditoría en Samba AD DC, se deben agregar en la sección [global] las siguientes directivas:

  1. log level = 1 auth_json_audit:3@/var/log/samba/samba_audit.log
  2. full_audit:failure = none
  3. full_audit:success = pwrite write rename
  4. full_audit:prefix = IP=%I|USER=%u|MACHINE=%m|VOLUME=%S
  5. full_audit:facility = local7
  6. full_audit:priority = NOTICE

Y en las secciones [netlogon] y [sysvol]: vfs objects = dfs_samba4, acl_xattr, full_audit.

NOTA: El fichero de configuración completo puede obtenerse en smb.conf.

Configuración de Kerberos

Durante el aprovisionamiento, Samba crea un archivo de configuración con los valores necesarios para el correcto funcionamiento del AD DC.

Utilizar el fichero configuración de kerberos generado durante el aprovisionamiento y editarlo.

  1. mv /etc/krb5.conf{,.org}
  2. ln -s /var/lib/samba/private/krb5.conf /etc/krb5.conf
  1. nano /etc/krb5.conf
  2. [libdefaults]
  3. default_realm = EXAMPLE.TLD
  4. dns_lookup_realm = false
  5. dns_lookup_kdc = true
  6. [realms]
  7. EXAMPLE.TLD = {
  8. kdc = 127.0.0.1
  9. kdc = DC.EXAMPLE.TLD
  10. master_kdc = DC.EXAMPLE.TLD
  11. admin_server = DC.EXAMPLE.TLD
  12. default_domain = example.tld
  13. }
  14. [domain_realm]
  15. .example.tld = EXAMPLE.TLD
  16. example.tld = EXAMPLE.TLD
  17. [kdc]
  18. check-ticket-addresses = false

Iniciar, verificar el estado y habilitar el servicio de Samba AD DC.

  1. systemctl start samba-ad-dc
  2. systemctl status samba-ad-dc

Evitar que la cuenta del usuario Administrator expire.

  1. samba-tool user setexpiry Administrator --noexpiry

Reiniciar el servidor.

Comprobaciones

Comprobar el nivel del dominio.

  1. samba-tool domain level show

Comprobar la resolución del nombre de domino, FQDN y hostname por la dirección IP estática.

  1. ping -c4 example.tld
  2. ping -c4 dc.example.tld
  3. ping -c4 dc

Solicitar ticket de Kerberos.

  1. kinit Administrator@EXAMPLE.TLD

Listar tickets de kerberos en caché.

  1. klist

Listar recursos compartidos.

  1. smbclient -L localhost -U%

Comprobar funcionamiento de la autenticación.

  1. smbclient //localhost/netlogon -Uadministrator -c 'ls'

Configuración del servidor Bind9 DNS

Durante el aprovisionamiento se utilizó el dns-backend=SAMBA_INTERNAL, que provee un servidor DNS interno del paquete Samba; aunque funcional en un entorno básico, tiene determinadas desventajas, como son la asignación de servidores DNS forwarders y una caché de resolución lenta. Para suplir estas carencias, se configurará Bind9 integrándolo a Samba.

Integración con Samba AD DC

Editar el fichero /etc/samba/smb.conf y en la sección [global] añadir las directivas:

  1. server services = -dns
  2. nsupdate command = /usr/bin/nsupdate -g

Comentar ó eliminar la directiva dns forwarder = 127.0.0.1.

Modificación del aprovisionamiento AD DC

Definir Bind9 como dns-backend.

  1. mv /etc/bind/named.conf.local{,.org}
  1. nano /etc/bind/named.conf.local
  2. dlz "samba4" {
  3. database "dlopen /usr/lib/x86_64-linux-gnu/samba/bind9/dlz_bind9_10.so";
  4. };
  1. mkdir /var/lib/samba/bind-dns
  2. mkdir /var/lib/samba/bind-dns/dns
  3. samba_upgradedns --dns-backend=BIND9_DLZ
  4. chgrp bind /var/lib/samba/private/dns.keytab
  5. chmod g+r /var/lib/samba/private/dns.keytab

Configurar Bind9.

Parámetros del servicio
  1. mv /etc/default/named{,.org}
  1. nano /etc/default/named
  2. RESOLVCONF=no
  3. OPTIONS="-4 -u bind"
Opciones globales del servicio
  1. mv /etc/bind/named.conf.options{,.org}
  1. nano /etc/bind/named.conf.options
  2. options {
  3. version none;
  4. hostname none;
  5. server-id none;
  6. directory "/var/cache/bind";
  7. max-cache-size 10m;
  8. max-cache-ttl 60;
  9. max-ncache-ttl 60;
  10. forwarders { 8.8.8.8; 8.8.4.4; };
  11. forward first;
  12. dnssec-validation auto;
  13. auth-nxdomain no;
  14. listen-on-v6 { none; };
  15. tkey-gssapi-keytab "/var/lib/samba/private/dns.keytab";
  16. allow-query { 192.168.0.0/24; 127.0.0.1; };
  17. allow-recursion { 192.168.0.0/24; 127.0.0.1; };
  18. allow-update { 192.168.0.0/24; 127.0.0.1; };
  19. datasize default;
  20. empty-zones-enable no;
  21. minimal-responses yes;
  22. };
Definir bitácora de eventos
  1. mkdir -p /var/log/named/
  2. chown -R bind /var/log/named/
  3. chmod u+rw /var/log/named/
  1. nano /etc/bind/named.conf.log
  2. logging {
  3. channel default_syslog {
  4. syslog local2;
  5. };
  6. channel audit_log {
  7. file "/var/log/named/audit.log" size 10m;
  8. severity debug;
  9. print-category yes;
  10. print-severity yes;
  11. print-time yes;
  12. };
  13. channel requests_log {
  14. // DNS requests logging
  15. file "/var/log/named/requests.log" size 10m;
  16. severity debug;
  17. print-time yes;
  18. print-category yes;
  19. print-severity yes;
  20. };
  21. channel null {
  22. null;
  23. };
  24. category default { default_syslog; };
  25. category general { audit_log; };
  26. category security { audit_log; };
  27. category config { audit_log; };
  28. category resolver { audit_log; };
  29. category xfer-in { audit_log; };
  30. category xfer-out { audit_log; };
  31. category notify { audit_log; };
  32. category client { audit_log; };
  33. category network { audit_log; };
  34. category update { audit_log; };
  35. category queries { requests_log; audit_log; };
  36. category lame-servers { null; };
  37. };

Agregar al final del fichero /etc/bind/named.conf la directiva include "/etc/bind/named.conf.log";.

Definir rotación de los archivos de bitácora
  1. nano /etc/logrotate.d/named
  2. /var/log/named/audit.log {
  3. daily
  4. missingok
  5. rotate 7
  6. compress
  7. delaycompress
  8. notifempty
  9. create 644 bind bind
  10. postrotate
  11. systemctl reload named > /dev/null
  12. endscript
  13. }
  14. /var/log/named/requests.log {
  15. daily
  16. missingok
  17. rotate 7
  18. compress
  19. delaycompress
  20. notifempty
  21. create 644 bind bind
  22. postrotate
  23. systemctl reload named > /dev/null
  24. endscript
  25. }
Permitir la actualización de registros DNS

Modificar el fichero /var/lib/samba/private/named.conf.update, agregando al final del bloque update-policy {};, las líneas grant *.example.tld wildcard *.0.168.192.in-addr.arpa. PTR TXT; y grant local-ddns zonesub any;. Ejemplo:

  1. update-policy {
  2. grant EXAMPLE.TLD ms-self * A AAAA;
  3. grant Administrator@EXAMPLE.TLD wildcard * A AAAA SRV CNAME;
  4. grant DC$@example.tld wildcard * A AAAA SRV CNAME;
  5. grant *.example.tld wildcard *.0.168.192.in-addr.arpa. PTR TXT;
  6. grant local-ddns zonesub any;
  7. };

Reiniciar los servicios.

  1. systemctl restart logrotate samba-ad-dc named
  2. systemctl enable named

Creación de zona inversa y registro PTR del servidor

  1. samba-tool dns zonecreate localhost 0.168.192.in-addr.arpa -U 'administrator'%'P@s$w0rd.123'
  2. samba-tool dns add localhost 0.168.192.in-addr.arpa 1 PTR 'dc.example.tld.' -U 'administrator'%'P@s$w0rd.123'

Comprobaciones

Comprobar correcta ejecución del servidor Bind9 DNS.

  1. netstat -tapn | grep 53
  2. netstat -lptun

Comprobar registros DNS necesarios para el funcionamiento correcto de Samba AD DC.

  1. dig example.tld
  2. dig -x 192.168.0.1 @127.0.0.1 +short
  3. host -t A dc.example.tld
  4. host -t SRV _kerberos._udp.example.tld
  5. host -t SRV _ldap._tcp.example.tld

Comprobar actualización automática de los registros DNS.

  1. samba-tool dns query 127.0.0.1 example.tld @ ALL -U 'administrator'%'P@s$w0rd.123'
  2. samba_dnsupdate --verbose --all-names

Configuración del servidor NTP

El servidor Samba AD DC actuará como servidor de tiempo (Network Time Protocol Server - NTP Server) propiciando la sincronización de los relojes de los hosts y sistemas informáticos existentes en su entorno de red.

NOTA: Por favor, si está implementando el servidor Samba AD DC en un contenedor, lea antes las Consideraciones finales.

Integración con Samba AD DC

Chronyd

Instalar paquetes necesarios.

  1. apt install chrony ntpdate
  2. ntpdate -bu ntp.tld

Configurar el servicio.

  1. mv /etc/chrony/chrony.conf{,.org}
  1. nano /etc/chrony/chrony.conf
  2. server ntp.tld iburst
  3. driftfile /var/lib/chrony/drift
  4. makestep 1.0 3
  5. rtcsync
  6. allow 192.168.0.0/24
  7. local stratum 10
  8. keyfile /etc/chrony/chrony.keys
  9. leapsectz right/UTC
  10. logdir /var/log/chrony
  11. ntpsigndsocket /var/lib/samba/ntp_signd

Establecer permisos.

  1. chown root:_chrony /var/lib/samba/ntp_signd/
  2. chmod 750 /var/lib/samba/ntp_signd/

Reiniciar el servicio.

  1. systemctl restart chronyd
  2. systemctl enable chronyd

Comprobaciones

  1. systemctl status chronyd
  2. chronyc sources

Configuración del servidor DHCP

Instalar el paquete isc-dhcp-server para asignar direcciones IP a los hosts clientes, permitiendo la actualización dinámica de sus registros DNS tanto para la zona directa como la inversa.

  1. apt install isc-dhcp-server

NOTA: Este método puede afectar funcionalidades en los clientes Windows, los cuales tratarán de actualizar los registros DNS por sí mismos, utilizando sus cuentas de hosts. Para evitar este comportamiento, debe crearse una Política de Grupo y aplicarla a Unidades Organizativas que contengan equipos.

La GPO debe configurarse con los siguientes parámetros:

  1. Computer Configuration
  2. Policies
  3. Administrative Templates
  4. Network
  5. DNS Client
  6. Dynamic Update = Disabled
  7. Register PTR Records = Disabled

Integración con Samba AD DC

Crear un usuario no privilegiado, pero otorgándole permisos de administración sobre el servidor DNS. Aunque no es obligatorio, es recomendable inhabilitar el tiempo de expiración de la contraseña.

  1. samba-tool user create dhcp --description='Unprivileged DHCP Server user account' --random-password
  2. samba-tool user setexpiry dhcp --noexpiry
  3. samba-tool group addmembers 'DnsAdmins' dhcp

Exportar las credenciales del usuario a un archivo keytab, y asignar permisos necesarios.

  1. samba-tool domain exportkeytab --principal=dhcp@EXAMPLE.TLD /etc/dhcp/dhcpd.keytab
  2. chown root:root /etc/dhcp/dhcpd.keytab
  3. chmod 400 /etc/dhcp/dhcpd.keytab

Integración con Bind9 DNS

Crear el fichero /etc/dhcp/dhcpd-update-samba-dns.conf, que contendrá las variables a utilizarse para la actualización de los registros DNS.

  1. nano /etc/dhcp/dhcpd-update-samba-dns.conf
  2. # Variables
  3. KRB5CC="/run/dhcpd.krb5cc"
  4. KEYTAB="/etc/dhcp/dhcpd.keytab"
  5. DOMAIN="example.tld"
  6. REALM="EXAMPLE.TLD"
  7. PRINCIPAL="dhcp@${REALM}"
  8. NAMESERVER="dc.${DOMAIN}"
  9. ZONE="${DOMAIN}"

Crear los scripts de actualización de los registros DNS.

  1. nano /etc/dhcp/dhcpd-update-dns.sh
  2. #!/bin/bash
  3. # Begin dhcpd-update-dns.sh
  4. . /etc/dhcpd/dhcpd-update-samba-dns.conf || exit 1
  5. ACTION=$1
  6. IP=$2
  7. HNAME=$3
  8. export KRB5CC KEYTAB DOMAIN REALM PRINCIPAL NAMESERVER ZONE ACTION IP HNAME
  9. /usr/bin/samba-dnsupdate.sh -m &
  10. # End dhcpd-update-samba-dns.sh
  1. nano /usr/bin/samba-dnsupdate.sh
  2. #!/bin/bash
  3. # Begin samba-dnsupdate.sh
  4. # Author: DJ Lucas <dj_AT_linuxfromscratch_DOT_org>
  5. # kerberos_creds() courtesy of Sergey Urushkin
  6. # http://www.kuron-germany.de/michael/blog/wp-content/uploads/2012/03/dhcpdns-sergey2.txt
  7. # DHCP server should be authoritative for its own records, sleep for 5 seconds
  8. # to allow unconfigured Windows hosts to create their own DNS records
  9. # In order to use this script you should disable dynamic updates by hosts that
  10. # will receive addresses from this DHCP server. Instructions are found here:
  11. # https://wiki.archlinux.org/index.php/Samba_4_Active_Directory_Domain_Controller#DHCP
  12. sleep 5
  13. checkvalues()
  14. {
  15. [ -z "${2}" ] && echo "Error: argument '${1}' requires a parameter." && exit 1
  16. case ${2} in
  17. -*)
  18. echo "Error: Invalid parameter '${2}' passed to ${1}."
  19. exit 1
  20. ;;
  21. *)
  22. return 0
  23. ;;
  24. esac
  25. }
  26. showhelp()
  27. {
  28. echo -e "\n"`basename ${0}` "uses samba-tool to update DNS records in Samba 4's DNS"
  29. echo "server when using INTERNAL DNS or BIND9 DLZ plugin."
  30. echo ""
  31. echo " Command line options (and variables):"
  32. echo ""
  33. echo " -a | --action Action for this script to perform"
  34. echo " ACTION={add|delete}"
  35. echo " -c | --krb5cc Path of the krb5 credential cache (optional)"
  36. echo " Default: KRB5CC=/run/dhcpd.krb5cc"
  37. echo " -d | --domain The DNS domain/zone to be updated"
  38. echo " DOMAIN={domain.tld}"
  39. echo " -h | --help Show this help message and exit"
  40. echo " -H | --hostname Hostname of the record to be updated"
  41. echo " HNAME={hostname}"
  42. echo " -i | --ip IP address of the host to be updated"
  43. echo " IP={0.0.0.0}"
  44. echo " -k | --keytab Krb5 keytab to be used for authorization (optional)"
  45. echo " Default: KEYTAB=/etc/dhcp/dhcpd.keytab"
  46. echo " -m | --mitkrb5 Use MIT krb5 client utilities"
  47. echo " MITKRB5={YES|NO}"
  48. echo " -n | --nameserver DNS server to be updated (must use FQDN, not IP)"
  49. echo " NAMESERVER={server.internal.domain.tld}"
  50. echo " -p | --principal Principal used for DNS updates"
  51. echo " PRINCIPAL={user@domain.tld}"
  52. echo " -r | --realm Authentication realm"
  53. echo " REALM={DOMAIN.TLD}"
  54. echo " -z | --zone Then name of the zone to be updated in AD."
  55. echo " ZONE={zonename}"
  56. echo ""
  57. echo "Example: $(basename $0) -d domain.tld -i 192.168.0.x -n 192.168.0.x \\"
  58. echo " -r DOMAIN.TLD -p user@domain.tld -H HOSTNAME -m"
  59. echo ""
  60. }
  61. # Process arguments
  62. [ -z "$1" ] && showhelp && exit 1
  63. while [ -n "$1" ]; do
  64. case $1 in
  65. -a | --action)
  66. checkvalues ${1} ${2}
  67. ACTION=${2}
  68. shift 2
  69. ;;
  70. -c | --krb5cc)
  71. checkvalues ${1} ${2}
  72. KRB5CC=${2}
  73. shift 2
  74. ;;
  75. -d | --domain)
  76. checkvalues ${1} ${2}
  77. DOMAIN=${2}
  78. shift 2
  79. ;;
  80. -h | --help)
  81. showhelp
  82. exit 0
  83. ;;
  84. -H | --hostname)
  85. checkvalues ${1} ${2}
  86. HNAME=${2%%.*}
  87. shift 2
  88. ;;
  89. -i | --ip)
  90. checkvalues ${1} ${2}
  91. IP=${2}
  92. shift 2
  93. ;;
  94. -k | --keytab)
  95. checkvalues ${1} ${2}
  96. KEYTAB=${2}
  97. shift 2
  98. ;;
  99. -m | --mitkrb5)
  100. KRB5MIT=YES
  101. shift 1
  102. ;;
  103. -n | --nameserver)
  104. checkvalues ${1} ${2}
  105. NAMESERVER=${2}
  106. shift 2
  107. ;;
  108. -p | --principal)
  109. checkvalues ${1} ${2}
  110. PRINCIPAL=${2}
  111. shift 2
  112. ;;
  113. -r | --realm)
  114. checkvalues ${1} ${2}
  115. REALM=${2}
  116. shift 2
  117. ;;
  118. -z | --zone)
  119. checkvalues ${1} ${2}
  120. ZONE=${2}
  121. shift 2
  122. ;;
  123. *)
  124. echo "Error!!! Unknown command line opion!"
  125. echo "Try" `basename $0` "--help."
  126. exit 1
  127. ;;
  128. esac
  129. done
  130. # Sanity checking
  131. [ -z "$ACTION" ] && echo "Error: action not set." && exit 2
  132. case "$ACTION" in
  133. add | Add | ADD)
  134. ACTION=ADD
  135. ;;
  136. del | delete | Delete | DEL | DELETE)
  137. ACTION=DEL
  138. ;;
  139. *)
  140. echo "Error: invalid action \"$ACTION\"." && exit 3
  141. ;;
  142. esac
  143. [ -z "$KRB5CC" ] && KRB5CC=/run/dhcpd.krb5cc
  144. [ -z "$DOMAIN" ] && echo "Error: invalid domain." && exit 4
  145. [ -z "$HNAME" ] && [ "$ACTION" == "ADD" ] && \
  146. echo "Error: hostname not set." && exit 5
  147. [ -z "$IP" ] && echo "Error: IP address not set." && exit 6
  148. [ -z "$KEYTAB" ] && KEYTAB=/etc/dhcp/dhcpd.keytab
  149. [ -z "$NAMESERVER" ] && echo "Error: nameservers not set." && exit 7
  150. [ -z "$PRINCIPAL" ] && echo "Error: principal not set." && exit 8
  151. [ -z "$REALM" ] && echo "Error: realm not set." && exit 9
  152. [ -z "$ZONE" ] && echo "Error: zone not set." && exit 10
  153. # Disassemble IP for reverse lookups
  154. OCT1=$(echo $IP | cut -d . -f 1)
  155. OCT2=$(echo $IP | cut -d . -f 2)
  156. OCT3=$(echo $IP | cut -d . -f 3)
  157. OCT4=$(echo $IP | cut -d . -f 4)
  158. RZONE="$OCT3.$OCT2.$OCT1.in-addr.arpa"
  159. kerberos_creds() {
  160. export KRB5_KTNAME="$KEYTAB"
  161. export KRB5CCNAME="$KRB5CC"
  162. if [ "$KRB5MIT" = "YES" ]; then
  163. KLISTARG="-s"
  164. else
  165. KLISTARG="-t"
  166. fi
  167. klist $KLISTARG || kinit -k -t "$KEYTAB" -c "$KRB5CC" "$PRINCIPAL" || { logger -s -p daemon.error -t dhcpd kinit for dynamic DNS failed; exit 11; }
  168. }
  169. add_host(){
  170. logger -s -p daemon.info -t dhcpd Adding A record for host $HNAME with IP $IP to zone $ZONE on server $NAMESERVER
  171. samba-tool dns add $NAMESERVER $ZONE $HNAME A $IP -k yes
  172. }
  173. delete_host(){
  174. logger -s -p daemon.info -t dhcpd Removing A record for host $HNAME with IP $IP from zone $ZONE on server $NAMESERVER
  175. samba-tool dns delete $NAMESERVER $ZONE $HNAME A $IP -k yes
  176. }
  177. update_host(){
  178. logger -s -p daemon.info -t dhcpd Removing A record for host $HNAME with IP $CURIP from zone $ZONE on server $NAMESERVER
  179. samba-tool dns delete $NAMESERVER $ZONE $HNAME A $CURIP -k yes
  180. add_host
  181. }
  182. add_ptr(){
  183. logger -s -p daemon.info -t dhcpd Adding PTR record $OCT4 with hostname $HNAME to zone $RZONE on server $NAMESERVER
  184. samba-tool dns add $NAMESERVER $RZONE $OCT4 PTR $HNAME.$DOMAIN -k yes
  185. }
  186. delete_ptr(){
  187. logger -s -p daemon.info -t dhcpd Removing PTR record $OCT4 with hostname $HNAME from zone $RZONE on server $NAMESERVER
  188. samba-tool dns delete $NAMESERVER $RZONE $OCT4 PTR $HNAME.$DOMAIN -k yes
  189. }
  190. update_ptr(){
  191. logger -s -p daemon.info -t dhcpd Removing PTR record $OCT4 with hostname $CURHNAME from zone $RZONE on server $NAMESERVER
  192. samba-tool dns delete $NAMESERVER $RZONE $OCT4 PTR $CURHNAME -k yes
  193. add_ptr
  194. }
  195. case "$ACTION" in
  196. ADD)
  197. kerberos_creds
  198. host -t A $HNAME.$DOMAIN > /dev/null
  199. if [ "${?}" == 0 ]; then
  200. CURIP=$(host -t A $HNAME.$DOMAIN | cut -d " " -f 4 )
  201. if [[ "$CURIP" != "$IP" ]]; then
  202. update_host
  203. fi
  204. else
  205. add_host
  206. fi
  207. host -t PTR $IP > /dev/null
  208. if [ "${?}" == 0 ]; then
  209. CURHNAME=$(host -t PTR $IP | cut -d " " -f 5 | rev | cut -c 2- | rev)
  210. if [[ "$CURHNAME" != "$HNAME.$DOMAIN" ]]; then
  211. update_ptr
  212. fi
  213. else
  214. add_ptr
  215. fi
  216. ;;
  217. DEL)
  218. kerberos_creds
  219. host -t A $HNAME.$DOMAIN > /dev/null
  220. if [ "${?}" == 0 ]; then
  221. delete_host
  222. fi
  223. host -t PTR $IP > /dev/null
  224. if [ "${?}" == 0 ]; then
  225. delete_ptr
  226. fi
  227. ;;
  228. *)
  229. echo "Error: Invalid action '$ACTION'!" && exit 12
  230. ;;
  231. esac
  232. # End samba-dnsupdate.sh

Asignar permisos de ejecución.

  1. chmod +x /etc/dhcp/dhcpd-update-dns.sh /usr/bin/samba-dnsupdate.sh

Modificar parámetros globales del servicio.

  1. mv /etc/default/isc-dhcp-server{,.org}
  1. nano /etc/default/isc-dhcp-server
  2. DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
  3. DHCPDv4_PID=/var/run/dhcpd.pid
  4. INTERFACESv4="eth0"

Crear fichero principal del servicio DHCP.

  1. mv /etc/dhcp/dhcpd.conf{,.org}
  1. nano /etc/dhcp/dhcpd.conf
  2. authoritative;
  3. server-identifier 192.168.0.1;
  4. ddns-update-style none;
  5. deny declines;
  6. deny bootp;
  7. deny duplicates;
  8. log-facility local7;
  9. shared-network EXAMPLE {
  10. subnet 192.168.0.0 netmask 255.255.255.0 {
  11. range 192.168.0.200 192.168.0.250;
  12. option domain-name "example.tld";
  13. option domain-name-servers 192.168.0.1;
  14. option routers 192.168.0.254;
  15. option subnet-mask 255.255.255.0;
  16. option broadcast-address 192.168.0.255;
  17. option netbios-name-servers 192.168.0.1;
  18. option netbios-node-type 8;
  19. option ntp-servers 192.168.0.1;
  20. option time-offset -18000;
  21. do-forward-updates false;
  22. ignore client-updates;
  23. update-static-leases false;
  24. one-lease-per-client true;
  25. update-conflict-detection false;
  26. deny client-updates;
  27. default-lease-time 86400;
  28. max-lease-time 86400;
  29. on commit {
  30. set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  31. set ClientName = pick-first-value(option host-name, host-decl-name);
  32. execute("/etc/dhcp/dhcpd-update-dns.sh", "add", ClientIP, ClientName);
  33. }
  34. on release {
  35. set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  36. set ClientName = pick-first-value(option host-name, host-decl-name);
  37. execute("/etc/dhcp/dhcpd-update-dns.sh", "delete", ClientIP, ClientName);
  38. }
  39. on expiry {
  40. set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  41. set ClientName = pick-first-value(option host-name, host-decl-name);
  42. execute("/etc/dhcp/dhcpd-update-dns.sh", "delete", ClientIP, ClientName);
  43. }
  44. }
  45. }

NOTA: Esta configuración asignará direcciones IP y actualizará los registros DNS para todos los hosts que se conecten a la red y que tengan habilitada la obtención de parámetros de red vía DHCP.

Si solo se quisiera asignar parámetros de red a los hosts que realmente forman parte de la organización, se puede usar la funcionalidad de clases y subclases, ejemplo:

  1. class "allocation-class-1" {
  2. match pick-first-value (option dhcp-client-identifier, hardware);
  3. }
  4. subclass "allocation-class-1" 1:08:00:27:aa:70:37;
  5. subclass "allocation-class-1" 1:08:00:27:9f:ff:05;
  6. pool {
  7. range 192.168.0.200 192.168.0.250;
  8. allow members of "allocation-class-1";
  9. }

Otra forma sería definiendo asignaciones estáticas, ejemplo:

  1. pool {
  2. range 192.168.0.200 192.168.0.250;
  3. deny unknown-clients;
  4. group {
  5. host pc-client1 {
  6. hardware ethernet 08:00:27:aa:70:37;
  7. fixed-address 192.168.0.200;
  8. }
  9. host pc-client2 {
  10. hardware ethernet 08:00:27:9f:ff:05;
  11. fixed-address 192.168.0.201;
  12. }
  13. }
  14. }

También se puede usar la combinación de ambas técnicas, ejemplo:

  1. class "allocation-class-1" {
  2. match pick-first-value (option dhcp-client-identifier, hardware);
  3. }
  4. subclass "allocation-class-1" 1:08:00:27:aa:70:37;
  5. subclass "allocation-class-1" 1:08:00:27:9f:ff:05;
  6. pool {
  7. range 192.168.0.200 192.168.0.250;
  8. allow members of "allocation-class-1";
  9. deny unknown-clients;
  10. group {
  11. host pc-client1 {
  12. hardware ethernet 08:00:27:aa:70:37;
  13. fixed-address 192.168.0.200;
  14. }
  15. host pc-client2 {
  16. hardware ethernet 08:00:27:9f:ff:05;
  17. fixed-address 192.168.0.201;
  18. }
  19. }
  20. }

Idependientemente del método que se adopte, deben conocerse de antemano las direcciones MAC de los hosts, y establecer la asignación de parámetros de red dentro de la subcláusula subnet {} y el rango de direcciones IP a asignar, debe estar contenido dentro de la subcláusula pool {}, ejemplo:

  1. nano /etc/dhcp/dhcpd.conf
  2. authoritative;
  3. server-identifier 192.168.0.1;
  4. ddns-update-style none;
  5. deny declines;
  6. deny bootp;
  7. deny duplicates;
  8. log-facility local7;
  9. shared-network EXAMPLE {
  10. subnet 192.168.0.0 netmask 255.255.255.0 {
  11. option domain-name "example.tld";
  12. option domain-name-servers 192.168.0.1;
  13. option routers 192.168.0.254;
  14. option subnet-mask 255.255.255.0;
  15. option broadcast-address 192.168.0.255;
  16. option netbios-name-servers 192.168.0.1;
  17. option netbios-node-type 8;
  18. option ntp-servers 192.168.0.1;
  19. option time-offset -18000;
  20. do-forward-updates false;
  21. ignore client-updates;
  22. update-static-leases false;
  23. one-lease-per-client true;
  24. update-conflict-detection false;
  25. deny client-updates;
  26. default-lease-time 86400;
  27. max-lease-time 86400;
  28. class "allocation-class-1" {
  29. match pick-first-value (option dhcp-client-identifier, hardware);
  30. }
  31. subclass "allocation-class-1" 1:08:00:27:aa:70:37;
  32. subclass "allocation-class-1" 1:08:00:27:9f:ff:05;
  33. pool {
  34. range 192.168.0.200 192.168.0.250;
  35. allow members of "allocation-class-1";
  36. deny unknown-clients;
  37. group {
  38. host pc-client1 {
  39. hardware ethernet 08:00:27:aa:70:37;
  40. fixed-address 192.168.0.200;
  41. }
  42. host pc-client2 {
  43. hardware ethernet 08:00:27:9f:ff:05;
  44. fixed-address 192.168.0.201;
  45. }
  46. }
  47. }
  48. on commit {
  49. set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  50. set ClientName = pick-first-value(option host-name, host-decl-name);
  51. execute("/etc/dhcp/dhcpd-update-dns.sh", "add", ClientIP, ClientName);
  52. }
  53. on release {
  54. set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  55. set ClientName = pick-first-value(option host-name, host-decl-name);
  56. execute("/etc/dhcp/dhcpd-update-dns.sh", "delete", ClientIP, ClientName);
  57. }
  58. on expiry {
  59. set ClientIP = binary-to-ascii(10, 8, ".", leased-address);
  60. set ClientName = pick-first-value(option host-name, host-decl-name);
  61. execute("/etc/dhcp/dhcpd-update-dns.sh", "delete", ClientIP, ClientName);
  62. }
  63. }
  64. }

Comprobaciones

Reiniciar el servicio y observar las salidas generadas en el fichero de trazas /var/log/syslog.

  1. systemctl restart isc-dhcp-server
  2. tail -fn100 /var/log/syslog

NOTA: Se puede verificar la configuración del servidor DHCP, ejecutando el comando dhcpd -t.

Creación de Unidades Organizativas, Grupos y Cuentas de Usuarios

Las unidades organizativas son subdivisiones jerárquicas que agrupan entidades, tales como otras OUs, cuentas y grupos de usuarios, y ordenadores; facilitando la aplicación de políticas de grupos en un AD DC.

Creación de Unidades Organizativas (Organizational Units - OU)

Crear nueva Unidad Organizativa.

  1. samba-tool ou create 'OU=ACME,DC=example,DC=tld' --description='EXAMPLE.TLD Main Organizational Unit'

Crear la Unidad Organizativa Workstations para agrupar las estaciones de trabajo, perteneciente a ACME.

  1. samba-tool ou create 'OU=Workstations,OU=ACME,DC=example,DC=tld' --description='Workstations Organizational Unit'

NOTA: A medida que se vayan incorporando estaciones de trabajo al dominio, deben ser movidas hacia esta Unidad Organizativa, ejecutando el comando samba-tool computer move computername <new_ou_dn> ó utilizando la aplicación gráfica Active Directory Users and Computers disponible en el paquete de herramientas administrativas RSAT. Ejemplo:

  1. samba-tool computer move PC-CLIENT1$ 'OU=Workstations,OU=ACME,DC=example,DC=tld'

Creación de Grupos

Crear nuevo Grupo de Usuarios perteneciente a la OU ACME.

  1. samba-tool group add IT --groupou='OU=ACME' --description='IT Technical Support Group'

Creación de Cuentas de Usuarios

Crear nueva Cuenta de Usuario perteneciente a la OU ACME.

  1. samba-tool user create 'john.doe' 'P@s$w0rd.456' \
  2. --userou='OU=ACME' \
  3. --surname='Doe' \
  4. --given-name='John' \
  5. --initials='JD' \
  6. --job-title='Network Administrator' \
  7. --department='IT' \
  8. --company='EXAMPLE' \
  9. --description='IT Technical Support Account' \
  10. --mail='john.doe@example.tld'

Añadir nuevo usuario al grupo IT.

  1. samba-tool group addmembers 'IT' john.doe

Añadir nuevo usuario a los grupos administrativos del AD DC.

  1. samba-tool group addmembers 'Administrators' john.doe
  2. samba-tool group addmembers 'Domain Admins' john.doe
  3. samba-tool group addmembers 'Schema Admins' john.doe
  4. samba-tool group addmembers 'Enterprise Admins' john.doe
  5. samba-tool group addmembers 'Group Policy Creator Owners' john.doe

Creación de Políticas de Grupos (Group Policy Object - GPO)

En los sistemas operativos Windows, una Política de Grupo (Group Policy Object - GPO) es un conjunto de configuraciones que define cómo será la apariencia y el comportamiento del sistema, para usuarios y/ó grupos de usuarios y ordenadores, previamente definidos y agrupados en OUs.

Configurar almacén central para definiciones de directivas.

  1. tar -xzmf PolicyDefinitions.tar.gz -C /var/lib/samba/sysvol/example.tld/Policies/
  2. chown -R 3000004.3000004 /var/lib/samba/sysvol/example.tld/Policies/

NOTA: El fichero PolicyDefinitions.tar.gz contine definiciones de directivas compatibles con sistemas operativos Windows hasta la versión 1809 de Windows 10. También están incorporadas las definiciones para el navegador Mozilla Firefox versión 60 y superiores; así como el cliente de correo electrónico Thunderbird versión 68 y superiores.

Crear Política de Grupo para actualizaciones dinámicas DHCP/DNS.

  1. samba-tool gpo create 'DHCP with dynamic DNS updates Policy' -U 'administrator'%'P@s$w0rd.123'

Vincular GPO a Unidad Organizativa Workstations.

  1. samba-tool gpo setlink 'OU=Workstations,OU=ACME,DC=example,DC=tld' {4E8A2506-32E1-4E66-B5A4-362B4ACD0DF0} -U 'administrator'%'P@s$w0rd.123'

Comprobaciones

  1. samba-tool gpo listall
  2. samba-tool gpo listcontainers {4E8A2506-32E1-4E66-B5A4-362B4ACD0DF0} -U 'administrator'%'P@s$w0rd.123'
  3. samba-tool gpo getlink 'OU=Workstations,OU=ACME,DC=example,DC=tld' -U 'administrator'%'P@s$w0rd.123'

NOTA: La modificación de los parámetros de las Políticas de Grupo se debe realizar mediante la aplicación gráfica Group Policy Management disponible en el paquete de herramientas administrativas RSAT.

Instalación y configuración de Squid Proxy e integración con Samba AD DC

Crear registros DNS.

  1. samba-tool dns add localhost example.tld proxy A '192.168.0.2' -U 'administrator'%'P@s$w0rd.123'
  2. samba-tool dns add localhost 0.168.192.in-addr.arpa 2 PTR 'proxy.example.tld.' -U 'administrator'%'P@s$w0rd.123'

Crear nueva Unidad Organizativa Proxy para grupos de navegación, perteneciente a ACME.

  1. samba-tool ou create 'OU=Proxy,OU=ACME,DC=example,DC=tld' --description='Proxy Groups Organizational Unit'

Crear nuevos grupos de navegación pertenecientes a la OU Proxy.

  1. samba-tool group add Intranet --groupou='OU=Proxy,OU=ACME' --description='.CU Access Group'
  2. samba-tool group add Internet --groupou='OU=Proxy,OU=ACME' --description='Internet Access Group'
  3. samba-tool group add Unrestricted --groupou='OU=Proxy,OU=ACME' --description='Unrestricted Access Group'

Crear nuevos usuarios de navegación pertenecientes a la OU ACME.

  1. samba-tool user create 'sheldon' 'Amy*123' \
  2. --userou='OU=ACME' \
  3. --surname='Cooper' \
  4. --given-name='Sheldon' \
  5. --department='PHYSICS' \
  6. --company='EXAMPLE' \
  7. --description='Intranet Access Account' \
  8. --mail='sheldon@example.tld'
  1. samba-tool user create 'leonard' 'Penny*456' \
  2. --userou='OU=ACME' \
  3. --surname='Hofstadter' \
  4. --given-name='Leonard' \
  5. --department='PSYCHOLOGY' \
  6. --company='EXAMPLE' \
  7. --description='Internet Access Account' \
  8. --mail='leonard@example.tld'
  1. samba-tool user create 'rajesh' 'Howard*789' \
  2. --userou='OU=ACME' \
  3. --surname='Koothrappali' \
  4. --given-name='Rajesh' \
  5. --department='ASTROLOGY' \
  6. --company='EXAMPLE' \
  7. --description='Unrestricted Access Account' \
  8. --mail='rajesh@example.tld'

Añadir usuarios a los grupos creados.

  1. samba-tool group addmembers 'Intranet' sheldon
  2. samba-tool group addmembers 'Internet' leonard
  3. samba-tool group addmembers 'Unrestricted' rajesh

Instalación de paquetes necesarios

  1. export DEBIAN_FRONTEND=noninteractive
  2. apt install squid krb5-user msktutil libsasl2-modules-gssapi-mit
  3. unset DEBIAN_FRONTEND

Detener el servicio y remplazar el fichero de configuración por defecto de Squid.

  1. systemctl stop squid
  2. mv /etc/squid/squid.conf{,.org}
  3. nano /etc/squid/squid.conf

Configuración de kerberos.

  1. mv /etc/krb5.conf{,.org}
  1. nano /etc/krb5.conf
  2. [libdefaults]
  3. default_realm = EXAMPLE.TLD
  4. dns_lookup_realm = false
  5. dns_lookup_kdc = true
  6. clockskew = 3600
  7. ticket_lifetime = 24h
  8. forwardable = yes
  9. default_keytab_name = /etc/krb5.keytab
  10. [realms]
  11. EXAMPLE.TLD = {
  12. kdc = DC.EXAMPLE.TLD:88
  13. master_kdc = DC.EXAMPLE.TLD
  14. admin_server = DC.EXAMPLE.TLD:749
  15. default_domain = example.tld
  16. }
  17. [domain_realm]
  18. .example.tld = EXAMPLE.TLD
  19. example.tld = EXAMPLE.TLD

Generar archivo keytab.

  1. kinit Administrator@EXAMPLE.TLD
  2. msktutil -c -b "CN=Computers" \
  3. -s HTTP/proxy.example.tld \
  4. -h proxy.example.tld \
  5. -k /etc/krb5.keytab \
  6. --computer-name PROXY \
  7. --upn HTTP/proxy.example.tld \
  8. --server dc.example.tld \
  9. --verbose

Establecer los permisos del archivo keytab.

  1. chown root:proxy /etc/krb5.keytab
  2. chmod 640 /etc/krb5.keytab

Comprobar que kerberos funciona.

  1. kinit -k HTTP/proxy.example.tld
  2. klist

Comprobar que la cuenta de host se actualice correctamente.

  1. msktutil --auto-update --verbose --computer-name proxy

Agregar en crontab.

  1. nano /etc/crontrab
  2. @midnight root msktutil --auto-update --computer-name proxy > /dev/null 2>&1

Integración con Samba AD DC

Crear nueva Cuenta de Usuario para el servicio squid.

Esta cuenta sería usada para propiciar la autenticación básica LDAP en caso de fallar kerberos ó para uso de gestores de descargas no compatibles con kerberos ó en aquellas estaciones que no están unidas al dominio.

  1. samba-tool user create 'squid' 'P@s$w0rd.789' \
  2. --surname='Proxy Service' \
  3. --given-name='Squid' \
  4. --company='EXAMPLE' \
  5. --description='Squid Proxy Service Account'
  6. samba-tool user setexpiry squid --noexpiry

Editar el fichero /etc/squid/squid.conf y agregar los métodos de autenticación.

  1. nano /etc/squid/squid.conf
  2. # OPTIONS FOR AUTHENTICATION
  3. # ---------------------------------------------------------------------
  4. # Kerberos authentication
  5. auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -r -d -s HTTP/proxy.example.tld@EXAMPLE.TLD -k /etc/krb5.keytab
  6. auth_param negotiate children 20 startup=0 idle=1
  7. auth_param negotiate keep_alive off
  8. # Basic LDAP authentication (fallback)
  9. auth_param basic program /usr/lib/squid/basic_ldap_auth -R -b "dc=example,dc=tld" -D squid@example.tld -w "P@s$w0rd.789" -f "(|(userPrincipalName=%s)(sAMAccountName=%s))" -h dc.example.tld
  10. auth_param basic children 10
  11. auth_param basic realm PROXY.EXAMPLE.TLD
  12. auth_param basic credentialsttl 8 hours
  13. # ACCESS CONTROL LISTS
  14. # ---------------------------------------------------------------------
  15. acl CUBA dstdomain .cu
  16. acl AUTH proxy_auth REQUIRED
  17. # Kerberos group mapping
  18. external_acl_type INTRANET ttl=300 negative_ttl=60 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -a -g Intranet -D EXAMPLE.TLD
  19. external_acl_type INTERNET ttl=300 negative_ttl=60 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -a -g Internet -D EXAMPLE.TLD
  20. external_acl_type UNRESTRICTED ttl=300 negative_ttl=60 %LOGIN /usr/lib/squid/ext_kerberos_ldap_group_acl -a -g Unrestricted -D EXAMPLE.TLD
  21. acl intranet external INTRANET
  22. acl internet external INTERNET
  23. acl unrestricted external UNRESTRICTED
  24. # LDAP group mapping
  25. external_acl_type memberof %LOGIN /usr/lib/squid/ext_ldap_group_acl -R -K -S -b "dc=example,dc=tld" -D squid@example.tld -w "P@s$w0rd.789" -f "(&(objectClass=person)(sAMAccountName=%v)(memberof=cn=%g,ou=Proxy,ou=ACME,dc=example,dc=tld))" -h dc.example.tld
  26. acl LDAPintranet external memberof Intranet
  27. acl LDAPinternet external memberof Internet
  28. acl LDAPunrestricted external memberof Unrestricted
  29. # HTTP_ACCESS
  30. # ---------------------------------------------------------------------
  31. http_access deny !AUTH
  32. # Using Kerberos
  33. http_access allow localnet unrestricted
  34. http_access allow localnet internet !blacklisted_sites
  35. http_access allow localnet intranet CUBA
  36. # Using basic LDAP
  37. http_access allow localnet LDAPunrestricted
  38. http_access allow localnet LDAPinternet !blacklisted_sites
  39. http_access allow localnet LDAPintranet CUBA
  40. http_access deny all

NOTA: El fichero de configuración completo puede obtenerse en squid.conf.

Comprobaciones

Usando autenticación Kerberos.

  1. /usr/lib/squid/ext_kerberos_ldap_group_acl -a -g Internet -D EXAMPLE.TLD

Usando autenticación básica LDAP.

  1. /usr/lib/squid/basic_ldap_auth -R -b "dc=example,dc=tld" -D squid@example.tld -w "P@s$w0rd.789" -f "(|(userPrincipalName=%s)(sAMAccountName=%s))" -h dc.example.tld

Membresía de grupos LDAP.

  1. /usr/lib/squid/ext_ldap_group_acl -R -K -S -b "dc=example,dc=tld" \
  2. -D squid@example.tld -w "P@s$w0rd.789" \
  3. -f "(&(objectClass=person)(sAMAccountName=%v)\
  4. (memberof=cn=%g,ou=Proxy,ou=ACME,dc=example,dc=tld))" \
  5. -h dc.example.tld

Analizando trazas de navegación.

  1. tail -fn100 /var/log/squid/access.log

Instalación y configuración de eJabberd XMPP Server e integración con Samba AD DC

Instalación de paquetes necesarios

  1. apt install ejabberd ejabberd-contrib erlang-eldap

Crear certificado de seguridad TLS/SSL.

  1. mv /etc/ejabberd/ejabberd.pem{,.org}
  1. openssl req -x509 -nodes -days 3650 -sha512 \
  2. -subj "/C=CU/ST=Provincia/L=Ciudad/O=EXAMPLE TLD/OU=IT/CN=example.tld/emailAddress=postmaster@example.tld/" \
  3. -addext "subjectAltName = DNS:jb.example.tld,DNS:conference.example.tld,DNS:echo.example.tld,DNS:pubsub.example.tld,IP:192.168.0.3" \
  4. -newkey rsa:4096 \
  5. -out /tmp/exampleJabber.crt \
  6. -keyout /tmp/exampleJabber.key
  7. openssl dhparam -out /etc/ssl/dh2048.pem 2048
  1. cat /tmp/{exampleJabber.crt,exampleJabber.key} > /etc/ejabberd/ejabberd.pem
  2. chmod 0640 /etc/ejabberd/ejabberd.pem
  3. chown root:ejabberd /etc/ejabberd/ejabberd.pem

Comprobar correcta creación del certificado.

  1. openssl x509 -in /etc/ejabberd/ejabberd.pem -text -noout

Definir el nombre de dominio del servidor eJabberd y parámetros de seguridad TLS/SSL en la comunicación c2s (cliente-servidor).

  1. cp /etc/ejabberd/ejabberd.yml{,.org}
  2. nano /etc/ejabberd/ejabberd.yml
  1. hosts:
  2. - "example.tld"
  3. certfiles:
  4. - "/etc/ejabberd/ejabberd.pem"
  5. define_macro:
  6. 'TLS_CIPHERS': "HIGH:!aNULL:!eNULL:!3DES:@STRENGTH"
  7. 'TLS_OPTIONS':
  8. - "no_sslv3"
  9. - "no_tlsv1"
  10. - "no_tlsv1_1"
  11. - "cipher_server_preference"
  12. - "no_compression"
  13. 'DH_FILE': "/etc/ssl/dh2048.pem"
  14. c2s_ciphers: 'TLS_CIPHERS'
  15. s2s_ciphers: 'TLS_CIPHERS'
  16. c2s_protocol_options: 'TLS_OPTIONS'
  17. s2s_protocol_options: 'TLS_OPTIONS'
  18. c2s_dhfile: 'DH_FILE'
  19. s2s_dhfile: 'DH_FILE'
  20. listen:
  21. -
  22. port: 5222
  23. ip: "::"
  24. module: ejabberd_c2s
  25. max_stanza_size: 262144
  26. shaper: c2s_shaper
  27. access: c2s
  28. starttls_required: true
  29. protocol_options: 'TLS_OPTIONS'
  30. disable_sasl_mechanisms:
  31. - "digest-md5"
  32. - "X-OAUTH2"

NOTA: El fichero de configuración completo puede obtenerse en Debian 10 Buster y Debian 11 Bullseye.

Creación de registros DNS

  1. samba-tool dns add localhost example.tld jb A '192.168.0.3' -U 'administrator'%'P@s$w0rd.123'
  2. samba-tool dns add localhost 0.168.192.in-addr.arpa 3 PTR 'jb.example.tld.' -U 'administrator'%'P@s$w0rd.123'
  3. samba-tool dns add localhost example.tld conference CNAME 'jb.example.tld' -U 'administrator'%'P@s$w0rd.123'
  4. samba-tool dns add localhost example.tld echo CNAME 'jb.example.tld' -U 'administrator'%'P@s$w0rd.123'
  5. samba-tool dns add localhost example.tld pubsub CNAME 'jb.example.tld' -U 'administrator'%'P@s$w0rd.123'
  6. samba-tool dns add localhost example.tld _xmpp-client._tcp SRV 'jb.example.tld 5222 5 0' -U 'administrator'%'P@s$w0rd.123'
  7. samba-tool dns add localhost example.tld _xmpp-server._tcp SRV 'jb.example.tld 5269 5 0' -U 'administrator'%'P@s$w0rd.123'
  8. samba-tool dns add localhost example.tld _xmpp-server._tcp.conference.example.tld SRV 'jb.example.tld 5269 5 0' -U 'administrator'%'P@s$w0rd.123'

Comprobaciones

  1. host -t SRV _xmpp-server._tcp.example.tld
  2. host -t SRV _xmpp-client._tcp.example.tld
  3. host -t A jb.example.tld
  4. dig -t SRV @example.tld _xmpp-client._tcp.example.tld
  5. dig -t SRV @example.tld _xmpp-server._tcp.example.tld
  6. dig -t SRV @example.tld _xmpp-server._tcp.conference.example.tld

Integración con Samba AD DC

Crear nueva Cuenta de Usuario para el servicio ejabberd.

  1. samba-tool user create 'ejabberd' 'P@s$w0rd.012' \
  2. --surname='XMPP Service' \
  3. --given-name='eJabberd' \
  4. --company='EXAMPLE' \
  5. --description='eJabberd XMPP Service Account'
  6. samba-tool user setexpiry ejabberd --noexpiry

Crear Grupo de Usuarios de mensajería instantánea.

  1. samba-tool group add XMPP --groupou='OU=ACME' --description='XMPP Users Group'

Añadir usuarios al grupo XMPP.

  1. samba-tool group addmembers 'XMPP' john.doe,sheldon,leonard,rajesh

Configuración del servicio.

Definir cuenta de usuario con acceso administrativo al servicio.

  1. nano /etc/ejabberd/ejabberd.yml
  1. acl:
  2. admin:
  3. user:
  4. - "john.doe@example.tld"

Definir método de autenticación.

  1. auth_password_format: scram
  2. fqdn: "jb.example.tld"
  3. auth_method: ldap
  4. ldap_servers:
  5. - "dc.example.tld"
  6. ldap_encrypt: none
  7. ldap_port: 389
  8. ldap_rootdn: "ejabberd@example.tld"
  9. ldap_password: "P@s$w0rd.012"
  10. ldap_base: "OU=ACME,DC=example,DC=tld"
  11. ldap_uids: {"sAMAccountName": "%u"}
  12. ldap_filter: "(&(memberOf=CN=XMPP,OU=ACME,DC=example,DC=tld)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"

Compartir el roster de los usuarios

Editar el fichero /etc/ejabberd/ejabberd.yml y añadir en la sección MODULES, debajo de la opción mod_roster: {}, el siguiente contenido:

  1. mod_shared_roster_ldap:
  2. ldap_base: "OU=ACME,DC=example,DC=tld"
  3. ldap_groupattr: "department"
  4. ldap_groupdesc: "department"
  5. ldap_memberattr: "sAMAccountName"
  6. ldap_useruid: "sAMAccountName"
  7. ldap_userdesc: "description"
  8. ldap_rfilter: "(objectClass=user)"
  9. ldap_filter: "(&(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))"

Personalizar vCard de los usuarios

Editar el fichero /etc/ejabberd/ejabberd.yml y añadir en la sección MODULES, el siguiente contenido:

  1. mod_vcard:
  2. db_type: ldap
  3. ldap_base: "OU=ACME,DC=example,DC=tld"
  4. ldap_uids: {"sAMAccountName": "%u"}
  5. matches: infinity
  6. ldap_vcard_map:
  7. "NICKNAME": {"%s": ["givenName"]}
  8. "FN": {"%s": ["displayName"]}
  9. "EMAIL": {"%s": ["mail"]}
  10. "GIVEN": {"%s": ["givenName"]}
  11. "MIDDLE": {"%s": ["middleName"]}
  12. "FAMILY": {"%s": ["sn"]}
  13. "ORGNAME": {"%s": ["company"]}
  14. "ORGUNIT": {"%s": ["department"]}
  15. "TITLE": {"%s": ["title"]}
  16. "TEL": {"%s": ["telephoneNumber"]}
  17. "PHOTO": {"%s": ["jpegPhoto"]}
  18. ldap_search_fields:
  19. "User": "%u"
  20. "Full Name": "displayName"
  21. "Email": "mail"
  22. ldap_search_reported:
  23. "Full Name": "FN"
  24. "Nickname": "NICKNAME"
  25. "Email": "EMAIL"

Reiniciar el servicio y comprobar su correcto funcionamiento.

  1. systemctl restart ejabberd
  2. systemctl status ejabberd

Comprobaciones

Acceder a la web admnistrativa https://jb.example.tld:5280/admin, que provee eJabberd desde un navegador, loguearse con un usuario administrador y revisar los parámetros de configuración establecidos.

Vale destacar que una vez intregado el servicio al AD DC, no es necesario realizar cambio alguno a los usuarios, por esta vía; pues son gestionados en el mismo AD DC.

Iniciar sesión desde cualquier cliente jabber (Spark, Gajim, Pidgin) que soporte el protocolo XMPP y en la consola del servidor ejecutar:

  1. tail -fn100 /var/log/ejabberd/ejabberd.log

Instalación y configuración de Postfix/Dovecot Mail Server e integración con Samba AD DC.

Instalación de paquetes necesarios

  1. export DEBIAN_FRONTEND=noninteractive
  2. apt install postfix-{pcre,ldap,policyd-spf-python} dovecot-{core,ldap,pop3d,imapd,lmtpd} ldap-utils mailutils
  3. unset DEBIAN_FRONTEND

Configuración del sistema

Crear grupo y usuario locales para el almacén de buzones vmail.

  1. groupadd -g 5000 vmail
  2. useradd -m -g 5000 -u 5000 -d /var/vmail -s /usr/sbin/nologin -c "Virtual Mailbox Storage" vmail

Crear certificado de seguridad TLS/SSL.

  1. openssl req -x509 -nodes -days 3650 -sha512 \
  2. -subj "/C=CU/ST=Provincia/L=Ciudad/O=EXAMPLE TLD/OU=IT/CN=mail.example.tld/emailAddress=postmaster@example.tld/" \
  3. -addext "subjectAltName = DNS:smtp.example.tld,\
  4. DNS:pop3.example.tld,DNS:imap.example.tld,\
  5. DNS:webmail.example.tld,IP:192.168.0.4" \
  6. -newkey rsa:4096 \
  7. -out /etc/ssl/certs/exampleMail.crt \
  8. -keyout /etc/ssl/private/exampleMail.key
  1. openssl dhparam -out /etc/ssl/dh2048.pem 2048
  2. chmod 0444 /etc/ssl/certs/exampleMail.crt
  3. chmod 0400 /etc/ssl/private/exampleMail.key

Comprobar correcta creación del certificado.

  1. openssl x509 -in /etc/ssl/certs/exampleMail.crt -text -noout

Integración con Samba AD DC

Crear nueva Cuenta de Usuario del Dominio para el servicio postfix.

  1. samba-tool user create 'postfix' 'P@s$w0rd.345' \
  2. --surname='Dovecot Roundcube' \
  3. --given-name='Postfix' \
  4. --company='EXAMPLE' \
  5. --description='Mail Service Account'
  6. samba-tool user setexpiry postfix --noexpiry

Crear buzón de correo electrónico para almacén de mensajes.

  1. samba-tool user create 'archive' 'P@s$w0rd.678' \
  2. --userou='OU=ACME' \
  3. --surname='Mail Storage' \
  4. --given-name='Archive' \
  5. --company='ACME' \
  6. --description='Archive Mail Storage Account' \
  7. --mail='archive@example.tld'
  8. samba-tool user setexpiry archive --noexpiry

Crear registros DNS.

  1. samba-tool dns add localhost example.tld mail A '192.168.0.4' -U 'administrator'%'P@s$w0rd.123'
  2. samba-tool dns add localhost 0.168.192.in-addr.arpa 4 PTR 'mail.example.tld.' -U 'administrator'%'P@s$w0rd.123'
  3. samba-tool dns add localhost example.tld @ MX 'mail.example.tld 10' -U 'administrator'%'P@s$w0rd.123'
  4. samba-tool dns add localhost example.tld @ TXT '"v=spf1 a:example.tld mx -all"' -U 'administrator'%'P@s$w0rd.123'
  5. samba-tool dns add localhost example.tld mail._domainkey TXT '"v=DKIM1; h=sha256; k=rsa;" "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtOXRUYAblt65ls/zAipF1CoOhe1+9So+n6LJ3GOJzU3xDT1/V+uf9snRAEmZletTOftARX7KMBYPBCVfFt1RBvSLYbvaKVQONgFR5mW60VTYvEhrChLtkUzWGSQsZswWxzOZYyxNR1spR2eF9RSnBTCgX763in+b0uIxhlbqiNCxC9C0JN9zL+DchJl2X0v6+p9xNb2Vmc5DU7" "87SujgNEZKVG5k4d7qDgy2mdIjg/q9BVOrBLRtMxtTIB7SymTo8SSTw31mWsl8uksgYqWSm1Fu61emPgafwCAya5ftqLpeAdPGgsoNLh242LWt5pXfbFKe8I/6HDAWCiHN7dnyewIDAQAB"' -U 'administrator'%'P@s$w0rd.123'
  6. samba-tool dns add localhost example.tld smtp CNAME 'mail.example.tld' -U 'administrator'%'P@s$w0rd.123'
  7. samba-tool dns add localhost example.tld pop3 CNAME 'mail.example.tld' -U 'administrator'%'P@s$w0rd.123'
  8. samba-tool dns add localhost example.tld imap CNAME 'mail.example.tld' -U 'administrator'%'P@s$w0rd.123'
  9. samba-tool dns add localhost example.tld webmail CNAME 'mail.example.tld' -U 'administrator'%'P@s$w0rd.123'
  10. samba-tool dns add localhost example.tld _smtp._tcp SRV 'mail.example.tld 25 5 0' -U 'administrator'%'P@s$w0rd.123'
  11. samba-tool dns add localhost example.tld _imaps._tcp SRV 'imap.example.tld 993 5 0' -U 'administrator'%'P@s$w0rd.123'
  12. samba-tool dns add localhost example.tld _pop3s._tcp SRV 'pop3.example.tld 995 5 0' -U 'administrator'%'P@s$w0rd.123'
  13. samba-tool dns add localhost example.tld _submission._tcp SRV 'smtp.example.tld 587 5 0' -U 'administrator'%'P@s$w0rd.123'

Crear nueva Unidad Organizativa Email para grupos de correo electrónico, perteneciente a ACME.

  1. samba-tool ou create 'OU=Email,OU=ACME,DC=example,DC=tld' --description='Email Groups Organizational Unit'

Crear Grupos de Usuarios de correo electrónico.

  1. samba-tool group add Everyone --groupou='OU=Email,OU=ACME' --description='All Users Email Group' --mail='everyone@example.tld'
  1. samba-tool group add Management --groupou='OU=Email,OU=ACME' --description='Management Email Group' --mail='management@example.tld'
  1. samba-tool group add Support --groupou='OU=Email,OU=ACME' --description='Technical Support Email Group' --mail='support@example.tld'

Añadir usuarios a los grupos creados.

  1. samba-tool group addmembers 'Everyone' sheldon,leonard,rajesh
  2. samba-tool group addmembers 'Management' sheldon
  3. samba-tool group addmembers 'Support' rajesh,sheldon

NOTA: Es importante definir siempre la dirección de correo electrónico en el momento de crear cuentas de usuarios y grupos, de lo contrario no se obtendrán los resultados esperados.

Configuración de Postfix

Realizar copia de seguridad de los ficheros de configuración.

  1. cp /etc/postfix/main.cf{,.org}
  2. cp /etc/postfix/master.cf{,.org}

Declarar dominio de correo a gestionar.

  1. postconf -e "mydomain = example.tld"
  2. postconf -e "smtpd_sasl_local_domain = example.tld"
  3. postconf -e "virtual_mailbox_domains = example.tld"

Definir transporte virtual del dominio de correo.

  1. postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"

Definir usuarios virtuales de correo electrónico.

  1. postconf -e "smtpd_sender_login_maps = proxy:ldap:/etc/postfix/virtual_sender_login_maps.cf"
  1. nano /etc/postfix/virtual_sender_login_maps.cf
  2. server_host = dc.example.tld
  3. server_port = 389
  4. version = 3
  5. bind = yes
  6. start_tls = no
  7. bind_dn = postfix@example.tld
  8. bind_pw = P@s$w0rd.345
  9. search_base = OU=ACME,DC=example,DC=tld
  10. scope = sub
  11. query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
  12. result_attribute = mail
  13. debuglevel = 0

Definir buzón almacén de correo electrónico.

  1. postconf -e "always_bcc = archive@example.tld"

Definir buzones virtuales de correo electrónico.

  1. postconf -e "virtual_minimum_uid = 5000"
  2. postconf -e "virtual_uid_maps = static:5000"
  3. postconf -e "virtual_gid_maps = static:5000"
  4. postconf -e "virtual_mailbox_base = /var/vmail"
  5. postconf -e "virtual_mailbox_maps = proxy:ldap:/etc/postfix/virtual_mailbox_maps.cf"
  1. nano /etc/postfix/virtual_mailbox_maps.cf
  2. server_host = dc.example.tld
  3. server_port = 389
  4. version = 3
  5. bind = yes
  6. start_tls = no
  7. bind_dn = postfix@example.tld
  8. bind_pw = P@s$w0rd.345
  9. search_base = OU=ACME,DC=example,DC=tld
  10. scope = sub
  11. query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
  12. result_attribute = mail
  13. result_format = %d/%u/Maildir/
  14. debuglevel = 0

Definir listas, aliases y forwardings virtuales de correo electrónico.

  1. postconf -e "virtual_alias_maps = proxy:ldap:/etc/postfix/virtual_list_maps.cf, proxy:ldap:/etc/postfix/virtual_alias_maps.cf, proxy:ldap:/etc/postfix/virtual_forwarding_maps.cf"
  1. nano /etc/postfix/virtual_list_maps.cf
  2. server_host = dc.example.tld
  3. server_port = 389
  4. version = 3
  5. bind = yes
  6. start_tls = no
  7. bind_dn = postfix@example.tld
  8. bind_pw = P@s$w0rd.345
  9. search_base = OU=ACME,DC=example,DC=tld
  10. scope = sub
  11. query_filter = (&(objectClass=group)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
  12. special_result_attribute = member
  13. leaf_result_attribute = mail
  14. debuglevel = 0
  1. nano /etc/postfix/virtual_alias_maps.cf
  2. server_host = dc.example.tld
  3. server_port = 389
  4. version = 3
  5. bind = yes
  6. start_tls = no
  7. bind_dn = postfix@example.tld
  8. bind_pw = P@s$w0rd.345
  9. search_base = OU=ACME,DC=example,DC=tld
  10. scope = sub
  11. query_filter = (&(objectClass=person)(otherMailbox=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
  12. result_attribute = mail
  13. debuglevel = 0
  1. nano /etc/postfix/virtual_forwarding_maps.cf
  2. server_host = dc.example.tld
  3. server_port = 389
  4. version = 3
  5. bind = yes
  6. start_tls = no
  7. bind_dn = postfix@example.tld
  8. bind_pw = P@s$w0rd.345
  9. search_base = OU=ACME,DC=example,DC=tld
  10. scope = sub
  11. query_filter = (&(objectClass=person)(mail=%s)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
  12. result_attribute = mail, pager
  13. debuglevel = 0

NOTA: Los atributos otherMailbox y pager pueden editarse utilizando el comando samba-tool user edit <username> o mediante las herramientas administrativas GUI RSAT, Apache Directory Studio o AD-webmanager..

Habilitar puerto seguro TCP\587 Submission y establecer comunicación con dovecot.

  1. nano /etc/postfix/master.cf
  2. submission inet n - y - 10 smtpd
  3. -o syslog_name=postfix/submission
  4. -o smtpd_tls_security_level=encrypt
  5. -o smtpd_sasl_auth_enable=yes
  6. -o smtpd_tls_cert_file=/etc/ssl/certs/exampleMail.crt
  7. -o smtpd_tls_key_file=/etc/ssl/private/exampleMail.key
  8. -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  9. dovecot unix - n n - - pipe
  10. flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/dovecot-lda -f ${sender} -d ${recipient}

NOTA: Los principales ficheros de configuración pueden obtenerse en main.cf y master.cf.

Comprobaciones

  1. postmap -q leonard@example.tld ldap:/etc/postfix/virtual_sender_login_maps.cf
  2. postmap -q rajesh@example.tld ldap:/etc/postfix/virtual_mailbox_maps.cf
  3. postmap -q everyone@example.tld ldap:/etc/postfix/virtual_list_maps.cf
  4. postmap -q postmaster@example.tld ldap:/etc/postfix/virtual_alias_maps.cf
  5. postmap -q sheldon@example.tld ldap:/etc/postfix/virtual_forwarding_maps.cf

Reiniciar el servicio.

  1. systemctl restart postfix

Configuración del servicio Dovecot

  • Realizar salva de seguridad del fichero de configuración principal.
  1. cp /etc/dovecot/dovecot.conf{,.org}
  • Crear script de alerta de sobreuso de cuota y asignar permiso
    de ejecución.
  1. nano /usr/local/bin/quota-warning
  2. #!/bin/bash
  3. PERCENT=${1}
  4. USER=${2}
  5. DOMAIN=${USER#*@}
  6. cat << EOT | /usr/lib/dovecot/dovecot-lda -d ${USER} -o "plugin/quota=maildir:User quota:noenforcing"
  7. From: no-reply@${DOMAIN}
  8. Subject: ALERTA: USO DE CUOTA SUPERIOR AL ${PERCENT}%
  9. ESTIMADO(A) USUARIO(A),
  10. SU BUZON DE CORREO ACTUALMENTE OCUPA MAS DEL ${PERCENT}% DE LA CUOTA
  11. ASIGNADA. BORRE ALGUNOS CORREOS VIEJOS PARA PODER SEGUIR RECIBIENDO
  12. EMAILS.
  13. MENSAJE AUTOMATIZADO DEL SISTEMA
  14. EOT
  15. exit 0
  1. chmod +x /usr/local/bin/quota-warning

Integración con Samba AD DC

  1. nano /etc/dovecot/dovecot.conf
  2. userdb {
  3. args = /etc/dovecot/dovecot-ldap.conf
  4. driver = ldap
  5. }
  6. passdb {
  7. args = /etc/dovecot/dovecot-ldap.conf
  8. driver = ldap
  9. }

NOTA: El fichero de configuración completo puede obtenerse en dovecot.conf.

  1. nano /etc/dovecot/dovecot-ldap.conf
  2. hosts = dc.example.tld:389
  3. auth_bind = yes
  4. ldap_version = 3
  5. dn = postfix@example.tld
  6. dnpass = P@s$w0rd.345
  7. base = OU=ACME,DC=example,DC=tld
  8. deref = never
  9. scope = subtree
  10. user_filter = (&(objectClass=person)(mail=%u)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
  11. user_attrs = maxStorage=quota_rule=*:bytes=%$
  12. pass_filter = (&(objectClass=person)(mail=%u)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))
  13. pass_attrs = userPassword=password
  14. default_pass_scheme = CRYPT

NOTA: El atributo maxStorage puede editarse utilizando el comando samba-tool user edit <username> o mediante las herramientas administrativas GUI RSAT, Apache Directory Studio o AD-webmanager.

Reiniciar el servicio.

  1. systemctl restart dovecot

Configuración del servicio Webmail

Roundcubemail

Descargar la última versión completa estable, disponible en el sitio Roundcube Webmail Downloads; descomprimir el paquete en el sistema y asignar permisos.

  1. tar -xzmf roundcubemail-*-complete.tar.gz -C /opt/
  2. mv /opt/roundcubemail-* /opt/roundcube
  3. ln -s /opt/roundcube/bin/{cleandb,gc}.sh /etc/cron.daily/
  4. chown -R root:www-data /opt/roundcube/
  5. find /opt/roundcube/ -type d \-exec chmod 0755 {} \;
  6. find /opt/roundcube/ -type f \-exec chmod 0644 {} \;
  7. chmod 0770 /opt/roundcube/{logs,temp}

Actualización

  1. tar -xzf roundcubemail-*-complete.tar.gz
  2. cd roundcubemail-*/
  3. ./bin/installto.sh /opt/roundcube/

PostgreSQL

Instalar gestor de base de datos PostgreSQL.

  1. apt install postgresql

Crear base de datos para roundcubemail.

  1. su - postgres
  2. psql
  3. \password postgres
  4. CREATE DATABASE roundcubemail WITH TEMPLATE template0 ENCODING 'UNICODE';
  5. \q

Inicializar la base de datos.

  1. psql -h localhost -U postgres -W -f /opt/roundcube/SQL/postgres.initial.sql roundcubemail

Nginx

Instalar servidor web Nginx.

  1. apt install nginx-full php-{fpm,pear,mbstring,intl,ldap,gd,imagick,pgsql,curl,json,xml,bz2,zip}

Definir zona horaria.

  1. sed -i "s/^;date\.timezone =.*$/date\.timezone = 'America\/Havana'/;
  2. s/^;cgi\.fix_pathinfo=.*$/cgi\.fix_pathinfo = 0/" \
  3. /etc/php/7*/fpm/php.ini

Crear fichero de publicación web.

  1. nano /etc/nginx/sites-available/roundcube
  2. proxy_cache_path /tmp/cache keys_zone=cache:10m levels=1:2 inactive=600s max_size=100m;
  3. server {
  4. listen 80;
  5. server_name webmail.example.tld;
  6. return 301 https://webmail.example.tld:443$request_uri;
  7. }
  8. server {
  9. listen 443 ssl;
  10. root /opt/roundcube;
  11. server_name webmail.example.tld;
  12. ssl_certificate /etc/ssl/certs/exampleMail.crt;
  13. ssl_certificate_key /etc/ssl/private/exampleMail.key;
  14. ssl_dhparam /etc/ssl/dh2048.pem;
  15. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  16. ssl_prefer_server_ciphers on;
  17. ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
  18. ssl_ecdh_curve secp384r1;
  19. ssl_session_cache shared:SSL:10m;
  20. ssl_session_tickets off;
  21. ssl_stapling_verify on;
  22. ssi on;
  23. http2 on;
  24. resolver 127.0.0.1 valid=300s;
  25. resolver_timeout 5s;
  26. add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
  27. add_header X-Content-Type-Options nosniff;
  28. proxy_cache cache;
  29. proxy_cache_valid 200 1s;
  30. location ~ [^/]\.php(/|$) {
  31. fastcgi_split_path_info ^(.+?\.php)(/.*)$;
  32. if (!-f $document_root$fastcgi_script_name) {
  33. return 404;
  34. }
  35. fastcgi_param HTTP_PROXY "";
  36. fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
  37. include snippets/fastcgi-php.conf;
  38. }
  39. location ~ /\. {
  40. deny all;
  41. }
  42. location = /favicon.ico {
  43. log_not_found off;
  44. access_log off;
  45. }
  46. location = /robots.txt {
  47. access_log off;
  48. log_not_found off;
  49. }
  50. location / {
  51. index index.php;
  52. location ~ ^/favicon.ico$ {
  53. root /opt/roundcube/skins/larry/images;
  54. log_not_found off;
  55. access_log off;
  56. expires max;
  57. }
  58. location ~ ^/(bin|SQL|config|temp|logs)/ {
  59. deny all;
  60. }
  61. location ~ ^/(README|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {
  62. deny all;
  63. }
  64. location ~ ^/(.+\.md)$ {
  65. deny all;
  66. }
  67. location ~ ^/program/resources/(.+\.pdf)$ {
  68. deny all;
  69. log_not_found off;
  70. access_log off;
  71. }
  72. location ~ ^/\. {
  73. deny all;
  74. access_log off;
  75. log_not_found off;
  76. }
  77. }
  78. access_log /var/log/nginx/roundcube_access.log;
  79. error_log /var/log/nginx/roundcube_error.log;
  80. }

Habilitar y reiniciar el servicio.

  1. ln -s /etc/nginx/sites-available/roundcube /etc/nginx/sites-enabled/
  2. systemctl restart nginx

Apache2

Instalar servidor web Apache2.

  1. apt install apache2 libapache2-mod-php php-{pear,mbstring,intl,ldap,gd,imagick,pgsql,curl,json,xml,bz2,zip}

Definir zona horaria.

  1. sed -i "s/^;date\.timezone =.*$/date\.timezone = 'America\/Havana'/;
  2. s/^;cgi\.fix_pathinfo=.*$/cgi\.fix_pathinfo = 0/" \
  3. /etc/php/7*/apache2/php.ini

Crear fichero de publicación web.

  1. nano /etc/apache2/sites-available/roundcube.conf
  2. <VirtualHost *:80>
  3. ServerName webmail.example.tld
  4. Redirect permanent / https://webmail.example.tld/
  5. </VirtualHost>
  6. <IfModule mod_ssl.c>
  7. <VirtualHost *:443>
  8. ServerName webmail.example.tld
  9. ServerAdmin webmaster@example.tld
  10. DocumentRoot /opt/roundcube
  11. DirectoryIndex index.php
  12. ErrorLog ${APACHE_LOG_DIR}/roundcube_error.log
  13. CustomLog ${APACHE_LOG_DIR}/roundcube_access.log combined
  14. SSLEngine on
  15. SSLCertificateFile /etc/ssl/certs/exampleMail.crt
  16. SSLCertificateKeyFile /etc/ssl/private/exampleMail.key
  17. <FilesMatch "\.(cgi|shtml|phtml|php)$">
  18. SSLOptions +StdEnvVars
  19. </FilesMatch>
  20. <Directory /usr/lib/cgi-bin>
  21. SSLOptions +StdEnvVars
  22. </Directory>
  23. BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
  24. BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
  25. <Directory /opt/roundcube>
  26. Options +FollowSymlinks
  27. AllowOverride All
  28. Require all granted
  29. SetEnv HOME /opt/roundcube
  30. SetEnv HTTP_HOME /opt/roundcube
  31. <IfModule mod_dav.c>
  32. Dav off
  33. </IfModule>
  34. </Directory>
  35. <Directory /opt/roundcube/program/resources>
  36. <FilesMatch "\.(pdf)$">
  37. Require all denied
  38. </FilesMatch>
  39. </Directory>
  40. </VirtualHost>
  41. </IfModule>

Habilitar y reiniciar el servicio.

  1. a2ensite roundcube.conf
  2. systemctl restart apache2

Integración con Samba AD DC

  1. nano /opt/roundcube/config/config.inc.php
  1. // Database
  2. $config['db_dsnw'] = 'pgsql://postgres:<postgres_user_password>@localhost/roundcubemail';
  3. // Samba AD DC Address Book
  4. $config['autocomplete_addressbooks'] = array(
  5. 'sql',
  6. 'global_ldap_abook'
  7. );
  8. $config['ldap_public']["global_ldap_abook"] = array(
  9. 'name' => 'Global Address Book',
  10. 'hosts' => array('dc.example.tld'),
  11. 'port' => 389,
  12. 'use_tls' => false,
  13. 'ldap_version' => '3',
  14. 'network_timeout' => 10,
  15. 'user_specific' => false,
  16. 'base_dn' => 'OU=ACME,DC=example,DC=tld',
  17. 'bind_dn' => 'postfix@example.tld',
  18. 'bind_pass' => 'P@s$w0rd.345',
  19. 'writable' => false,
  20. 'search_fields' => array(
  21. 'mail',
  22. 'cn',
  23. 'sAMAccountName',
  24. 'displayName',
  25. 'sn',
  26. 'givenName',
  27. ),
  28. 'fieldmap' => array(
  29. 'name' => 'cn',
  30. 'displayname' => 'displayName',
  31. 'surname' => 'sn',
  32. 'firstname' => 'givenName',
  33. 'title' => 'title',
  34. 'email' => 'mail:*',
  35. 'phone:work' => 'telephoneNumber',
  36. 'phone:mobile' => 'mobile',
  37. 'phone:workfax' => 'facsimileTelephoneNumber',
  38. 'street' => 'street',
  39. 'zipcode' => 'postalCode',
  40. 'locality' => 'l',
  41. 'department' => 'department',
  42. 'notes' => 'description',
  43. 'photo' => 'jpegPhoto',
  44. ),
  45. 'sort' => 'cn',
  46. 'scope' => 'sub',
  47. 'filter' => '(&(mail=*)(|(objectclass=person)(objectClass=group))(!(mail=archive@example.tld))(!(userAccountControl:1.2.840.113556.1.4.803:=2))(!(objectClass=computer)))',
  48. 'fuzzy_search' => true,
  49. 'vlv' => false,
  50. 'sizelimit' => '0',
  51. 'timelimit' => '0',
  52. 'referrals' => false,
  53. 'group_filters' => array(
  54. 'lists' => array(
  55. 'name' => 'Lists',
  56. 'scope' => 'sub',
  57. 'base_dn' => 'OU=Email,OU=ACME,DC=example,DC=tld',
  58. 'filter' => '(objectClass=group)',
  59. ),
  60. ),
  61. );

NOTA: El fichero de configuración completo puede obtenerse en config.inc.php.

Comandos y herramientas útiles

  • samba-tool (herramienta principal para administración samba)
  • testparam|samba-tool testparm (chequeo errores de configuración samba)
  • wbinfo (consultar información utilizando windbind)
  • pdbedit (manipular base datos de usuarios samba)
  • ldapsearch (consultar servicios de directorios LDAP)
  • dhcpd -t (chequeo errores de configuración isc-dhcp-server)
  • RSAT (herramientas administración servidor remoto windows)
  • Apache Directory Studio (herramienta administración servicios de directorio LDAP)
  • named-checkconf (chequeo errores de configuración bind9)
  • squid -kp (chequeo errores de configuración squid)
  • postconf (herramienta principal de configuración postfix)
  • postfix check (chequeo errores de configuración postfix)
  • doveconf -n (muestra los parámetros configurados)
  • nginx -t (chequeo errores de configuración nginx)
  • apache2ctl configtest (chequeo errores de configuración apache2)

Consideraciones finales

Todas las configuraciones expuestas en esta guía han sido probadas satisfactoriamente -si los pasos descritos se siguen a cabalidad-, en contenedores (CT) y máquinas virtuales (VM), gestionadas con Proxmox v6/v7.

Los CT que ejecuten servicios que utilicen autenticación kerberos, deben crearse con las características fuse, nesting y la opción Unprivileged mode desmarcada.

En CT para que el servidor Samba AD DC funcione correctamente; además de lo descrito en el párrafo anterior, debe activarse la característica cifs.

Para un correcto funcionamiento del servidor NTP en CT se debe eliminar la restricción de acceso al reloj del sistema, editando el fichero de configuración del contendor y agregando las líneas lxc.cap.drop: y lxc.cap.drop: mac_admin mac_override sys_module sys_rawio sys_time, al final. Ejemplo:

  1. nano /etc/pve/lxc/101.conf
  2. arch: amd64
  3. cores: 1
  4. features: fuse=1,nesting=1
  5. hostname: dc
  6. memory: 768
  7. nameserver: 127.0.0.1
  8. net0: name=eth0,bridge=vmbr0,gw=192.168.0.254,hwaddr=00:00:00:00:00:00,ip=192.168.0.1/24,type=veth
  9. ostype: debian
  10. rootfs: local-lvm:vm-101-disk-0,size=10G
  11. searchdomain: example.tld
  12. swap: 1024
  13. lxc.cap.drop:
  14. lxc.cap.drop: mac_admin mac_override sys_module sys_rawio sys_time

La integración de los servicios descritos en esta guía, también son funcionales con el servicio de directorio Active Directory de Microsoft Windows.

NOTA: Siempre es recomendable disponer con más de un servidor Controlador de Dominio. A tales efectos, puede consultarse Installing and configuring a secondary Samba-AD on Debian10.

A diferencia de Microsoft Active Directory, Samba AD DC habilita el soporte LDAP STARTTLS y LDAPS de forma predeterminada. Durante el aprovisionamiento se genera un certificado autofirmado, que debe ser reemplazado con uno válido dentro de la organización si se quiere explotar correctamente esta funcionalidad. Entonces, solo restaría agregar al fichero /etc/samba/smb.conf en la sección [global], lo siguiente:

  1. tls enabled = yes
  2. tls keyfile = /etc/samba/tls/dc.example.tld.key
  3. tls certfile = /etc/samba/tls/dc.example.tld.crt
  4. tls cafile = /etc/samba/tls/example.tld_CA.crt

NOTA: En las Referencias encontrará enlaces a sitios sobre cómo crear una Entidad Certificadora para su organización.

Referencias

Samba AD DC+Bind9 DNS Server+NTP+DHCP

Squid Proxy Server

ejabberd XMPP Server

Postfix/Dovecot/Roundcube Mail Server

Proxmox VE

Entidad Certificadora