Использование [#username#] при выдаче доступа к персональным УЗ
В JumpServer нужно в явном виде указывать имя аккаунта, к которому вы даете доступ, иногда это не удобно, если нужно выдать доступы к персональным УЗ пользователей который отличаются от имени пользователя префиксом, приходится создавать персональные группы доступа для каждого пользователя.
Но можно чуть модифицировать файлы продукта, чтобы можно было использовать [#username#] в политике доступа.
Как это работает
Создайте группу доступа и укажите там имя аккаунта в виде [#username#]_adm (или другой постфикс\префикс):
Таким образом каждый пользователь входящий в группу доступа получит возможность подключаться с любым аккаунтом, имя которого совпадает с логином пользователя+постфикс, если такие УЗ существуют в системе.
То есть пользователь 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
