Un blog mas

Bitácora de vuelo

Certbot es una herramienta para administrar certificados de manera automatizada desarrollado por la EFF (Electronic Frontier Foundation) como cliente oficial de la CA de Let’s Encrypt. La instalación en Ubuntu es muy sencilla:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-apache

Generar el certificado

$ sudo certbot certonly --manual -d pablo.sarubbi.com.ar

Con el parámetro -d se pueden agregar mas dominios separados por espacios.
El sistema nos advierte que va intentar leer archivo con el siguiente nombre y contenido para validar nuestra propiedad.

-------------------------------------------------------------------------------
Create a file containing just this data:
 
NHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E.8Ep8-mh5ETXinamOr3Z3pd6qmlRiLklJy-lpP4Q64SI
 
And make it available on your web server at this URL:
 
http://pablo.sarubbi.com.ar/.well-known/acme-challenge/NHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E
 
-------------------------------------------------------------------------------
Press Enter to Continue

Durante este proceso debemos crear el archivo con el nombre, ubicación y contenido exacto que nos define, y luego continuar con el proceso para que verifique su existencia. Hay que estar atentos porque el último paso comprueba directamente las URLs y si no fueron creadas, tendremos que ejecutar nuevamente el procedimiento.

$ sudo mkdir -p .well-known/acme-challenge/
$ sudo echo NHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E.8Ep8-mh5ETXinamOr3Z3pd6qmlRiLklJy-lpP4Q64SI > .well-known/acme-challenge/JNHhlywEu46fGY0YLEAIiFFeeNNEQfS0pwJbiUkjqM-E
-------------------------------------------------------------------------------
Press Enter to Continue
Waiting for verification...
Cleaning up challenges
 
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/sarubbi.com.ar/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/sarubbi.com.ar/privkey.pem
   Your cert will expire on 2018-01-28. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:
 
   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
-------------------------------------------------------------------------------

Como bien dice el log, se generaron 3 archivos con el certificado, la clave privada y el CA con caducidad de seis meses. Resta apuntar correctamente el archivo de configuración del Apache a los que generamos recientemente:

<VirtualHost *:443>
 
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/sarubbi.com.ar/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/sarubbi.com.ar/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/sarubbi.com.ar/chain.pem
$ sudo service apache2 restart

Modificando el WordPress

Antes que nada debemos exportar la BBDD para reapuntar todos los links internos a la nueva URL con el https delante. Lo mas conveniente es trabajar sobre una BBDD nueva, en este caso la crearemos con el nombre wp_saru_seg y los mismos permisos de acceso. Generamos un backup de la base original y reemplazamos todas las URLs no seguras por el nuevo dominio con https. Importamos nuevamente el archivo sobre la base wp_saru_seg a la cual apuntaremos el WordPress en un paso futuro.

mysqldump --skip-dump-date -uadmin -p wp_saru > bkp_saru.sql
sed -i -e 's/http:\/\/pablo.sarubbi.com.ar/https:\/\/pablo..com.ar/g' bkp_saru.sql 
mysql -uadmin -p wp_saru_seg < wp_saru.sql

Copiamos todos los archivos manteniendo los permisos y solo para estar seguros, verificamos que no haya quedado ninguna URL apuntando al sitio viejo.

cp -a /var/www/httpdocs/* /var/www/httpsdocs/
find /var/www/httpsdocs/ -type f -name "*.php" | xargs grep http://pablo.sarubbi.com.ar

Cambiamos el archivo de configuración para que apunte a la nueva BBDD y si todo anda bien podemos eliminar el sitio no seguro y la base de datos original.

$ rm -R /var/www/httpdocs/*
$ sed -i -e 's/wp_saru/wp_saru_seg/g' /var/www/httpsdocs/wp-config.php

Nos resta redirigir el trafico a las URLs que teniamos antes para que tengan como destino el sitio seguro. Esto lo hacemos mediante un Redirect en el .htaccess

echo "Redirect 301 / https://pablo.sarubbi.com.ar/" > /var/www/httpdocs/.htaccess

Con un poco de suerte y muy poco tiempo tenés configurado tu WordPress en un dominio con SSL y disponible por https://, en tu servidor Linux.

Gracias al aporte de Paulino Calderon (@calderpwn) tenemos disponible desde hace unas horas un script para sumar a nuestra colección en nmap que nos permite con un solo comando escanear la red y descubrir aquellos equipos que podrían ser afectados por el último ransomware WannaCry.

Lo que hace este script es conectarse al $IPC y ejecutar una transacción sobre FID 0 para verificar el error “STATUS_INSUFF_SERVER_RESOURCES” y así determinar si el equipo fue parcheado o no contra MS17-010.

El único requerimiento (además de un nmap actualizado) es descargar el script de github y copiarlo al directorio /scripts

wget https://raw.githubusercontent.com/cldrn/nmap-nse-scripts/master/scripts/smb-vuln-ms17-010.nse
mv smb-vuln-ms17-010.nse /opt/nmap-7.40/scripts/
sudo ./nmap -sC -p445 --open --max-hostgroup 3 --script smb-vuln-ms17-010.nse 192.168.1.0/24

Un ejemplo de equipo vulnerable retornaría algo similar a:

Nmap scan report for 192.168.1.2
Host is up (0.00079s latency).
PORT    STATE SERVICE
445/tcp open  microsoft-ds
 
Host script results:
| smb-vuln-ms17-010: 
|   VULNERABLE:
|   Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
|     State: VULNERABLE
|     IDs:  CVE:CVE-2017-0143
|     Risk factor: HIGH
|       A critical remote code execution vulnerability exists in Microsoft SMBv1
|        servers (ms17-010).
|       
|     Disclosure date: 2017-03-14
|     References:
|       https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
|       https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
|_      https://technet.microsoft.com/en-us/library/security/ms17-010.aspx

Para solucionar esta vulnerabilidad debemos aplicar los parches que tan gentilmente nos ofrece Microsoft tanto para los sistemas mantenidos como para los XP y 2003.

Para Windows XP y 2003 descargar y aplicar los siguientes parches de seguridad (requiere reinicio)
https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/?utm_content=buffer8d9ab&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer

Para las versiones actuales de Windows descargar y aplicar los siguientes parches de seguridad (requiere reinicio)
https://technet.microsoft.com/en-us/library/security/ms17-010.aspx

Actualización:
Si cuando ejecutamos el escaneo obtenemos como respuesta es un error similar al siguiente:

NSE: smb-vuln-ms17-010 against 192.168.1.2 threw an error!
/usr/bin/../share/nmap/scripts/smb-vuln-ms17-010.nse:85: variable 'debug1' is not declared
stack traceback:
        [C]: in function 'error'
        /usr/bin/../share/nmap/nselib/strict.lua:80: in function '__index'
        /usr/bin/../share/nmap/scripts/smb-vuln-ms17-010.nse:85: in function 'check_ms17010'
        /usr/bin/../share/nmap/scripts/smb-vuln-ms17-010.nse:160: in function </usr/bin/../share/nmap/sc...

Es probable que necesitemos actualizar el nmap, tarea relativamente sencilla siguiendo estos pasos:

wget https://nmap.org/dist/nmap-7.40.tar.bz2
bzip2 -cd nmap-7.40.tar.bz2 | tar xvf -
cd nmap-7.40
./configure
make
sudo make install

Instalando Davmail

DavMail es un gateway que nos permite utilizar cualquier cliente de correo y/o calendario con un servidor MS Exchange, incluso compartiendo la libreta de direcciones del usuario LDAP. Este objetivo lo logra convirtiendose en un intermediario entre el cliente y el servidor Exchange Propietario, donde proporciona una serie de protocolos estándars como LDAP (libreta de direcciones), IMAP, POP, CALDAV (calendario) y CARDAV (contactos personales).

DavMail está desarrollado en Java, lo que lo hace multiplataforma, y puede correr de manera local o sirviendo varias conexiones. Nosotros lo instalaremos en un servidor Ubuntu 16.04 Server. Como pre-requisito debemos instalar las Runtime de Java.

sudo apt-get install default-jre libswt-gtk-3-java libswt-cairo-gtk-3-jni

y luego descargar de SourceForge el .deb de la última versión disponible (hoy la 4.7.3).

wget http://sourceforge.net/projects/davmail/files/davmail/4.7.3/davmail_4.7.3-2438-1_all.deb
sudo dpkg -i davmail_4.7.3-2438-1_all.deb

si todo va bien y no tenemos errores en la instalación (que no serían mas que alguna dependencia incumplida) deberíamos estar en condiciones de ejecutar DavMail. Con interface gráfica un icono en la barra de tareas nos ayuda a editar el archivo de configuraciones, pero como nos gusta la terminal, crearemos el mismo a partir del siguiente template:

sudo touch /etc/davmail.properties

y pegamos el siguiente código:

# DavMail settings, see http://davmail.sourceforge.net/ for documentation
 
#############################################################
# Basic settings
 
# Server or workstation mode
davmail.server=true
# connection mode auto, EWS or WebDav
davmail.enableEws=auto
# base Exchange OWA or EWS url
davmail.url=https://owa.example.com/owa/
 
# Listener ports
davmail.caldavPort=1080
davmail.imapPort=1143
davmail.ldapPort=1389
#davmail.popPort=1110
davmail.smtpPort=1025
 
#############################################################
# Network settings
 
# Network proxy settings
davmail.enableProxy=false
davmail.useSystemProxies=false
davmail.proxyHost=
davmail.proxyPort=
davmail.proxyUser=
davmail.proxyPassword=
 
# proxy exclude list
davmail.noProxyFor=
 
# allow remote connection to DavMail
davmail.allowRemote=true
# bind server sockets to a specific address
davmail.bindAddress=
# client connections SO timeout in seconds
davmail.clientSoTimeout=
 
# DavMail listeners SSL configuration
davmail.ssl.keystoreType=
davmail.ssl.keystoreFile=
davmail.ssl.keystorePass=
davmail.ssl.keyPass=
 
# Accept specified certificate even if invalid according to trust store
davmail.server.certificate.hash=
 
# disable SSL for specified listeners
davmail.ssl.nosecurecaldav=false
davmail.ssl.nosecureimap=false
davmail.ssl.nosecureldap=false
davmail.ssl.nosecurepop=false
davmail.ssl.nosecuresmtp=false
 
# disable update check
davmail.disableUpdateCheck=true
 
# Send keepalive character during large folder and messages download
davmail.enableKeepalive=false
# Message count limit on folder retrieval
davmail.folderSizeLimit=0
# Default windows domain for NTLM and basic authentication
davmail.defaultDomain=
 
#############################################################
# Caldav settings
 
# override default alarm sound
davmail.caldavAlarmSound=
# retrieve calendar events not older than 90 days
davmail.caldavPastDelay=90
# WebDav only: force event update to trigger ActiveSync clients update
davmail.forceActiveSyncUpdate=false
 
#############################################################
# IMAP settings
 
# Delete messages immediately on IMAP STORE \Deleted flag
davmail.imapAutoExpunge=true
# Enable IDLE support, set polling delay in minutes
davmail.imapIdleDelay=
# Always reply to IMAP RFC822.SIZE requests with Exchange approximate message size for performance reasons
davmail.imapAlwaysApproxMsgSize=
 
#############################################################
# POP settings
 
# Delete messages on server after 30 days
davmail.keepDelay=30
# Delete messages in server sent folder after 90 days
davmail.sentKeepDelay=90
# Mark retrieved messages read on server
davmail.popMarkReadOnRetr=false
 
#############################################################
# SMTP settings
 
# let Exchange save a copy of sent messages in Sent folder
davmail.smtpSaveInSent=true
 
#############################################################
# Loggings settings
 
# log file path, leave empty for default path
davmail.logFilePath=/var/log/davmail.log
# maximum log file size, use Log4J syntax, set to 0 to use an external rotation mechanism, e.g. logrotate
davmail.logFileSize=1MB
# log levels
log4j.logger.davmail=WARN
log4j.logger.httpclient.wire=WARN
log4j.logger.org.apache.commons.httpclient=WARN
log4j.rootLogger=WARN
 
#############################################################
# Workstation only settings
 
# smartcard access settings
davmail.ssl.pkcs11Config=
davmail.ssl.pkcs11Library=
 
# SSL settings for mutual authentication
davmail.ssl.clientKeystoreType=
davmail.ssl.clientKeystoreFile=
davmail.ssl.clientKeystorePass=
 
# disable all balloon notifications
davmail.disableGuiNotifications=false
# disable startup balloon notifications
davmail.showStartupBanner=true
 
# enable transparent client Kerberos authentication
davmail.enableKerberos=false

Nos quedamos con un par de lineas que son las mas relevantes:

davmail.server=true
davmail.allowRemote=true
davmail.url=https://yourcompany.com/owa
davmail.enableEws=auto
davmail.imapPort=993
davmail.smtpPort=465
davmail.ldapPort=636
#davmail.popPort=995
davmail.caldavPort=8443

y lo ejecutamos de la siguiente manera para poder chequear errores con “tail -f nohup.out”:

nohup davmail.sh davmail.properties &

Para agregarlo como un servicio mas creamos un archivo en /etc/init.d/davmail con el siguiente contenido:

#! /bin/sh
### BEGIN INIT INFO
# Provides:          davmail
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: DavMail Exchange gatway
# Description:       A gateway between Microsoft Exchange and open protocols.
    ### END INIT INFO
 
    # Author: Jesse TeKrony <jesse ~at~ jtekrony ~dot~ com>
 
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="Davmail Exchange gateway"
    NAME=davmail
    CONFIG=/etc/davmail.properties
    DAEMON=/usr/bin/$NAME
    DAEMON_ARGS="$CONFIG"
    PIDFILE=/var/run/$NAME.pid
    SCRIPTNAME=/etc/init.d/$NAME
    LOGFILE=/var/log/davmail.log
 
    # Exit if the package is not installed
    [ -x "$DAEMON" ] || exit 0
 
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
 
    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
 
    # Define LSB log_* functions
    . /lib/lsb/init-functions
 
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
            || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
            $DAEMON_ARGS >> $LOGFILE 2>&1 &
        [ $? != 0 ] && return 2
        echo $! > $PIDFILE
        exit 0
    }
 
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
        [ "$?" = 2 ] && return 2
        rm -f $PIDFILE
        return "$RETVAL"
    }
 
    case "$1" in
      start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_start
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
      status)
           status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
           ;;
      restart|force-reload)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
            do_start
            case "$?" in
                0) log_end_msg 0 ;;
                1) log_end_msg 1 ;; # Old process is still running
                *) log_end_msg 1 ;; # Failed to start
            esac
            ;;
          *)
            # Failed to stop
            log_end_msg 1
            ;;
        esac
        ;;
      *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart| force-reload}" >&2
        exit 3
        ;;
    esac

Lo marcamos como ejecutable, arrancamos el servicio y lo habilitamos en el arranque:

sudo chmod +x /etc/init.d/davmail
sudo service davmail start
sudo update-rc.d davmail defaults

Un detalle que puede surgir es que sin el entorno gráfico no podremos aceptar el certificado del servidor Exchange con un simple Click, lo que podemos hacer es agregar el fingerprint SHA1 del mismo en el archivo de configuración de DavMail. El fingerprint lo obtenemos con los siguientes comandos:

echo | openssl s_client -connect exchange.mydomain.com.ar:443 |& openssl x509 -fingerprint -noout
 
SHA1 Fingerprint=02:1E:A3:93:6C:A3:02:15:FC:C0:4C:BD:F9:42:79:E4:B6:73:45:23

Ahora si lo agregamos al archivo de configuración:

davmail.server.certificate.hash=2:1E:A3:93:6C:A3:2:15:FC:C0:4C:BD:F9:42:69:E4:B6:73:45:23

Una nota importante es que el hash no debe tener (si existiera) los ceros iniciales, por eso el “02” del primer valor se reemplazara solo por un “2”.

Habilitar cifrado SSL

Para habilitar la comunicación segura es necesario un certificado SSL y una clave privada SSL en formato PEM. Esto es posible adquiriendo uno (en donde ya tendríamos el certificado y clave) o como pretendemos en este post, generando un juego autofirmado. Para eso necesitamos realizar los siguientes pasos:

Generar clave RSA con OpenSSL

sudo openssl genrsa -out /usr/lib/ssl/private/davmail.key 2048
sudo chown root:root /usr/lib/ssl/private/davmail.key
sudo chmod 600 /usr/lib/ssl/private/davmail.key

Crear un CSR o solicitud de firma de certificado SSL

sudo openssl req -new -key /usr/lib/ssl/private/davmail.key -out /usr/lib/ssl/certs/davmail.csr

Este proceso realizará varias preguntas. El campo mas importante es el “Common Name”, donde se establece el nombre de dominio o la dirección IP con el cual accederán los clientes (por ejemplo, davmail.mydomain.com.ar o 123.123.123.123).

Firmamos el CSR utilizando la clave privada, estableciendo la fecha de caducidad con el argumento -days:

sudo openssl x509 -req -signkey /usr/lib/ssl/private/davmail.key -in /usr/lib/ssl/certs/davmail.csr -out /usr/lib/ssl/certs/davmail.crt -days 365

Ya esta el certificado generado con expiración de un año.

Configuración del OpenSSL

Con el certificado generado, lo convertiremos al formato que DavMail entiende (PEM)

sudo -s cat /usr/lib/ssl/private/davmail.key /usr/lib/ssl/certs/davmail.crt > /tmp/davmail.pem
sudo mv /tmp/davmail.pem /usr/lib/ssl/certs/
sudo chown root:root /usr/lib/ssl/certs/davmail.pem
sudo chmod 600 /usr/lib/ssl/certs/davmail.pem
sudo openssl pkcs12 -export -in /usr/lib/ssl/certs/davmail.pem -out /usr/lib/ssl/certs/davmail.p12 -name "davmail"
sudo chown root:root /usr/lib/ssl/certs/davmail.pem
sudo chmod 600 /usr/lib/ssl/certs/davmail.pem

Te pedirá generar una contraseña que no se puede dejar en blanco ya que DavMail no funciona correctamente de esta manera.

Solo resta configurar el DavMail modificando algunos parámetros del archivo de propiedades:

sudo nano /etc/davmail.properties
davmail.ssl.keystoreType=PKCS12
davmail.ssl.keystoreFile=/usr/lib/ssl/certs/davmail.p12
davmail.ssl.keyPass=password
davmail.ssl.keystorePass=password

Donde keyPass y keystorePass toman el mismo valor de contraseña generada en el paso anterior.

Solo resta reiniciar el servicio y verificar su funcionamiento

sudo service davmail restart

Una de las versiones de OpenVAS que tenemos disponible para descargar del sitio oficial es una imagen OVA que corre sobre VirtualBox. Lamentablemente esta imagen viene con un certificado que venció hace semanas y esto hace que el sistema nos retorne un 503 – Service temporarily down. Para solucionar este fallo solo debemos renovar los certificados del servidor y cliente OpenVAS.

Lo primero que debemos hacer es actualizar el sistema completo

# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
# systemctl stop openvas-scanner
# systemctl stop openvas-manager

Generamos el nuevo certificado

# openvas-mkcert -f
-------------------------------------------------------------------------------
                        Creation of the OpenVAS SSL Certificate
-------------------------------------------------------------------------------
 
This script will now ask you the relevant information to create the SSL certificate of OpenVAS.
Note that this information will *NOT* be sent to anybody (everything stays local), but anyone with the ability to connect to your OpenVAS daemon will be able to retrieve this information.
 
 
CA certificate life time in days [1460]: 
Server certificate life time in days [365]: 
Your country (two letter code) [DE]: 
Your state or province name [none]: 
Your location (e.g. town) [Berlin]: 
Your organization [OpenVAS Users United]: 
 
 
-------------------------------------------------------------------------------
                        Creation of the OpenVAS SSL Certificate
-------------------------------------------------------------------------------
 
Congratulations. Your server certificate was properly created.
 
The following files were created:
 
. Certification authority:
   Certificate = /usr/local/var/lib/openvas/CA/cacert.pem
   Private key = /usr/local/var/lib/openvas/private/CA/cakey.pem
 
. OpenVAS Server : 
    Certificate = /usr/local/var/lib/openvas/CA/servercert.pem
    Private key = /usr/local/var/lib/openvas/private/CA/serverkey.pem
 
Press [ENTER] to exit
 
# openvas-mkcert-client -i -n

Con los archivos de claves generados, nos resta obtener el UUID del escaner.

# openvasmd --get-scanners
 
08b69003-5fc2-4037-a479-93b440211c73  OpenVAS Default

Ahora si podemos actualizar los parámetros del servidor con el siguiente comando:

# openvasmd --modify-scanner 08b69003-5fc2-4037-a479-93b440211c73 	
	    --scanner-ca-pub /usr/local/var/lib/openvas/CA/cacert.pem 
	    --scanner-key-pub /usr/local/var/lib/openvas/CA/servercert.pem 
	    --scanner-key-priv /usr/local/var/lib/openvas/private/CA/serverkey.pem

Actualizamos, guardamos y por las dudas, reiniciamos el servidor.

# openvas-nvt-sync
# systemctl start openvas-scanner
# openvasmd --rebuild 
# openvasmd --backup
# systemctl start openvas-manager
# systemctl start gsa

Ahora si deberíamos tener el OpenVAS funcionando como de costumbre.

Suerte!

Un sistema operativo linux puede ser integrado de manera sencilla a un dominio de Active Directory para que este administre los usuarios y grupos, ademas de centralizar el proceso de indentificación, autenticación y autorización de nuestros sistemas.

El primer paso es verificar si contamos con las siguientes aplicaciones. Si es necesario instalarlas, lo hacemos de la siguiente manera:

 
pablo@clienteLinux:~$ sudo apt-get install samba smbclient winbind krb5-user krb5-config libnss-winbind libpam-winbind

Editamos y/o verificamos la configuración de DNS del cliente Linux Ubuntu

 
pablo@clienteLinux:~$ sudo mcedit /etc/resolv.conf
 
nameserver 192.168.0.1		# IP del servidor de DNS primario, el Active Directory Principal
nameserver 192.168.1.1		# IP del servidor de DNS secundario, el Active Directory Alternativo
search miDominio
 
pablo@clienteLinux:~$ sudo mcedit /etc/hosts
 
127.0.0.1	localhost
192.168.0.50	clienteLinux.miDominio	clienteLinux
192.168.0.1	adPrincipal.miDominio	adPrincipal
192.168.1.1	adSecundario.miDominio	adSecundario

Editamos el archivo de configuración del cliente de Kerberos

 
pablo@clienteLinux:~$ sudo mcedit /etc/krb5.conf 
 
[libdefaults]
        default_realm = MIDOMINIO
        clockskew = 300
 
[realms]
        MIDOMINIO = {
            kdc = 192.168.0.1
            kdc = 192.168.1.1
            default_domain = miDominio
            admin_server = 192.168.0.1
            admin_server = 192.168.1.1
        }
 
        miDominio = {
            kdc = 192.168.0.1
            kdc = 192.168.1.1
            default_domain = miDominio
            admin_server = 192.168.0.1
            admin_server = 192.168.1.1
        }
 
[logging]
    kdc = FILE:/var/log/krb5/krb5kdc.log
    admin_server = FILE:/var/log/krb5/kadmind.log
    default = SYSLOG:NOTICE:DAEMON
 
[domain_realm]
    .miDominio = miDominio
    miDominio = miDominio
 
[appdefaults]
    pam = {
        ticket_lifetime = 1d
        renew_lifetime = 1d
        forwardable = true
        proxiable = false
        retain_after_close = false
        minimum_uid = 0
        try_first_pass = true
    }

Debemos crear los tickets Kerberos con el siguiente comando (y respetando el dominio en MAYUSCULA)

 
pablo@clienteLinux:~$ sudo kinit admin@MYDOMINIO

Editamos el archivo de configuración del Samba

 
pablo@clienteLinux:~$ sudo mcedit  /etc/samba/smb.conf
 
[global]
    security = ADS
    netbios name = clienteLinux
    realm = MYDOMINIO
    password server = adPrincipal.miDominio
    workgroup = MYDOMINIO
    log level = 1
    syslog = 0
    idmap uid = 10000-29999
    idmap gid = 10000-29999
    winbind separator = +
    winbind enum users = yes
    winbind enum groups = yes
    template homedir = /home/%D/%U
    template shell = /bin/bash
    client use spnego = yes
    domain master = no
    server string = linux como cliente del Active Directory
    encrypt passwords = yes
    idmap cache time = 30
    idmap negative cache time = 12
    winbind cache time = 30

Agregamos la máquina Linux al dominio

 
pablo@clienteLinux:~$ sudo net ads join -S adPrincipal.miDominio -U admin
 
pablo@clienteLinux:~$ sudo net ads join -S adSecundario.miDominio -U admin

En este punto podemos tener dos errores comunes:

  • Que haya diferencias en la fecha/hora del linux y el controlador de dominio, donde solo deberíamos setear la hora del cliente para que coincida con la del Active Directory.
  • Que exista un registro fijado en el DNS con el mismo nombre, donde solo debemos eliminarlo para que se genere luego automáticamente.

Debemos editar y configurar el NSSwitch para que resuelva por el Active Directory (además de localmente) los usuarios/passwords, grupos y hosts.

 
pablo@clienteLinux:~$ sudo mcedit /etc/nsswitch.conf 
 
passwd:		files winbind
group:		files winbind
shadow:		files winbind
hosts:		files dns winbind
networks: 	files
protocols:      db files
services:       db files
ethers:         db files
rpc:            db files
netgroup:	nis
sudoers:	files

Para configurar el acceso de usuarios del dominio al sistema debemos configurar PAM, editando los siguientes archivos:

 
pablo@clienteLinux:~$ sudo mcedit /etc/pam.d/common-session
 
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022
session sufficient pam_winbind.so
session required pam_unix.so try_first_pass
 
pablo@clienteLinux:~$ sudo mcedit /etc/pam.d/common-password 
 
password sufficient pam_winbind.so
password required pam_unix.so nullok obscure min=4 max=8 md5 try_first_pass
 
pablo@clienteLinux:~$ sudo mcedit /etc/pam.d/common-auth 
 
auth sufficient pam_winbind.so
auth required pam_unix.so nullok_secure try_first_pass
 
pablo@clienteLinux:~$ sudo mcedit /etc/pam.d/common-account 
 
account sufficient pam_winbind.so
account required pam_unix.so try_first_pass

y por último el archivo sudoers desde donde autorizamos a los diferentes usuarios/grupos las acciones permitidas. Mucho cuidado durante esta modificación ya que podríamos quedar “fuera” del sistema. Como ejemplo creamos dos grupos en el AD, uno linuxAdmin con permisos totales, y otro linuxSeg con acceso solo a algunos comandos de manera restringida.

 
pablo@clienteLinux:~$ sudo mcedit /etc/sudoers
 
#                                                                                                                                
# This file MUST be edited with the 'visudo' command as root.                                                                    
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 
# Host alias specification
 
# User alias specification
 
# Cmnd alias specification
 
# User privilege specification
root    ALL=(ALL:ALL) ALL
 
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
 
# Allow members of group sudo to execute any command
%sudo   ALL=(ALL:ALL) ALL
 
# See sudoers(5) for more information on "#include" directives:
 
#includedir /etc/sudoers.d
 
%MYDOMINIO+linuxAdmin ALL=(ALL) ALL
 
%MYDOMINIO+linuxSeg ALL=(ALL) /sbin/iptables -L -n,/usr/bin/less /var/log/*,/usr/sbin/aideinit,/usr/bin/tshark*

Para que el sistema funcione es conveniente reiniciar el sistema y ya podríamos iniciar sesión con el usuario de AD.

 
pablo@clienteLinux:~$ sudo reboot
.
.
.
pablo@otroClienteLinux:~$ ssh -l pablo@myDominio clienteLinux 2222
 
pablo@MYDOMINIO@clienteLinux\'s password: 
Last login: Wed Apr 27 10:21:09 2016 from 192.168.0.55
MYDOMINIO+pablo@clienteLinux:~$

Como información adicional, les dejo la ayuda del comando wbinfo con el que podemos extraer información variada del controlador de domino, como ser usuarios, grupos, uids, etc..

 
pablo@clienteLinux:~$ wbinfo   
Usage: wbinfo [OPTION...]
  -u, --domain-users                    Lists all domain users
  -g, --domain-groups                   Lists all domain groups
  -N, --WINS-by-name=NETBIOS-NAME       Converts NetBIOS name to IP
  -I, --WINS-by-ip=IP                   Converts IP address to NetBIOS name
  -n, --name-to-sid=NAME                Converts name to sid
  -s, --sid-to-name=SID                 Converts sid to name
      --sid-to-fullname=SID             Converts sid to fullname
  -R, --lookup-rids=RIDs                Converts RIDs to names
      --lookup-sids=Sid-List            Converts SIDs to types and names
  -U, --uid-to-sid=UID                  Converts uid to sid
  -G, --gid-to-sid=GID                  Converts gid to sid
  -S, --sid-to-uid=SID                  Converts sid to uid
  -Y, --sid-to-gid=SID                  Converts sid to gid
      --allocate-uid                    Get a new UID out of idmap
      --allocate-gid                    Get a new GID out of idmap
      --set-uid-mapping=UID,SID         Create or modify uid to sid mapping in idmap
      --set-gid-mapping=GID,SID         Create or modify gid to sid mapping in idmap
      --remove-uid-mapping=UID,SID      Remove uid to sid mapping in idmap
      --remove-gid-mapping=GID,SID      Remove gid to sid mapping in idmap
      --sids-to-unix-ids=Sid-List       Translate SIDs to Unix IDs
  -t, --check-secret                    Check shared secret
  -c, --change-secret                   Change shared secret
  -P, --ping-dc                         Check the NETLOGON connection
  -m, --trusted-domains                 List trusted domains
      --all-domains                     List all domains (trusted and own domain)
      --own-domain                      List own domain
      --sequence                        Deprecated command, see --online-status
      --online-status                   Show whether domains are marked as online or offline
  -D, --domain-info=STRING              Show most of the info we have about the domain
  -i, --user-info=USER                  Get user info
      --uid-info=UID                    Get user info from uid
      --group-info=GROUP                Get group info
      --user-sidinfo=SID                Get user info from sid
      --gid-info=GID                    Get group info from gid
  -r, --user-groups=USER                Get user groups
      --user-domgroups=SID              Get user domain groups
      --sid-aliases=SID                 Get sid aliases
      --user-sids=SID                   Get user group sids for user SID
  -a, --authenticate=user%password      authenticate user
      --pam-logon=user%password         do a pam logon equivalent
      --logoff                          log off user
      --logoff-user=STRING              username to log off
      --logoff-uid=INT                  uid to log off
      --set-auth-user=user%password     Store user and password used by winbindd (root only)
      --ccache-save=user%password       Store user and password for ccache operation
      --getdcname=domainname            Get a DC name for a foreign domain
      --dsgetdcname=domainname          Find a DC for a domain
      --dc-info=domainname              Find the currently known DCs
      --get-auth-user                   Retrieve user and password used by winbindd (root only)
  -p, --ping                            Ping winbindd to see if it is alive
      --domain=domain                   Define to the domain to restrict operation
  -K, --krb5auth=user%password          authenticate user using Kerberos
      --separator                       Get the active winbind separator
      --verbose                         Print additional information per command
      --change-user-password=STRING     Change the password for a user
      --ntlmv2                          Use NTLMv2 cryptography for user authentication
      --lanman                          Use lanman cryptography for user authentication
 
Help options:
  -?, --help                            Show this help message
      --usage                           Display brief usage message
 
Common samba options:
  -V, --version                         Print version

Fuentes:

Stop SOPA