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.
Синтаксис флага |
Значение |
|---|---|
|
Список путей, разделенных запятыми, по которым шаблон kube-rbac-proxy сопоставляет входящий запрос. Если запрос не совпадает, kube-rbac-proxy отвечает кодом состояния 404. Если этот параметр опущен, путь входящего запроса не проверяется. Нельзя использовать с параметром |
|
Значение |
|
Имя поля в заголовке запроса HTTP/2, чтобы сообщить вышестоящему серверу о группах пользователя (по умолчанию |
|
Разделитель, используемый для объединения нескольких имен групп в значении поля заголовка группы (по умолчанию |
|
Имя поля в заголовке запроса HTTP(2), сообщающее вышестоящему серверу об имени пользователя (по умолчанию |
|
Список аудиторий токенов, которые необходимо принять, разделенный запятыми. По умолчанию токен не должен иметь какой-либо конкретной аудитории. Рекомендуется установить конкретную аудиторию |
|
Любой запрос, представляющий сертификат клиента, подписанный одним из уполномоченных в файле |
|
Файл конфигурации для настройки kube-rbac-proxy |
|
Список путей, разделенных запятыми, по которым шаблон kube-rbac-proxy сопоставляет входящий запрос. Если запрос совпадает, он перенаправляет запрос без выполнения аутентификации или проверки авторизации. Нельзя использовать с флагом |
|
Путь к файлу kubeconfig*, указывающий, как подключиться к серверу API. Если значение |
|
Сертификат сервера OpenID будет проверен в файле oidc-ca при установке флага, в противном случае будет использоваться корневой набор CA хоста |
|
Идентификатор клиента для клиента OpenID Connect должен быть установлен, если установлен |
|
Идентификатор групп в заявке JWT |
|
Флаг, при установке которого все группы будут иметь префикс с этим значением, чтобы предотвратить конфликты с другими стратегиями аутентификации |
|
URL-адрес издателя OpenID, должен быть указан только в формате HTTPS. Если он установлен, он будет использоваться для проверки веб-токена OIDC JSON (JWT) |
|
Поддерживаемые алгоритмы подписи, по умолчанию |
|
Идентификатор пользователя в заявлении JWT, по умолчанию установлено значение «электронная почта» |
|
Порт для безопасного обслуживания конечных точек, специфичных для прокси-сервера (например, |
|
Адрес, который должен прослушивать HTTP-сервер kube-rbac-proxy |
|
Файл, содержащий сертификат x509 по умолчанию для HTTPS. Сертификат ЦС, если таковой имеется, объединенный после сертификата сервера |
|
Список наборов шифров для сервера, разделенный запятыми. Если этот параметр не указан, будут использоваться наборы шифров Go по умолчанию |
|
Минимальная поддерживаемая версия TLS 1.2. По умолчанию |
|
Файл, содержащий закрытый ключ x509 по умолчанию, соответствующий |
|
Интервал, с которым следует отслеживать изменения сертификата TLS 1.2, по умолчанию равен одной минуте |
|
Исходящий URL-адрес для прокси-сервера после успешной аутентификации и авторизации запросов |
|
ЦС, который исходящий поток использует для TLS 1.2-соединения. Это необходимо, когда исходящий поток использует TLS 1.2 и собственный сертификат ЦС |
|
Флаг, при установке которого клиент будет использоваться для аутентификации прокси-сервера в исходящем направлении. Также требуется установить |
|
Флаг, соответствующий сертификату из |
|
Флаг, заставляющий h2c взаимодействовать с исходящим потоком. Это необходимо, когда исходящий поток использует только h2c (открытый текст HTTP/2 — небезопасный вариант HTTP/2). Например, сервер go-grpc в небезопасном режиме без TLS 1.2 |
Глобальные флаги: |
|
|
Помощь для kube-rbac-proxy |
|
Флаг, позволяющий записывать файлы журналов в текущий каталог (не ведет запись, если |
|
Флаг, позволяющий вывести информацию о версии и выйти из приложения |
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.
Установка#
Для установки Kube-rbac-proxy:
Создайте файл yaml:
Создайте deployment в DropApp с использованием файла
deployment.yaml, как представлено ниже.Команда
kubectl createпозволяет создать deployment на основе файлаdeployment.yaml, который содержит описание приложения и его настроек. Файлdeployment.yamlможет содержать информацию о контейнерах, ресурсах, настройках сети и другие параметры, необходимые для создания и управления deployment.kubectl create -f deployment.yamlВнесите при помощи текстового редактора, следующее содержание манифеста:
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Разверните объект
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, клиент будет создан и готов к использованию.Внесите при помощи текстового редактора, следующее содержание манифеста:
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 <IP-address>..
* TCP_NODELAY set
* Connected to Kube-rbac-proxy.default.svc (<IP-address>) 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