В инструкции ниже описывается вариант установки с помощью Docker-контейнеров. Вариант установки с помощью RPM-пакетов описан здесь - RPM.
Закрома.Хранение использует следующие компоненты, которые должны быть установлены в кластере до установки сервисов Закрома:
Руководство по установке дополнительных сервисов читайте подробнее здесь.
Внимание! Совместимая версия Keycloak на 01.11.2023 - 18.0.2
Valid Redirect URIs: /*
Access Type: confidential
Authorization Enabled: ON
Service Accounts Enabled: ON
На вкладке Service Account Roles добавляем роли admin и uma_autorization
На вкладке Mappers добавляем новый mapper
Name: username-mapper
Mapper Type: User Property
Property: username
Token Claim Name: username
Claim JSON Type: String
Edit Mode: READ_ONLY
Vendor: other
Username LDAP attribute: cn
RDN LDAP attribute: cn
UUID LDAP attribute: cn
User Object Classes: person, organizationalPerson
Connection URL: ldap://openldap.openldap.svc.cluster.local:389
Users DN: ou=users,dc=demo,dc=zakroma,dc=ru
Bind Type: simple
Bind DN: cn=admin,dc=demo,dc=zakroma,dc=ru
Bind Credential: xxx
В Bind Credential надо вставить Bind password который внутри секрета openldap-passwd в неймспейсе openldap и нажимаем Save Далее настраиваем вкладку Mappers. Переходим в нее и наживаем Create
4. Создаем имя group c типом role-ldap-mapper
. Общая суть сводится к синхронизацию групп AD с ролями пользователей в keycloak. Пример настроек:
LDAP Groups DN: ou=groups,dc=demo,dc=zakroma,dc=ru
Group Name LDAP Attribute: cn
Group Object Classes: groupOfUniqueNames
Membership LDAP Attribute: uniqueMember
Membership Attribute Type: DN
Membership User LDAP Attribute: uid
Mode: LDAP_ONLY
User Role Retrieve Strategy: LOAD_GROUPS_BY_MEMBER_ATTRIBUTE
Member-Of LDAP Attribute: memberOf
ClientID: zakroma
Далее Save и возвращаемся к настройкам на вкладке User Federation -> ldap -> settings
и жмем на синхронизацию всех пользователей, тут должны увидеть что пользователи юзеров были добавлены.
Переходим на Clients -> zakroma -> Roles
. Тут увидим роли, которые можно использовать для доступа к системе. Настроим маппинг ролей на helm-chart. Необходимо проставить в следующие
global:
config:
adminConsole:
userRoleName: <Название роли для доступа через S3>
global:
config:
adminConsole:
adminRoleName: <Название роли для доступа в административную консоль>
gatewayCloud:
adminRole: <Название роли для доступа в административную консоль>
Далее переходим на вкладки слева Realm Settings -> Keys
копируем ключ с алгоритмом RS256. Его нужно вставить в config-map kong-yaml в поле key раздела jwt_secrets. Находим Public key и вставляем его в поле rsa_public_key раздела jwt_secrets.
jwt_secrets: - consumer: admin-cli algorithm: RS256 key: xxxxxxxxxxx rsa_public_key: "-----BEGIN PUBLIC KEY----------END PUBLIC KEY-----"
Увеличим время жизни токена. Переходим на вкладки слева Realm Settings -> Tokens
. Проставим следующее значение:
Access Token Lifespan: 10 minute
Для установки компонентов ПО нужно выполнить два Helm-чарта: zakroma-cloud.
global:
config:
docker:
url: registry.local.net # Адрес registry с образами ПО
path: zakroma
baseDomain: site.ru # имя домена установки ПО
ingress:
enabled: false
adminConsole:
domain: admin
adminRoleName: cloudadmin
userRoleName: clouduser
gatewayCloud:
logLevel: debug
adminRole: cloudadmin
pathPrefix: /api
s3Domain: s3.site.ru # базовый url для domain style
secaudit:
enabled: true
db:
enabled: true
name: permission
search_path: public
username: <userdb>
password: <userdb password>
cors:
- https://admin.site.ru #адрес консоли администратора
keycloak:
namespace: keycloak # в данном случае подразумевается что keycloak установлен в namespace keycloak
serviceName: keycloak
realm: master
clientId: zakroma
clientSecret: <secret клиента zakroma в keycloak>
jwt_secrets:
- kid: <id публичного rsa256 ключа keycloak>
rsa_public_key: '"-----BEGIN PUBLIC KEY-----\n<публичный rsa256 ключ keycloak>\n-----END PUBLIC KEY-----"'
cloud_common:
db:
name: cloud
search_path: public
sslmode: disable
clusters:
enabled: false
cloud:
logLevel: INFO
port: 8080
api_call_enabled: true
plugins:
ip_filter:
enabled: true
hooks:
webhooks:
enabled: true
metrics:
enabled: true
readonly:
enabled: true
secaudlog:
enabled: true
database: # Параметры подключения к БД аудита
name: secaudlog
search_path: public
sslmode: disable
host: <some postgres host>
port: 5432
username: <userdb>
password: <userdb password>
size_limit:
enabled: true
type_filter:
enabled: true
background:
api_call_enabled: true
logLevel: debug
port: 8080
plugins:
hooks:
webhooks:
enabled: true
postgres: # Параметры подключения к БД
url: jdbc:postgresql://<some postgres host>:5432
host: <some postgres host>
port: 5432
username: <userdb>
password: <userdb password>
cloud:
deployment:
background:
deployment:
helm upgrade --install zakroma-cloud -f my-values.yaml . -n zakroma
Где '-n zakroma
' - имя namespace, в который устанавливается ПО
Опционально можно использовать дисковое хранилище, подключенное к микросервисной платформе. В этом случае создаём PVC и добавляем в my-values.yaml параметры:
cloud:
deployment:
volumeMounts:
- mountPath: "/mnt/fs-nvme" # точка монтирования внутри контейнера, одинаково для cloud и background
name: cloud-fs-claim-nvme
volumes:
- name: cloud-fs-claim-nvme
persistentVolumeClaim:
claimName: cloud-fs-claim-nvme # имя PersistentVolumeClaim для хранилища, одинаково для cloud и background
background:
deployment:
volumeMounts:
- mountPath: "/mnt/fs-nvme" # точка монтирования внутри контейнера, одинаково для cloud и background
name: cloud-fs-claim-nvme
volumes:
- name: cloud-fs-claim-nvme
persistentVolumeClaim:
claimName: cloud-fs-claim-nvme # имя PersistentVolumeClaim для хранилища, одинаково для cloud и background
Пример PVC:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: cloud-fs-claim-nvme
namespace: zakroma
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 400Gi
storageClassName: nvmestorage
volumeMode: Filesystem
Создаём Ingress для сервисов admin-console-ui
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: admin-ui-ingress
namespace: zakroma
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: "letsencrypt" # в данном случае используется letsencrypt
spec:
tls:
- hosts:
- admin.site.ru #адрес консоли администратора
secretName: admin.site.ru
rules:
- host: admin.site.ru #адрес консоли администратора
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: admin-ui-service
port:
number: 80
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: workspaces-ps-domain-gateway-ingress
namespace: zakroma
annotations:
cert-manager.io/cluster-issuer: letsencrypt
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: 'true'
nginx.ingress.kubernetes.io/client-body-buffer-size: 512k
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_input_headers "x-forwarded-path $request_uri";
nginx.ingress.kubernetes.io/proxy-body-size: '0'
nginx.ingress.kubernetes.io/proxy-buffer-size: 512k
nginx.ingress.kubernetes.io/proxy-buffering: 'off'
nginx.ingress.kubernetes.io/proxy-request-buffering: 'off'
nginx.ingress.kubernetes.io/rewrite-target: /s3/$1
nginx.ingress.kubernetes.io/ssl-redirect: 'true'
spec:
tls:
- hosts:
- '*.ps.hostname.ru' #адрес для бекенда закромов
secretName: workspaces.ps.hostname.ru
rules:
- host: '*.ps.hostname.ru' #адрес для бекенда закромов
http:
paths:
- path: /(.*)
pathType: ImplementationSpecific
backend:
service:
name: gateway-cloud-service
port:
number: 80
TBD