Seccomp
Informazioni di base
Seccomp, che sta per Secure Computing mode, è una funzionalità di sicurezza del kernel Linux progettata per filtrare le chiamate di sistema. Limita i processi a un insieme limitato di chiamate di sistema (exit()
, sigreturn()
, read()
e write()
per i descrittori di file già aperti). Se un processo tenta di chiamare qualsiasi altra cosa, viene terminato dal kernel utilizzando SIGKILL o SIGSYS. Questo meccanismo non virtualizza le risorse ma isola il processo da esse.
Ci sono due modi per attivare seccomp: tramite la chiamata di sistema prctl(2)
con PR_SET_SECCOMP
, o per i kernel Linux 3.17 e successivi, la chiamata di sistema seccomp(2)
. Il vecchio metodo di abilitazione di seccomp scrivendo su /proc/self/seccomp
è stato deprecato a favore di prctl()
.
Un miglioramento, seccomp-bpf, aggiunge la capacità di filtrare le chiamate di sistema con una policy personalizzabile, utilizzando regole Berkeley Packet Filter (BPF). Questa estensione viene sfruttata da software come OpenSSH, vsftpd e i browser Chrome/Chromium su Chrome OS e Linux per il filtraggio delle chiamate di sistema flessibile ed efficiente, offrendo un'alternativa alla ormai non supportata systrace per Linux.
Modalità originale/strict
In questa modalità Seccomp permette solo le chiamate di sistema exit()
, sigreturn()
, read()
e write()
ai descrittori di file già aperti. Se viene effettuata qualsiasi altra chiamata di sistema, il processo viene terminato utilizzando SIGKILL.
Seccomp-bpf
Questa modalità consente il filtraggio delle chiamate di sistema utilizzando una policy configurabile implementata tramite regole Berkeley Packet Filter.
Seccomp in Docker
Seccomp-bpf è supportato da Docker per limitare le syscalls dai container, riducendo efficacemente l'area di superficie. Puoi trovare le syscalls bloccate di default su https://docs.docker.com/engine/security/seccomp/ e il profilo seccomp di default può essere trovato qui https://github.com/moby/moby/blob/master/profiles/seccomp/default.json. Puoi eseguire un container Docker con una politica seccomp diversa usando:
Se vuoi ad esempio proibire a un container di eseguire alcune syscall come uname
, puoi scaricare il profilo predefinito da https://github.com/moby/moby/blob/master/profiles/seccomp/default.json e semplicemente rimuovere la stringa uname
dalla lista.
Se vuoi assicurarti che un determinato binario non funzioni all'interno di un container Docker, puoi utilizzare strace per elencare le syscall utilizzate dal binario e poi proibirle.
Nell'esempio seguente vengono scoperte le syscall di uname
:
Se stai usando Docker solo per avviare un'applicazione, puoi profilare con strace
e consentire solo le syscalls di cui ha bisogno
Esempio di politica Seccomp
Per illustrare la funzionalità Seccomp, creiamo un profilo Seccomp che disabilita la chiamata di sistema "chmod" come segue.
Nel profilo sopra, abbiamo impostato l'azione predefinita su "allow" e creato una lista nera per disabilitare "chmod". Per essere più sicuri, possiamo impostare l'azione predefinita su "drop" e creare una lista bianca per abilitare selettivamente le chiamate di sistema. L'output seguente mostra la chiamata "chmod" che restituisce un errore perché è disabilitata nel profilo seccomp.
Il seguente output mostra il comando "docker inspect" che visualizza il profilo:
Disattivarlo in Docker
Avvia un container con il flag: --security-opt seccomp=unconfined
A partire da Kubernetes 1.19, seccomp è abilitato per impostazione predefinita per tutti i Pod. Tuttavia, il profilo seccomp predefinito applicato ai Pod è il profilo "RuntimeDefault", che è fornito dal runtime del container (ad esempio, Docker, containerd). Il profilo "RuntimeDefault" consente la maggior parte delle chiamate di sistema, bloccando alcune che sono considerate pericolose o non generalmente richieste dai container.
Last updated