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.
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
- 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. - 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. - 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. - 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.