Catégorie : Kubernetes

AKS | Pod Security Policy (PSP)

Bonjour,

Dans cet article nous allons voir ensemble comment activer la fonctionnalité de « Pod Security Policy » connue également sous le nom de PSP dans un cluster AKS.

PodSecurityPolicy est un contrôleur d’admission qui confirme si une spécification de pod répond à vos besoins définis. Ces exigences peuvent limiter l’utilisation de conteneurs privilégiés, l’accès à certains types de stockage, ou l’utilisateur/groupe sous lequel le conteneur peut s’exécuter. 

Lorsque vous tentez de déployer une ressource où les spécifications de pod ne répondent pas aux exigences décrites dans la stratégie de sécurité des pods, la requête est refusée. Ce contrôle sur les pods pouvant être planifiés dans le cluster AKS empêche d’éventuelles vulnérabilités de sécurité ou des escalades de privilèges.

Control AspectField Names
Running of privileged containersprivileged
Usage of host namespaceshostPIDhostIPC
Usage of host networking and portshostNetworkhostPorts
Usage of volume typesvolumes
Usage of the host filesystemallowedHostPaths
White list of FlexVolume driversallowedFlexVolumes
Allocating an FSGroup that owns the pod’s volumesfsGroup
Requiring the use of a read only root file systemreadOnlyRootFilesystem
The user and group IDs of the containerrunAsUserrunAsGroupsupplementalGroups
Restricting escalation to root privilegesallowPrivilegeEscalationdefaultAllowPrivilegeEscalation
Linux capabilitiesdefaultAddCapabilitiesrequiredDropCapabilitiesallowedCapabilities
The SELinux context of the containerseLinux
The Allowed Proc Mount types for the containerallowedProcMountTypes
The AppArmor profile used by containersannotations
The seccomp profile used by containersannotations
The sysctl profile used by containersforbiddenSysctls,allowedUnsafeSysctls

Activer la fonctionnalité PSP dans un cluster AKS existant:

# Install the aks-preview extension
az extension add --name aks-preview

# Update the extension to make sure you have the latest version installed 
az extension update --name aks-preview

az feature register --name PodSecurityPolicyPreview --namespace Microsoft.ContainerService

az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/PodSecurityPolicyPreview')].{Name:name,State:properties.state}"

az provider register --namespace Microsoft.ContainerService

# Enable Pod Security Policy
az aks update \
     --resource-group myResourceGroup \
     --name myAKSCluster \
     --enable-pod-security-policy 

Documentations :

AKS | Désactiver le Dashboard de votre cluster

Bonjour,

Dans cet article nous allons voir ensemble comment « désactiver/supprimer » le dashboard de votre cluster AKS.

Pour cela, je vous invite à utiliser la commande suivante:

az aks disable-addons -a kube-dashboard --resource-group Nom_RG --name Nom_AKS_Cluster

Bonne journée,

Maxime.

AKS | Restreindre l’accès a API Server

Bonjour,

Je commence une série de blog posts sur la sécurité dans AKS, pour rappel AKS est le service managé de Kubernetes pour Azure.

Dans ce premier blog post nous allons voir ensemble comment restreindre l’accès à API Server. Mais avant cela je vous invite à regarder de nouveau l’architecture d’un cluster Kubernetes.

Avec le service managé AKS, Microsoft à la responsabilité de gérer et d’opérer le composant « Kubernetes Master ». Ce composant est composé des sous-composants suivants :

  • Control Manager
  • Scheduler
  • etcd
  • API Server

Les nodes de votre cluster vont interagir directement avec le composant API Server. Si vous souhaitez accéder à votre cluster Kubernetes vous allez également interagir avec API Server. Ce composant est un composant clé de l’architecture de votre cluster Kubernetes.

Quand vous déployez un cluster managé dans Azure, un cluster AKS, Microsoft va créer un « endpoint » publique vous permettant d’interagir avec votre cluster. Par défaut, vous pouvez accéder à votre cluster avec l’aide de vos identifiants depuis n’importe quelle adresse IP internet …

Dans cet article, je vous présente comment réduire la portée d’accès à l’API Server en filtrant l’accès depuis une adresse IP publique spécifique ou depuis une plage d’adresses IP publiques.

Nous partons de la prémisse que notre cluster AKS est déjà déployé, ci ce n’était pas le cas, je vous invite à regarder la vidéo ci-dessous:

Afin de restreindre les accès à API Serveur nous allons utiliser le service Azure Firewall, nous allons créer dans un premier temps une passerelle sortante pour nos nodes.

L’ensemble de nos nodes vont avoir la meme adresse IP publique de sortie, l’adresse de notre Azure Firewall. Puis dans un second temps nous allons mettre à jour notre cluster afin d’autoriser uniquement cette adresse IP publique.

La fonctionnalité que nous utilisons est « preview » lors de l’écriture de cet article, pour cela je vous invite à suivre les pré-requis suivant:

az feature register --name APIServerSecurityPreview --namespace Microsoft.ContainerService

az feature list -o table --query "[ contains(name,'Microsoft.ContainerService/APIServerSecurityPreview')].{Name:name,State:properties.state}"

az provider register --namespace Microsoft.ContainerService

Nous créons un sous-réseau dédié à notre Azure Firewall, dans le VNet de notre cluster AKS

# Get the name of the virtual network used by the cluster
VNET_NAME=$(az network vnet list --resource-group $MC_RESOURCE_GROUP --query [0].name -o tsv) 

# Create a subnet in the virtual network for Azure Firewall 
az network vnet subnet create --resource-group $MC_RESOURCE_GROUP --vnet-name $VNET_NAME --name AzureFirewallSubnet --address-prefixes 10.200.0.0/16

Nous allons créer notre Azure Firewall, puis dans un second temps nous allons créer une adresse IP publique pour notre Azure Firewall :

# Install the CLI extension for Azure Firewall
az extension add --name azure-firewall 

# Create an Azure firewall  
az network firewall create --resource-group $MC_RESOURCE_GROUP --name myAzureFirewall

# Create a public IP address for the firewall FIREWALL_PUBLIC_IP=$(az network public-ip create --resource-group $MC_RESOURCE_GROUP --name myAzureFirewallPublicIP --sku Standard --query publicIp.ipAddress -o tsv)

Enfin nous attachons notre Azure Firewall avec le subnet précédemment créé:

# Associated the firewall with virtual network 
az network firewall ip-config create --resource-group $MC_RESOURCE_GROUP --name myAzureFirewallIPConfig --vnet-name $VNET_NAME --firewall-name myAzureFirewall --public-ip-address myAzureFirewallPublicIP

Nous allons créer une première règle de pare-feu pour autoriser l’ensemble du traffic sortant. (Je ne vous recommande pas de mettre en place ce type de règle pour un cluster de production, mais de filter en sortie uniquement les adresses requises pour vos nodes : https://docs.microsoft.com/en-us/azure/aks/limit-egress-traffic)

az network firewall network-rule create --resource-group $MC_RESOURCE_GROUP --firewall-name myAzureFirewall --name AllowTCPOutbound --collection-name myAzureFirewallCollection --priority 200 --action Allow --protocols TCP --source-addresses '*' --destination-addresses '*' destination-ports '*'

Nous déployons une table de routage afin router le traffic entre l’interface privé et l’interface publique de notre Azure Firewall.

# Get the AKS cluster route table 
ROUTE_TABLE=$(az network route-table list --resource-group $MC_RESOURCE_GROUP --query "[?contains(name,'agentpool')].name" -o tsv) 

# Get internal IP address of the firewall FIREWALL_INTERNAL_IP=$(az network firewall show --resource-group $MC_RESOURCE_GROUP --name myAzureFirewall --query ipConfigurations[0].privateIpAddress -o tsv) 

# Get the IP address of API server endpoint K8S_ENDPOINT_IP=$(kubectl get endpoints -o=jsonpath='{.items[?(@.metadata.name == "kubernetes")].subsets[].addresses[].i

az network route-table route create --resource-group $MC_RESOURCE_GROUP --route-table-name $ROUTE_TABLE  --name AzureFirewallAPIServer --address-prefix $K8S_ENDPOINT_IP/32 --next-hop-ip-address $FIREWALL_INTERNAL_IP --next-hop-type VirtualAppliance echo "Public IP address for the Azure Firewall instance that should be added to the list of API server authorized addresses is:" $FIREWALL_PUBLIC_IP

Dernière étape nous mettons à jour notre cluster AKS afin de n’autoriser que l’adresse IP publique du Azure Firewall. Nous pouvons si nous le souhaitons par la même occasion autoriser l’adresse IP publique de notre connexion internet afin d’interagir avec API Server directement depuis notre poste de travail avec l’aide de l’outil kubectl.

az aks update --resource-group myResourceGroup --name myAKSCluster --api-server-authorized-ip-ranges @IP_Public_Firewall_Azure/32

Lien vers la documentation : https://docs.microsoft.com/en-us/azure/aks/api-server-authorized-ip-ranges