Disabilitare PermitEmptyPasswords con uno script Bash per proteggere l’accesso SSH

Garantire un accesso sicuro ai server è una priorità assoluta per i professionisti IT e i provider di servizi gestiti (MSP). Un aspetto importante della sicurezza dei server è la gestione delle configurazioni SSH per evitare accessi non autorizzati. Una misura di sicurezza critica è quella di disabilitare l’opzione PermitEmptyPasswords di OpenSSH, che impedisce agli utenti di accedere con una password vuota. In questo articolo presentiamo uno script Bash progettato per disabilitare PermitEmptyPasswords e garantire così una maggiore sicurezza ai sistemi Linux.

Contesto

OpenSSH è un protocollo ampiamente utilizzato per la gestione sicura dei server remoti. Per impostazione predefinita, l’opzione PermitEmptyPasswords è impostata su “no”, ma è essenziale verificare e applicare questa configurazione per ridurre i rischi associati a configurazioni errate o non verificate. I professionisti IT che gestiscono più sistemi potrebbero trascurare questo dettaglio, lasciando i server vulnerabili. Questo script fornisce una soluzione automatizzata che garantisce la conformità alle best practice disabilitando esplicitamente la possibilità di login con password vuote.

Per gli MSP e gli amministratori che gestiscono numerosi server, questo script per disabilitare PermitEmptyPasswords semplifica l’hardening SSH, offrendo un modo rapido e affidabile per migliorare la sicurezza senza interventi manuali.

Lo script per disabilitare PermitEmptyPasswords:

#!/usr/bin/env bash

# Description: Explicitly disables PermitEmptyPasswords in OpenSSH.
# 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).
#
# PermitEmptyPasswords defaults to no when not specified in the sshd_config file.
# This script will ensure that it is set to no to prevent SSH from accepting empty passwords.
#
# Links: https://man.openbsd.org/sshd_config#PermitEmptyPasswords
#
# Release Notes: Initial Release

# Logs an error message and exits with the specified exit code
die() {
    local _ret="${2:-1}"
    echo "$1" >&2
    exit "${_ret}"
}

# Check that we are running as root
if [[ $EUID -ne 0 ]]; then
    die "[Error] This script must be run as root." 1
fi

_should_reload="false"

# Check if the sshd_config file exists
if [[ -f /etc/ssh/sshd_config ]]; then
    # Check if the PermitEmptyPasswords option is already set to no
    if grep -q "^PermitEmptyPasswords no" /etc/ssh/sshd_config; then
        echo "[Info] PermitEmptyPasswords is already set to no."
        _should_reload="false"
    elif grep -q "^PermitEmptyPasswords yes" /etc/ssh/sshd_config; then
        # First check if the option is not commented out and set to yes
        # Then set the PermitEmptyPasswords option to no
        sed -i 's/^PermitEmptyPasswords.*/PermitEmptyPasswords no/' /etc/ssh/sshd_config
        echo "[Info] PermitEmptyPasswords set to no."
        _should_reload="true"
    elif grep -q "^#PermitEmptyPasswords" /etc/ssh/sshd_config; then
        # First check if the option is commented out
        # Then set the PermitEmptyPasswords option to no
        sed -i 's/^#PermitEmptyPasswords.*/PermitEmptyPasswords no/' /etc/ssh/sshd_config
        echo "[Info] PermitEmptyPasswords set to no, as it was commented out."
        _should_reload="true"
    else
        # Append the PermitEmptyPasswords option to the end of the sshd_config file
        # If the past checks have not found the option, appending it will ensure that it is set to no
        echo "PermitEmptyPasswords no" >>/etc/ssh/sshd_config
        echo "[Info] PermitEmptyPasswords set to no at the end of the sshd_config file."
        _should_reload="true"
    fi

    # Check that this system is running systemd-based
    _type=$(
        # Get the type of init system
        file /sbin/init 2>/dev/null | awk -F/ '{print $NF}' 2>/dev/null
    )
    if [[ "${_type}" == "systemd" ]] && [ "$(command -v systemctl)" ]; then
        echo "[Info] Reloading ${sshd_service} service..."
        # Find the sshd service
        sshd_service=$(
            # Get the ssh service, if two are found use the first one. Likely the first one is a symlink to the actual service file.
            systemctl list-unit-files | grep -E "^(sshd|ssh|openssh-server)\.service" | awk -F' ' '{print $1}' | head -n 1
        )
        if [[ -z "${sshd_service}" ]]; then
            die "[Error] sshd service is not available. Please install it and try again." 1
        fi
        # Check that ssh service is enabled
        if systemctl is-enabled "${sshd_service}" >/dev/null; then
            echo "[Info] ${sshd_service} is enabled."
        else
            die "[Info] ${sshd_service} is not enabled. When enabled and started, PermitEmptyPasswords will be set to no." 0
        fi
        # Check that ssh service is running
        if systemctl is-active "${sshd_service}" >/dev/null; then
            echo "[Info] ${sshd_service} is running."
            if [[ "${_should_reload}" == "true" ]]; then
                # Reload sshd.service
                if systemctl reload "${sshd_service}"; then
                    echo "[Info] sshd service configuration reloaded."
                else
                    die "[Error] Failed to reload ${sshd_service}. Please try again." 1
                fi
            else
                echo "[Info] sshd service configuration will not be reloaded as there is no need to do so."
            fi
        else
            echo "[Info] ${sshd_service} is not running."
        fi
    else
        echo "[Info] Restarting sshd service..."
        # Check that the service command is available
        if ! [ "$(command -v service)" ]; then
            die "[Error] The service command is not available. Is this an initd type system (e.g. SysV)? Please try again." 1
        fi
        # Find the sshd service
        sshd_service=$(
            # Get the list of services
            service --status-all | awk -F' ' '{print $NF}' | grep sshd
        )
        if [[ -z "${sshd_service}" ]]; then
            die "[Error] sshd service is not available. Please install it and try again." 1
        fi
        if [[ "${_should_reload}" == "true" ]]; then
            # Restart sshd service
            if service "${sshd_service}" restart; then
                echo "[Info] sshd service restarted."
            else
                die "[Error] Failed to restart sshd service. Please try again." 1
            fi
        else
            echo "[Info] sshd service configuration will not be restarted as there is no need to do so."
        fi
    fi
else
    die "[Error] The sshd_config file does not exist." 1
fi

 

Risparmia tempo con gli oltre 300 script del Dojo NinjaOne.

Accedi oggi stesso.

Analisi dettagliata

Questo script Bash automatizza il processo di impostazione esplicita di PermitEmptyPasswords su “no” nel file di configurazione SSH (/etc/ssh/sshd_config). Di seguito viene illustrato passo per passo il funzionamento dello script per disabilitare PermitEmptyPasswords:

1. Verifica dei privilegi di root

Lo script per disabilitare PermitEmptyPasswords inizia verificando se viene eseguito come utente root, poiché la modifica delle configurazioni SSH richiede permessi elevati. In caso contrario, termina con un errore.

bash

Copia il codice

if [[ $EUID -ne 0 ]]; then
die “[Errore] Questo script deve essere eseguito come root” 1
fi

2. Identificazione del file di configurazione

Lo script per disabilitare PermitEmptyPasswords verifica l’esistenza di /etc/ssh/sshd_config. Se questo file manca, lo script esce con un errore, poiché non può procedere senza il file di configurazione SSH.

3. Modifica dell’impostazione PermitEmptyPasswords

Lo script per disabilitare PermitEmptyPasswords ispeziona il file alla ricerca della direttiva PermitEmptyPasswords:

  • Se la direttiva è impostata su “no”, non vengono apportate modifiche.
  • Se è impostata su “sì”, il valore viene modificato in “no”.
  • Se commentato, lo script rimuove il commento imposta il valore su “no”.
  • Se la direttiva manca del tutto, viene aggiunto PermitEmptyPasswords no al file.

4. Ricaricare il servizio SSH

Lo script per disabilitare PermitEmptyPasswords determina il sistema di init del sistema (systemd o init.d) per ricaricare o riavviare il servizio SSH in modo appropriato. Assicura che le modifiche vengano applicate senza interrompere le sessioni SSH in corso.

5. Gestione degli errori

Una gestione completa degli errori assicura che lo script per disabilitare PermitEmptyPasswords termini se incontra problemi come comandi mancanti, servizi disabilitati o sistemi di init non supportati.

Casi d’uso potenziali

Scenario ipotetico

Un amministratore IT che gestisce un certo numero di server nota che un server consente l’accesso SSH con password vuote. Ispezionare e modificare manualmente i file di configurazione di tutti i server richiederebbe molto tempo. Distribuendo questo script per disabilitare PermitEmptyPasswords attraverso strumenti di automazione come Ansible o direttamente via SSH, l’amministratore si assicura che tutti i server applichino l’impostazione PermitEmptyPasswords no in modo coerente ed efficiente.

Confronti

Configurazione manuale

Modificare manualmente il file sshd_config e riavviare il servizio SSH è una procedura semplice ma soggetta a errori e inefficiente per più server.

Strumenti di configurazione centralizzati

Strumenti di gestione della configurazione come Puppet o Chef possono imporre le impostazioni SSH in tutta l’infrastruttura. Tuttavia, questi strumenti richiedono una configurazione e sono più complessi di questo script leggero per le distribuzioni su piccola scala.

Lo script per disabilitare PermitEmptyPasswords offre una via di mezzo: semplice, mirata ed efficace per un’attuazione immediata.

Domande frequenti

  1. Cosa succede se PermitEmptyPasswords non è specificato nel file di configurazione?
    Lo script per disabilitare PermitEmptyPasswords aggiunge PermitEmptyPasswords no al file, disabilitando esplicitamente i login con password vuote.
  2. Questo script per disabilitare PermitEmptyPasswords può interrompere l’accesso SSH?
    No, modifica solo una direttiva specifica e ricarica/riavvia il servizio SSH senza interrompere le sessioni attive.
  3. Questo script per disabilitare PermitEmptyPasswords è compatibile con tutte le distribuzioni Linux?
    È progettato per le distribuzioni che utilizzano OpenSSH e supporta sia i sistemi systemd che init.d.
  4. Dovrò riavviare manualmente il servizio SSH?
    No, lo script per disabilitare PermitEmptyPasswords gestisce i ricarichi o i riavvii del servizio come richiesto.

Implicazioni

Applicando il parametro PermitEmptyPasswords no, questo script per disabilitare PermitEmptyPasswords riduce un rischio critico per la sicurezza. Una configurazione errata delle impostazioni SSH può esporre i server ad attacchi brute-force e ad accessi non autorizzati. Questo script garantisce la conformità alle best practice di sicurezza, riducendo la superficie di attacco e salvaguardando i sistemi sensibili.

Raccomandazioni

  • Testa prima della distribuzione: Esegui lo script per disabilitare PermitEmptyPasswords in un ambiente di prova per verificarne il comportamento.
  • Automatizza l’implementazione: Utilizza strumenti come Ansible per distribuire questo script per disabilitare PermitEmptyPasswords su più server.
  • Monitora i log: Controlla i log SSH per verificare che le modifiche alla configurazione siano effettive.
  • Documenta le modifiche: Conserva registrazioni delle configurazioni applicate per scopi di auditing.

Considerazioni finali

Il mantenimento di un ambiente SSH sicuro è fondamentale per le operazioni IT. Script come quello per disabilitare PermitEmptyPasswords semplificano il processo di applicazione delle misure di sicurezza critiche, garantendo la conformità e proteggendo i sistemi da accessi non autorizzati. Per i professionisti IT che gestiscono grandi infrastrutture, l’utilizzo di strumenti di automazione come NinjaOne migliora l’efficienza operativa, offrendo soluzioni di gestione e monitoraggio centralizzate e personalizzate per le loro esigenze.

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.