Nota:

Utilizzare SELinux su Oracle Linux

Introduzione

SELinux è un set di modalità del kernel e strumenti di spazio utente che offrono un altro livello di sicurezza del sistema, un controllo accurato dell'accesso, criteri definiti dall'amministratore a livello di sistema e una migliore mitigazione per gli attacchi di escalation dei privilegi.

Questa esercitazione consente di utilizzare questi strumenti di spazio utente per mantenere il sistema in esecuzione in modalità di applicazione.

Obiettivi

In questo laboratorio imparerai a:

Prerequisiti

Imposta ambiente laboratorio

Nota: quando si utilizza l'ambiente di laboratorio gratuito, vedere Oracle Linux Lab Basics per le connessioni e altre istruzioni d'uso.

Crea un utente

Un utente aggiuntivo consente di eseguire il test dell'assegnazione di un utente SELinux più tardi in questo laboratorio.

  1. Se non è già connesso, aprire un terminale e connettersi tramite ssh al sistema ol8-server.

    ssh oracle@<ip_address_of_ol8-server>
    
  2. Creare un utente e impostare una password.

    sudo useradd -u 8000 ralph
    echo "ralph:oracle" | sudo chpasswd
    
  3. Consenti connessioni SSH.

    Copiare la chiave SSH dall'account utente oracle.

    sudo mkdir /home/ralph/.ssh
    sudo cp /home/oracle/.ssh/authorized_keys /home/ralph/.ssh/authorized_keys
    sudo chown -R ralph:ralph /home/ralph/.ssh
    sudo chmod 700 /home/ralph/.ssh
    sudo chmod 600 /home/ralph/.ssh/authorized_keys
    
  4. Aprire un nuovo terminale e verificare che la connessione SSH funzioni.

    ssh ralph@<ip_address_of_ol8-server>
    

    Quindi, exit la sessione e chiudere la finestra del terminale.

Modalità e stato SELinux

Oracle Linux installa SELinux per impostazione predefinita, viene eseguito in modalità Enforcing.

  1. Confermare controllando la modalità SELinux.

    Deve essere impostato su Enforcing.

    getenforce
    
  2. Controllare gli stati e le modalità di SELinux.

    sestatus
    

    L'output del comando sestatus mostra lo stato, il criterio e la modalità di SELinux.

    Output di esempio:

    SELinux status:                 enabled
    SELinuxfs mount:                /sys/fs/selinux
    SELinux root directory:         /etc/selinux
    Loaded policy name:             targeted
    Current mode:                   enforcing
    Mode from config file:          enforcing
    Policy MLS status:              enabled
    Policy deny_unknown status:     allowed
    Memory protection checking:     actual (secure)
    Max kernel policy version:      31
    

etichette di sicurezza SELinux

Ogni risorsa di processo e sistema disponibile in SELinux dispone di un'etichetta di sicurezza denominata contesto SELinux. Il contesto SELinux, anche denominato etichetta SELinux, è incentrato sulle proprietà di sicurezza e consente di fare riferimento in modo coerente agli oggetti nei criteri SELinux.

  1. Mostrare l'etichetta di sicurezza SELinux per un file.

    ls -ldZ /etc/passwd
    

    Output di esempio:

    -rw-r--r--. 1 root root system_u:object_r:passwd_file_t:s0 1892 Apr 13 14:39 /etc/passwd
    

    L'output ls con l'opzione -Z visualizza i quattro campi degli attributi di SELinux:

    • utente: system_u
    • ruolo: object_r
    • tipo: passwd_file_t
    • sicurezza: s0

    La cosa più importante è il tipo SELinux, poiché la maggior parte delle regole dei criteri targeted di SELinux utilizza i tipi SELinux per definire l'interazione consentita tra un oggetto (ad esempio, un processo) e un altro (ad esempio un file).

  2. Ottenere un elenco dei tipi di SELinux disponibili.

    seinfo --type | head
    
    • Il comando head limita l'output solo alle prime dieci righe di output.

    L'output completo mostra che i tipi di SELinux esistono per molti comandi e servizi diversi, ad esempio ssh e sshd.

  3. Ottenere un elenco di tipi di SELinux specifici.

    grep limiterà l'output solo ai tipi che contengono la parola ssh.

    seinfo -t | grep ssh
    
  4. Ottieni un elenco dei dispositivi di sicurezza per processi e file di configurazione specifici.

    L'utilizzo di ps consente di ottenere le etichette di sicurezza per i processi.

    ps -efZ | grep sshd
    

    Output di esempio:

    system_u:system_r:sshd_t:s0-s0:c0.c1023 root 2535      1  0 14:37 ?        00:00:00 /usr/sbin/sshd -D
    system_u:system_r:sshd_t:s0-s0:c0.c1023 root 18514  2535  0 15:21 ?        00:00:00 sshd: oracle [priv]
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 18528 18514  0 15:21 ? 00:00:00 sshd: oracle@pts/0
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 oracle 23611 18529  0 15:41 pts/0 00:00:00 grep --color=auto sshd
    

    Utilizzare ls per ottenere le etichette di sicurezza per i file di configurazione.

    ls -lZ /etc/ssh/
    

    Output di esempio:

    total 600
    -rw-r--r--. 1 root root     system_u:object_r:etc_t:s0      577388 Oct  9  2021 moduli
    -rw-r--r--. 1 root root     system_u:object_r:etc_t:s0        1770 Oct  9  2021 ssh_config
    drwxr-xr-x. 2 root root     system_u:object_r:etc_t:s0          28 Feb 18 08:51 ssh_config.d
    -rw-------. 1 root root     system_u:object_r:etc_t:s0        4268 Apr 13 14:37 sshd_config
    -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0    537 Apr 13 14:37 ssh_host_ecdsa_key
    -rw-r--r--. 1 root root     system_u:object_r:sshd_key_t:s0    197 Apr 13 14:37 ssh_host_ecdsa_key.pub
    -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0    432 Apr 13 14:37 ssh_host_ed25519_key
    -rw-r--r--. 1 root root     system_u:object_r:sshd_key_t:s0    117 Apr 13 14:37 ssh_host_ed25519_key.pub
    -rw-r-----. 1 root ssh_keys system_u:object_r:sshd_key_t:s0   2635 Apr 13 14:37 ssh_host_rsa_key
    -rw-r--r--. 1 root root     system_u:object_r:sshd_key_t:s0    589 Apr 13 14:37 ssh_host_rsa_key.pub
    

    Il processo del daemon sshd utilizza il tipo sshd_t. Pertanto, nel criterio targeted è prevista una regola per l'attributo SELinux sshd_t che afferma che gli oggetti con sshd_t possono accedere a qualsiasi oggetto con il seguente attributo di sicurezza:

    • etc_t
    • sshd_key_t
    • ...

    Analogamente, se si esaminasse il comando ssh, sarebbe possibile determinare un mapping simile tra ssh_home_t e ssh_exec_t.

    ls -lZ /usr/bin/ssh
    

    Output di esempio:

    -rwxr-xr-x. 1 root root system_u:object_r:ssh_exec_t:s0 775720 Oct  9  2021 /usr/bin/ssh
    
    ls -lZ ~/.ssh
    

    Output di esempio:

    total 4
    -rw-------. 1 oracle oracle unconfined_u:object_r:ssh_home_t:s0 404 Apr 13 14:39 authorized_keys
    
  5. Recupera il contesto di sicurezza di un utente.

    L'altro tipo di contesto di interesse è unconfined_t. Gli oggetti con questo tipo di SELinux, ad esempio gli utenti, dispongono di accesso illimitato. Questo livello di accesso significa che SELinux non limita le azioni che gli utenti possono eseguire e non solo tramite le autorizzazioni DAC. DAC (Discrezionale Access Control), il criterio di sicurezza gestito da utenti, gruppi e altre autorizzazioni tradizionali.

    Ad esempio, mostrare gli attributi di sicurezza per l'utente oracle.

    whoami
    
    id -Z
    

    Output di esempio:

    [oracle@ol-selinux ~]$ whoami
    oracle
    [oracle@ol-selinux ~]$ id -Z
    unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
    

Servizi di rete e SELinux

SELinux tiene traccia delle configurazioni per i pacchetti software basati su rete più comunemente utilizzati all'interno del proprio database interno. Questo tracciamento consente a SELinux di proteggere il sistema da servizi di fronte all'esterno soggetti ad attacchi.

Pertanto, SELinux potrebbe impedire il funzionamento di un servizio se si configura il software per l'utilizzo di una directory o di una porta non standard.

Per dimostrare ciò che SELinux conosce le porte standard di un sistema, è necessario utilizzare la utility SELinux semanage. Poiché Oracle Linux non installa l'utility per impostazione predefinita, installarla.

  1. Determinare il pacchetto che fornisce la utility.

    sudo dnf whatprovides semanage
    

    I risultati mostrano che /usr/sbin/semanage fa parte del pacchetto policycoreutils-python-utils.

  2. Installare il pacchetto e le eventuali dipendenze.

    sudo dnf install -y policycoreutils-python-utils
    
  3. Controllare le porte consentite da SELinux per sshd.

    sudo semanage port -l | grep ssh
    

    Output di esempio:

    ssh_port_t                     tcp      22
    
  4. Aggiungere una nuova porta al criterio SELinux.

    Se dovessimo modificare la porta, il daemon SSH ascolta fino a 2222 o cambia dove memorizza la configurazione predefinita, quindi dovremmo informare SELinux che vogliamo tali modifiche. È possibile utilizzare nuovamente semanage per consentire una porta personalizzata aggiungendo una nuova regola dei criteri.

    sudo sudo semanage port -a -t ssh_port_t -p tcp 2222
    
    • L'opzione -a aggiunge una nuova regola dei criteri di tipo -t.
  5. Controlla quali porte è consentito da SELinux.

    sudo semanage port -l | grep ssh
    

    Output di esempio:

    ssh_port_t                     tcp      2222, 22
    
  6. Modificare una porta nel criterio SELinux.

    Si supponga di voler mappare il daemon SSH alla porta 443. Ripetere lo stesso comando, ma verrà visualizzato un messaggio di errore indicante che la porta è già in uso.

    sudo semanage port -a -t ssh_port_t -p tcp 443
    

    Output di esempio:

    ValueError: Port tcp/443 already defined
    

    L'errore si è verificato perché si sta tentando di passare alla porta 443 dal tipo http_port_t al tipo ssh_port_t. Per funzionare, utilizzare l'opzione -m, che modifica il record dell'oggetto porta.

    sudo semanage port -m -t ssh_port_t -p tcp 443
    

Utenti SELinux

Ogni utente Linux viene mappato a un utente SELinux utilizzando un criterio SELinux. Questo approccio consente agli utenti di Linux di ereditare le limitazioni basate sul mapping utente di SELinux. Il mapping predefinito in Oracle Linux è il login __default__, che è mappato all'utente unconfined_u di SELinux.

  1. Ottieni una lista di tutti i mapping utenti Linux correnti.

    sudo semanage login -l
    
    • Si noti che il nostro utente oracle non è elencato e quindi è mappato all'utente unconfined_u.
  2. Ottenere un elenco degli utenti di SELinux.

    seinfo -u
    
  3. Limitare le azioni di un utente.

    Sebbene un utente Linux predefinito venga eseguito senza vincoli, le azioni dell'utente potrebbero indurre limitazioni basate su un'applicazione domain. domain è un gruppo di oggetti con lo stesso tipo di SELinux.

    Che cosa accade se si desidera impedire agli utenti di utilizzare X Window System, sudo e la rete?

    SELinux ha un utente per questo.

    Per verificare questo, dobbiamo avere un altro utente Linux. Verrà utilizzato l'utente ralph.

    1. Creare il nuovo mapping a guest_u.

      sudo semanage login -a -s guest_u ralph
      
    2. Verificare il mapping.

      sudo semanage login -l
      
    3. Verificare che ralph non possa accedere alla rete.

      Le limitazioni ereditate da guest_u si verificano solo dopo il login e non eseguendo un comando sudo o su.

      Aprire un terminale nuovo e connettersi tramite ssh al sistema ol8-server come utente ralph.

      ssh ralph@<ip_address_of_ol8-server>
      
    4. Controllare il contesto dell'utente.

      id; id -Z
      

      Output di esempio:

      uid=8000(ralph) gid=8000(ralph) groups=8000(ralph) context=guest_u:guest_r:guest_t:s0
      guest_u:guest_r:guest_t:s0
      
    5. Mostra il contesto di sicurezza dei processi correnti dell'utente:

      ps axZ
      

      L'output mostra l'utente ralph mappato a guest_u e può eseguire il login. Tuttavia, ralph non deve essere in grado di accedere alla rete.

    6. Test della connettività di rete con ping.

      ping localhost
      

      Output di esempio:

      ping: socket: Permission denied
      
    7. Eseguire inoltre il test della rete utilizzando curl.

      curl ifconfig.me
      

      Output di esempio:

      curl: (6) Could not resolve host: ifconfig.me
      

      Il messaggio indica che curl non è in grado di risolvere il nome DNS di ifconfig.me in un indirizzo IP. DNS, un servizio di rete di Linux, richiede l'apertura di un socket, quindi l'utente SELinux guest_u lo blocca.

    8. Chiudere la finestra del terminale corrente.

      Abbiamo completato i test con l'utente ralph, quindi chiudi la finestra del terminale.

      exit
      

Booleani SELinux

Gli elementi booleani SELinux consentono modifiche specifiche ai criteri in fase di esecuzione senza conoscere come scrivere i criteri SELinux. Oracle Linux fornisce molti booleani integrati oppure gli amministratori che conoscono i criteri SELinux possono scrivere i propri. Si consiglia agli amministratori di scrivere i criteri come booleani se il criterio implementato è facoltativo.

  1. Ottieni un elenco di booleani insieme al loro significato.

    Tornare al terminale in cui si è connessi come oracle ed eseguire il comando seguente.

    sudo semanage boolean -l
    

    Output di esempio:

    SELinux boolean                State  Default Description
    
    abrt_anon_write                (off  ,  off)  Allow abrt to anon write
    abrt_handle_event              (off  ,  off)  Allow abrt to handle event
    abrt_upload_watch_anon_write   (on   ,   on)  Allow abrt to upload watch anon write
    antivirus_can_scan_system      (off  ,  off)  Allow antivirus to can scan system
    antivirus_use_jit              (off  ,  off)  Allow antivirus to use jit
    auditadm_exec_content          (on   ,   on)  Allow auditadm to exec content
    authlogin_nsswitch_use_ldap    (off  ,  off)  Allow authlogin to nsswitch use ldap
    authlogin_radius               (off  ,  off)  Allow authlogin to radius
    ...
    
    • L'output spiega cosa fa ogni booleano e se è abilitato (on) o disabilitato (off).
  2. Ottenere un elenco solo dei booleani e del relativo stato.

    sudo getsebool -a
    

    Output di esempio:

    abrt_anon_write --> off
    abrt_handle_event --> off
    abrt_upload_watch_anon_write --> on
    antivirus_can_scan_system --> off
    antivirus_use_jit --> off
    auditadm_exec_content --> on
    authlogin_nsswitch_use_ldap --> off
    authlogin_radius --> off
    authlogin_yubikey --> off
    ...
    
  3. Recupera lo stato di un singolo booleano.

    Se il nome booleano è noto, passare il nome come argomento per ottenere solo lo stato booleano.

    sudo getsebool virt_use_nfs
    
  4. Eseguire una query sul criterio SELinux per un valore booleano.

    Ti sei mai chiesto cosa stimola un booleano nell'ambito della politica di SELinux? SELinux fornisce una utility per eseguire query su tali regole.

    sesearch -b virt_use_nfs -A
    

    Output di esempio:

    allow fsdaemon_t autofs_t:dir { getattr open search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr ioctl lock open read search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:dir { getattr open search }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:file { getattr ioctl lock open read }; [ virt_use_nfs ]:True
    allow fsdaemon_t nfs_t:lnk_file { getattr read }; [ virt_use_nfs ]:True
    ...
    
  5. Eseguire una query se un valore booleano consente l'accesso.

    Che cosa accade se un determinato accesso è consentito in base a un valore booleano condizionale? Rispondere alla domanda: il ping utente consente la transizione da un dominio utente (user_t) al dominio di ping (ping_t)?

    sesearch -s user_t -t ping_t -c process -p transition -AT
    

    Output di esempio:

    allow user_t ping_t:process transition; [ selinuxuser_ping ]:True
    
    • La transizione è consentita se il valore booleano di user_ping SELinux è abilitato.
  6. Abilitare un valore booleano.

    Si supponga di voler consentire a KVM di memorizzare le immagini su una condivisione di Samba? C'è anche un booleano per questo.

    1. Trovare l'elemento booleano.

      sudo semanage boolean -l | grep virt | grep samba
      

      Output di esempio:

      virt_use_samba                 (off  ,  off)  Allow virt to use samba
      
    2. Modificare il valore booleano in abilitato.

      sudo setsebool virt_use_samba on
      

      oppure

      sudo semanage boolean -m --on virt_use_samba
      
    3. Controllare lo stato corrente.

      getsebool virt_use_samba
      
    4. Assicurarsi che la modifica sia sottoposta a un reboot.

      sudo setsebool -P virt_use_samba on
      
  7. Mostra le personalizzazioni dei criteri SELinux locali.

    Poiché le impostazioni predefinite sono state modificate, è possibile visualizzare tali personalizzazioni locali.

    sudo semanage boolean -l -C
    

    Output di esempio:

    SELinux boolean                State  Default Description
    
    virt_use_samba                 (on   ,   on)  Allow virt to use samba
    
    • L'output mostra che il valore predefinito è ora on. Il valore predefinito è stato modificato dopo aver impostato lo switch come permanente e aver scritto i valori in sospeso nel file dei criteri sul disco.

Contesto file SELinux

Tutti i file e le directory hanno un'etichetta con un contesto SELinux durante l'esecuzione di SELinux. Esamineremo alcuni comandi per la gestione delle etichette del file system.

Un esempio familiare è la creazione di una nuova directory per la radice dei documenti di Nginx.

  1. Creare la nuova directory insieme a tre file.

    sudo mkdir -p /web
    sudo touch /web/file{1,2,3}
    
  2. Controllare la nuova directory e l'assegnazione di etichette ai file.

    ls -lZ /web
    

    Output di esempio:

    total 0
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
    
    • Il tipo di contesto della nuova directory e i file sono default_t.

    Nota: i nuovi file e directory creati ereditano il tipo SELinux delle directory padre.

  3. Apportare modifiche alle etichette temporanee.

    Nell'ambito della risoluzione dei problemi o del test, possiamo modificare temporaneamente il contesto.

    sudo chcon -R -t httpd_sys_content_t /web/
    
    ls -lZ /web
    
  4. Restituire le etichette alle impostazioni predefinite.

    Ripristinare il contesto al tipo di contesto predefinito.

    sudo restorecon -R -v /web/
    

    Output di esempio:

    [oracle@ol-selinux ~]$ sudo restorecon -R -v /web/
    Relabeled /web from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    Relabeled /web/file1 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    Relabeled /web/file2 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    Relabeled /web/file3 from unconfined_u:object_r:httpd_sys_content_t:s0 to unconfined_u:object_r:default_t:s0
    [oracle@ol-selinux ~]$ ls -lZ /web
    total 0
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
    
  5. Apportare modifiche etichetta in modo permanente.

    Per rendere permanenti le modifiche e sopravvivere al reboot, utilizzare il comando semanage fcontext. -a aggiunge un record al file /etc/selinux/targeted/contexts/files/file_contexts.local e -t definisce il tipo.

    sudo semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
    

    Nota: quando si modifica il contesto SELinux con semanage fcontext, si consiglia di utilizzare il percorso completo del file o della directory per evitare di etichettare in modo errato i file dopo la nuova etichetta del file system o dopo l'esecuzione di restorecon.

  6. Controllare il contesto.

    ls -ldZ /web; ls -lZ /web
    

    Output di esempio:

    [oracle@ol-selinux ~]$ ls -ldZ /web; ls -lZ /web
    drwxr-xr-x. 2 root root unconfined_u:object_r:default_t:s0 45 Apr 14 19:00 /web
    total 0
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file1
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file2
    -rw-r--r--. 1 root root unconfined_u:object_r:default_t:s0 0 Apr 14 19:00 file3
    

    Si noti che il contesto non è cambiato, cosa ci aspettavamo.

  7. Visualizzare il contesto dei file e delle directory appena creati.

    sudo semanage fcontext -C -l
    

    Output di esempio:

    [oracle@ol-selinux ~]$ sudo semanage fcontext -C -l
    SELinux fcontext                                   type               Context
    
    /web(/.*)?                                         all files          system_u:object_r:httpd_sys_content_t:s0 
    
  8. Applicare le modifiche al contesto.

    sudo restorecon -R -v /web
    

    Output di esempio:

    [oracle@ol-selinux ~]$ sudo restorecon -R -v /web
    Relabeled /web from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    Relabeled /web/file1 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    Relabeled /web/file2 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    Relabeled /web/file3 from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:httpd_sys_content_t:s0
    
  9. Rimuovere il nuovo contesto SELinux.

    sudo semanage fcontext -d "/web(/.*)?"
    
    • Questo esempio passa l'espressione regolare utilizzata durante la creazione del contesto e la posiziona all'inizio del record di contesto nel file. Poiché si tratta di un'espressione regolare, racchiuderla tra virgolette.
  10. Applicare le modifiche e verificare il contesto restituito a default_t.

    sudo restorecon -R -v /web; ls -ldZ /web; ls -lZ /web
    

Per le utility mostrate, vedere le pagine man. Utilizzare quindi gli elementi appresi per mantenere SELinux in modalità Enforcing.

Per ulteriori informazioni

Vedere altre risorse correlate:

Altre risorse di apprendimento

Esplora altri laboratori su docs.oracle.com/learn o accedi ad altri contenuti per la formazione gratuita sul canale YouTube di Oracle Learning. Inoltre, visitare education.oracle.com/learning-explorer per diventare Oracle Learning Explorer.

Per la documentazione sul prodotto, visitare Oracle Help Center.