CentOS 7 - Directory create tramite VSFTPD che non ereditano contesti SELinux


8

La nostra azienda ha un server web con CentOS 7 e i nostri clienti gestiscono i loro siti Web tramite FTP (vsftpd). SELinux è in modalità di applicazione.

Il problema è che i dati creati / caricati tramite VSFTPD non ereditano il contesto SELinux appropriato. Lasciatemi spiegare.

Ad esempio, per i siti WordPress il server ha già pronto un paio di regole che possono essere viste usando semanage fcontext -l |grep '/var/www', che sono:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files          system_u:object_r:httpd_sys_rw_content_t:s0

Quindi, quando copio un sito WordPress diciamo da un altro server in una directory in /var/www/html/SSH, le cartelle wp-content/e wp-content/uploads/hanno il giusto httpd_sys_rw_content_tcontesto di sicurezza. TUTTAVIA, quando quelle cartelle vengono create tramite FTP, il contesto che ottengono è httpd_sys_content_t(no rw ). Ciò significa che i siti caricati dai nostri clienti sul server non possono scrivere in quelle directory anche se danno autorizzazioni di scrittura all'utente / gruppo apache, quindi l'amministratore di WordPress non funziona. Quindi, quando caricano un sito, devono richiederci supporto per risolvere il problema, il che è una perdita di tempo per tutti i soggetti coinvolti.

Diciamo che il cliente ha caricato il proprio sito in httpdocs, se attraverso SSH faccio mv httpdocs/ httpdocs.2/ && cp -pr httpdocs.2/ httpdocs/ && rm httpdocs.2/ -fril problema è risolto, quindi non c'è niente di sbagliato nei dati.

Posso anche fare restorecon -Rv httpdocs/per risolvere il problema.

Quindi, la domanda è: come posso fare in modo che le directory create / caricate tramite VSFTPD ereditino i contesti SELinux appropriati proprio come sono ereditate quando le directory vengono create / caricate tramite SSH?


Per motivi di sicurezza, è una cattiva idea supportare FTP. Prendi in considerazione l'idea di liberartene e di istruire i clienti su come configurare i loro client di trasferimento file per utilizzare invece SFTP ... che eliminerà anche questo problema.
Michael Hampton,

Grazie Michael. Sono d'accordo con te, ma nel nostro caso non utilizziamo "ftp.domain.com" per i nostri clienti e inoltre non esponiamo l'indirizzo IP pubblico del server (il server è dietro il proxy NginX), quindi la sicurezza FTP non è un problema per noi. Solo coloro a cui inviamo l'indirizzo FTP possono persino trovare l'indirizzo IP del server per connettersi tramite FTP.
Juan Pablo Barrios,

Risposte:


6

Esiste una differenza tra l'etichettatura predefinita che si verifica in fase di esecuzione e la politica di post-etichettatura basata su espressioni regolari che si applica sul server.

Quello che stai notando qui:

/var/www/html(/.*)?/uploads(/.*)?                  all files          system_u:object_r:httpd_sys_rw_content_t:s0
/var/www/html(/.*)?/wp-content(/.*)?               all files         system_u:object_r:httpd_sys_rw_content_t:s0

È la politica di etichettatura postale.

Ciò di cui si discute nel problema riguarda in realtà la politica di runtime.

Quando una voce viene creata in una directory usando SELinux, le regole che governano l'etichetta che il file o la directory finiscono per essere non sono dettate dalle espressioni regolari che citi ma altre regole come segue (credo che questo sia l'ordine corretto, ma potrebbe essersi perso qualcosa) .

  1. Esiste una type_transitionregola denominata esplicita .
  2. Esiste una type_transitionregola esplicita senza nome .
  3. Eredita lo stesso contesto della directory principale.
  4. Applica il default_context.

Quindi, quando copio un sito WordPress diciamo da un altro server in una directory in / var / www / html / di SSH, le cartelle wp-content / e wp-content / uploads / hanno il giusto contesto di sicurezza httpd_sys_rw_content_t.

Quindi sì, lo fa, ma non per il motivo che pensi che lo faccia. Certamente non a causa della politica di etichettatura postale.

Ciò si verifica perché type_transitionesiste una specifica regola denominata che fornisce questo comportamento.

$ sesearch -C -T -s unconfined_t -t httpd_sys_content_t -c dir

Found 4 named file transition filename_trans:
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "wp-content"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "smarty"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "uploads"; 
type_transition unconfined_t httpd_sys_content_t : dir httpd_sys_rw_content_t "upgrade"; 

Questo sta sostanzialmente dicendo.

  • Se lo sei unconfined_t e
  • Se si sta eseguendo un'azione nel tipo di destinazione httpd_sys_content_t e
  • Se la classe della nuova voce è una directory e
  • Se il nome della nuova voce è "uploads", allora
  • Il nuovo tipo è httpd_sys_rw_content_t

Il motivo per cui funziona per SSHD è perché dopo aver effettuato l'accesso ti viene dato il contesto di origine unconfined_tper cui si applica questa regola.

Questo non funziona per il servizio FTP perché è molto probabile ftpd_tche il contesto di origine di questo servizio non abbia una regola corrispondente.

Come tale, dovresti modificare la politica per alterare il comportamento di SELinux per onorare anche le regole dei file con nome che vedi nelle altre voci anche per FTP.

Almeno in Fedora 23 esiste un'interfaccia per permetterlo, un modulo politico come questo lo farebbe.

policy_module(local_ftpd, 7.2.0)

require {
  type ftpd_t;
}

apache_filetrans_named_content(ftpd_t)

Puoi caricarlo assicurandoti che il selinux-policy-develpacchetto sia installato e funzionante make -f /usr/share/selinux/devel/Makefile load.


1
Ciao Matthew, questo ha funzionato !! Grazie per l'aiuto dato che stavo impazzendo con questo. Non ero sicuro di cosa facessi con il modulo di policy che hai scritto poiché non avevo mai personalizzato SELinux, quindi ho cercato su google un po 'e ciò che ho fatto è stato il seguente: ho creato il file local_ftpd.tecon il tuo modulo di policy, poi l'ho fatto make -f /usr/share/selinux/devel/Makefile local_ftpd.ppe poi semodule -i local_ftpd.pp. Va bene? Ora i file creati tramite FTP ereditano i contesti desiderati. Grazie ancora!
Juan Pablo Barrios,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.