K3s - создать пользователя с клиентским сертификатом - PullRequest
0 голосов
/ 28 января 2020

Я пытался создать учетные записи пользователей с сертификатом клиента.

Я следовал двум учебникам, но застрял с обоими вариантами в сообщении

https://medium.com/better-programming/k8s-tips-give-access-to-your-clusterwith-a-client-certificate-dfb3b71a76fe

https://docs.bitnami.com/kubernetes/how-to/configure-rbac-in-your-kubernetes-cluster/

Я установил правильного пользователя, сервер и правильный контекст. Я установил пространство имен, но ошибка все та же.

> kubectl get pods
You must be logged in to the server (Unauthorized) 

Кто-то уже испытывал нечто подобное? Или кто-то знает, что я делаю не так?

Моя версия кластера k3s - 1.15.4.

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Я наконец нашел свой ответ в этом билете.

https://github.com/rancher/k3s/issues/684

Пользователь huapox разместил следующий код:

[root@(⎈ |default:default) sec-rbac]$ cat t2.sh 
ws=/opt/sec-rbac
day=3650

clus_name="t1.k3s"
clus_ns="default"
user="koper"
#clus_url="https://10.200.100.183:7442"
clus_url="https://server:6443"  ##
ca_path=$ws/server/tls
rm -f $ca_path/*-ca.srl

ctx=gen && mkdir -p $ws/$ctx/{kube,keys} && cd $ws/$ctx
#############
ca1=client-ca
generate="keys/u-"$user
echo -e "\033[32m#>>GEN-KEY\033[0m"
#openssl genrsa -out $generate.key 2048
openssl ecparam -name prime256v1 -genkey -noout -out $generate.key
openssl req -new -key $generate.key -out $generate.csr -subj "/CN=${user}@${clus_name}/O=key-gen"
openssl x509 -req -in $generate.csr -CA $ca_path/$ca1.crt -CAkey $ca_path/$ca1.key -CAcreateserial -out $generate.crt -days $day

#-----------
#generate=$ca_path/client-admin  ##test
ca2=server-ca
embed=false
ctx2="$user@$clus_name"
config="kube/$user.kubeconfig"
echo -e "\033[32m#>>KUBE-CONFIG\033[0m" 
kubectl --kubeconfig=$config config set-cluster $clus_name --embed-certs=$embed --server=$clus_url --certificate-authority=$ca_path/$ca2.crt
kubectl --kubeconfig=$config config set-credentials $user --embed-certs=$embed --client-certificate=$generate.crt  --client-key=$generate.key
kubectl --kubeconfig=$config config set-context $ctx2 --cluster=$clus_name --namespace=$clus_ns --user=$user
kubectl --kubeconfig=$config config set current-context $ctx2
kubectl --kubeconfig=$config --context=$ctx2 get pods

Большое спасибо huapox.

0 голосов
/ 28 января 2020

Начиная с сообщения об ошибке, ваш пользователь получает ошибку только на этапе аутентификации (код ошибки HTTP: 401 ), вы можете проверить то же самое, используя:

$ k get pods -v=6
...
I0123 16:34:18.842853   29373 helpers.go:203] server response object: [{
  ...
  "code": 401
}]
F0123 16:34:18.842907   29373 helpers.go:114] error: You must be logged in to the server (Unauthorized)

Отладка настройте, используя следующие шаги:

  1. Убедитесь, что вы используете правильный контекст и правильного пользователя, как вы ожидали (с * в столбце CURRENT):

    $ kubectl config get-contexts 
    CURRENT   NAME                          CLUSTER      AUTHINFO                NAMESPACE
    *         context-user-ca-signed        kubernetes   user-user-ca-signed     ns1
              kubernetes-admin@kubernetes   kubernetes   kubernetes-admin        
    
  2. Проверьте сертификат CA для Kubernetes API Server (при условии, что сервер API работает как Pod):

    $ sudo cat /etc/kubernetes/manifests/kube-apiserver.yaml | grep -i "\-\-client-ca-file"
        - --client-ca-file=/etc/kubernetes/pki/ca.crt
    
    $ openssl x509 -in /etc/kubernetes/pki/ca.crt -text -noout | grep -i "Issuer:\|Subject:"
            Issuer: CN = kubernetes
            Subject: CN = kubernetes
    
  3. Убедитесь, что сертификат вашего пользователя подписан вышеуказанным CA (эмитент CN пользователя сертификат совпадает с субъектом CN сертификата CA (здесь «kubernetes»), который настраивается на сервере API:

    $ kubectl config view --raw -o jsonpath="{.users[?(@.name == \"user-user-ca-signed\")].user.client-certificate-data}" | base64 -d > client.crt
    
    $ openssl x509 -in client.crt -text -noout | grep -i "Issuer:\|Subject:"
            Issuer: CN = kubernetes
            Subject: C = IN, ST = Some-State, O = Some-Organization, CN = user-ca-signed
    

Если вышеуказанные действия подходят для созданного вами пользователя, Вы должны пройти Аутентификация фаза. Но фаза авторизации все еще должна быть настроена с использованием RBA C, ABA C или любого другого поддерживаемого режима авторизации, в противном случае вы все равно можете получить код ошибки HTTP: 403

$ kubectl get pods -v=6
I0123 16:59:41.350501   28553 helpers.go:203] server response object: [{
  ...
  "code": 403
}]
F0123 16:59:41.351080   28553 helpers.go:114] Error from server (Forbidden): pods is forbidden: User "user-ca-signed" cannot list resource "pods" in API group "" in the namespace "ns1": No policy matched.
...