Ограничение доступа к админ-консоли#

Ограничение доступа к админ-консоли в Kubernetes/Openshift#

Ограничение доступа к админ-консоли в Kubernetes/Openshift реализуется следующим образом:

  1. Создать сервис для Istio, в котором будут прописаны порты

apiVersion: v1
kind: Service
metadata:
  labels:
    app: kcse-ingressgateway
    istio: kcse-ingressgateway
  name: ingressgateway-svc-separate
spec:
  ports:
    - name: https-<ADMIN_PORT>
      port: <ADMIN_PORT>
    - name: https-<USER_PORT>
      port: <USER_PORT>
  selector:
    app: kcse-ingressgateway
    istio: kcse-ingressgateway
  1. Создать Route (служба, в которой задается имя хоста), по которым будут получать доступ пользователи и администраторы.

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: kcse-ingressgateway
    istio: kcse-ingressgateway
  name: ingressgateway-https-admin
  annotations:
    haproxy.router.openshift.io/balance: roundrobin
spec:
  host: admin-<HOST>
  port:
    targetPort: https-<ADMIN_PORT>
  tls:
    termination: passthrough
  to:
    kind: Service
    name: ingressgateway-svc-separate
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: kcse-ingressgateway
    istio: kcse-ingressgateway
  name: ingressgateway-https-user
  annotations:
    haproxy.router.openshift.io/balance: roundrobin
spec:
  host: user-<HOST>
  port:
    targetPort: https-<USER_PORT>
  tls:
    termination: passthrough
  to:
    kind: Service
    name: ingressgateway-svc-separate
  1. Создать VirtualService, который представляет собой набор правил маршрутизации трафика при обращении к хосту

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: internal-host-vs-admin
spec:
  exportTo:
    - .
  gateways:
    - ingressgateway-gw-separate
  hosts:
    - admin-<HOST>
  http:
    - route:
        - destination:
            host: kcse
            port:
              number: 8080
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: internal-host-vs-user
spec:
  exportTo:
    - .
  gateways:
    - ingressgateway-gw-separate
  hosts:
    - user-<HOST>
  http:
    - match:
        - uri:
            prefix: /admin
        - uri:
            prefix: /auth/admin
      redirect:
        authority: admin-<HOST>
    - route:
        - destination:
            host: kcse
            port:
              number: 8080
  1. Создать Gateway, который описывает балансировщик нагрузки, работающий на границе сетки, принимающий входящие или исходящие соединения HTTP/TCP

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ingressgateway-gw-separate
spec:
  selector:
    istio: kcse-ingressgateway
  servers:
    - port:
        name: https-<ADMIN_PORT>
        number: <ADMIN_PORT>
        protocol: HTTPS
      hosts:
        - admin-<HOST>
      tls:
        caCertificates: /etc/istio/ingressgateway-ca-certs/ca-chain.cert.pem
        mode: MUTUAL
        privateKey: /etc/istio/ingressgateway-certs/tls.key
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
    - port:
        name: https-<USER_PORT>
        number: <USER_PORT>
        protocol: HTTPS
      hosts:
        - user-<HOST>
      tls:
        caCertificates: /etc/istio/ingressgateway-ca-certs/ca-chain.cert.pem
        mode: SIMPLE
        privateKey: /etc/istio/ingressgateway-certs/tls.key
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt

Теперь при входе в панель администратора по хосту пользователя user-<HOST> его будет переадресовывать на хост администратора admin-<HOST>, на который можно будет войти предъявив сертификат.

Запуск в режиме Read-only с блокировкой изменений через административную консоль#

Специальная конфигурация запуска в режиме Read-only с блокировкой изменений через админ-консоль включается переменной окружения: KCSE_UI_READ_ONLY_MODE. Если для переменной задано значение “true”, - консоль администратора после входа пользователя отображается в режиме «только для чтения». В этом случае пользователь может просматривать данные в консоли, но не может их редактировать или удалять. Описание конфигурационных параметров на странице Настройка конфигурационных параметров

  1. После запуска Pods необходимо проверить работоспособность приложения согласно url, прописанному в Routes для данного приложения.

  2. Откроется консоль администратора в режиме "только для чтения"

    1. Консоль администратора

Ограничение доступа к админ-консоли при помощи Platform V. IAM Proxy#

Для разграничения доступа к админ-консоли необходимо настроить в Platform V. IAM Proxy ответвления.

- junctionName: Keycloak for Admins 
  https: True
  authorizeByRoleTemplate: "platformauth_admin"
  junctionPoint: /auth/admin 
  indexUrl: /auth/admin/master/console/ 
  applyJctRequestFilter: "common/rds-set-header-host-to-backend.location.conf , common/rds-ssl-sni-on.server.conf , common/rds-block-for-custom-keycloak-admin-api.location.conf" 
  sslCommonName: "node1.platformauth-devb.sc.dev.mycompany" 
  transparent: True 
  serverAddresses: [ "node1.platformauth-devb.sc.dev.mycompany:8444" ] 
- junctionName: Keycloak for Users 
  https: True 
  junctionPoint: /auth 
  indexUrl: /auth/realms/PlatformAuth/account/ 
  applyJctRequestFilter: "common/rds-set-header-host-to-backend.location.conf , common/rds-ssl-sni-on.server.conf , common/rds-block-all-keycloak-admin-api.location.conf" 
  sslCommonName: "platformauth-devb.sc.dev.mycompany" 
  transparent: True 
  serverAddresses: [ "platformauth-devb.sc.dev.mycompany:443" ]

В параметре authorizeByRoleTemplate должна быть указана роль, указанная в токене одним из следующим образом:

  1. Как Realm-роль пользователя:

  • На вкладке "Роли" должна быть создана роль, указанная в параметре authorizeByRoleTemplate.

  • На вкладке "Клиенты" -> Выбранный клиент -> "Сопоставления" добавить сопоставление "User Realm Role", задав имя переменной в токене.

  • На вкладке "Пользователи" -> Выбранный пользователь -> "Сопоставление ролей" назначить ее пользователю.

  1. Как роль клиента, который используется на IAM Proxy для авторизации:

  • На вкладке "Клиенты" -> Выбранный клиент -> "Роли" должна быть создана роль, указанная в параметре authorizeByRoleTemplate.

  • На вкладке "Клиенты" -> Выбранный клиент -> "Сопоставления" добавить сопоставление "User Client Role", задав имя переменной в токене.

  • На вкладке "Клиенты" -> Выбранный клиент -> "Роли Service Account" назначить данную роль.

Подробнее о настройке ответвлений можно узнать в документации компонента IAM Proxy (AUTH).