Nota:
- Questa esercitazione è disponibile in un ambiente di laboratorio gratuito fornito da Oracle.
- Utilizza valori di esempio per le credenziali, la tenancy e i compartimenti di Oracle Cloud Infrastructure. Al termine del laboratorio, sostituire questi valori con quelli specifici del tuo ambiente cloud.
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:
- Controllare la modalità e lo stato di SELinux
- Comprendere le etichette di sicurezza di SELinux
- Utilizzare i servizi di rete SELinux
- Utilizzare gli utenti SELinux
- Modifica booleani SELinux
- Valutare i contesti di file SELinux
Prerequisiti
- Un sistema con Oracle Linux 8 installato con la seguente configurazione:
- un utente non root con autorizzazioni
sudo
- un utente non root con autorizzazioni
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.
-
Se non è già connesso, aprire un terminale e connettersi tramite ssh al sistema ol8-server.
ssh oracle@<ip_address_of_ol8-server>
-
Creare un utente e impostare una password.
sudo useradd -u 8000 ralph echo "ralph:oracle" | sudo chpasswd
-
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
-
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
.
-
Confermare controllando la modalità SELinux.
Deve essere impostato su
Enforcing
.getenforce
-
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.
-
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). - utente:
-
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
esshd
. - Il comando
-
Ottenere un elenco di tipi di SELinux specifici.
grep
limiterà l'output solo ai tipi che contengono la parolassh
.seinfo -t | grep ssh
-
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 tiposshd_t
. Pertanto, nel criterio targeted è prevista una regola per l'attributo SELinuxsshd_t
che afferma che gli oggetti consshd_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 trassh_home_t
essh_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
-
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.
-
Determinare il pacchetto che fornisce la utility.
sudo dnf whatprovides semanage
I risultati mostrano che
/usr/sbin/semanage
fa parte del pacchettopolicycoreutils-python-utils
. -
Installare il pacchetto e le eventuali dipendenze.
sudo dnf install -y policycoreutils-python-utils
-
Controllare le porte consentite da SELinux per
sshd
.sudo semanage port -l | grep ssh
Output di esempio:
ssh_port_t tcp 22
-
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
.
- L'opzione
-
Controlla quali porte è consentito da SELinux.
sudo semanage port -l | grep ssh
Output di esempio:
ssh_port_t tcp 2222, 22
-
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 tipossh_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.
-
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'utenteunconfined_u
.
- Si noti che il nostro utente
-
Ottenere un elenco degli utenti di SELinux.
seinfo -u
-
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.
-
Creare il nuovo mapping a
guest_u
.sudo semanage login -a -s guest_u ralph
-
Verificare il mapping.
sudo semanage login -l
-
Verificare che ralph non possa accedere alla rete.
Le limitazioni ereditate da
guest_u
si verificano solo dopo il login e non eseguendo un comandosudo
osu
.Aprire un terminale nuovo e connettersi tramite ssh al sistema ol8-server come utente ralph.
ssh ralph@<ip_address_of_ol8-server>
-
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
-
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. -
Test della connettività di rete con
ping
.ping localhost
Output di esempio:
ping: socket: Permission denied
-
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 diifconfig.me
in un indirizzo IP. DNS, un servizio di rete di Linux, richiede l'apertura di un socket, quindi l'utente SELinuxguest_u
lo blocca. -
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.
-
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
).
- L'output spiega cosa fa ogni booleano e se è abilitato (
-
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 ...
-
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
-
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 ...
-
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.
- La transizione è consentita se il valore booleano di
-
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.
-
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
-
Modificare il valore booleano in abilitato.
sudo setsebool virt_use_samba on
oppure
sudo semanage boolean -m --on virt_use_samba
-
Controllare lo stato corrente.
getsebool virt_use_samba
-
Assicurarsi che la modifica sia sottoposta a un reboot.
sudo setsebool -P virt_use_samba on
-
-
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.
- L'output mostra che il valore predefinito è ora
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.
-
Creare la nuova directory insieme a tre file.
sudo mkdir -p /web sudo touch /web/file{1,2,3}
-
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.
- Il tipo di contesto della nuova directory e i file sono
-
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
-
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
-
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 direstorecon
. -
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.
-
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
-
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
-
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.
-
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.