Agregar un Ubuntu Server a un Dominio Active Directory.

A. Contexto.

Paso a paso para registrar un servidor Ubuntu Server 22.04.1 en un Dominio Active Directory, corriendo en un Windows Server 2022 y nivel funcional de Windows Server 2016.

La idea es usar los mismos usuarios de dominio para iniciar sesión en Ubuntu Server. También se busca que los usuarios que pertenezcan al grupo Admins. del dominio tengan permisos de super usuario.

En este caso, utilizaré el dominio que utilizo en mi casa: 302.cl

B. Previo.

Originalmente al configurar por primera vez el Ubuntu Server, se nos pide indicar un nombre de equipo. Este campo no permite ingresar puntos, por lo cual solo nos permite escribir una palabra.

Al momento de escribir este manual, noté que al registrar el Ubuntu Server en el Active Directory, el campo Nombre DNS queda establecido con el nombre del equipo, pero sin completar el dominio. Esto trae un problema al momento utilizar el registro DNS del Active Directory.

Ejemplo de cómo se registra el campó Nombre DNS en un equipo con Windows Server y un equipo con Ubuntu Server

Debido a lo anterior, es necesario cambiar el hostname del Ubuntu Server agregando el nombre del dominio al final.

C. Pasos.

1. Cambiar el hostname del servidor.

sudo nano /etc/hostname

Agregar el dominio al final del hostname y guardar el archivo.

Y reiniciar el servidor.

sudo reboot

2. Instalar los paquetes necesarios para unir el Ubuntu Server al dominio.

sudo apt install realmd sssd sssd-tools samba-common krb5-user packagekit samba-common-bin samba-libs adcli ntp

3. Durante la instalación de los paquetes, se solicitará ingresar el dominio al cual debe registrarse el servidor.

Este paso podría no aparecer al declarar el dominio en el archivo /etc/hostname.

4. Luego del paso anterior, solicitará reiniciar el siguiente servicio.

5. Ingresar al dominio, utilizando un usuario con permisos de administrador.

sudo realm join 302.cl -U 'nicolas' -v

Resultado:

6. Para que se puedan crear automáticamente los directorios home de los usuarios que inicien sesión en el Ubuntu Server, se debe modificar el archivo /usr/share/pam-configs/mkhomedir mediante el siguiente comando.

sudo bash -c "cat > /usr/share/pam-configs/mkhomedir" <<EOF
Name: activate mkhomedir
Default: yes
Priority: 900
Session-Type: Additional
Session:
        required                        pam_mkhomedir.so umask=0022 skel=/etc/skel
EOF

Y posteriormente el siguiente.

sudo pam-auth-update

Aparecerá el siguiente diálogo. Se deberá activar la opción activate mkhomedir.

7. Reiniciar el servicio sssd para aplicar los cambios en la configuración.

sudo systemctl restart sssd

8. Para comprobar la correcta conexión con el Active Directory, utilizamos el siguiente comando para consultar un usuario existente.

id nicolas@302.cl

Resultado:

9. Permitir al grupo Admins. del dominio iniciar sesión en el Ubuntu Server.

sudo realm permit -g 'Admins. del dominio'

10. Agregar al grupo Admins. del dominio en la lista de sudoers.

sudo nano /etc/sudoers.d/sudoers

Agregar la siguiente línea al archivo:

%Admins.\ del\ dominio@302.cl ALL=(ALL) ALL

11. Reiniciar el servidor, porque no sé exactamente qué servicio es el necesario reiniciar para aplicar la configuración 😅.

sudo reboot

Páginas de referencia:

Raspberry PI + Ubuntu Server como Router y Cliente Open VPN.

A. Contexto.

En mi actual trabajo —y cuando estoy en casa— necesito estar constantemente conectado mediante VPN. Gracias a que mi computador de escritorio posee 2 tarjetas de red —y doble Windows para arrancar: uno personal y otro corporativo—, he decidido usar una de las tarjetas de red para mantener el equipo constantemente conectado a las redes corporativas, lo cual incluye el controlador de dominio y servidores que necesito utilizar.

La conexión con las redes corporativas se realiza mediante Open VPN, por lo cual planeo utilizar una Raspberry PI 3 + Ubuntu Server 20.04 LTS, a la cual se le instala un cliente de Open VPN y se le configura el OS como router.

Actualmente y simplificadamente, este es el diagrama actual que va hasta mi computador:

Y busco llegar a esto:

Finalmente, necesito agregarle un puerto Ethernet adicional a la Raspberry PI. En este caso en particular utilizaré este dispositivo:

B. Configuración del Cliente Open VPN.

Posterior a la instalación de Ubuntu Server en la tarjeta SD y luego de iniciar la Rasbperry PI, iniciamos con la configuración:

1. Actualizar la lista de paquetes.

sudo apt update

2. Por gusto personal, instalar net-tools para ver las interfaces de red.

sudo apt install net-tools

3. Verificamos las interfaces de red disponibles:

ifconfig

Resultado: Podemos ver que está disponible y activa la conexión mediante el Ethernet integrado en la Rasbperry.

3. Instalar cliente de Open VPN.

sudo apt install openvpn

4. Cargar el perfil de conexión en el directorio /etc/openvpn/ y copiarlo cambiando su extensión a .conf .

sudo cp /home/ubuntu/client.ovpn /etc/openvpn/client.conf

5. Abrir el archivo client.conf:

sudo nano /etc/openvpn/client.conf

6. Buscar la línea:

auth-user-pass

Y reemplazarla con:

auth-user-pass pass

7. Crear un archivo para almacenar la contraseña de la conexión:

sudo touch /etc/openvpn/pass

Pegar el usuario en la primera línea y la contraseña de la conexión en la segunda línea y guardar.

8. Habilitar el servicio del cliente Open VPN. El nombre después de openvpn@ debe coincidir con el nombre del perfil que se copió a /etc/openvpn/ .

sudo systemctl enable openvpn@client.service

9. Recargamos la configuración de systemd manager.

sudo systemctl daemon-reload

10. Iniciamos el servicio.

sudo service openvpn@client start

8. Revisamos las interfaces de red:

ifconfig

Y revisamos que aparezca el túnel como una interfaz nueva:

Finalmente, basta con reiniciar la Raspberry y comprobar que la conexión se realiza automáticamente.

C. Configuración de interfaz Ethernet USB.

Como se ve en la imagen anterior, solo está configurado el Ethernet original de la Raspberry (eth0), que para efectos de esta configuración, correspondería a la WAN de nuestra Raspberry Router. Es por esto que necesitamos configurar el adaptador Ethernet USB.

1. Conectar el adaptador USB y conectar un cable RJ45 entre el adaptador y el pc. Luego listar las interfaces de red.

sudo lshw -C network

Podemos ver que aparece disponible la interfaz eth1, que corresponde al adaptador USB. No siempre las interfaces toman el identificador como eth0 y eth1.

2. Abrir el archivo de configuración de red. (El nombre del archivo puede variar).

 sudo nano /etc/netplan/50-cloud-init.yaml

Se puede ver la configuración de la eth0 (WAN), configurado como cliente DHCP.

Reemplazar el código con la siguiente configuración:

network:
    ethernets:
        eth0:
            dhcp4: true
            optional: true
        eth1:
            dhcp4: no
            addresses:
             - 192.168.254.1/24
    version: 2

La interfaz eth1 (LAN) queda configurada con una IP fija en la red 192.168.254.0/24. Puede ser cualquier red, que no colisione con la red casera o alguna red corporativa.

3. Probamos la configuración.

sudo netplan try

4. Guardamos la configuración.

sudo netplan apply

En mi caso, en el computador de la casa utilizo Windows para trabajar, por lo cual es necesario darle también una IP fija a la segunda tarjeta de red dentro de la red 192.168.254.0/24, que apunte como gateway la IP de la Raspberry.

Finalizando la configuración de la tarjeta por el lado del cliente, probamos que hay visibilidad entre la Raspberry y el computador.

D. Configurar Ubuntu como router.

1. Habilitar el forwarding de paquetes ipv4.

sudo sed -i '/net.ipv4.ip_forward/s/^#//' /etc/sysctl.conf

2. Aplicar cambios.

sudo sysctl -p

3. Configurar las reglas iptables para habilitar el ruteo entre la eth1 (LAN) y la tun0 («WAN» hacia la red corporativa).

Packet forwarding.

sudo iptables -A FORWARD -i eth1 -o tun0 -j ACCEPT
sudo iptables -A FORWARD -i  tun0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Nating.

sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

4. Hacer las reglas persistentes. Durante la instalación se guardarán automáticamente las reglas ya configuradas.

sudo apt install iptables-persistent

5. Finalmente solo queda reiniciar la Raspberry y verificar que el túnel OpenVPN y el ruteo levanten automáticamente.

Adicionalmente, es necesario agregar las rutas estáticas por el lado del cliente (Windows en mi caso) y verificar que podamos llegar a las redes corporativas declaradas.

route -p ADD 192.168.4.0 MASK 255.255.255.0 192.168.254.1

Un ejemplo del trace hasta el host 192.168.4.254, un equipo ubicado en las redes corporativas.

Páginas de referencia.

Instalación de Onedrive en Ubuntu Server Raspberry para sincronización automática de carpetas.

A. Instalar el paquete onedrive.

El paquete onedrive viene incluido en los repositorios de Ubuntu, sin embargo la versión disponible no es la mas reciente y ya no funciona de acuerdo a la documentación del repositorio del software.

Es por esto que el desarrollador dispone de un método de instalación alternativo, utilizando la versión de onedrive disponible en los repositorios de OpenSuSE.

1. Agregar el repository release key de OpenSuSE Build Service.

wget -qO - https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/Release.key | sudo apt-key add -

2. Agregar el repositorio de OpenSuSE Build Service, pero acotado al paquete onedrive.

echo 'deb https://download.opensuse.org/repositories/home:/npreining:/debian-ubuntu-onedrive/xUbuntu_20.04/ ./' | sudo tee /etc/apt/sources.list.d/onedrive.list

3. Actualizar el caché de apt.

sudo apt update

4. Instalar el paquete onedrive.

sudo apt install onedrive

B. Configurar el cliente.

1. Crear carpeta /etc/onedrive.

sudo mkdir /etc/onedrive

2. Crear archivo de configuración vacío.

sudo touch /etc/onedrive/config

3. Abrir el archivo de configuración.

sudo nano /etc/onedrive/config

Y agregar las siguientes líneas.

# Configuration for OneDrive Linux Client
# This file contains the list of supported configuration fields
# with their default values.
# All values need to be enclosed in quotes
# When changing a config option below, remove the '#' from the start of the line
# For explanations of all config options below see docs/USAGE.md or the man page.
#
# sync_dir = "~/OneDrive"
# skip_file = "~*|.~*|*.tmp"
# monitor_interval = "300"
# skip_dir = ""
# log_dir = "/var/log/onedrive/"
# drive_id = ""
# upload_only = "false"
# check_nomount = "false"
# check_nosync = "false"
# download_only = "false"
# disable_notifications = "false"
# disable_upload_validation = "false"
# enable_logging = "false"
# force_http_2 = "false"
# local_first = "false"
# no_remote_delete = "false"
# skip_symlinks = "false"
# debug_https = "false"
# skip_dotfiles = "false"
# dry_run = "false"
# min_notify_changes = "5"
# monitor_log_frequency = "5"
# monitor_fullscan_frequency = "10"
# sync_root_files = "false"
# classify_as_big_delete = "1000"
# user_agent = ""
# remove_source_files = "false"
# skip_dir_strict_match = "false"
# application_id = ""
# resync = "false"
# resync_auth = "false"
# bypass_data_preservation = "false"
# azure_ad_endpoint = ""
# azure_tenant_id = "common"
# sync_business_shared_folders = "false"
# sync_dir_permissions = "700"
# sync_file_permissions = "600"
# rate_limit = "131072"
# operation_timeout = "3600"
# webhook_enabled = "false"
# webhook_public_url = ""
# webhook_listening_host = ""
# webhook_listening_port = "8888"
# webhook_expiration_interval = "86400"
# webhook_renewal_interval = "43200"

4. Iniciar la vinculación del cliente con una cuenta de Microsoft.

sudo onedrive

El comando retorna un link que debe ser visitado mediante un navegador.

Authorize this app visiting:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=22c49a0d-d21c-4792-aed1-8f163c982546&scope=Files.ReadWrite%20Files.ReadWrite.all%20Sites.ReadWrite.All%20offline_access&response_type=code&redirect_uri=https://login.microsoftonline.com/common/oauth2/nativeclient

Se abrirá el login de Microsoft Account y se deberá iniciar sesión con una cuenta de Microsoft.

5. Luego del login, se abrirá una página en blanco. Se debe copiar la URL de la página de respuesta.

6. Pegar la URL de respuesta en el cliente.

Enter the response uri: https://login.microsoftonline.com/common/oauth2/nativeclient?code=M.R3_BAY.78b5aa2e-3675-1e3e-0f74

Application has been successfully authorised, however no additional command switches were provided.

Please use --help for further assistance in regards to running this application.

7. Probar la sincronización de prueba.

sudo onedrive --dry-run

Resultado:

System configuration file successfully loaded
DRY-RUN Configured. Output below shows what 'would' have occurred.
Configuring Global Azure AD Endpoints

--synchronize or --monitor switches missing from your command line input. Please add one (not both) of these switches to your command line or use --help for further assistance.

No OneDrive sync will be performed without one of these two arguments being present.

8. El detalle de como configurar el cliente mediante el archivo de configuración se puede encontrar en el siguiente link:

https://github.com/abraunegg/onedrive/blob/master/docs/USAGE.md

C. Iniciar el cliente como servicio del sistema.

1. Crear un archivo de servicio vacío en /etc/systemd/system.

sudo touch /etc/systemd/system/onedrive.service

2. Abrir el archivo del servicio vacío.

sudo nano /etc/systemd/system/onedrive.service

3. Pegar las siguientes líneas en el archivo y guardar los cambios.


[Unit]
Description=OneDrive Free Client
Documentation=https://github.com/abraunegg/onedrive
After=network-online.target
Wants=network-online.target

[Service]

ProtectSystem=full

ProtectHostname=true

ProtectKernelTunables=true

ProtectControlGroups=true
RestrictRealtime=true
ExecStart=/usr/bin/onedrive --monitor
Restart=on-failure
RestartSec=3
RestartPreventExitStatus=3

[Install]
WantedBy=default.target

4. Habilitar el servicio onedrive.

sudo systemctl enable onedrive.service

5. Iniciar el servicio onedrive.

sudo systemctl start onedrive.service

6. Comprobar que el servicio se ejecuta correctamente.

sudo systemctl status onedrive.service

Finalmente solo resta comprobar que la sincronización se realiza automáticamente después de un reinicio del servidor.

Páginas de referencia:

Instalar y configurar Samba en Ubuntu Server Raspberry para compartir carpetas en red.

Probado en Ubuntu Server 20.04 para Raspberry PI instalado mediante Pi Imager.

1. Instalar el paquete Samba.

sudo apt install samba

2. Comprobar que el servicio se inició automáticamente.

sudo systemctl status nmbd

3. Editar el archivo de configuración de Samba.

sudo nano /etc/samba/smb.conf

4. Esta es la configuración simple de una carpeta compartida. Se puede agregar al final del archivo /etc/samba/smb.conf

[samba-share]
path = /samba
read only = no
browsable = yes
valid users = one, two, three
  • El valor definido entre los corchetes [ ] corresponde al nombre del recurso compartido a nivel de red.
  • El valor definido en path corresponde a la ruta a la carpeta que se desea compartir.
  • El valor read only, define si la carpeta es de solo lectura.
  • El valor browsable define si el recurso compartido es visible a nivel de red.
  • El valor valid user define que usuarios del sistema puede acceder al recurso compartido.

5. Agregar un usuario del sistema para acceder al recurso compartido. Esto se hace para no utilizar un usuario con sudo o un usuario que pueda acceder al sistema.

sudo useradd <username>

6. Agregar el usuario creado al servidor Samba. Se solicitará crear un password para este usuario. Solo servirá para conectarse al servidor.

sudo smbpasswd -a <username>

7. Reiniciar el servicio Samba.

sudo systemctl restart smbd

8. Probar la conexión a la carpeta compartida mediante la red utilizando las credenciales del usuario creado en el punto 5 y 6.

Copiado en gran medida de:

Otras páginas de referencia:

Automontar disco usb al arranque en Ubuntu Server Raspberry.

Probado en Ubuntu Server 20.04 para Raspberry PI instalado mediante Pi Imager.

El disco a utilizar está formateado en NTFS.

1. Crear una carpeta para realizar el montaje del disco.

sudo mkdir /media/hdd0

2. Listar los dispositivos de bloque disponibles.

sudo lsblk -f

3. Obtener el UUID del disco que se quiere montar.

4. Editar el archivo fstab agregando la siguiente línea.

echo 'UUID=<uuid> /media/hdd0 ntfs user,errors=remount-ro,auto,exec,rw 0 0' | sudo tee -a /etc/fstab

5. Reiniciar el servidor.

sudo reboot

6. Revisar si la unidad se automontó después del reinicio.

sudo lsblk -f

Páginas de referencia:

Cambiar usuario default Ubuntu Server Raspberry.

Probado en Ubuntu Server 20.04 para Raspberry PI instalado mediante Pi Imager.

Usualmente, después de instalar Ubuntu Server en una tarjeta Micro SD y ejecutarlo en una Raspberry PI, se debe conectar al sistema operativo mediante ssh. En este caso, el usuario y password default es ubuntu / ubuntu y es de sentido común cambiar ambos valores. El problema es realizar este cambio mediante la conexión por SSH.

Una vez conectados con el usuario ubuntu:

1. Establecer una contraseña para el usuario root.

sudo passwd

2. Permitir al usuario root conectarse mediante ssh.

sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

3. Reiniciar el servicio ssh.

sudo systemctl restart ssh

4. Cerrar la sesión ssh actual establecida usando el usuario ubuntu.

exit

5. Volver a conectarse mediante ssh utilizando el usuario root y la contraseña establecida en el punto 1.

6. Cambiar el username y carpeta del usuario ubuntu por uno nuevo.

usermod -l <newname> -d /home/<newname> -m ubuntu

5. Cerrar la sesión ssh actual establecida usando el usuario root.

exit

7. Volver a conectarse mediante ssh utilizando el nuevo usuario establecido en el paso 6.

8. Quitar el password al usuario root y bloquearlo.

9. Prohibir al usuario root conectarse mediante ssh.

sudo sed -i 's/PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

10. Reiniciar el servicio ssh nuevamente.

sudo systemctl restart ssh

11. Quitar el password del usuario root y bloquearlo.

sudo passwd -d root && sudo passwd -l root