Benchmark Kubernetes center for Internet Security (CIS)
Come servizio sicuro, il servizio Azure Kubernetes è conforme agli standard SOC, ISO, PCI DSS e HIPAA. Questo articolo illustra la protezione avanzata applicata al servizio Azure Kubernetes in base al benchmark kubernetes CIS. Per altre informazioni sulla sicurezza del servizio Azure Kubernetes, vedere Concetti di sicurezza per applicazioni e cluster nel servizio Azure Kubernetes. Per altre informazioni sul benchmark CIS, vedere Benchmark di Center for Internet Security (CIS).
Benchmark CIS di Kubernetes
Di seguito sono riportati i risultati delle raccomandazioni di CIS Kubernetes V1.27 Benchmark v1.9.0 nel servizio Azure Kubernetes. I risultati sono applicabili al servizio Azure Kubernetes 1.27.x fino a AKS 1.29.x.
Livelli di sicurezza
I benchmark CIS offrono due livelli di impostazioni di sicurezza:
- L1 o Livello 1, consiglia requisiti di sicurezza di base essenziali che possono essere configurati in qualsiasi sistema e che devono causare un'interruzione minima o nessuna interruzione del servizio o funzionalità ridotta.
- L2o Livello 2 consiglia le impostazioni di sicurezza per gli ambienti che richiedono una maggiore sicurezza che potrebbe comportare una riduzione delle funzionalità.
Stato valutazione
Per ogni raccomandazione è incluso uno stato di valutazione. Lo stato della valutazione indica se la raccomandazione specificata può essere automatizzata o richiede passaggi manuali da implementare. Entrambi gli stati sono ugualmente importanti e sono determinati e supportati come definito di seguito:
- Automatizzato: rappresenta le raccomandazioni per cui la valutazione di un controllo tecnico può essere completamente automatizzata e convalidata in uno stato di superamento/errore. Le raccomandazioni includono le informazioni necessarie per implementare l'automazione.
- Manuale: rappresenta le raccomandazioni per cui la valutazione di un controllo tecnico non può essere completamente automatizzata e richiede tutti o alcuni passaggi manuali per verificare che lo stato configurato sia impostato come previsto. Lo stato previsto può variare a seconda dell'ambiente.
Le raccomandazioni automatizzate influiscono sul punteggio del benchmark se non vengono applicate, mentre le raccomandazioni manuali non lo sono.
Stato attestazione
Le raccomandazioni possono avere uno degli stati di attestazione seguenti:
- Pass: la raccomandazione è stata applicata.
- Errore: la raccomandazione non è stata applicata.
- N/D: la raccomandazione è correlata ai requisiti di autorizzazione per i file manifesto non rilevanti per il servizio Azure Kubernetes. Per impostazione predefinita, i cluster Kubernetes usano un modello manifesto per distribuire i pod del piano di controllo, che si basano sui file della macchina virtuale del nodo. Il benchmark kubernetes CIS consiglia che questi file abbiano determinati requisiti di autorizzazione. I cluster del servizio Azure Kubernetes usano un grafico Helm per distribuire i pod del piano di controllo e non si basano sui file nella macchina virtuale del nodo.
- Dipende dall'ambiente: la raccomandazione viene applicata nell'ambiente specifico dell'utente e non è controllata dal servizio Azure Kubernetes. Le raccomandazioni automatizzate influiscono sul punteggio del benchmark se la raccomandazione si applica o meno all'ambiente specifico dell'utente.
- Controllo equivalente: la raccomandazione è stata implementata in modo diverso ed equivalente.
Dettagli del benchmark
ID CIS | Descrizione della raccomandazione | Stato valutazione | Livello | Status |
---|---|---|---|---|
1 | Componenti del piano di controllo | |||
1.1 | File di configurazione del nodo del piano di controllo | |||
1.1.1 | Assicurarsi che le autorizzazioni del file di specifica del pod del server API siano impostate su 600 o più restrittive | Automatizzato | L1 | N/D |
1.1.2 | Assicurarsi che la proprietà del file di specifica del pod del server API sia impostata su root:root | Automatizzato | L1 | N/D |
1.1.3 | Assicurarsi che le autorizzazioni del file di specifica del pod di gestione controller siano impostate su 600 o più restrittive | Automatizzato | L1 | N/D |
1.1.4 | Assicurarsi che la proprietà del file di specifica del pod di gestione controller sia impostata su root:root | Automatizzato | L1 | N/D |
1.1.5 | Assicurarsi che le autorizzazioni del file di specifica del pod dell'utilità di pianificazione siano impostate su 600 o più restrittive | Automatizzato | L1 | N/D |
1.1.6 | Assicurarsi che la proprietà del file di specifica del pod dell'utilità di pianificazione sia impostata su root:root | Automatizzato | L1 | N/D |
1.1.7 | Assicurarsi che le autorizzazioni del file di specifica del pod etcd siano impostate su 600 o più restrittive | Automatizzato | L1 | N/D |
1.1.8 | Verificare che la proprietà del file di specifica del pod etcd sia impostata su root:root | Automatizzato | L1 | N/D |
1.1.9 | Assicurarsi che le autorizzazioni del file dell'interfaccia di rete del contenitore siano impostate su 600 o più restrittive | Manuale | L1 | N/D |
1.1.10 | Assicurarsi che la proprietà del file dell'interfaccia di rete contenitore sia impostata su root:root | Manuale | L1 | N/D |
1.1.11 | Assicurarsi che le autorizzazioni della directory dati etcd siano impostate su 700 o più restrittive | Automatizzato | L1 | N/D |
1.1.12 | Assicurarsi che la proprietà della directory dei dati etcd sia impostata su etcd:etcd | Automatizzato | L1 | N/D |
1.1.13 | Assicurarsi che le autorizzazioni del file admin.conf siano impostate su 600 o più restrittive | Automatizzato | L1 | N/D |
1.1.14 | Assicurarsi che la proprietà del file admin.conf sia impostata su root:root | Automatizzato | L1 | N/D |
1.1.15 | Assicurarsi che le autorizzazioni del file scheduler.conf siano impostate su 600 o più restrittive | Automatizzato | L1 | N/D |
1.1.16 | Verificare che la proprietà del file scheduler.conf sia impostata su root:root | Automatizzato | L1 | N/D |
1.1.17 | Assicurarsi che le autorizzazioni del file controller-manager.conf siano impostate su 600 o più restrittive | Automatizzato | L1 | N/D |
1.1.18 | Assicurarsi che la proprietà del file controller-manager.conf sia impostata su root:root | Automatizzato | L1 | N/D |
1.1.19 | Assicurarsi che la directory PKI di Kubernetes e la proprietà del file siano impostate su root:root | Automatizzato | L1 | N/D |
1.1.20 | Assicurarsi che le autorizzazioni del file di certificato PKI di Kubernetes siano impostate su 600 o più restrittive | Manuale | L1 | N/D |
1.1.21 | Assicurarsi che le autorizzazioni del file di chiave PKI di Kubernetes siano impostate su 600 | Manuale | L1 | N/D |
1.2 | Server API | |||
1.2.1 | Verificare che l'argomento --anonymous-auth sia impostato su false |
Manuale | L1 | Riuscito |
1.2.2 | Assicurarsi che il parametro --token-auth-file non sia impostato |
Automatizzato | L1 | Errore |
1.2.3 | Assicurarsi che --DenyServiceExternalIPs non sia impostato |
Manuale | L1 | Errore |
1.2.4 | Assicurarsi che gli argomenti --kubelet-client-certificate e --kubelet-client-key siano impostati in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.2.5 | Verificare che l'argomento --kubelet-certificate-authority sia impostato in base alle esigenze |
Automatizzato | L1 | Errore |
1.2.6 | Assicurarsi che l'argomento --authorization-mode non sia impostato su AlwaysAllow |
Automatizzato | L1 | Riuscito |
1.2.7 | Verificare che l'argomento --authorization-mode includa Node |
Automatizzato | L1 | Riuscito |
1.2.8 | Verificare che l'argomento --authorization-mode includa il controllo degli accessi in base al ruolo (RBAC) |
Automatizzato | L1 | Riuscito |
1.2.9 | Assicurarsi che il plug-in del controllo di ammissione EventRateLimit sia impostato | Manuale | L1 | Errore |
1.2.10 | Assicurarsi che il plug-in di controllo di ammissione AlwaysAdmit non sia impostato | Automatizzato | L1 | Riuscito |
1.2.11 | Assicurarsi che il plug-in di controllo di ammissione AlwaysPullImages sia impostato | Manuale | L1 | Errore |
1.2.12 | Assicurarsi che il plug-in del controllo di ammissione ServiceAccount sia impostato | Automatizzato | L2 | Errore |
1.2.13 | Assicurarsi che il plug-in del controllo di ammissione NamespaceLifecycle sia impostato | Automatizzato | L2 | Riuscito |
1.2.14 | Assicurarsi che il plug-in del controllo di ammissione NodeRestriction sia impostato | Automatizzato | L2 | Riuscito |
1.2.15 | Verificare che l'argomento --profiling sia impostato su false |
Automatizzato | L1 | Riuscito |
1.2.16 | Verificare che l'argomento --audit-log-path sia impostato |
Automatizzato | L1 | Riuscito |
1.2.17 | Assicurarsi che l'argomento --audit-log-maxage sia impostato su 30 o in base alle esigenze |
Automatizzato | L1 | Controllo equivalente |
1.2.18 | Verificare che l'argomento --audit-log-maxbackup sia impostato su 10 o come appropriato |
Automatizzato | L1 | Controllo equivalente |
1.2.19 | Verificare che l'argomento --audit-log-maxsize sia impostato su 100 o in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.2.20 | Verificare che l'argomento --request-timeout sia impostato in base alle esigenze |
Manuale | L1 | Riuscito |
1.2.21 | Verificare che l'argomento --service-account-lookup sia impostato su true |
Automatizzato | L1 | Riuscito |
1.2.22 | Verificare che l'argomento --service-account-key-file sia impostato in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.2.23 | Assicurarsi che gli argomenti --etcd-certfile e --etcd-keyfile siano impostati in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.2.24 | Assicurarsi che gli argomenti --tls-cert-file e --tls-private-key-file siano impostati in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.2.25 | Verificare che l'argomento --client-ca-file sia impostato in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.2.26 | Verificare che l'argomento --etcd-cafile sia impostato in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.2.27 | Verificare che l'argomento --encryption-provider-config sia impostato in base alle esigenze |
Manuale | L1 | Dipende dall'ambiente |
1.2.28 | Assicurarsi che i provider di crittografia siano configurati in modo appropriato | Manuale | L1 | Dipende dall'ambiente |
1.2.29 | Assicurarsi che il server API usi solo crittografie crittografiche complesse | Manuale | L1 | Riuscito |
1.3 | Controller Manager | |||
1.3.1 | Verificare che l'argomento --terminated-pod-gc-threshold sia impostato in base alle esigenze |
Manuale | L1 | Riuscito |
1.3.2 | Verificare che l'argomento --profiling sia impostato su false |
Automatizzato | L1 | Riuscito |
1.3.3 | Verificare che l'argomento --use-service-account-credentials sia impostato su true |
Automatizzato | L1 | Riuscito |
1.3.4 | Verificare che l'argomento --service-account-private-key-file sia impostato in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.3.5 | Verificare che l'argomento --root-ca-file sia impostato in base alle esigenze |
Automatizzato | L1 | Riuscito |
1.3.6 | Assicurarsi che l'argomento RotateKubeletServerCertificate sia impostato su true | Automatizzato | L2 | Riuscito |
1.3.7 | Verificare che l'argomento --bind-address sia impostato su 127.0.0.1 |
Automatizzato | L1 | Controllo equivalente |
1.4 | Utilità di pianificazione | |||
1.4.1 | Verificare che l'argomento --profiling sia impostato su false |
Automatizzato | L1 | Riuscito |
1.4.2 | Verificare che l'argomento --bind-address sia impostato su 127.0.0.1 |
Automatizzato | L1 | Controllo equivalente |
2 | etcd | |||
2.1 | Assicurarsi che gli argomenti --cert-file e --key-file siano impostati in base alle esigenze |
Automatizzato | L1 | Riuscito |
2.2 | Verificare che l'argomento --client-cert-auth sia impostato su true |
Automatizzato | L1 | Riuscito |
2.3 | Assicurarsi che l'argomento --auto-tls non sia impostato su true |
Automatizzato | L1 | Riuscito |
2.4 | Assicurarsi che gli argomenti --peer-cert-file e --peer-key-file siano impostati in base alle esigenze |
Automatizzato | L1 | Riuscito |
2.5 | Verificare che l'argomento --peer-client-cert-auth sia impostato su true |
Automatizzato | L1 | Riuscito |
2.6 | Assicurarsi che l'argomento --peer-auto-tls non sia impostato su true |
Automatizzato | L1 | Riuscito |
2.7 | Assicurarsi che venga usata un'autorità di certificazione univoca per etcd | Manuale | L2 | Riuscito |
3 | Configurazione del piano di controllo | |||
3.1 | Autenticazione e autorizzazione | |||
3.1.1 | L'autenticazione del certificato client non deve essere usata per gli utenti | Manuale | L1 | Riuscito |
3.1.2 | L'autenticazione del token dell'account del servizio non deve essere usata per gli utenti | Manuale | L1 | Riuscito |
3.1.3 | L'autenticazione token bootstrap non deve essere usata per gli utenti | Manuale | L1 | Riuscito |
3.2 | Registrazione | |||
3.2.1 | Assicurarsi che venga creato un criterio di controllo minimo | Manuale | L1 | Riuscito |
3.2.2 | Assicurarsi che i criteri di controllo includano i principali problemi di sicurezza | Manuale | L2 | Riuscito |
4 | Nodi di lavoro | |||
4.1 | File di configurazione del nodo di lavoro | |||
4.1.1 | Assicurarsi che le autorizzazioni del file del servizio kubelet siano impostate su 600 o più restrittive | Automatizzato | L1 | Riuscito |
4.1.2 | Assicurarsi che la proprietà del file del servizio kubelet sia impostata su root:root | Automatizzato | L1 | Riuscito |
4.1.3 | Se esiste un file kubeconfig proxy, verificare che le autorizzazioni siano impostate su 600 o più restrittive | Manuale | L1 | N/D |
4.1.4 | Se esiste un file kubeconfig proxy, verificare che la proprietà sia impostata su root:root | Manuale | L1 | N/D |
4.1.5 | Assicurarsi che le autorizzazioni del file --kubeconfig kubelet.conf siano impostate su 600 o più restrittive |
Automatizzato | L1 | Riuscito |
4.1.6 | Assicurarsi che la proprietà del file --kubeconfig kubelet.conf sia impostata su root:root |
Automatizzato | L1 | Riuscito |
4.1.7 | Assicurarsi che le autorizzazioni dei file delle autorità di certificazione siano impostate su 600 o più restrittive | Manuale | L1 | Riuscito |
4.1.8 | Assicurarsi che la proprietà del file delle autorità di certificazione client sia impostata su root:root | Manuale | L1 | Riuscito |
4.1.9 | Se viene usato il file di configurazione kubelet config.yaml, assicurarsi che le autorizzazioni impostate su 600 o più restrittive | Automatizzato | L1 | Riuscito |
4.1.10 | Se viene usato il file di configurazione kubelet config.yaml, verificare che la proprietà del file sia impostata su root:root | Automatizzato | L1 | Riuscito |
4.2 | Kubelet | |||
4.2.1 | Verificare che l'argomento --anonymous-auth sia impostato su false |
Automatizzato | L1 | Riuscito |
4.2.2 | Assicurarsi che l'argomento --authorization-mode non sia impostato su AlwaysAllow |
Automatizzato | L1 | Riuscito |
4.2.3 | Verificare che l'argomento --client-ca-file sia impostato in base alle esigenze |
Automatizzato | L1 | Riuscito |
4.2.4 | Verificare che l'argomento --read-only-port sia impostato su 0 |
Manuale | L1 | Riuscito |
4.2.5 | Verificare che l'argomento --streaming-connection-idle-timeout non sia impostato su 0 |
Manuale | L1 | Riuscito |
4.2.6 | Verificare che l'argomento --make-iptables-util-chains sia impostato su true |
Automatizzato | L1 | Riuscito |
4.2.7 | Verificare che l'argomento --hostname-override non sia impostato |
Manuale | L1 | Riuscito |
4.2.8 | Assicurarsi che l'argomento sia impostato su un livello che garantisce l'acquisizione --eventRecordQPS di eventi appropriata |
Manuale | L2 | Riuscito |
4.2.9 | Assicurarsi che gli argomenti --tls-cert-file e --tls-private-key-file siano impostati in base alle esigenze |
Manuale | L1 | Riuscito |
4.2.10 | Assicurarsi che l'argomento --rotate-certificates non sia impostato su false |
Automatizzato | L1 | Riuscito |
4.2.11 | Verificare che l'argomento RotateKubeletServerCertificate sia impostato su true | Manuale | L1 | Errore |
4.2.12 | Assicurarsi che Kubelet usi solo crittografie crittografiche complesse | Manuale | L1 | Riuscito |
4.2.13 | Assicurarsi che un limite sia impostato sui PID dei pod | Manuale | L1 | Riuscito |
4.3 | kube-proxy | |||
4.3.1 | Assicurarsi che il servizio metriche kube-proxy sia associato a localhost | Automatizzato | L1 | Riuscito |
5 | Criteri | |||
5.1 | Controllo degli accessi in base al ruolo e account del servizio | |||
5.1.1 | Assicurarsi che il ruolo di amministratore del cluster venga usato solo se necessario | Automatizzato | L1 | Dipende dall'ambiente |
5.1.2 | Ridurre al minimo l'accesso ai segreti | Automatizzato | L1 | Dipende dall'ambiente |
5.1.3 | Ridurre al minimo l'uso dei caratteri jolly in Ruoli e ClusterRoles | Automatizzato | L1 | Dipende dall'ambiente |
5.1.4 | Ridurre al minimo l'accesso per creare pod | Automatizzato | L1 | Dipende dall'ambiente |
5.1.5 | Assicurarsi che gli account di servizio predefiniti non vengano usati attivamente | Automatizzato | L1 | Dipende dall'ambiente |
5.1.6 | Assicurarsi che i token dell'account del servizio siano montati solo se necessario | Automatizzato | L1 | Dipende dall'ambiente |
5.1.7 | Evitare l'uso del gruppo system:masters | Manuale | L1 | Dipende dall'ambiente |
5.1.8 | Limitare l'uso delle autorizzazioni Bind, Impersonate e Escalation nel cluster Kubernetes | Manuale | L1 | Dipende dall'ambiente |
5.1.9 | Ridurre al minimo l'accesso per creare volumi permanenti | Manuale | L1 | Dipende dall'ambiente |
5.1.10 | Ridurre al minimo l'accesso alla sotto-risorsa proxy dei nodi | Manuale | L1 | Dipende dall'ambiente |
5.1.11 | Ridurre al minimo l'accesso alla sotto-risorsa di approvazione degli oggetti certificatesigningrequests | Manuale | L1 | Dipende dall'ambiente |
5.1.12 | Ridurre al minimo l'accesso agli oggetti di configurazione del webhook | Manuale | L1 | Dipende dall'ambiente |
5.1.13 | Ridurre al minimo l'accesso alla creazione del token dell'account del servizio | Manuale | L1 | Dipende dall'ambiente |
5,2 | Standard di sicurezza dei pod | |||
5.2.1 | Assicurarsi che il cluster disponga di almeno un meccanismo di controllo dei criteri attivi | Manuale | L1 | Dipende dall'ambiente |
5.2.2 | Ridurre al minimo l'ammissione di contenitori con privilegi | Manuale | L1 | Dipende dall'ambiente |
5.2.3 | Ridurre al minimo l'ammissione di contenitori che desiderano condividere lo spazio dei nomi id processo host | Manuale | L1 | Dipende dall'ambiente |
5.2.4 | Ridurre al minimo l'ammissione di contenitori che desiderano condividere lo spazio dei nomi IPC host | Manuale | L1 | Dipende dall'ambiente |
5.2.5 | Ridurre al minimo l'ammissione di contenitori che desiderano condividere lo spazio dei nomi della rete host | Manuale | L1 | Dipende dall'ambiente |
5.2.6 | Ridurre al minimo l'ammissione di contenitori con allowPrivilegeEscalation | Manuale | L1 | Dipende dall'ambiente |
5.2.7 | Ridurre al minimo l'ammissione di contenitori radice | Manuale | L2 | Dipende dall'ambiente |
5.2.8 | Ridurre al minimo l'ammissione di contenitori con la funzionalità di NET_RAW | Manuale | L1 | Dipende dall'ambiente |
5.2.9 | Ridurre al minimo l'ammissione di contenitori con funzionalità aggiunte | Manuale | L1 | Dipende dall'ambiente |
5.2.10 | Ridurre al minimo l'ammissione di contenitori con funzionalità assegnate | Manuale | L2 | Dipende dall'ambiente |
5.2.11 | Ridurre al minimo l'ammissione di contenitori HostProcess di Windows | Manuale | L1 | Dipende dall'ambiente |
5.2.12 | Ridurre al minimo l'ammissione di volumi HostPath | Manuale | L1 | Dipende dall'ambiente |
5.2.13 | Ridurre al minimo l'ammissione di contenitori che usano HostPorts | Manuale | L1 | Dipende dall'ambiente |
5.3 | Criteri di rete e CNI | |||
5.3.1 | Assicurarsi che l'interfaccia CNI in uso supporti i criteri di rete | Manuale | L1 | Riuscito |
5.3.2 | Assicurarsi che tutti gli spazi dei nomi dispongano di criteri di rete definiti | Manuale | L2 | Dipende dall'ambiente |
5.4 | Gestione dei segreti | |||
5.4.1 | Preferire l'uso di segreti come file rispetto ai segreti come variabili di ambiente | Manuale | L2 | Dipende dall'ambiente |
5.4.2 | Prendere in considerazione l'archiviazione privata esterna | Manuale | L2 | Dipende dall'ambiente |
5.5 | Controllo di ammissione estendibile | |||
5.5.1 | Configurare la provenienza di immagini usando il controller di ammissione ImagePolicyWebhook | Manuale | L2 | Errore |
5.6 | Criteri generali | |||
5.6.1 | Creare limiti amministrativi tra le risorse usando gli spazi dei nomi | Manuale | L1 | Dipende dall'ambiente |
5.6.2 | Assicurarsi che il profilo seccomp sia impostato su docker/default nelle definizioni dei pod | Manuale | L2 | Dipende dall'ambiente |
5.6.3 | Applicare il contesto di sicurezza ai pod e ai contenitori | Manuale | L2 | Dipende dall'ambiente |
5.6.4 | Lo spazio dei nomi predefinito non deve essere usato | Manuale | L2 | Dipende dall'ambiente |
Nota
Oltre al benchmark CIS kubernetes, è disponibile anche un benchmark CIS del servizio Azure Kubernetes.
Note aggiuntive
- Il sistema operativo protetto è costruito e mantenuto specificamente per AKS e non è supportato al di fuori della piattaforma AKS.
- Per ridurre ulteriormente la superficie di attacco, alcuni driver del modulo kernel non necessari sono disabilitati nel sistema operativo.
Passaggi successivi
Per altre informazioni sulla sicurezza del servizio Azure Kubernetes, vedere gli articoli seguenti:
Azure Kubernetes Service