Configurare i banner di accesso e disabilitare il login automatico in Linux con uno script personalizzato 

Negli ambienti IT, mantenere la sicurezza e garantire al tempo stesso un’esperienza utente senza interruzioni è una sfida costante. I banner di accesso e le impostazioni di login controllato svolgono un ruolo fondamentale nel rafforzare i criteri di sicurezza, informare gli utenti sui termini di utilizzo e soddisfare i requisiti di conformità.

Questo articolo analizza uno script Bash per disabilitare il login automatico che automatizza queste configurazioni, offrendo ai professionisti IT e ai provider di servizi gestiti (MSP) un potente strumento per semplificare la gestione della sicurezza.

Comprendere lo scopo e il valore dello script per disabilitare il login automatico

Questo script per disabilitare il login automatico è stato progettato per automatizzare il processo di impostazione dei banner di accesso in ambienti Linux, e funziona modificando il file /etc/issue e aggiornando le configurazioni sia per SSH che per le interfacce grafiche come Gnome. Inoltre, fornisce la funzionalità per disabilitare il login automatico, migliorando la sicurezza e richiedendo agli utenti di autenticarsi manualmente.

Per i professionisti IT e gli MSP, queste configurazioni sono spesso necessarie per la conformità alle normative (per esempio, HIPAA o GDPR) o per i protocolli di sicurezza interni. La capacità dello script di automatizzare e semplificare queste attività lo rende un’aggiunta preziosa al kit di strumenti di qualsiasi amministratore.

Lo script per disabilitare il login automatico:

#!/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

 

Risparmia tempo con gli oltre 300 script del Dojo NinjaOne.

Accedi oggi stesso.

Analisi dettagliata dello script per disabilitare il login automatico

Caratteristiche e funzionalità principali

1. Argomenti della riga di comando

Lo script per disabilitare il login automatico accetta diversi argomenti:

a. –bannerText: Specifica il testo da visualizzare nel banner di accesso.

b. –clear: Ripristina tutte le configurazioni, compresa la cancellazione di /etc/issue e il ripristino delle impostazioni di SSH e Gnome.

c. –forceRestart: Pianifica il riavvio del sistema per applicare immediatamente le modifiche.

2. Parsing degli argomenti

Una funzione analizza gli argomenti forniti dall’utente, li convalida e assegna alle variabili valori predefiniti o specificati. Per esempio, se si usa –clear, non verrà impostato il testo del banner.

3. Aggiornamento di /etc/issue

Lo script per disabilitare il login automatico scrive il testo del banner specificato in /etc/issue, cosa che permette di mostrarlo durante gli accessi locali.

4. Modifica della configurazione SSH

a. Se il banner SSH non è impostato su /etc/issue, lo script aggiorna il file sshd_config.

b. Se viene richiesta la cancellazione, lo script disabilita il banner SSH.

5. Gestione delle impostazioni di accesso a Gnome

a. Rileva se Gnome è installato e aggiunge un banner grafico per le schermate di login.

b. Disabilita il login automatico modificando custom.conf.

6. Gestione degli errori e backup

Assicura il backup di file critici come sshd_config e custom.conf prima di apportare modifiche, consentendo un facile ripristino in caso di errori.

7. Riavvio programmato

Se è impostato –forceRestart, il sistema viene programmato per un riavvio dopo 60 secondi, assicurando che tutte le modifiche abbiano effetto immediato.

Casi d’uso potenziali

Caso di studio: conformità ai criteri di sicurezza

Immagina un MSP che gestisce diversi server Linux per un’azienda sanitaria. La conformità normativa richiede la visualizzazione di un avviso legale prima del login e di disabilitare il login automatico per una maggiore sicurezza. Distribuendo questo script per disabilitare il login automatico:

  • L’MSP imposta un banner coerente tra i server utilizzando l’argomento –bannerText.
  • Disabilita il login automatico per gli ambienti Gnome, assicurando che tutti gli utenti si autentichino manualmente.
  • Grazie all’opzione –forceRestart applica le modifiche senza intervento manuale, risparmiando tempo.

Questo approccio garantisce che l’ambiente soddisfi in modo efficiente i requisiti di conformità.

Confronto con metodi alternativi

La configurazione manuale dei banner e delle impostazioni di login comporta la modifica di più file (/etc/issue, sshd_config, custom.conf di Gnome) e la capacità di orientarsi tra le varie sintassi delle diverse distribuzioni. Sebbene le impostazioni manuali consentano un controllo granulare, sono soggette a errori e richiedono molto tempo per gli ambienti su larga scala.

Strumenti di automazione come Ansible o Chef offrono funzionalità più estese, ma spesso richiedono una configurazione complessa e risorse aggiuntive. Questo script per disabilitare il login automatico aiuta a raggiungere un equilibrio, fornendo semplicità ed efficacia per attività singole.

Domande comuni sull’uso dello script per disabilitare il login automatico

  1. Questo script per disabilitare il login automatico può essere utilizzato su distribuzioni diverse da Ubuntu?
    Sì, ma percorsi come /etc/gdm3/custom.conf e /etc/ssh/sshd_config possono variare da una distribuzione all’altra. Verifica questi percorsi prima di eseguire lo script.
  2. Cosa succede se Gnome non è installato?
    Lo script per disabilitare il login automatico salta le configurazioni relative a Gnome e visualizza un avviso se viene rilevato KDE, poiché non supporta i banner di accesso a KDE.
  3. Il riavvio del sistema è sempre necessario?
    No, ma un riavvio assicura che tutte le modifiche siano applicate universalmente, in particolare per gli ambienti SSH e grafici.

Implicazioni più ampie per la sicurezza informatica

L’automazione delle configurazioni di sicurezza riduce il rischio di errore umano e garantisce la coerenza tra i sistemi. La capacità dello script di disabilitare il login automatico è particolarmente significativa, in quanto riduce il rischio di accesso non autorizzato da sessioni non presidiate. I banner di accesso rafforzano inoltre i criteri organizzativi e forniscono protezione legale informando gli utenti sui termini di utilizzo.

Raccomandazioni per l’uso dello script

  • Testa in un ambiente non di produzione: Convalida le configurazioni su un server di prova per evitare interruzioni nei sistemi di produzione.
  • Aggiorna regolarmente i banner: Utilizza lo script per disabilitare il login automatico periodicamente, per aggiornare i banner con le modifiche ai criteri o gli annunci pertinenti.
  • Effettua backup dei file di configurazione: Esegui sempre il backup dei file modificati per garantire un rapido recupero delle modifiche non attese.
  • Documenta le modifiche: Tieni un registro degli aggiornamenti a scopo di verifica e risoluzione dei problemi.

Considerazioni finali

Questo script per disabilitare il login automatico rappresenta un esempio di come l’automazione possa semplificare le attività amministrative di routine, rafforzando al tempo stesso la sicurezza. NinjaOne, con la sua suite di strumenti di gestione IT, può integrare script come questo per disabilitare il login automatico fornendo una supervisione centralizzata e l’automazione per gli ambienti più grandi. Combinando queste funzionalità, i professionisti IT possono mantenere un’infrastruttura sicura e conforme con un intervento manuale minimo.

Passi successivi

La creazione di un team IT efficiente ed efficace richiede una soluzione centralizzata che funga da principale strumento per la fornitura di servizi. NinjaOne consente ai team IT di monitorare, gestire, proteggere e supportare tutti i dispositivi, ovunque essi si trovino, senza la necessità di una complessa infrastruttura locale.

Per saperne di più sulla distribuzione remota di script con NinjaOne, fai un tour dal vivo, o inizia la tua prova gratuita della piattaforma NinjaOne.

Categorie:

Ti potrebbe interessare anche

×

Guarda NinjaOne in azione!

Inviando questo modulo, accetto La politica sulla privacy di NinjaOne.

Termini e condizioni NinjaOne

Cliccando sul pulsante “Accetto” qui sotto, dichiari di accettare i seguenti termini legali e le nostre condizioni d’uso:

  • Diritti di proprietà: NinjaOne possiede e continuerà a possedere tutti i diritti, i titoli e gli interessi relativi allo script (compreso il copyright). NinjaOne ti concede una licenza limitata per l’utilizzo dello script in conformità con i presenti termini legali.
  • Limitazione d’uso: Puoi utilizzare lo script solo per legittimi scopi personali o aziendali interni e non puoi condividere lo script con altri soggetti.
  • Divieto di ripubblicazione: In nessun caso ti è consentito ripubblicare lo script in una libreria di script appartenente o sotto il controllo di un altro fornitore di software.
  • Esclusione di garanzia: Lo script viene fornito “così com’è” e “come disponibile”, senza garanzie di alcun tipo. NinjaOne non promette né garantisce che lo script sia privo di difetti o che soddisfi le tue esigenze o aspettative specifiche.
  • Assunzione del rischio: L’uso che farai dello script è da intendersi a tuo rischio. Riconosci che l’utilizzo dello script comporta alcuni rischi intrinseci, che comprendi e sei pronto ad assumerti.
  • Rinuncia e liberatoria: Non riterrai NinjaOne responsabile di eventuali conseguenze negative o indesiderate derivanti dall’uso dello script e rinuncerai a qualsiasi diritto legale o di equità e a qualsiasi rivalsa nei confronti di NinjaOne in relazione all’uso dello script.
  • EULA: Se sei un cliente NinjaOne, l’uso dello script è soggetto al Contratto di licenza con l’utente finale (EULA) applicabile.