sighupio/gatekeeper-policy-manager

User \"system:anonymous\" cannot get path \"/apis/constraints.gatekeeper.sh/v1beta1//

steve-heslouin opened this issue ยท 8 comments

Hello, i wanted to try your dashboard so i could try runing it for my company, but that didn't worked.

On my local machine i used :

docker run -v ~/.kube/config:/home/gpm/.kube/config -p 8080:8080 quay.io/sighup/gatekeeper-policy-manager:v0.5.1

It loaded my kubeconfig file correctly, when i click "Get constraints status", it give me following error:

(403) Reason: Forbidden HTTP response headers: HTTPHeaderDict({'Audit-Id': '2b44e6b7-e43e-449b-a608-83d4347fde9e', 'Cache-Control': 'no-cache, private', 'Content-Type': 'application/json', 'X-Content-Type-Options': 'nosniff', 'X-Kubernetes-Pf-Flowschema-Uid': 'e8915a47-326c-450c-af43-f297c36367a6', 'X-Kubernetes-Pf-Prioritylevel-Uid': '38bf4b6b-d54e-4289-b143-c225265af301', 'Date': 'Tue, 01 Mar 2022 13:36:38 GMT', 'Content-Length': '225'}) HTTP response body: {"kind":"Status","apiVersion":"v1","metadata":{},"status":"Failure","message":"forbidden: User \"system:anonymous\" cannot get path \"/apis/constraints.gatekeeper.sh/v1beta1//\"","reason":"Forbidden","details":{},"code":403}
[2022-03-01 13:27:34 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2022-03-01 13:27:34 +0000] [1] [INFO] Listening at: http://0.0.0.0:8080 (1)
[2022-03-01 13:27:34 +0000] [1] [INFO] Using worker: gthread
[2022-03-01 13:27:34 +0000] [9] [INFO] Booting worker with pid: 9
[2022-03-01 13:27:34 +0000] [11] [INFO] Booting worker with pid: 11
[2022-03-01 13:27:38,405] INFO: RUNNING WITH AUTHENTICATION DISABLED
[2022-03-01 13:27:38,405] INFO: RUNNING WITH AUTHENTICATION DISABLED
[2022-03-01 13:27:38,407] INFO: Attempting init with KUBECONFIG from path '~/.kube/config'
[2022-03-01 13:27:38,407] INFO: Attempting init with KUBECONFIG from path '~/.kube/config'
[2022-03-01 13:27:38,691] ERROR: [Errno 2] No such file or directory: 'aws-iam-authenticator'
[2022-03-01 13:27:38,693] ERROR: [Errno 2] No such file or directory: 'aws-iam-authenticator'

I have gatekeeper 3.7 installed on my EKS cluster and its up and running.

gatekeeper-system   gatekeeper-audit-59d4b6fd4c-lw8hj                1/1     Running   0          82d
gatekeeper-system   gatekeeper-controller-manager-66f474f785-448pz   1/1     Running   0          82d
gatekeeper-system   gatekeeper-controller-manager-66f474f785-895ng   1/1     Running   0          82d
gatekeeper-system   gatekeeper-controller-manager-66f474f785-cl8sz   1/1     Running   0          82d

We use STS assume role and use the aws-auth mechanism provided by AWS, could that be the issue , as it seems the client run by default in anonymous, and ofc we don't provide access to anonymous user in our clusters

Thanks

Hello @steve-heslouin
You seem to be using https://github.com/kubernetes-sigs/aws-iam-authenticator to authenticate to EKS. GPM's docker image doesn't include the aws-aim-authenticator binary.

You could try mounting also the binary to somewhere in $PATH together with the KUBECONFIG when you run the docker image, maybe that's enough.

Another option is to build your own image for GPM adding the aws-aim-authenticator binary, with a Dockerfile like:

FROM curlimages/curl:7.81.0 as downloader
RUN curl https://github.com/kubernetes-sigs/aws-iam-authenticator/releases/download/v0.5.5/aws-iam-authenticator_0.5.5_linux_amd64 --output /tmp/aws-iam-authenticator
RUN chmod +x /tmp/aws-iam-authenticator
FROM quay.io/sighup/gatekeeper-policy-manager:v0.5.1
COPY --from=downloader --chown=root:root /tmp/aws-iam-authenticator /usr/local/bin/

@ralgozino Thanks a lot for your feedback, let me try it and i will let you know ;)

@ralgozino
So i tried, and after having mounted the config and credentials file, i do not have error related to aws-iam-authenticator

I rather have this error:

ERROR: exec: plugin api version client.authentication.k8s.io/v1beta1 does not match client.authentication.k8s.io/v1alpha

DO you have an idea where that could come from?

Thanks a lot :)

What version of kubectl do you have installed?

Could you please check your kubeconfig and see if you have a section like this:

# [...]
users:
- name: kubernetes-admin
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1beta1
      command: aws-iam-authenticator
      args:
        - "token"
        - "-i"
        - "REPLACE_ME_WITH_YOUR_CLUSTER_ID"
        - "-r"
        - "REPLACE_ME_WITH_YOUR_ROLE_ARN"
  # no client certificate/key needed here!

if you do, check that the apiVersion is client.authentication.k8s.io/v1beta1.

I think it could be a mismatch between the Kubernetes client version included in GPM and your kubeconfig format.

I would suggest trying with the unstable tag of GPM instead of v0.5.1 that has a newer version of the Kubernetes client.

Ok so i edited my kubeconfig to target v1beta1 instead and that worked great, i logged in and saw my constraints.
Thanks a lot @ralgozino , i will be testing it in dev envs, see how it goes, and if that work, well, we will surely
will propose PRs to help for any improvements ;)

Great to hear that!

We'll be waiting for your feedback ๐Ÿ™‚

 name: arn:aws:eks:......
  user:
    exec:
      apiVersion: client.authentication.k8s.io/v1alpha1
      args:
      - --region
      - us-east-1
      - eks
      - get-token
      - --cluster-name
      - cluster_name
      command: aws
      env:
      - name: AWS_PROFILE
        value: dev
      interactiveMode: IfAvailable
      provideClusterInfo: false

Turns out i also had some cluster that were relying on aws cli to authenticate , and by adding it to your image, it also worked great, maybe that'd be cool to have those 2 binary installed by default ?

I need to think about it, as first thought, I would prefer not to include them in order to no couple GPM version to AWS's tooling. What we can do instead is to add documentation on how to do it so everyone can easily build the image with the versions they need.
EDIT: Because if we include AWS binaries we would need to include all the possible options also. the exec option in the kubeconfig files is generic. It allows you to use any executable.