Kube-rbac-proxy#

Kube-rbac-proxy — это HTTP-прокси для одного исходящего потока, который может выполнять авторизацию RBAC для DropApp API с помощью SubjectAccessReview.

В кластерах DropApp без применения сетевой политики любой pod может выполнять запросы к любому другому pod в кластере. Используйте Kube-rbac-proxy для ограничения запросов только теми модулями, которые предоставляют действительный и авторизованный RBAC токен или клиентский TLS-сертификат.

Преимущества использования Kube-rbac-proxy:

  • разгружает API DropApp, чтобы он мог обрабатывать фактические запросы, связанные с компонентами кластера, а не запросы от клиентов;

  • принимает входящие HTTP-запросы, это позволяет гарантировать, что запрос авторизован и имеет право доступа к приложению, а не просто имеет сетевой доступ к объекту.

При входящем запросе Kube-rbac-proxy выясняет, какой пользователь выполняет запрос. Kube-rbac-proxy поддерживает использование клиентских TLS-сертификатов, а также токенов. В случае использования сертификата, он проверяется настроенным центром сертификации.

После того как пользователь прошел аутентификацию, снова используется authentication.k8s.io для выполнения SubjectAccessReview, чтобы авторизовать соответствующий запрос и убедиться, что аутентифицированный пользователь имеет необходимые роли RBAC.

У Kube-rbac-proxy есть все glog флаги для ведения журнала. Чтобы использовать Kube-rbac-proxy, установите несколько флагов:

  • --upstream: - исходящий поток проксирования;

  • --config-file: - файл, в котором указаны сведения о SubjectAccessReview, их необходимо выполнить по запросу. Например, можно указать, что объекту, выполняющему запрос, должно быть разрешено выполнять развертывание get pod с названием my-frontend-app.

Все флаги командной строки Kube-rbac-proxy представлены в таблице.

Таблица. Флаги командной строки Kube-rbac-proxy.

Синтаксис флага

Значение

--allow-paths strings

Список путей, разделенных запятыми, по которым шаблон kube-rbac-proxy сопоставляет входящий запрос. Если запрос не совпадает, kube-rbac-proxy отвечает кодом состояния 404. Если этот параметр опущен, путь входящего запроса не проверяется. Нельзя использовать с параметром --ignore-paths

--auth-header-fields-enabled

Значение true данного флага позволяет kube-rbac-proxy добавлять поля, связанные с аутентификацией, в заголовки HTTP-запросов, отправляемых в исходящий поток

--auth-header-groups-field-name string

Имя поля в заголовке запроса HTTP/2, чтобы сообщить вышестоящему серверу о группах пользователя (по умолчанию x-remote-groups)

--auth-header-groups-field-separator string

Разделитель, используемый для объединения нескольких имен групп в значении поля заголовка группы (по умолчанию )

--auth-header-user-field-name string

Имя поля в заголовке запроса HTTP(2), сообщающее вышестоящему серверу об имени пользователя (по умолчанию x-remote-user)

--auth-token-audiences strings

Список аудиторий токенов, которые необходимо принять, разделенный запятыми. По умолчанию токен не должен иметь какой-либо конкретной аудитории. Рекомендуется установить конкретную аудиторию

--client-ca-file

Любой запрос, представляющий сертификат клиента, подписанный одним из уполномоченных в файле client-ca, в случае установки флага, аутентифицируется с использованием идентификатора, соответствующего CommonName сертификата клиента

--config-file string

Файл конфигурации для настройки kube-rbac-proxy

--ignore-paths strings

Список путей, разделенных запятыми, по которым шаблон kube-rbac-proxy сопоставляет входящий запрос. Если запрос совпадает, он перенаправляет запрос без выполнения аутентификации или проверки авторизации. Нельзя использовать с флагом --allow-paths

--kubeconfig

Путь к файлу kubeconfig*, указывающий, как подключиться к серверу API. Если значение --kubeconfig не задано, будет использоваться конфигурация внутри кластера

--oidc-ca-file

Сертификат сервера OpenID будет проверен в файле oidc-ca при установке флага, в противном случае будет использоваться корневой набор CA хоста

--oidc-clientID

Идентификатор клиента для клиента OpenID Connect должен быть установлен, если установлен oidc-issuer-url

--oidc-groups-claim string

Идентификатор групп в заявке JWT

--oidc-groups-prefix string

Флаг, при установке которого все группы будут иметь префикс с этим значением, чтобы предотвратить конфликты с другими стратегиями аутентификации

--oidc-issuer string

URL-адрес издателя OpenID, должен быть указан только в формате HTTPS. Если он установлен, он будет использоваться для проверки веб-токена OIDC JSON (JWT)

--oidc-sign-alg stringArray

Поддерживаемые алгоритмы подписи, по умолчанию RS256

--oidc-username-claim string

Идентификатор пользователя в заявлении JWT, по умолчанию установлено значение «электронная почта»

--proxy-endpoints-port int

Порт для безопасного обслуживания конечных точек, специфичных для прокси-сервера (например, healthz). Использует хост из --secure-listen-address

--secure-listen-address string

Адрес, который должен прослушивать HTTP-сервер kube-rbac-proxy

--tls-cert-file string

Файл, содержащий сертификат x509 по умолчанию для HTTPS. Сертификат ЦС, если таковой имеется, объединенный после сертификата сервера

--tls-cipher-suites strings

Список наборов шифров для сервера, разделенный запятыми. Если этот параметр не указан, будут использоваться наборы шифров Go по умолчанию

--tls-min-version  string

Минимальная поддерживаемая версия TLS 1.2. По умолчанию ВTLS12

--tls-private-key-file string

Файл, содержащий закрытый ключ x509 по умолчанию, соответствующий --tls-cert-file

--tls-reload-interval duration

Интервал, с которым следует отслеживать изменения сертификата TLS 1.2, по умолчанию равен одной минуте

--upstream string

Исходящий URL-адрес для прокси-сервера после успешной аутентификации и авторизации запросов

--upstream-ca-file string

ЦС, который исходящий поток использует для TLS 1.2-соединения. Это необходимо, когда исходящий поток использует TLS 1.2 и собственный сертификат ЦС

--upstream-client-cert-file  string

Флаг, при установке которого клиент будет использоваться для аутентификации прокси-сервера в исходящем направлении. Также требуется установить --upstream-client-key-file

--upstream-client-key-file string

Флаг, соответствующий сертификату из --upstream-client-cert-file. При установке, требуется также установить --upstream-client-cert-file

--upstream-force-h2c

Флаг, заставляющий h2c взаимодействовать с исходящим потоком. Это необходимо, когда исходящий поток использует только h2c (открытый текст HTTP/2 — небезопасный вариант HTTP/2). Например, сервер go-grpc в небезопасном режиме без TLS 1.2

Глобальные флаги:

-h, --help

Помощь для kube-rbac-proxy

--log-dir string

Флаг, позволяющий записывать файлы журналов в текущий каталог (не ведет запись, если -logtostderr=true)

--version version[=true]

Флаг, позволяющий вывести информацию о версии и выйти из приложения

RBAC различается по двум типам, которые необходимо авторизовать: ресурсные и нересурсные. Например, авторизация запроса ресурса может заключаться в том, что запрашивающему объекту необходимо авторизоваться для выполнения действия get при развертывании DropApp.

Выполните следующие действия для защиты приложения с помощью kube-rbac-proxy (в примере ниже - prometheus-example-app). В этом примере запрашивающему объекту разрешено вызывать подресурс proxy в службе DropApp с именем kube-rbac-proxy. Это настраивается в файле, переданном kube-rbac-proxy с флагом --config-file. Кроме того, необходимо установить флаг --upstream для настройки приложения, которое должно быть проксировано при успешной аутентификации и авторизации.

Kube-rbac-proxy также требует доступа RBAC для выполнения TokenReviews, а также SubjectAccessReviews. Это API-интерфейсы, доступные в DropApp API для аутентификации и последующей проверки авторизации объекта.

Установка Kube-rbac-proxy#

Предварительные условия#

Предварительные условия создания клиента RBAC:

  • развернут кластер DropApp;

  • установлен kubectl.

Установка#

Примечание

В приведенном сценарии IP адреса являются ненастоящими и приведены в качестве примера.

Для установки Kube-rbac-proxy:

  1. Создайте файл yaml:

    Создайте deployment в DropApp с использованием файла deployment.yaml, как представлено ниже.

    Команда kubectl create позволяет создать deployment на основе файла deployment.yaml, который содержит описание приложения и его настроек. Файл deployment.yaml может содержать информацию о контейнерах, ресурсах, настройках сети и другие параметры, необходимые для создания и управления deployment.

    kubectl create -f deployment.yaml
    
  2. Внесите при помощи текстового редактора, следующее содержание манифеста:

    Kube-rbac-proxy.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: kube-rbac-proxy
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: kube-rbac-proxy
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: kube-rbac-proxy
    subjects:
    - kind: ServiceAccount
      name: kube-rbac-proxy
      namespace: default
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: kube-rbac-proxy
    rules:
    - apiGroups: ["authentication.k8s.io"]
      resources:
      - tokenreviews
      verbs: ["create"]
    - apiGroups: ["authorization.k8s.io"]
      resources:
      - subjectaccessreviews
      verbs: ["create"]
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: kube-rbac-proxy
      name: kube-rbac-proxy
    spec:
      ports:
      - name: HTTPs
        port: 8443
        targetPort: HTTPs
      selector:
        app: kube-rbac-proxy
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kube-rbac-proxy
    data:
      config-file.yaml: |+
        authorization:
          resourceAttributes:
            namespace: default
            apiVersion: v1
            resource: services
            subresource: proxy
            name: kube-rbac-proxy
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kube-rbac-proxy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: kube-rbac-proxy
      template:
        metadata:
          labels:
            app: kube-rbac-proxy
        spec:
          securityContext:
            runAsUser: 65532
          serviceAccountName: kube-rbac-proxy
          containers:
          - name: kube-rbac-proxy
            image: quay.io/brancz/kube-rbac-proxy:v0.14.1
            args:
            - "--secure-listen-address=0.0.0.0:8443"
            - "--upstream=HTTP://127.0.0.1:8081/"
            - "--config-file=/etc/kube-rbac-proxy/config-file.yaml"
            - "--logtostderr=true"
            - "--v=10"
            ports:
            - containerPort: 8443
              name: HTTPs
            volumeMounts:
            - name: config
              mountPath: /etc/kube-rbac-proxy
            securityContext:
              allowPrivilegeEscalation: false
          - name: prometheus-example-app
            image: quay.io/brancz/prometheus-example-app:v0.1.0
            args:
            - "--bind=127.0.0.1:8081"
          volumes:
          - name: config
            configMap:
              name: kube-rbac-proxy
    

    Примечание

    IP адреса являются ненастоящими и приведены в качестве примера.

  3. Разверните объект Job, который выполняет curl, чтобы протестировать приложение prometheus-example-app. Поскольку он имеет правильные роли RBAC - запрос будет выполнен успешно:

    kubectl create -f client-rbac.yaml client.yaml
    

    Это команда для создания клиента RBAC. В данном случае, команда создает два файла: client-rbac.yaml и client.yaml. Файл client-rbac.yaml описывает клиента RBAC и содержит информацию о пользователях, группах и ролях, которые будут иметь доступ к ресурсам кластера. Файл client.yaml содержит конфигурацию клиента, включая его имя, IP-адрес и другие параметры.

    После выполнения команды kubectl create, клиент будет создан и готов к использованию.

  4. Внесите при помощи текстового редактора, следующее содержание манифеста:

Kube-rbac-proxy-client.yaml
apiVersion: rbac.authorization v1
kind: ClusterRole
metadata:
  name: Kube-rbac-proxy-client
rules:
- apiGroups: [""]
  resources: ["services/proxy"]
  verbs: ["get"]
---
apiVersion: rbac.authorization v1
kind: ClusterRoleBinding
metadata:
  name: Kube-rbac-proxy-client
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: Kube-rbac-proxy-client
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
apiVersion: batch/v1
kind: Job
metadata:
  name: krp-curl
spec:
  template:
    metadata:
      name: krp-curl
    spec:
      containers:
      - name: krp-curl
        image: quay.io/brancz/krp-curl:v0.0.2
      restartPolicy: Never
  backoffLimit: 4

При просмотре журнала, вывод должен отображать следующее содержание:

kubectl logs job/krp-curl
*   Trying 00.000.000.000..
* TCP_NODELAY set
* Connected to Kube-rbac-proxy.default.svc (000.000.00.000) port 8080 (#0)
> GET /metrics HTTP/1.1
> Host: Kube-rbac-proxy.default.svc:8080
> User-Agent: curl/7.57.0
> Accept: */*
> Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5clkLKJlkLK;lknLKnmLKNlknlkn:LkhGfgufiytFl[p;":lpl";l'kX
>
< HTTP/1.1 200 OK
< Content-Type: text/plain; version=0.0.4
< Date: Sun, 17 Dec 2017 13:34:26 GMT
< Content-Length: 102
<
{ [102 bytes data]
* Connection #0 to host Kube-rbac-proxy.default.svc left intact
# Информация о версии этого бинарного файла
version{version="v0.1.0"} 0

Примечание

IP адреса являются ненастоящими и приведены в качестве примера.