Configuration des bannières de connexion et désactivation de la connexion automatique sous Linux grâce à un script personnalisé 

Dans les environnements informatiques, maintenir la sécurité tout en assurant une expérience utilisateur transparente est un défi permanent. Les bannières de connexion et les paramètres de connexion contrôlés jouent un rôle essentiel dans le renforcement des politiques de sécurité, l’information des utilisateurs sur les conditions d’utilisation et le respect des exigences de conformité.

Cet article présente un script Bash qui automatise ces configurations, offrant ainsi aux professionnels de l’informatique et aux fournisseurs de services gérés (MSP) un outil puissant pour rationaliser la gestion de la sécurité.

Comprendre l’objectif et l’importance du script

Ce script est conçu pour automatiser le processus de configuration des bannières de connexion dans les environnements Linux, la modification du fichier /etc/issue, et la mise à jour des configurations pour SSH et les interfaces graphiques comme Gnome. Il permet également la désactivation de la connexion automatique, ce qui renforce la sécurité en obligeant les utilisateurs à s’authentifier manuellement.

Pour les professionnels de l’informatique et les entreprises MSP, ces configurations sont souvent nécessaires pour la conformité réglementaire (par exemple, la HIPAA ou la RGPD) ou les protocoles de sécurité internes. La capacité du script à automatiser et à rationaliser ces tâches en fait un complément précieux à la boîte à outils de tout administrateur.

Le script :

#!/usr/bin/env bash
#
# Description: Updates the /etc/issue file and adds it to the SSH banner. If Gnome is installed, ensure a banner is displayed above login and disable automatic login.
# By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
# Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
# Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
# Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
# Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
# Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
# Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
# EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#
# Preset Parameter: --bannerText "ReplaceMeWithYourMessage"
#   The message you would like to display inside the logon banner.
#
# Preset Parameter: --clear
#   Clears /etc/issue, Gnome banner text, and reverts sshd config.
#
# Preset Parameter: --forceRestart
#   Schedules a restart 60 seconds from now so that the login banner may take immediate effect.'
#
# Release Notes: Initial Release

# Initialize variables
_arg_bannertext=
_arg_clear="off"
_arg_forceRestart="off"

# Function to display help message
print_help() {
  printf '\n\n%s\n\n' 'Usage: --bannerText <arg> [--clear|-c] [--forceRestart|-r] [--help|-h]'
  printf '%s\n' 'Preset Parameter: --bannerText "ReplaceMeWithYourMessage"'
  printf '\t%s\n' 'The message you would like to display inside the logon banner.'
  printf '%s\n' 'Preset Parameter: --clear'
  printf '\t%s\n' 'Clears /etc/issue, Gnome banner text, and reverts sshd config.' 
  printf '%s\n' 'Preset Parameter: --forceRestart'
  printf '\t%s\n' 'Schedules a restart 60 seconds from now so that the login banner may take immediate effect.'
  printf '%s\n' 'Preset Parameter: --help'
  printf '\t%s\n' "Displays this help menu."
}

# Function to display error message and exit
die() {
  local _ret="${2:-1}"
  echo "$1" >&2
  test "${_PRINT_HELP:-no}" = yes && print_help >&2
  exit "${_ret}"
}

# Function to parse command line arguments
parse_commandline() {
  while test $# -gt 0; do
    _key="$1"
    case "$_key" in
    --bannerText | --bannertext | -b)
      test $# -lt 2 && die "Missing value for argument '$_key'." 1
      _arg_bannertext=$2
      shift
      ;;
    --bannerText=*)
      _arg_bannertext="${_key##--bannerText=}"
      ;;
    --clear | -c)
      _arg_clear="on"
      ;;
    --forceRestart | --forcerestart | -r)
      _arg_forceRestart="on"
      ;;
    --help | -h)
      _PRINT_HELP=yes die 0
      ;;
    *)
      _PRINT_HELP=yes die "FATAL ERROR: Got an unexpected argument '$1'" 1
      ;;
    esac
    shift
  done
}

# Parse command line arguments
parse_commandline "$@"

# Check if script variables are set and replace command line arguments with the script variables.
if [[ -n $bannerText ]]; then
  _arg_bannertext="$bannerText"
fi
if [[ -n $forceRestart && $forceRestart == "true" ]]; then
  _arg_forceRestart="on"
fi
if [[ -n $clearAndRemoveConfigChanges && $clearAndRemoveConfigChanges == "true" ]]; then
  _arg_clear="on"
fi

# Trim leading and trailing whitespace from _arg_bannertext
if [[ -n $_arg_bannertext ]]; then
  _arg_bannertext=$(echo "$_arg_bannertext" | sed 's/^[ \t]*//' | sed 's/\ *$//g')
fi

# Check if banner text is required and not provided
if [[ -z $_arg_bannertext && $_arg_clear != "on" ]]; then
  echo "[Error] banner text is required!" >&2
  exit 1
fi

# Check if both setting and clearing banner text are requested
if [[ -n $_arg_bannertext && $_arg_clear == "on" ]]; then
  echo "[Error] Cannot set and clear banner text at the same time. Please do not fill in the banner text box when the clear and remove checkbox is checked." >&2
  exit 1
fi

# Display the current /etc/issue content
echo "### Modifying /etc/issue From ###"
cat '/etc/issue'
echo ""

# Display the new banner text
echo "### To ###"
echo "$_arg_bannertext"
echo ""

# Update /etc/issue with the new banner text
echo "$_arg_bannertext" >/etc/issue

# Extract the Banner configuration from the sshd_config file, ignoring commented lines
bannerFile=$(grep "Banner" /etc/ssh/sshd_config | grep -v "#" | xargs | cut -f2 -d' ')

# Check conditions to back up the sshd_config file
if [[ -f /etc/ssh/sshd_config && (((-z $bannerFile || $bannerFile != "/etc/issue" ) && $_arg_clear == "off") || (-n $bannerFile && $_arg_clear == "on")) ]]; then
  # Get the current timestamp
  timestamp=$(date +%s)
  # Create a backup file name
  backupFile="sshd_config.$timestamp.back"

  echo "Backing up sshd config to /etc/ssh/$backupFile"

  # Attempt to copy sshd_config to the backup file
  if ! cp "/etc/ssh/sshd_config" "/etc/ssh/$backupFile"; then
    echo "[Error] Unable to backup sshd config!" >&2
    EXITCODE=1
    # Set the flag to indicate backup failure
    failedBackup="true"
  fi
fi

# Create or update the Banner configuration based on conditions
if [[ -f /etc/ssh/sshd_config && -z $failedBackup && $_arg_clear == "off" && -z $bannerFile ]]; then
  # If Banner is not set and clear is off, add the Banner configuration
  if echo "    Banner /etc/issue" >>"/etc/ssh/sshd_config"; then
    echo "Successfully created sshd login banner."
  else
    echo "[Error] Unable to create sshd login banner!" >&2
    EXITCODE=1
  fi
elif [[ -f /etc/ssh/sshd_config && -z $failedBackup && $_arg_clear == "off" && $bannerFile != "/etc/issue" ]]; then
  # If Banner is set to a different value and clear is off, update the Banner configuration
  if sed -i 's/Banner.*/Banner \/etc\/issue/' /etc/ssh/sshd_config &>/dev/null; then
    echo "Successfully updated sshd login banner."
  else
    echo "[Error] Failed to update sshd login banner!" >&2
    EXITCODE=1
  fi
elif [[ -f /etc/ssh/sshd_config && -z $failedBackup && $_arg_clear == "on" && -n $bannerFile ]]; then
   # If Banner is set and clear is on, comment out the Banner configuration
  if sed -i 's/Banner/#Banner/' /etc/ssh/sshd_config &>/dev/null; then
    echo "Successfully removed sshd login banner."
  else
    echo "[Error] Failed to remove sshd login banner!" >&2
    EXITCODE=1
  fi
fi

# Check for Gnome and KDE session files to determine if they are installed
for f in /usr/bin/*session; do
  if echo "$f" | grep "gnome" &>/dev/null; then
    gnomeInstalled="true"
  fi

  if echo "$f" | grep "plasma" &>/dev/null; then
    kdeInstalled="true"
  fi
done

# Add login banner for Gnome if Gnome is installed and clear is off
if [[ -n $gnomeInstalled && $_arg_clear == "off" ]]; then
  echo ""
  echo "Gnome installation detected."

  automaticLogins=$(grep "AutomaticLoginEnable" /etc/gdm3/custom.conf | grep -v "#" | grep -i "true")
  if [[ -n $automaticLogins ]]; then
    echo ""
    echo "Automatic logins detected. Disabling automatic login."
    
    # Get the current timestamp
    timestamp=$(date +%s)
    # Create a backup file name
    backupFile="custom.conf.$timestamp.back"

    echo "Backing up gdm3 custom.conf config to /etc/gdm3/$backupFile"

    sed -i "s/AutomaticLoginEnable.*/AutomaticLoginEnable=False/g" /etc/gdm3/custom.conf &>/dev/null
    echo ""
  fi

  echo "Adding login banner for gui logins."

  # Create the dconf profile for gdm if it doesn't exist
  if [[ ! -f '/etc/dconf/profile/gdm' ]]; then
    {
      echo "user-db:user"
      echo "system-db:gdm"
      echo "file-db:/usr/share/gdm/greeter-dconf-defaults"
    } >>'/etc/dconf/profile/gdm'
  fi

  # Create the dconf database directory for gdm if it doesn't exist
  if [[ ! -d '/etc/dconf/db/gdm.d' ]]; then
    mkdir /etc/dconf/db/gdm.d
  fi

  # Escape single quotes in _arg_bannertext for use in the GUI banner text
  guiBannerText=${_arg_bannertext//\'/\\\'}

  # Check if the Gnome banner configuration file does not exist
  if [[ ! -f '/etc/dconf/db/gdm.d/01-banner-message' ]]; then
    # Create the banner configuration file with the specified settings
    {
      echo "[org/gnome/login-screen]"
      echo "banner-message-enable=true"
      echo "banner-message-text='$guiBannerText'"
    } >>'/etc/dconf/db/gdm.d/01-banner-message'
  else
    # Escape single quotes again for updating existing configuration
    guiBannerText=${_arg_bannertext//\'/\\\\\'}
    # Enable the banner message and update the text in the existing configuration file
    sed -i "s/banner-message-enable=false/banner-message-enable=true/" '/etc/dconf/db/gdm.d/01-banner-message' &>/dev/null
    sed -i "s/banner-message-text=.*/banner-message-text='$guiBannerText'/" '/etc/dconf/db/gdm.d/01-banner-message' &>/dev/null
  fi

  # Apply the changes to the dconf database
  if dconf update; then
    echo "Successfully added graphical login banner."
  else
    echo "Failed to add graphical login banner" >&2
    exit 1
  fi
# Check if Gnome is installed and clear argument is set to "on"
elif [[ -n $gnomeInstalled && $_arg_clear == "on" ]]; then
  echo ""
  echo "Gnome installation detected. Removing login banner for gui logins (if present)."

  # If the Gnome banner configuration file exists, disable the banner message
  if [[ -f '/etc/dconf/db/gdm.d/01-banner-message' ]]; then
    sed -i "s/banner-message-enable=true/banner-message-enable=false/" '/etc/dconf/db/gdm.d/01-banner-message' &>/dev/null
  fi

  # Apply the changes to the dconf database
  if dconf update; then
    echo "Successfully removed graphical login banner."
  else
    echo "Failed to remove graphical login banner" >&2
    exit 1
  fi
fi

# Check if KDE is installed
if [[ -n $kdeInstalled ]]; then
  echo "WARNING: KDE install detected. Unable to set login banner for KDE gui."
fi

# Checks if an error code is set and exits the script with that code.
if [[ -n $EXITCODE ]]; then
  exit "$EXITCODE"
fi

# If forceRestart argument is set to "on", schedule a system restart in 1 minute
if [[ $_arg_forceRestart == "on" ]]; then
  echo ""
  shutdown -r "+1"
fi

 

Gagnez du temps grâce à plus de 300 scripts du Dojo NinjaOne.

Obtenir l’accès

Décomposons les éléments du script :

Principales caractéristiques et fonctionnalités

1. Arguments de la ligne de commande

Le script accepte plusieurs arguments :

a. –bannerText : Spécifie le texte à afficher dans la bannière de connexion.

b. –clear : Réinitialise toutes les configurations, y compris l’effacement de /etc/issue et l’annulation des paramètres SSH et Gnome.

c. –forceRestart : Planifie un redémarrage du système pour appliquer immédiatement les modifications.

2. Analyse des arguments

Une fonction robuste analyse les arguments fournis par l’utilisateur, les valide et attribue des valeurs par défaut ou spécifiées aux variables. Par exemple, si l’option –clear est utilisée, aucun texte de bannière ne sera défini.

3. Mise à jour de /etc/issue

Le script écrit le texte de la bannière spécifiée dans le fichier /etc/issue, qui affiche la bannière lors des connexions locales.

4. Modification de la configuration SSH

a. Si la bannière SSH n’est pas définie dans /etc/issue, le script met à jour le fichier sshd_config.

b. Si l’effacement est demandé, le script désactive la bannière SSH.

5. Gestion des paramètres de connexion de Gnome

a. Détecte si Gnome est installé et ajoute une bannière graphique pour les écrans de connexion.

b. Désactive la connexion automatique en modifiant le fichier custom.conf.

6. Gestion des erreurs et sauvegarde

S’assure que les fichiers critiques tels que sshd_config et custom.conf sont sauvegardés avant d’effectuer des modifications, ce qui permet de les restaurer facilement en cas d’erreur.

7. Redémarrage programmé

Si l’option –forceRestart est activée, le système est programmé pour un redémarrage dans 60 secondes, ce qui garantit que toutes les modifications prennent effet immédiatement.

Cas d’utilisation potentiels

Étude de cas : Respect des politiques de sécurité

Imaginez un MSP qui gère plusieurs serveurs Linux pour un prestataire de soins de santé. La conformité réglementaire exige l’affichage d’un avertissement légal avant la connexion et la désactivation de la connexion automatique pour une sécurité accrue. En déployant ce script :

  • Le MSP définit une bannière cohérente pour tous les serveurs en utilisant l’argument –bannerText.
  • Ils désactivent la connexion automatique pour les environnements Gnome, garantissant que tous les utilisateurs s’authentifient manuellement.
  • L’option –forceRestart applique les modifications sans intervention manuelle, ce qui permet de gagner du temps.

Cette approche garantit que l’environnement répond efficacement aux exigences de conformité.

Comparaison avec d’autres méthodes

La configuration manuelle des bannières et des paramètres de connexion implique l’édition de plusieurs fichiers (/etc/issue, sshd_config, custom.conf de Gnome) et l’utilisation de syntaxes différentes d’une distribution à l’autre. Bien que les configurations manuelles permettent un contrôle précis, elles sont sujettes aux erreurs et prennent beaucoup de temps pour les environnements à grande échelle.

Les outils d’automatisation comme Ansible ou Chef offrent des possibilités plus étendues, mais nécessitent souvent une configuration complexe et des ressources supplémentaires. Ce script établit un équilibre entre la simplicité et l’efficacité pour les tâches à usage unique.

Questions courantes sur l’utilisation du script

  1. Ce script peut-il être utilisé sur d’autres distributions qu’Ubuntu ?
    Oui, mais les chemins comme /etc/gdm3/custom.conf et /etc/ssh/sshd_config peuvent varier d’une distribution à l’autre. Vérifiez ces chemins avant d’exécuter le script.
  2. Que se passe-t-il si Gnome n’est pas installé ?
    Le script ignore les configurations liées à Gnome et affiche un avertissement si KDE est détecté, car il ne prend pas en charge les bannières de connexion KDE.
  3. Un redémarrage du système est-il toujours nécessaire ?
    Non, mais un redémarrage permet de s’assurer que toutes les modifications sont appliquées de manière universelle, en particulier pour les environnements SSH et graphiques.

Des implications plus larges pour la sécurité informatique

L’automatisation des configurations de sécurité réduit le risque d’erreur humaine et garantit la cohérence entre les systèmes. La capacité du script à désactiver la connexion automatique est particulièrement importante, car elle réduit le risque d’accès non autorisé à partir de sessions non surveillées. Les bannières de connexion renforcent également les politiques de l’entreprise et assurent une protection juridique en informant les utilisateurs des conditions d’utilisation.

Recommandations pour l’utilisation du script

  • Testez le script dans un environnement hors production : Validez les configurations sur un serveur de test afin d’éviter les perturbations dans les systèmes de production.
  • Mettez régulièrement à jour les bannières : Utilisez le script régulièrement pour mettre à jour les bannières avec les changements de politique ou les annonces pertinentes.
  • Sauvegarde des fichiers de configuration : Sauvegardez toujours les fichiers modifiés afin d’assurer une récupération rapide des modifications involontaires.
  • Modifications du document : Conservez un journal des mises à jour à des fins d’audit et de dépannage.

Conclusion

Ce script illustre la manière dont l’automatisation peut simplifier les tâches administratives courantes tout en renforçant la sécurité. NinjaOne, avec sa suite d’outils de gestion informatique, peut compléter ces scripts en fournissant une supervision centralisée et une automatisation pour les environnements plus importants. En combinant ces capacités, les professionnels de l’informatique peuvent maintenir une infrastructure sécurisée et conforme avec une intervention manuelle minimale.

Pour aller plus loin

Pour créer une équipe informatique efficace et performante, il est essentiel d'avoir une solution centralisée qui joue le rôle de nœud principal pour vos services. NinjaOne permet aux équipes informatiques de surveiller, gérer, sécuriser et prendre en charge tous les appareils, où qu'ils soient, sans avoir besoin d'une infrastructure complexe sur site. Pour en savoir plus sur NinjaOne Endpoint Management, participez à une visite guidée, ou profitez d'un essai gratuit de la plateforme NinjaOne.

Catégories :

Vous pourriez aussi aimer

×

Voir NinjaOne en action !

En soumettant ce formulaire, j'accepte la politique de confidentialité de NinjaOne.

Termes et conditions NinjaOne

En cliquant sur le bouton “J’accepte” ci-dessous, vous indiquez que vous acceptez les termes juridiques suivants ainsi que nos conditions d’utilisation:

  • Droits de propriété: NinjaOne possède et continuera de posséder tous les droits, titres et intérêts relatifs au script (y compris les droits d’auteur). NinjaOne vous accorde une licence limitée pour l’utilisation du script conformément à ces conditions légales.
  • Limitation de l’utilisation: Les scripts ne peuvent être utilisés qu’à des fins personnelles ou professionnelles internes légitimes et ne peuvent être partagés avec d’autres entités.
  • Interdiction de publication: Vous n’êtes en aucun cas autorisé à publier le script dans une bibliothèque de scripts appartenant à, ou sous le contrôle d’un autre fournisseur de logiciels.
  • Clause de non-responsabilité: Le texte est fourni “tel quel” et “tel que disponible”, sans garantie d’aucune sorte. NinjaOne ne promet ni ne garantit que le script sera exempt de défauts ou qu’il répondra à vos besoins ou attentes particulières.
  • Acceptation des risques: L’utilisation du script est sous votre propre responsabilité. Vous reconnaissez qu’il existe certains risques inhérents à l’utilisation du script, et vous comprenez et assumez chacun de ces risques.
  • Renonciation et exonération de responsabilité: Vous ne tiendrez pas NinjaOne pour responsable des conséquences négatives ou involontaires résultant de votre utilisation du script, et vous renoncez à tout droit ou recours légal ou équitable que vous pourriez avoir contre NinjaOne en rapport avec votre utilisation du script.
  • EULA: Si vous êtes un client de NinjaOne, votre utilisation du script est soumise au contrat de licence d’utilisateur final qui vous est applicable (End User License Agreement (EULA)).