Перейти к основному контенту

Использование [#username#] при выдаче доступа к персональным УЗ

Важно: инструкция не является инструкцией от вендора, обсуждаем внедрение такого сценария в дистрибутив "из коробки", так что просьба пользоваться инструкцией с учетом этого :)

В JumpServer нужно в явном виде указывать имя аккаунта, к которому вы даете доступ,  иногда это не удобно, если нужно выдать доступы к персональным УЗ пользователей который отличаются от имени пользователя префиксом, приходится создавать персональные группы доступа для каждого пользователя. 

Но можно чуть модифицировать файлы продукта, чтобы можно было использовать [#username#] в политике доступа.

Как это работает

Создайте группу доступа и укажите там имя аккаунта в виде [#username#]_adm (или другой постфикс\префикс):

изображение.png

Таким образом каждый пользователь входящий в группу доступа получит возможность подключаться с любым аккаунтом, имя которого совпадает с логином пользователя+постфикс, если такие УЗ существуют в системе.
То есть пользователь ivan увидит аккаунт ivan_adm, а пользователь sergey увидит sergey_adm


Как это сделать

На JumpServer копируем файл из контейнера jms_core в папку /opt/jumpserver/:

docker cp jms_core:/opt/jumpserver/apps/perms/utils/asset_perm.py /opt/jumpserver/

Редактируем файл в 2 местах:
Примерно на 18й строчке добавляем одну строку
    USERNAME_TEMPLATE_TOKEN = '[#username#]' чтобы получилось так:


class PermAssetDetailUtil:
    """ 资产授权账号相关的工具 """
    USERNAME_TEMPLATE_TOKEN = '[#username#]'

    def __init__(self, user, asset_or_id):
        self.user = user

        if isinstance(asset_or_id, Asset):
            self.asset_id = asset_or_id.id
            self.asset = asset_or_id
        else:
            self.asset_id = asset_or_id

Примерно на 136 строчке добавляем
            if alias == AliasAccount.USER and user.username in username_accounts_mapper:
                _accounts = username_accounts_mapper[user.username]
            elif cls.USERNAME_TEMPLATE_TOKEN in alias:
                rendered_username = alias.replace(cls.USERNAME_TEMPLATE_TOKEN, user.username)
                _accounts = username_accounts_mapper.get(rendered_username, [])
чтобы получилось так:

    def map_alias_to_accounts(cls, alias_action_bit_mapper, alias_date_expired_mapper, asset, user):
        username_accounts_mapper = defaultdict(list)
        cleaned_accounts_expired = defaultdict(list)
        asset_accounts = asset.all_valid_accounts.all()

        # 用户名 -> 账号
        for account in asset_accounts:
            username_accounts_mapper[account.username].append(account)

        cleaned_accounts_action_bit = defaultdict(int)
        for alias, action_bit in alias_action_bit_mapper.items():
            account = None
            _accounts = []
            if alias == AliasAccount.USER and user.username in username_accounts_mapper:
                _accounts = username_accounts_mapper[user.username]
            elif cls.USERNAME_TEMPLATE_TOKEN in alias:
                rendered_username = alias.replace(cls.USERNAME_TEMPLATE_TOKEN, user.username)
                _accounts = username_accounts_mapper.get(rendered_username, [])
            elif alias in username_accounts_mapper:
                _accounts = username_accounts_mapper[alias]
            elif alias in ['@INPUT', '@ANON', '@USER']:
                account = VirtualAccount.get_special_account(alias, user, asset, from_permed=True)
            elif alias.startswith('@'):
                continue

Сохраняем файл и подключаем его в compose файле из текущего дистрибутива.

nano /opt/jumpserver-installer-v4.10.16/compose/core.yml

Добавляем в файле ссылку на отредактированный файл asset_perm.py:


services:
  core:
    image: ${REGISTRY:-docker.io}/jumpserver/core:${VERSION}
    container_name: jms_core
    hostname: jms_core
    ulimits:
      core: 0
    restart: always
    command: start web
    env_file:
      - ${CONFIG_FILE}
    environment:
      TIME_ZONE: ${TZ:-Asia/Shanghai}
    volumes:
      - ${CONFIG_DIR}/certs:/opt/jumpserver/data/certs
      - ${VOLUME_DIR}/core/data:/opt/jumpserver/data
      - /opt/asset_perm.py:/opt/jumpserver/apps/perms/utils/asset_perm.py
    healthcheck:
      test: "check http://localhost:8080/api/health/"
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 90s
    networks:
      - net
Важно:
При обновлении JumpServer compose файлы перезаписываются, так что после обновления нужно будет повторно подключить файл, а еще лучше сравнить старый и новые файлы, вдруг в новой версии в нем будут какие-то изменения.