NOPE LinkedIn

Catégories:
Lab

Comment mettre en oeuvre un serveur radius et OpenLDAP

Important
Article en cours de rédaction
Je reprends tout un tas d’articles et de LABs en projets et mis en standby. Principalement des LABs autour de l’authentification, Radius, etc…

Présentation de Radius, OpenLDAP et Duo Security

Radius (Remote Authentication Dial-In User Service) :

Qu’est-ce que Radius ?

  • Radius est un protocole d’authentification, d’autorisation et de comptabilisation (AAA) largement utilisé dans les réseaux informatiques.
  • Il a été développé à l’origine pour les réseaux téléphoniques, mais il est maintenant utilisé pour gérer l’accès à un large éventail de services réseau, notamment l’accès à Internet, les réseaux sans fil et les réseaux privés virtuels (VPN).

Principales caractéristiques de Radius :

  1. Authentification : Radius permet d’authentifier les utilisateurs avant de leur accorder l’accès à un réseau ou à des ressources spécifiques. Les utilisateurs doivent fournir des informations d’identification valides, telles que des noms d’utilisateur et des mots de passe.

  2. Autorisation : Une fois qu’un utilisateur est authentifié, Radius peut également déterminer les autorisations de cet utilisateur en fonction de son profil. Par exemple, il peut déterminer quels services l’utilisateur est autorisé à utiliser.

  3. Comptabilisation : Radius peut enregistrer les activités des utilisateurs, telles que la durée de leur session, les volumes de données transférées, etc. Cela est utile pour la facturation et le suivi de l’utilisation des ressources.

  4. Sécurité : Radius prend en charge divers mécanismes de sécurité pour protéger les informations d’identification et les données de l’utilisateur pendant la transmission. Il utilise souvent le chiffrement pour assurer la confidentialité des informations sensibles.

OpenLDAP (Lightweight Directory Access Protocol) :

Qu’est-ce qu’OpenLDAP ?

  • OpenLDAP est un serveur d’annuaire open source qui implémente le protocole LDAP. LDAP est un protocole utilisé pour gérer et organiser des informations dans un annuaire, généralement des informations d’identification, des profils d’utilisateurs, des groupes, des machines, etc.

Principales caractéristiques d’OpenLDAP :

  1. Stockage des données : OpenLDAP permet de stocker des données structurées dans un annuaire, ce qui le rend idéal pour gérer des informations telles que les comptes d’utilisateurs, les groupes, les adresses e-mail, etc.

  2. Protocole standard : OpenLDAP utilise le protocole LDAP, qui est un standard de l’industrie pour l’accès aux annuaires. Cela signifie que de nombreux clients LDAP peuvent interagir avec un serveur OpenLDAP.

  3. Extensibilité : OpenLDAP est extensible et peut être personnalisé pour répondre aux besoins spécifiques d’une organisation. Vous pouvez ajouter des schémas personnalisés pour définir la structure des données dans l’annuaire.

  4. Sécurité : OpenLDAP prend en charge des mécanismes de sécurité robustes, notamment l’authentification sécurisée, le chiffrement des données et le contrôle d’accès pour protéger les informations sensibles stockées dans l’annuaire.

Duo Security :

Qu’est-ce que Duo Security ?

Duo Security est une solution de sécurité informatique qui se concentre sur l’authentification multifactorielle (MFA) et l’accès sécurisé aux applications et aux données. Voici quelques caractéristiques importantes de Duo Security :

  1. Authentification multifactorielle (MFA) : Duo Security renforce la sécurité en exigeant plusieurs facteurs d’authentification, tels que quelque chose que vous savez (mot de passe) et quelque chose que vous avez (un appareil mobile).

  2. Protection des accès : Il offre une protection renforcée des accès aux applications et aux services en vérifiant l’identité de l’utilisateur à chaque connexion.

  3. Intégration : Duo Security peut être intégré à une variété de systèmes, notamment Radius et LDAP, pour renforcer la sécurité des accès réseau et des ressources.

  4. Tableau de bord centralisé : Il fournit un tableau de bord centralisé pour la gestion et la surveillance des activités d’authentification, offrant ainsi une visibilité accrue sur les tentatives d’accès.

En résumé, Radius est principalement utilisé pour l’authentification, l’autorisation et la comptabilisation des utilisateurs, tandis qu’OpenLDAP est un serveur d’annuaire utilisé pour stocker des informations d’identification et des données structurées. Ensemble, ils peuvent être utilisés pour gérer de manière efficace et sécurisée l’accès aux ressources réseau et l’authentification des utilisateurs dans un environnement informatique.

Installation des produits

Paramètrage du projet

Tous le paramètrage des fichier Docker-compose et Dockerfile s’appuient sur un fichier .env

Fichier .env
COMPOSE_PROJECT_NAME=bzh          # Prefix devant le nom des containers. Utile pour faire cohabiter plusieurs projets sur le même serveur.
CONTAINER_TIMEZONE=Europe/Paris   # Timezone
# Les UID et GID doivent correspondre à ceux utilisé sur votre serveur par docker
DOCKER_UID=2000
DOCKER_GID=996
# ------------------------ NETWORK DEFINITION  -----------------------
VLAN1_NAME=brzl_int_h2            # Nom du réseau
VLAN1_SUBNET=<Subnet interne VMs> # Subnet du vlan hébergeant les VMs
FORWARDER=8.8.8.8
GATEWAY_VLAN1=<IP GATEWAY VLAN>   # GATEWAY du VLAN
DNS_VLAN1=<IP SERVEUR DNS VLAN>   # IP du DNS sur le VLAN
# ------------------------ MYSQL SERVER  ------------------------------
DB_VLAN1=<@ IP du serveur MYSQL>
DB_ROOT_PASSWORD=<MDP BDD>
MYSQL_DATA_DIR=/var/lib/mysql
MYSQL_LOG_DIR=/var/log/mysql
# ------------------------ RADIUS SERVER  -----------------------------
RADIUS_VLAN1=<@ IP du serveur RADIUS>
RADIUS_REALM=<NOM du royaume RADIUS>
RADIUS_USR_PASSWORD=<MDP RADIUS>
RADIUS_SECRET=testing123
# ------------------------ OPENLDAP SERVER  ---------------------------
LDAP_VLAN1=<@ IP du serveur OPENLDAP>

Installation de openldap

Fichier Dockerfile
FROM docker.io/bitnami/minideb:bullseye

ARG TARGETARCH

LABEL com.vmware.cp.artifact.flavor="sha256:1e1b4657a77f0d47e9220f0c37b9bf7802581b93214fff7d1bd2364c8bf22e8e" \
      org.opencontainers.image.base.name="docker.io/bitnami/minideb:bullseye" \
      org.opencontainers.image.created="2023-09-12T12:24:46Z" \
      org.opencontainers.image.description="Application packaged by VMware, Inc" \
      org.opencontainers.image.licenses="Apache-2.0" \
      org.opencontainers.image.ref.name="2.6.6-debian-11-r40" \
      org.opencontainers.image.title="openldap" \
      org.opencontainers.image.vendor="VMware, Inc." \
      org.opencontainers.image.version="2.6.6"

ENV HOME="/" \
    OS_ARCH="${TARGETARCH:-amd64}" \
    OS_FLAVOUR="debian-11" \
    OS_NAME="linux"

COPY prebuildfs /
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
# Install required system packages and dependencies
RUN install_packages ca-certificates curl libargon2-1 libcap2-bin libcom-err2 libcrypt1 libgssapi-krb5-2 libk5crypto3 libkeyutils1 libkrb5-3 libkrb5support0 libltdl7 libnsl2 libnss3-tools libodbc1 libperl5.32 libsasl2-2 libssl1.1 libtirpc3 libwrap0 mdbtools procps psmisc
RUN mkdir -p /tmp/bitnami/pkg/cache/ && cd /tmp/bitnami/pkg/cache/ && \
    COMPONENTS=( \
      "openldap-2.6.6-1-linux-${OS_ARCH}-debian-11" \
    ) && \
    for COMPONENT in "${COMPONENTS[@]}"; do \
      if [ ! -f "${COMPONENT}.tar.gz" ]; then \
        curl -SsLf "https://downloads.bitnami.com/files/stacksmith/${COMPONENT}.tar.gz" -O ; \
        curl -SsLf "https://downloads.bitnami.com/files/stacksmith/${COMPONENT}.tar.gz.sha256" -O ; \
      fi && \
      sha256sum -c "${COMPONENT}.tar.gz.sha256" && \
      tar -zxf "${COMPONENT}.tar.gz" -C /opt/bitnami --strip-components=2 --no-same-owner --wildcards '*/files' && \
      rm -rf "${COMPONENT}".tar.gz{,.sha256} ; \
    done
RUN apt-get autoremove --purge -y curl && \
    apt-get update && apt-get upgrade -y && \
    apt-get clean && rm -rf /var/lib/apt/lists /var/cache/apt/archives
RUN chmod g+rwX /opt/bitnami

COPY rootfs /
RUN /opt/bitnami/scripts/openldap/postunpack.sh
ENV APP_VERSION="2.6.6" \
    BITNAMI_APP_NAME="openldap" \
    PATH="/opt/bitnami/openldap/bin:/opt/bitnami/openldap/sbin:$PATH"

EXPOSE 1389 1636

USER 1001
ENTRYPOINT [ "/opt/bitnami/scripts/openldap/entrypoint.sh" ]
CMD [ "/opt/bitnami/scripts/openldap/run.sh" ]

Installation de radius

Fichier Dockerfile
from alpine:latest
LABEL maintainer="albertoscola221@gmail.com"

RUN apk update && \
	apk add freeradius nano openssl freeradius-mysql shadow rsyslog freeradius-eap openldap-clients bash && \
	apk upgrade

ARG DB_VLAN1
ARG RADIUS_USR_PASSWORD
ARG REALM
ARG RADIUS_SECRET
ARG UID
ARG GID

COPY ./freeradius/radiusd.conf /etc/freeradius/3.0/radiusd.conf
COPY ./freeradius/default /etc/freeradius/3.0/sites-available/default
COPY ./freeradius/inner-tunnel /etc/freeradius/3.0/sites-available/inner-tunnel
COPY ./freeradius/clients.conf /etc/freeradius/3.0/clients.conf

COPY ./freeradius/proxy.conf /etc/freeradius/3.0/proxy.conf
#COPY ./freeradius/queries.conf /etc/freeradius/3.0/mods-config/sql/main/mysql/queries.conf

COPY ./keys/ /etc/freeradius/3.0/certs

COPY ./raddb/sql /etc/freeradius/3.0/mods-available/sql
COPY ./raddb/eap /etc/freeradius/3.0/mods-available/eap
COPY ./raddb/linelog /etc/freeradius/3.0/mods-available/linelog
COPY ./raddb/rsyslog.conf /etc/rsyslog.conf

RUN sed -i -e 's@RADIUS_USR_PASSWORD@'${RADIUS_USR_PASSWORD}'@g' /etc/freeradius/3.0/mods-available/sql && \
	sed -i -e 's@DB_VLAN1@'${DB_VLAN1}'@g' /etc/freeradius/3.0/mods-available/sql && \
	sed -i -e 's@REALM@'${REALM}'@g' /etc/freeradius/3.0/proxy.conf && \
	sed -i -e 's@RADIUS_SECRET@'${RADIUS_SECRET}'@g' /etc/freeradius/3.0/clients.conf

COPY start.sh /

RUN chmod 750 /start.sh && \
	usermod -u ${UID} radius && \
 	groupmod -g ${GID} radius && \
 	chown radius -R /var/log/radius /etc/raddb && \
 	echo "${DB_VLAN1}		mysql.${REALM}" >> /etc/hosts

ENTRYPOINT ["/start.sh"]

Installation de Mysql

Fichier Dockerfile
FROM mysql:latest
LABEL maintainer="albertoscola221@gmail.com"

ARG MYSQL_CONTAINER_USER
ARG MYSQL_CONTAINER_GROUP
ARG MYSQL_DATA_DIR
ARG MYSQL_LOG_DIR
ARG RADIUS_USR_PASSWORD 
ARG RADIUS_VLAN1
ARG DB_VLAN1

COPY my.cnf /etc/my.cnf

COPY sql/*.sql /docker-entrypoint-initdb.d/
COPY certs/* /mysql-certs/

RUN mkdir ${MYSQL_LOG_DIR} && \
	usermod -u 1000 ${MYSQL_CONTAINER_USER} && \
 	groupmod -g 1000 ${MYSQL_CONTAINER_GROUP} && \
	chown ${MYSQL_CONTAINER_USER}:${MYSQL_CONTAINER_USER} -R ${MYSQL_DATA_DIR} ${MYSQL_LOG_DIR} /docker-entrypoint-initdb.d && \
	sed -i -e 's@RADIUS_USR_PASSWORD@'${RADIUS_USR_PASSWORD}'@g' /docker-entrypoint-initdb.d/radius_setup.sql && \
	sed -i -e 's@RADIUS_VLAN1@'${RADIUS_VLAN1}'@g' /docker-entrypoint-initdb.d/radius_setup.sql && \
	chown ${MYSQL_CONTAINER_USER}:${MYSQL_CONTAINER_USER} -R /mysql-certs/

EXPOSE 3306

#COPY start.sh /start.sh
#RUN chmod 750 /start.sh
#CMD /start.sh

Installation de Duo Security

Fichier Dockerfile

Fichier création Lab

Fichier docker-compose
# Docker-Compose file for Stockholm Network
version: '3'
services:
  radius_server:
    container_name: ${COMPOSE_PROJECT_NAME}_radius
    hostname: radius.${RADIUS_REALM}
    restart: always
    build:
      context: ./radius
      args:
        - UID=${DOCKER_UID}
        - GID=${DOCKER_GID}
        - DB_VLAN1=${DB_VLAN1}
        - RADIUS_USR_PASSWORD=${RADIUS_USR_PASSWORD}
        - REALM=${RADIUS_REALM}
        - RADIUS_SECRET=${RADIUS_SECRET}
    networks:
      breizhland_int:
        ipv4_address: ${RADIUS_VLAN1}
    ports:
      - "1812:1812/udp"
      - "1813:1813/udp"
    volumes:
      - ./radius/logs:/var/log/radius
      - "/etc/timezone:/etc/timezone:ro"
      - "/etc/localtime:/etc/localtime:ro"
    links:
      - mysql_db:database
    depends_on:
      - "mysql_db"

  mysql_db:
    container_name: ${COMPOSE_PROJECT_NAME}_mysql
    hostname: mysql.${RADIUS_REALM}
    restart: always
    build:
      context: ./mysql
      args:
        - DB_VLAN1=${DB_VLAN1}
        - MYSQL_CONTAINER_USER=mysql
        - MYSQL_CONTAINER_GROUP=mysql
        - MYSQL_DATA_DIR=${MYSQL_DATA_DIR}
        - MYSQL_LOG_DIR=${MYSQL_LOG_DIR}
        - RADIUS_USR_PASSWORD=${RADIUS_USR_PASSWORD}
        - RADIUS_VLAN1=${RADIUS_VLAN1}
    networks:
      breizhland_int:
        ipv4_address: ${DB_VLAN1}
    volumes:
      - ./mysql/data:${MYSQL_DATA_DIR}
      - ./mysql/log/:${MYSQL_LOG_DIR}
      # TODO FIX LOCALTIME IN MYSQL CONTAINER
      #- "/etc/timezone:/etc/timezone:ro"
      #- "/etc/localtime:/etc/localtime:ro"
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
      MYSQL_CONTAINER_USER: "mysql"
      MYSQL_CONTAINER_GROUP: "mysql"
      MYSQL_DATABASE: "radius"
# ------------------------ Definition des reseaux  ----------------------------
networks:
  breizhland_int:
    name: ${VLAN1_NAME}
    driver: bridge
    internal: true
    attachable: true
    ipam:
      config:
        - subnet: ${VLAN1_SUBNET}
          gateway: ${GATEWAY_VLAN1}