Le contrôle d'accès basé sur les rôles (RBAC) est une première étape de sécurité dans lequel chaque autorisation d'accès est basée sur des rôles qui sont attribués à un utilisateur. Avec ce système, il est donc possible de restreindre l'accès aux ressources d'un cluster Kubernetes (namespaces
, pods
, jobs
, etc.) à des applications ou des utilisateurs.
INFO
Kubernetes utilise des certificats pour sécuriser les communications entre les différents composants du cluster (par exemple, entre le kube-apiserver
et les kubelets
sur les nodes) ainsi que pour l'authentification des utilisateurs et des services.
Concepts
Dans Kubernetes, les stratégies RBAC peuvent être utilisées pour gérer aussi bien les droits d'accès d'un utilisateur système (User ou Group) que ceux des comptes de service (Service Account).
Un rôle permet de définir des autorisations d'accès via des verbes sur certaines ressources
, tels que des pods
, des nodes
, des deployments
, des ConfigMaps
, etc.
Composants
Kubernetes possède quatre objets liés aux RBAC qui peuvent être combinés pour définir les autorisations d'accès aux ressources du cluster.
Objet | Description |
---|---|
gérer les autorisations pour accéder aux ressources d'un namespace uniquement | |
gérer les autorisations pour accéder aux ressources à l'échelle du cluster | |
lie un rôle à des utilisateurs ou des comptes de service dans un namespace | |
lie un ClusterRole à des utilisateurs ou des comptes de service sur l'ensemble du cluster |
TIP
Comme pour tout système RBAC, Kubernetes RBAC est plus efficace lorsque les administrateurs suivent le principe du moindre privilège, en accordant à chaque utilisateur ou compte seulement les privilèges minimaux nécessaires pour effectuer son travail. Cela signifie utiliser des Roles au lieu de ClusterRoles dans la mesure du possible.
Création des ressources RBAC
Définir les utilisateurs et les comptes de service
- Créer une clé privée
openssl genrsa -out <username>.key 2048
- Créer une Demande de signature de certificat
openssl req -new -key <username>.key -out <username>.csr -subj "/CN=<username>/O=group1/"
TIP
Kubernetes utilise le champ Organisation (O=group1) pour déterminer l'appartenance à un groupe d'utilisateurs pour RBAC. CN est le nom de l'utilisateur et O est le groupe auquel cet utilisateur appartiendra.
- Signer la CSR avec l'autorité de certification k8s
sudo openssl x509 -req -in <username>.csr -CA /etc/kubernetes/pki/server-ca.crt -CAkey /etc/kubernetes/pki/server-ca.key -CAcreateserial -out <username>.crt -days 365
TIP
L'autorité de certification k8s se trouve par défaut dans le répertoire /etc/kubernetes/pki
- Inspecter le certificat
openssl x509 -in <username>.crt -text
- Récupérer le certificat en
base64
cat <username>.csr | base64 | tr -d "\n"
- Créer un Objet
CertificateSigningRequest
INFO
Cet objet fait une demande de signature de certificat
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: <username>
spec:
groups:
- system:authenticated
request: # certificat en Base64 = cat <username>.csr | base64 | tr -d "\n"
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
- Appliquer la configuration
kubectl apply -f CertificateSigningRequest.yml
- Vérifier la Liste des CSR (
CertificateSigningRequest
)
kubectl get csr
- Approuver la signature du certificat
kubectl certificate approve <username>
Créer un role
ou un clusterRole
Un Role
ou un ClusterRole
définit les actions qui peuvent être effectuées sur une ressource. Voici un exemple pour accorder des autorisations de get
et list
sur les pods
:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: <username>-role
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
Créer un RoleBinding
ou un ClusterRoleBinding
Un RoleBinding
ou un ClusterRoleBinding
lie un Role
ou un ClusterRole
à un utilisateur ou à un compte de service, permettant ainsi d'exécuter les actions définies dans le rôle.
- Créer un RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: <username>-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: <username>-role
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: <username>
- Appliquer la configuration
kubectl apply -f rolebinding.yml
- Générer le certificat pour l'authentification
INFO
Permet de s'authentifier sur le composant kube-api server
depuis l'objet CertificateSigningRequest
appelé username
kubectl get csr <username> -o jsonpath='{.status.certificate}' | base64 -d > <username>-cert.crt
- Ajouter l'utilisateur dans le fichier
Kubeconfig
sudo kubectl config set-credentials <username> --client-key=<username>.key --client-certificate=<username>-cert.crt --embed-certs=true
- Créer un nouveau contexte pour l'utilisateur
sudo kubectl config set-context <username> --cluster=default --user=<username>
- Vérifier la création du contexte
sudo kubectl config get-contexts
- Utiliser le nouveau contexte
sudo kubectl config use-context <username>