Come abilitare o disabilitare i dispositivi di archiviazione USB su Linux con uno script shell

Il controllo dell’accesso ai dispositivi di archiviazione USB è una pratica fondamentale per mantenere l’integrità dei dati e prevenire la condivisione di dati non autorizzata negli ambienti enterprise. Poiché le minacce provenienti dai supporti rimovibili continuano a esistere, dalle fughe di dati a causa di insider alle unità USB cariche di malware, gli amministratori IT e i provider di servizi gestiti (MSP) devono applicare criteri rigorosi sull’utilizzo delle unità USB. Un metodo efficace e scalabile è il controllo tramite scripting a livello di modulo del kernel. In questo articolo presentiamo uno script shell progettato per abilitare, disabilitare i dispositivi di archiviazione USB o per configurarli su Linux.

Contesto

Sui sistemi Linux, l’accesso allo storage USB è regolato da moduli del kernel, in particolare usb-storage e uas (USB Attached SCSI). Questi moduli possono essere caricati automaticamente quando i dispositivi sono collegati (caricamento implicito) o richiamati manualmente (caricamento esplicito). Bloccando o consentendo questi moduli a livello di sistema, i professionisti IT possono controllare in modo efficace il comportamento dei dispositivi di archiviazione USB negli endpoint Linux.

Lo script in questione è progettato per l’automazione, l’applicazione dei criteri e la compatibilità con piattaforme RMM come NinjaOne. Crea e gestisce i file di configurazione in /etc/modprobe.d/, aggiorna il filesystem iniziale della RAM (initramfs) e può opzionalmente attivare un riavvio del sistema, diventando così una soluzione completa per la governance dei dispositivi USB.

Lo script per disabilitare i dispositivi di archiviazione USB su Linux:

#!/usr/bin/env bash

# Description: Enable or disable USB storage devices on Linux.
# 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).
#
#   There are two methods of loading USB storage drivers that allow mounting of USB storage devices:
#       1. Implicit loading: The USB storage driver is loaded automatically when a USB storage device is connected.
#       2. Explicit loading: The USB storage driver is loaded manually by a user, program, or script.
#
# Release Notes: Initial Release
#
# Notes: This will create config files in /etc/modprobe.d/ as needed to block USB storage devices.
#
# Usage: [-Enable | -Disable] [-Reboot]
#
# Preset Parameter: --help
#   Displays the help menu.
#
# Preset Parameter: -Enable
#   Enables USB storage devices.
#
# Preset Parameter: -Disable
#   Disables USB storage devices.
#
# Preset Parameter: -Reboot
#   Reboots the system, if needed, after enabling or disabling USB storage devices.

# Functions
# Print an error message and exit with a specific status code
die() {
    local _ret="${2:-1}"
    test "${_PRINT_HELP:-no}" = yes && print_help >&2
    echo "$1" >&2
    exit "${_ret}"
}

print_help() {
    printf '\n\n%s\n\n' 'Usage: [-Enable | -Disable]'
    printf '  %s\n' '-Enable'
    printf '    Enables USB storage devices'
    printf '  %s\n' '-Disable'
    printf '    Disables USB storage devices'
}

# Set the default values
_arg_reboot="false"

# Parse the command-line arguments
parse_commandline() {
    while test $# -gt 0; do
        _key="$1"
        case "$_key" in
        -Enable | --Enable | -enable | --enable | -e | --e)
            _arg_action="Enable"
            ;;
        -Disable | --Disable | -disable | --disable | -d | --d)
            _arg_action="Disable"
            ;;
        --Reboot | --reboot | -Reboot | -reboot | -r | --r)
            _arg_reboot="true"
            ;;
        --help | -help | -h | --h)
            _PRINT_HELP=yes die "" 0
            ;;
        *)
            _PRINT_HELP=yes die "[Error] Got an unexpected argument '$1'" 1
            ;;
        esac
        shift
    done
}

parse_commandline "$@"

# Exit if not running as root
if [[ $EUID -ne 0 ]]; then
    die "[Error] This script must be run as root or SYSTEM from NinjaRMM" 1
fi

# If script form variables are used, replace the command line parameters with their value.
if [[ -n "${action}" ]] && [[ "${action}" == "Enable" ]]; then
    _arg_action="Enable"
elif [[ -n "${action}" ]] && [[ "${action}" == "Disable" ]]; then
    _arg_action="Disable"
fi

if [[ "${reboot}" == "true" ]]; then
    _arg_reboot="true"
fi

# Check if action is empty
if [[ -z "${_arg_action}" ]]; then
    die "Invalid action. Use Enable or Disable" 1
fi

# Variables
# Modprobe.d folder
modprobFolder="/etc/modprobe.d"
# Config file
configFile="${modprobFolder}/ninja-usb-block.conf"

# Check if modprobe.d folder does not exists
if ! [ -d "${modprobFolder}" ]; then
    die "[Error] Modprobe folder does not exist" 1
fi

# Check if usb-storage and uas kenel drivers are modules
if ! modprobe -n uas >/dev/null 2>&1; then
    die "[Error] USB Attached SCSI driver(uas) must be compiled as a kernel module" 1
fi
if ! modprobe -n usb-storage >/dev/null 2>&1; then
    die "[Error] USB storage(usb-storage) driver must be compiled as a kernel module" 1
fi

if [[ "${_arg_action}" == "Enable" ]]; then
    # Enable USB storage

    # Check if our file exists
    if [ -f "${configFile}" ]; then
        echo "[Info] Enabling USB storage devices"
        # Remove our config file
        rm "${configFile}"
        echo "[Info] Enabled USB storage devices"
    else
        echo "[Info] USB storage devices are already enabled"
    fi

    # Remove other blocks USB storage in other files
    for file in "${modprobFolder}"/*; do
        # Remove implicit USB Storage block
        if grep -q "blacklist usb_storage" "${file}"; then
            echo "[Info] Removing implicit USB Storage block in ${file}"
            sed -i '/blacklist usb_storage/d' "${file}"
            echo "[Info] Removed implicit USB Storage block in ${file}"
        fi
        # Remove implicit USB Attached SCSI block
        if grep -q "blacklist uas" "${file}"; then
            echo "[Info] Removing implicit USB Attached SCSI block in ${file}"
            sed -i '/blacklist uas/d' "${file}"
            echo "[Info] Removed implicit USB Attached SCSI block in ${file}"
        fi
        # Remove explicit USB Storage driver block
        if grep -q "install usb-storage /bin/true" "${file}"; then
            echo "[Info] Removing explicit USB Storage block in ${file}"
            sed -i '/install usb-storage \/bin\/true/d' "${file}"
            echo "[Info] Removed explicit USB Storage block in ${file}"
        fi
        # Remove explicit USB Attached SCSI driver block
        if grep -q "install uas /bin/true" "${file}"; then
            echo "[Info] Removing explicit USB Attached SCSI block in ${file}"
            sed -i '/install uas \/bin\/true/d' "${file}"
            echo "[Info] Removed explicit USB Attached SCSI block in ${file}"
        fi
    done

    # Check that update-initramfs command exists
    if command -v update-initramfs >/dev/null 2>&1; then
        # Update the initramfs
        echo "[Info] Updating initramfs"
        update-initramfs -u >/dev/null 2>&1
        echo "[Info] Updated initramfs"
    fi

    if [[ "${_arg_reboot}" == "true" ]]; then
        echo "[Info] Rebooting the system to enable USB storage devices"
        # Shutdown in 1 minute
        shutdown -r +1
    else
        echo "[Info] USB storage devices are enabled, please reboot the system"
    fi

elif [[ "${_arg_action}" == "Disable" ]]; then
    # Disable USB storage

    # Variables to determine if we should block the drivers
    blacklist_uas="false"
    blacklist_usb_storage="false"
    block_uas="false"
    block_usb_storage="false"

    # Check if usb_storage or uas is blocked in other files
    for file in "${modprobFolder}"/*; do

        # Check if implicit loading is already blocked
        if grep -q "blacklist uas" "${file}"; then
            echo "[Info] USB Attached SCSI drivers are already implicitly blocked in ${file}"
        else
            blacklist_uas="true"
        fi

        # Check if implicit loading is already blocked
        if grep -q "blacklist usb_storage" "${file}"; then
            echo "[Info] USB storage drivers are already implicitly blocked in ${file}"
        else
            blacklist_usb_storage="true"
        fi

        # Check if explicit loading is already blocked
        if grep -q "install uas /bin/true" "${file}"; then
            echo "[Info] USB Attached SCSI drivers are already explicitly blocked in ${file}"
        else
            block_uas="true"
        fi

        # Check if explicit loading is already blocked
        if grep -q "install uas /bin/true" "${file}"; then
            echo "[Info] USB storage drivers are already explicitly blocked in ${file}"
        else
            block_usb_storage="true"
        fi
    done

    if [ "${blacklist_uas}" == "true" ]; then
        echo "[Info] Implicitly Disabling USB Attached SCSI driver"

        # Check if config file exists
        if ! [ -f "${configFile}" ]; then
            echo "[Info] Creating blocklist config file (${configFile})"
            touch "${configFile}"
        fi

        # Write the line to the file
        echo "blacklist uas" >>"${configFile}"
    fi

    if [ "${blacklist_usb_storage}" == "true" ]; then
        echo "[Info] Implicitly Disabling USB storage driver"

        # Check if config file exists
        if ! [ -f "${configFile}" ]; then
            echo "[Info] Creating blocklist config file (${configFile})"
            touch "${configFile}"
        fi

        # Write the line to the file
        echo "blacklist usb_storage" >>"${configFile}"
    fi

    if [ "${block_uas}" == "true" ]; then
        echo "[Info] Explicitly Disabling USB Attached SCSI driver"

        # Check if uas config file exists
        if ! [ -f "${modprobFolder}" ]; then
            echo "[Info] Creating UAS config file (${modprobFolder}/uas.conf)"
            touch "${modprobFolder}/uas.conf"
        fi

        # Write the line to the file
        echo "install uas /bin/true" >>"${modprobFolder}/uas.conf"
    fi

    if [ "${block_usb_storage}" == "true" ]; then
        echo "[Info] Explicitly Disabling USB storage driver"

        # Check if usb-storage config file exists
        if ! [ -f "${modprobFolder}" ]; then
            echo "[Info] Creating USB storage config file (${modprobFolder}/usb-storage.conf)"
            touch "${modprobFolder}/usb-storage.conf"
        fi

        # Write the line to the file
        echo "install usb-storage /bin/true" >>"${modprobFolder}/usb-storage.conf"
    fi

    # Unload the modules
    echo "[Info] Unloading USB storage modules"
    modprobe -r uas >/dev/null 2>&1
    modprobe -r usb_storage >/dev/null 2>&1
    rmmod uas >/dev/null 2>&1
    rmmod usb_storage >/dev/null 2>&1

    # Check if the modules are still loaded
    modules_unloaded="true"
    if lsmod | grep -q uas; then
        modules_unloaded="false"
    fi
    if lsmod | grep -q usb_storage; then
        modules_unloaded="false"
    fi

    # Check that update-initramfs command exists
    if command -v update-initramfs >/dev/null 2>&1; then
        # Update the initramfs
        echo "[Info] Updating initramfs"
        update-initramfs -u >/dev/null 2>&1
        echo "[Info] Updated initramfs"

        # Set to false so we can reboot or warn that a reboot is needed
        modules_unloaded="false"
        if [[ "${_arg_reboot}" == "false" ]]; then
            echo "[Warn] USB storage devices can still be mounted, please reboot the system"
        fi
    fi

    if [ "${modules_unloaded}" == "true" ]; then
        echo "[Info] Unloaded USB storage modules"
    else
        if [[ "${_arg_reboot}" == "true" ]]; then
            echo "[Info] USB storage devices are still mounted, rebooting the system"
            # Shutdown in 1 minute
            shutdown -r +1
        else
            echo "[Warn] USB storage devices are still mounted, please unmount them and rerun this script OR reboot the system"
        fi
    fi

else
    die "[Error] Invalid parameter. Use -Enable or -Disable" 1
fi

 

Analisi dettagliata dello script per disabilitare i dispositivi di archiviazione USB su Linux

Ecco come funziona lo script per disabilitare i dispositivi di archiviazione USB su Linux passo per passo:

1. Parsing della riga di comando

Lo script per disabilitare i dispositivi di archiviazione USB su Linux accetta i seguenti flag:

  • -Enable: Consente l’archiviazione USB rimuovendo le relative restrizioni del modulo del kernel.
  • -Disable: Impedisce l’archiviazione USB applicando blacklist di moduli del kernel e blocchi di caricamento espliciti.
  • -Reboot: Flag opzionale per riavviare la macchina dopo la modifica.
  • –help: Visualizza le istruzioni d’uso.

2. Controllo dei privilegi

Lo script per disabilitare i dispositivi di archiviazione USB su Linux verifica che venga eseguito con i privilegi di root, essenziali per le modifiche a livello di kernel.

3. Rilevamento dei moduli

Verifica che usb-storage e uas siano compilati come moduli del kernel, un prerequisito per l’efficacia delle modifiche.

4. Abilitazione dell’archiviazione USB

Quando viene invocato -Enable:

  • Lo script per disabilitare i dispositivi di archiviazione USB su Linux rimuove il proprio file di configurazione (ninja-usb-block.conf).
  • Esamina altri file .conf in /etc/modprobe.d/ ed elimina tutte le direttive di blacklist o di blocco esplicito del caricamento.
  • Rigenera initramfs per riflettere le modifiche.
  • Opzionalmente, pianifica un riavvio.

5. Disabilitazione dell’archiviazione USB

Quando si usa -Disable:

  • Lo script per disabilitare i dispositivi di archiviazione USB su Linux scrive le direttive di blacklist (blacklist usb_storage, blacklist uas) e di blocco dell’installazione (install usb-storage /bin/true) in file .conf dedicati.
  • Scarica forzatamente i moduli del kernel usando modprobe -r e rmmod.
  • Convalida la rimozione del modulo tramite lsmod.
  • Aggiorna initramfs e, se necessario, riavvia il sistema.

Casi d’uso potenziali

Caso di studio: Protezione dei laptop degli sviluppatori

Un MSP che gestisce workstation per sviluppatori Linux vuole evitare che codice o dati proprietari vengano condivisi in modo non autorizzato tramite unità USB. Utilizzando NinjaOne, l’amministratore distribuisce questo script shell per disabilitare i dispositivi di archiviazione USB su Linux con i flag -Disable -Reboot. Su tutti i sistemi interessati non sarà possibile utilizzare storage USB al successivo avvio. Durante un blocco del codice, l’accesso USB viene temporaneamente riattivato tramite un’attività pianificata con -Enable.

Questo metodo garantisce un controllo rigoroso con possibilità di audit e di rollback.

Confronti

MetodoProContro
Regole udevControllo granulare del dispositivoRichiede ID dispositivo, complesso
Criteri di gruppo (su Windows)Applicazione nativaNon applicabile a Linux
Script shell (questo)Veloce, replicabile, si integra bene con altre soluzioniRichiede il supporto del modulo del kernel
SELinux/AppArmorMolto sicuroComplesso da configurare correttamente

Rispetto alle alternative, questo script shell offre un mix equilibrato di semplicità, portabilità e applicazione a livello di sistema senza la necessità di gestire ID di dispositivi o software di terze parti.

Domande frequenti

D: Cosa succede se il mio sistema non usa initramfs?

Lo script per disabilitare i dispositivi di archiviazione USB su Linux salta silenziosamente gli aggiornamenti di initramfs. Tuttavia, le modifiche potrebbero non essere applicate fino al successivo riavvio.

D: Questo script può essere distribuito tramite NinjaOne?

Sì, lo script per disabilitare i dispositivi di archiviazione USB su Linux è completamente compatibile con l’automazione di scripting Linux di NinjaOne, compreso il supporto per il passaggio di parametri come action=Disable e reboot=true.

D: Cosa succede se un utente carica manualmente il modulo dopo averlo disabilitato?

La direttiva install /bin/true impedisce anche il caricamento manuale dei moduli, a meno che non venga esplicitamente rimossa.

D: L’azione dello script è reversibile?

Assolutamente sì. L’esecuzione dello script per disabilitare i dispositivi di archiviazione USB su Linux con -Enable annulla tutta la configurazione e ripristina la funzionalità USB.

Implicazioni

L’uso di questo script per disabilitare i dispositivi di archiviazione USB su Linux migliora la sicurezza degli endpoint e garantisce la conformità ai criteri sui computer Linux. Riduce i rischi derivanti da:

  • Minacce insider che trasferiscono dati sensibili
  • Infezione da malware tramite USB rogue
  • Bypass dei sistemi DLP tramite unità rimovibili

Per i settori regolamentati come quello finanziario, sanitario o governativo, questo script per disabilitare i dispositivi di archiviazione USB su Linux offre un efficace controllo di conformità.

Raccomandazioni

  • Esegui i test prima della distribuzione di massa, soprattutto sui sistemi con moduli kernel personalizzati.
  • Automatizza le procedure di rollback e archivia un backup dei file .conf modificati.
  • Integra lo script con gli avvisi RMM; tieni traccia dei sistemi in cui l’archiviazione USB è nuovamente abilitata.
  • Pianifica attentamente i riavvii per evitare di disturbare gli utenti.

Considerazioni finali

Se stai cercando di disabilitare i dispositivi di archiviazione USB su Linux con uno script shell, di abilitare i dispositivi di archiviazione USB con uno script shell o di configurare i criteri di accesso all’archiviazione USB su Linux, questo script per disabilitare i dispositivi di archiviazione USB su Linux offre un approccio affidabile e ripetibile. Grazie al framework di scripting e automazione di NinjaOne, gli MSP e i professionisti IT possono rendere operativa la governance USB anche su vasta scala, applicando i criteri di sicurezza e mantenendo il controllo amministrativo.

Per gestire gli endpoint Linux in modo efficiente e sicuro, gli strumenti centralizzati di scripting, automazione e reporting di NinjaOne sono complementari a questo script, e possono aiutare i team a scalarne l’applicazione senza aumentare il carico di lavoro.

Next Steps

Building an efficient and effective IT team requires a centralized solution that acts as your core service delivery tool. NinjaOne enables IT teams to monitor, manage, secure, and support all their devices, wherever they are, without the need for complex on-premises infrastructure.

Learn more about NinjaOne Remote Script Deployment, check out a live tour, or start your free trial of the NinjaOne platform.

Categorie:

Ti potrebbe interessare anche