Samba fornisce software server e client per consentire la condivisione di file tra macchine Linux e Windows. Installarlo e configurarlo su RHEL 8 / CentOS 8 è abbastanza semplice. Continua a leggere per imparare come condividere una directory con samba e come applicarvi il contesto SELinux appropriato.
In questo tutorial imparerai:
- Come installare samba su RHEL8
- Come abilitare e avviare i demoni smb e nmb
- Come creare una condivisione samba
- Come configurare il firewall per consentire l'accesso alla condivisione samba
- Come impostare il contesto SELinux corretto affinché samba funzioni correttamente
Requisiti e convenzioni software utilizzati
Categoria | Requisiti, convenzioni o versione del software utilizzata |
---|---|
Sistema | Red Hat Enterprise Linux 8 |
Software | Pacchetti Samba, coreutils e policycoreutils-python-utils |
Altro | Autorizzazione a eseguire il comando con privilegi di root. |
Convenzioni | # – richiede che i comandi linux dati vengano eseguiti con i privilegi di root direttamente come utente root o usando sudo comando$ – richiede che i comandi linux dati vengano eseguiti come un normale utente non privilegiato |
Vi presentiamo Samba
Samba, come si legge nella homepage del progetto, è un software open source, rilasciato sotto la GPL
licenza, che ci consente di condividere file e servizi di stampa utilizzando il SMB/CIFS
protocollo.
Il progetto fornisce sia software server che client per consentire l'interoperabilità con macchine Windows, rappresentando la soluzione ideale in ambienti misti. In questo tutorial vedremo come installare Samba su Red Hat Enterprise Linux 8, come configurare una condivisione samba, come configurare il firewall per consentire l'accesso alle risorse condivise e come applicare il contesto SELinux appropriato.
Installazione
La prima cosa che dobbiamo fare è installare samba sulla nostra macchina. Il pacchetto e le librerie necessarie sono disponibili nei repository ufficiali di RHEL 8 / CentOS 8, quindi possiamo installarli semplicemente usando yum o dnf. In questa versione di RHEL/CentOS, il primo comando è solo un "link" al secondo:
$ sudo dnf install samba samba-client
Il pacchetto samba-client non è strettamente necessario, ma le utilità da esso fornite possono essere utili. Una volta installati i pacchetti, dobbiamo avviare e abilitare il smb
e il nmb
demoni all'avvio. Il primo è il demone che si occupa di eseguire i trasferimenti effettivi e le operazioni di condivisione, mentre il secondo esegue il NetBIOS
risoluzioni dei nomi, consentendo alle risorse di apparire durante la navigazione in rete su Windows. Ora possiamo abilitare e avviare entrambi i servizi systemd con un solo comando:
$ sudo systemctl enable --now {smb,nmb}
Configurazione del firewall
Il passaggio successivo è la configurazione del firewall. Dobbiamo aprire le porte appropriate, in modo che le risorse condivise da samba possano essere accessibili da altre macchine. Il software di gestione del firewall predefinito suRHEL 8 / CentOS 8 è firewalld.
Fortunatamente per noi, non c'è bisogno di aprire le porte manualmente:non ci resta che aggiungere il servizio “samba” alla nostra zona. Un "servizio" è solo un'astrazione che ci consente di consentire il traffico attraverso tutte le porte necessarie a un servizio, facendo riferimento al nome del servizio, invece di dover configurare (e ricordare) ciascuna porta utilizzata da esso. Nel caso in cui desideriamo raccogliere informazioni su un "servizio", possiamo eseguire:
$ sudo firewall-cmd --info-service samba samba ports: 137/udp 138/udp 139/tcp 445/tcp protocols: source-ports: modules: netbios-ns destination:
Dall'output del comando vediamo che il servizio consentirà il traffico attraverso le porte 173/udp, 138/udp, 139/tcp e 445/tcp. Per aggiungere permanentemente il servizio alla zona predefinita, possiamo eseguire:
$ sudo firewall-cmd --permanent --add-service=samba
Durante l'esecuzione del comando abbiamo utilizzato --permanent
switch per rendere persistente il nostro cambiamento. Abbiamo anche assunto il default
zona da utilizzare. Se volessimo specificare un'altra zona su cui applicare l'azione, avremmo usato il --zone
opzione e ha fornito il nome della zona come argomento (ad es. –zone=external). Poiché la nostra modifica è impostata come permanente, affinché diventi effettiva, dobbiamo ricaricare la configurazione del firewall:
$ sudo firewall-cmd --reload
Possiamo verificare che il servizio “samba” sia ora parte della nostra zona, eseguendo:
$ sudo firewall-cmd --list-services cockpit dhcpv6-client http samba ssh
Anche in questo caso, se non viene specificata alcuna zona, il comando viene applicato alla zona predefinita.
Configurazione di una directory condivisa accessibile agli ospiti
Diciamo che vogliamo condividere una directory tramite samba e vogliamo consentire l'accesso gratuito a questa directory agli utenti ospiti, senza che debbano fornire una password. Per ottenere il risultato desiderato, dobbiamo apportare alcune modifiche al /etc/samba/smb.conf
file e aggiungi una "stanza" per la nostra condivisione. Apri il file con il tuo editor preferito e nel [global]
sezione, aggiungi il testo evidenziato:
[global] workgroup = SAMBA security = user passdb backend = tdbsam printing = cups printcap name = cups load printers = yes cups options = raw map to guest = bad user
La map to guest = bad user
istruzione, mapperà i tentativi di accesso con nomi utente errati all'utente ospite predefinito, che, per impostazione predefinita, è nobody
. Ciò è necessario per consentire l'accesso anonimo senza dover fornire una password.
Dopo questa modifica, dobbiamo aggiungere una nuova stanza dedicata alla nostra condivisione alla fine del file. Chiameremo la risorsa condivisa “linuxconfig”:
[linuxconfig] path = /mnt/shared guest only = yes
Con la configurazione di cui sopra abbiamo dichiarato di voler condividere il contenuto del /mnt/shared
directory, senza la necessità di autenticazione dell'utente. Questa configurazione è ovviamente rischiosa, ed è qui riportata solo a titolo di esempio:in uno scenario reale, potresti voler almeno negare l'accesso in scrittura agli ospiti (puoi farlo aggiungendo il writeable = no
istruzione). Per rendere effettive le modifiche, dobbiamo riavviare i demoni:
$ sudo systemctl restart {smb,nmb}
Configura una condivisione accessibile solo agli utenti registrati
Per proteggere l'accesso a una risorsa con una richiesta di accesso, quando samba è in esecuzione come server autonomo, dobbiamo aggiungere un utente esistente al database di samba. Le credenziali di questo utente saranno necessarie per accedere alla directory condivisa. Per motivi di sicurezza, è buona norma creare un utente dedicato per l'attività, omettendo la creazione della sua home directory e assegnandogli una shell falsa:
$ sudo adduser -M sambauser -s /sbin/nologin
Il -M
l'opzione passata al comando è la forma abbreviata di --no-create-home
, che è abbastanza autoesplicativo; il -s
opzione, invece, specifichiamo una shell, in questo caso apposta non valida:/sbin/nologin
. A questo punto l'utente non ha nemmeno bisogno di avere una password impostata sul nostro sistema.
Una volta creato l'utente, dobbiamo aggiungerlo al database di samba:possiamo eseguire l'operazione utilizzando il smbpasswd
comando:
$ sudo smbpasswd -a sambauser New SMB password: Retype new SMB password: Added user sambauser.
Dopo aver eseguito il comando, ci viene chiesto di assegnare una password per l'utente, e anche di confermarla:questa password sarà valida solo nel contesto samba, non ha nulla a che fare con l'account utente sul nostro sistema. Per limitare la condivisione che abbiamo creato in precedenza, dobbiamo apportare una piccola modifica nella sezione dedicata:
[linuxconfig] path = /mnt/shared guest ok = no
Possiamo verificare che la nostra configurazione sia valida, utilizzando il testparm
comando:
$ testparm Load smb config files from /etc/samba/smb.conf rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384) Processing section "[homes]" Processing section "[printers]" Processing section "[print$]" Processing section "[linuxconfig]" Loaded services file OK. Server role: ROLE_STANDALONE
Ancora una volta, dobbiamo riavviare smb
e nmb
demoni per rendere effettive le nostre modifiche. La directory condivisa sarà ora accessibile solo dopo aver fornito le credenziali corrette.
Imposta SELinux per samba
SELinux è spesso visto come una complicazione e disabilitato immediatamente. Questo non è necessario:dobbiamo solo imparare a configurarlo e sfruttare il miglioramento della sicurezza che fornisce. Affinché la nostra condivisione samba funzioni quando SELinux è in modalità "enforcing", dobbiamo assegnare il contesto appropriato alla nostra directory e ai nostri file condivisi:
$ sudo chcon -R -t samba_share_t /mnt/shared
Nell'esempio sopra, abbiamo usato chcon
comando con il -t
opzione, per modificare il TYPE
sezione del contesto SELinux in samba_share_t
. Abbiamo anche usato il -R
passare per rendere il comando ricorsivo. Questa modifica sopravviverà a un riavvio, ma non a una rietichettatura del sistema se esiste una politica predefinita per la nostra directory e i nostri file, perché in tal caso l'impostazione predefinita verrebbe riapplicata.
Se vogliamo che la nostra modifica sopravviva a un evento di rietichettatura, dobbiamo aggiungere la nostra regola alla politica. Possiamo farlo usando il semanage
comando:
$ sudo semanage fcontext -a -t samba_share_t "/mnt/shared(/.*)?"
Dato che abbiamo usato il (/.*)?
regex, la regola verrà applicata a tutto il contenuto della directory "condivisa" e alla directory stessa. Possiamo verificare che la nostra regola sia stata aggiunta alla norma elencando le etichette in uso nel nostro sistema:
$ sudo semanage fcontext -l | grep /mnt/shared /mnt/shared(/.*)? all files system_u:object_r:samba_share_t:s0
Ora dovremmo avere una configurazione di samba funzionante. Per modificare ulteriormente la configurazione di samba potrebbe essere necessario manipolare anche i booleani di SELinux. Ad esempio, quando si aggiungono utenti esistenti a samba, per consentire la condivisione delle loro directory home, è necessario abilitare il booleano SELinux dedicato. Per elencare tutti i booleani relativi a samba, possiamo eseguire:
$ sudo semanage boolean -l|grep samba samba_create_home_dirs (off , off) Allow samba to create home dirs samba_domain_controller (off , off) Allow samba to domain controller samba_enable_home_dirs (off , off) Allow samba to enable home dirs samba_export_all_ro (off , off) Allow samba to export all ro samba_export_all_rw (off , off) Allow samba to export all rw samba_load_libgfapi (off , off) Allow samba to load libgfapi samba_portmapper (off , off) Allow samba to portmapper samba_run_unconfined (off , off) Allow samba to run unconfined samba_share_fusefs (off , off) Allow samba to share fusefs samba_share_nfs (off , off) Allow samba to share nfs sanlock_use_samba (off , off) Allow sanlock to use samba tmpreaper_use_samba (off , off) Allow tmpreaper to use samba use_samba_home_dirs (off , off) Allow use to samba home dirs virt_use_samba (off , off) Allow virt to use samba
Nell'output sopra, la seconda colonna indica il valore corrente del booleano, mentre la terza quello di default (entrambi sono spenti, in questo caso). Il booleano che vogliamo attivare, per abilitare la condivisione delle home directory, è samba_enable_home_dirs
. Possiamo eseguire l'operazione usando il setsebool
comando:
$ sudo setsebool samba_enable_home_dirs=1
Conclusioni
In questo tutorial abbiamo visto come installare samba su un sistema RHEL 8 / CentOS 8. Abbiamo anche visto come condividere una directory, consentendo l'accesso agli ospiti o limitandola agli utenti autenticati. Abbiamo anche visto come configurare il firewall in modo che la condivisione sia accessibile da altre macchine sulla rete.
Infine, abbiamo visto come eseguire le modifiche necessarie per avere una configurazione samba funzionante con SELinux in modalità "enforcing". Se sei interessato a SELinux, puoi anche leggere il nostro articolo sull'argomento.