Система прав — самая мощная и самая ругаемая часть TeamSpeak 3. Полторы сотни привилегий, четыре колонки с непонятными флагами, группы трёх сортов — и ни одного внятного руководства на русском. При этом сама модель компактная: одно правило вычисления итогового значения и три флага. Эта статья разбирает модель по официальной документации сервера (doc/permissiondoc.txt из дистрибутива), а все значения по умолчанию сняты с чистой инсталляции 3.13.8. После неё вы сможете собирать роли осознанно, а не перебором галочек.
Как устроена одна привилегия
Каждая привилегия — это переменная с именем и значением. Тип виден по префиксу:
b_— булева: true или false. Пример:b_channel_create_temporary— можно ли создавать временные каналы.i_— целочисленная. Пример:i_channel_max_depth— насколько глубокую иерархию каналов можно создавать;-1у многих числовых привилегий означает «без ограничений».
Особый и самый важный случай числовых привилегий — пары power / needed power. Они всегда ходят парой: у действующего — «сила», у цели — «требуемая сила». Действие проходит, если сила действующего больше или равна требуемой силе цели:
i_client_kick_from_server_power — мой «вес» при кике
i_client_needed_kick_from_server_power — сколько «веса» нужно, чтобы кикнуть меня
Хотите кикнуть клиента — сервер сравнит ваш i_client_kick_from_server_power с его i_client_needed_kick_from_server_power. На этом сравнении строится вся иерархия: младшим модераторам дают силу, которой хватает только на гостей, старшим — на всех. Такие же пары есть для кика из канала, перемещения, бана, поке, личных сообщений, входа в канал и подписки на него.
Незаданная привилегия считается нулём (для булевых — false). Это правило стоит запомнить: половина «магии» системы прав — просто сравнение с нулём.
Откуда клиент получает права: пять уровней
Права приходят к клиенту с пяти уровней, и каждый следующий уровень перекрывает предыдущий:
| Уровень | Источник | Где действует |
|---|---|---|
| 1 | Server Groups — серверные группы | Весь сервер |
| 2 | Client Permissions — права, выданные клиенту напрямую | Весь сервер |
| 3 | Channel Permissions — права, заданные на канале | Только этот канал |
| 4 | Channel Groups — группы канала | Только канал, где выдана группа |
| 5 | Channel-Client Permissions — права клиента в конкретном канале | Клиент + канал |
Отсюда и три вида групп из меню Permissions. Серверная группа (уровень 1) — основной инструмент: клиент может состоять в нескольких сразу, и её права действуют везде. Группа канала (уровень 4) — ровно одна на клиента в каждом канале; все её права работают только внутри канала: b_channel_modify_password от группы Channel Admin позволяет менять пароль своего канала, но не соседнего. Прямое назначение (уровни 2, 3, 5) — точечная настройка без создания группы: право лично клиенту, требование на канал или их комбинация. Уровень 5 использует сам клиент TeamSpeak: кнопка «priority speaker» вешает b_client_is_priority_speaker именно как право клиента в конкретном канале.
Три служебных установки в настройках виртуального сервера связывают группы с жизненным циклом клиента: Default Server Group получает каждый новичок при первом заходе (в свежей инсталляции это Guest), Default Channel Group — каждый вошедший в канал (Guest канала), Default Channel Admin Group — создатель канала (Channel Admin).
Порядок разрешения конфликтов
Это ядро системы, и именно его нигде не объясняют. Когда одна привилегия задана в нескольких местах, итог вычисляется так:
- Внутри уровня 1 (несколько серверных групп) берётся наибольшее значение по всем группам клиента. Состоите в группах с kick power 50 и 100 — действует 100.
- Исключение — флаг negate: если хотя бы в одной группе привилегия помечена negate, вместо наибольшего берётся наименьшее среди помеченных negate. Так делают «штрафные» группы: значение −1 с negate перебивает любые плюсы из остальных групп.
- Между уровнями побеждает более высокий номер: права клиента (2) перекрывают серверные группы (1), права канала (3) перекрывают их, группа канала (4) — права канала, и так далее.
- Исключение — флаг skip: привилегия уровня 1 или 2 с этим флагом не может быть перекрыта уровнями 3 и 4. Каналы и группы каналов бессильны против неё.
- Что не задано нигде — ноль (false для булевых).
Проверим на примере из официальной документации: вы в серверной группе Guest, где b_channel_modify_name = false, но в своём канале вы Channel Admin, и у этой группы канала b_channel_modify_name = true. Группа канала — уровень 4, серверная — уровень 1: итог true, имя своего канала менять можно. Поставь админ сервера на привилегии в группе Guest флаг skip — стало бы false.
У skip есть и «оптовая» форма: булева привилегия b_client_skip_channelgroup_permissions действует как skip сразу на все права клиента. В свежей инсталляции она включена у группы Server Admin — поэтому никакая группа канала не может ограничить админа сервера.
Четыре колонки: Value, Skip, Negate, Grant
В окне редактирования прав у каждой привилегии четыре поля.
Value — само значение привилегии: true/false или число. Всё, что обсуждалось выше, — про него.
Skip — защита от перекрытия. Ставится только на уровнях 1 и 2 (серверные группы и права клиента) и означает: уровни 3 и 4 эту привилегию не трогают. Типичное применение — привилегии админских и модераторских групп, чтобы владелец канала не мог ограничить модератора в его канале.
Negate — инверсия правила «лучшее из групп». Ставится только в серверных группах. Помеченная negate привилегия заставляет брать наименьшее значение среди помеченных, а не наибольшее по всем группам. Нужна для запрещающих групп, которые вешаются поверх обычных: без negate группа со значением −1 проиграла бы группе со значением 50.
Grant — право выдавать право, и путают его чаще всего. Grant — это не ограничение значения привилегии. Это отдельная привилегия i_needed_modify_power_* (для i_client_talk_power — i_needed_modify_power_client_talk_power), которую клиент показывает четвёртой колонкой. Работает так: изменить привилегию может лишь тот, чей i_permission_modify_power больше или равен её Grant-значению. У Server Admin по умолчанию i_permission_modify_power = 75, и все Grant в стандартных группах тоже 75 — поэтому админ может редактировать всё. Выдаёте модератору i_permission_modify_power = 50 — он сможет менять только привилегии с Grant не выше 50, а Grant у любой привилегии он сможет выставить не выше собственной Grant-власти над ней. Так строится безопасная делегация: модератор раздаёт таlk power, но не может выдать сам себе кик-права админа.
Помимо Grant, на редактирование накладываются проверки по месту: для правки серверной группы или группы канала нужен i_group_modify_power не ниже i_group_needed_modify_power группы (у стандартных групп — 75), для правки прав клиента — i_client_permission_modify_power не ниже i_client_needed_permission_modify_power цели, для прав на канале — i_channel_permission_modify_power не ниже i_channel_needed_permission_modify_power канала. А добавление и исключение людей из групп контролирует отдельная пара i_group_member_add_power / i_group_needed_member_add_power (и такая же на remove) — можно разрешить модератору выдавать группу VIP, не давая ему права редактировать её содержимое.
Группы по умолчанию: что создаёт свежая инсталляция
Чистый сервер 3.13.8 создаёт три серверные группы и четыре группы канала (плюс шаблоны для новых виртуальных серверов и две query-группы — их не трогаем). Ключевые значения:
Серверные группы.
Guest — заходить, говорить, писать в канальный чат, создавать временные каналы, входить в любые каналы без порога (i_channel_join_power не задан = 0). Кик- и бан-власти нет, защита от кика 25. Выдавать никому не нужно: она вешается на каждого новичка сама как Default Server Group.
Normal — всё гостевое плюс полупостоянные каналы, подканалы до глубины 5, join и subscribe power 50, файлы, поке и личные сообщения (power 50), защита от кика и бана 50. Это группа для проверенных участников.
Server Admin — всё: правка сервера, каналов, групп и банов, все power 75, i_permission_modify_power 75, b_client_skip_channelgroup_permissions. Полный контроль, поэтому владельцу и одному-двум доверенным.
Группы канала.
Guest — ничего сверх серверных прав. Default Channel Group, вешается сама.
Voice — i_client_talk_power 25, право говорить в модерируемом канале. Тем, кому дали слово.
Operator — talk power 50, выдача флага talker, добавление людей в группы канала (add power 30). Помощнику владельца канала.
Channel Admin — правка своего канала (имя, пароль, кодек, лимиты), кик из канала 50, перемещение 50, talk power 60, удаление подканалов. Выдаётся создателю канала сама как Default Channel Admin Group.
Обратите внимание на «лесенку» защит: гостей (needed kick power 25) может кикнуть любой, у кого сила 25+; участников Normal (50) — только сила 50+; админов (75) — только другой админ. Свои роли встраивайте в эту же шкалу.
Практика: собираем три роли
Все три роли — серверные группы: Permissions → Server Groups → Add. Удобный приём: создать группу копией Normal (кнопка со стрелками в том же окне) и донастроить, тогда база здравая и совместимая с «лесенкой» выше.
Модератор: кик, мут, перемещение
Копируем Normal, добавляем поверх:
i_client_kick_from_server_power = 60
i_client_kick_from_channel_power = 60
i_client_move_power = 60
i_client_talk_power = 60
b_client_set_flag_talker = true
b_client_ban_create = true
i_client_ban_power = 60
i_client_ban_max_bantime = 86400
И поднимаем защиту самого модератора, чтобы модераторы не воевали друг с другом:
i_client_needed_kick_from_server_power = 60
i_client_needed_kick_from_channel_power = 60
i_client_needed_ban_power = 60
i_client_needed_move_power = 60
Сила 60 покрывает гостей (25) и участников (50), но не достаёт до админов (75). i_client_ban_max_bantime в секундах ограничивает срок бана — 86400 это сутки; перманентно банить оставьте админам. Про «мут» важно понимать: глобального мута в TeamSpeak нет, право говорить — это talk power против i_client_needed_talk_power канала. В канале с ненулевым порогом (модерируемом) модератор с b_client_set_flag_talker выдаёт и отбирает слово; в обычном канале «мут» — это перемещение нарушителя, для чего и нужен move power. На все перечисленные привилегии стоит поставить skip, чтобы Channel Admin чужого канала не мог их перекрыть своей группой канала.
VIP: свой канал и приоритет речи
Копируем Normal, добавляем:
b_channel_create_semi_permanent = true
b_channel_create_with_password = true
i_channel_max_depth = 2
b_client_is_priority_speaker = true
i_channel_join_power = 40
i_channel_subscribe_power = 40
i_client_talk_power = 55
Полупостоянный канал живёт до перезапуска сервера — этого VIP обычно достаточно; постоянные (b_channel_create_permanent) лучше оставить админам, иначе дерево каналов зарастает мёртвыми ветками. b_client_is_priority_speaker приглушает остальных, когда говорит VIP (степень приглушения настраивается на виртуальном сервере). Join/subscribe power 40 понадобится в следующем разделе — это пропуск в закрытые каналы.
Гость: запрещаем ломать структуру
Группу Guest не удаляют и не заменяют — она Default Server Group, её редактируют по месту. В свежей инсталляции гостям разрешено больше, чем ждёшь, и вот что стоит урезать:
b_channel_create_temporary = false # не создавать даже временные каналы
b_channel_create_with_password = false
i_client_max_clones_uid = 1 # одна идентификация — одно подключение
b_client_channel_textmessage_send = false # если чат гостям не нужен
i_client_private_textmessage_power = 0 # личные сообщения только тем, у кого порог 0
Ставить false здесь нужно явно (а не удалять привилегию): явный false в группе — это заданное значение, которое участвует в вычислении, и его же потом можно защитить флагом skip. Права на вход и подглядывание в каналы у гостей и так нулевые — этим займёмся со стороны каналов.
Частая задача: закрытые каналы и запрет свободного хождения
Скрыть содержимое канала. Кто сидит в канале, видят только подписанные на него клиенты. Подписка — обычная пара power/needed power: на канале (правый клик → Edit Channel → Permissions) задаём
i_channel_needed_subscribe_power = 40
i_channel_needed_join_power = 40
Теперь заходить и видеть участников могут только клиенты с i_channel_subscribe_power / i_channel_join_power ≥ 40: наш VIP (40), Normal (50), админы (75). У гостей обе привилегии не заданы, то есть 0 — они видят канал в дереве, но список сидящих внутри для них пуст, и войти они не могут. Хотите закрыть канал и от Normal — поднимите порог до 60 и раздайте 60 тем, кому положено. Полностью спрятать сам канал из дерева штатной привилегией нельзя — только содержимое; заодно можно закрыть и описание канала порогом i_channel_description_view_power.
Запретить свободно ходить по каналам. Вариант первый, точечный: порог i_channel_needed_join_power на каждом канале, куда гостям нельзя, — как выше. Вариант второй, «карцер» из официальной документации: серверная группа Sticky с единственной привилегией i_channel_join_power = −1 и флагом negate. Повесьте её нарушителю — и благодаря negate итоговый join power станет −1 независимо от остальных его групп, а −1 меньше даже нулевого порога обычных каналов: клиент останется там, где стоит, пока группу не снимут. Без negate этот трюк не работает — положительное значение из другой группы победило бы.
Privilege Key: выдаём админку правильно
Есть два способа сделать человека админом, и они не взаимозаменяемы.
Вручную в группу — правый клик по клиенту → Groups → добавить в Server Admin. Требует, чтобы цель была онлайн (или искать её в базе), а у вас — i_group_member_add_power ≥ 75. Подходит, когда человек рядом и уже подключался.
Privilege Key — одноразовый талон на вступление в группу: Permissions → Privilege Keys → Create, тип Server Group, выбрать группу — получите строку-токен. Человек вводит её у себя через Permissions → Use Privilege Key и попадает в группу сам. Ключ привязан к виртуальному серверу, срабатывает один раз и не требует, чтобы получатель когда-либо заходил к вам раньше: TeamSpeak идентифицирует людей по криптографической идентификации клиента, а не по нику, и до первого захода серверу просто некого добавлять в группу. Именно поэтому ключ — единственный способ выдать права заранее: сгенерировали, отправили в личку, забыли. Неиспользованные ключи видны в том же окне — раздали лишних, удалите.
Тот же механизм спасает, когда админов не осталось: сервер при создании печатает ServerAdmin privilege key, а новый ключ всегда можно сгенерировать командой privilegekeyadd через ServerQuery — пошагово это разобрано в инструкции по установке сервера, в разделе о восстановлении доступа. ServerQuery на порту 10011 должен быть доступен только с localhost — почему его нельзя открывать наружу, см. в справочнике по портам.
Куда смотреть, когда что-то не работает
Главный инструмент отладки — Permission Overview: правый клик по клиенту → Permission Overview покажет итоговые значения всех его привилегий с указанием, с какого уровня и из какой группы пришло каждое. Прежде чем менять галочки, посмотрите туда: в девяти случаях из десяти «не работает право» — это перекрытие с более высокого уровня или незамеченный negate. И заведите привычку менять права группами, а не лично клиентам: точечные права уровня 2 не видны в списках групп, и через полгода никто не вспомнит, почему у одного гостя kick power 100.
Официальные источники
doc/permissiondoc.txt— описание системы прав из дистрибутива TeamSpeak 3 Server (в каталоге сервера); первоисточник по уровням, negate, skip и Grantdoc/privilegekey_guide.txt— там же; управление пользователями и privilege keys- Grant, Skip & Negate — Permissions — разъяснение флагов от сотрудника TeamSpeak на официальном форуме
- Where are the permissions? — support.teamspeak.com