Только исходящее
Агент сам открывает TLS-соединение наружу и держит его. Для управления на сервере не слушается ни один порт, так что открывать в файрволе нечего и закрывать потом нечего.
входящих портов: 0
Безопасность
Панель не заходит на ваши машины. Соединение держит агент — он сам звонит шине наружу и забирает задания оттуда. Входящих портов для управления на сервере не открывается ни одного.
шина NATS · TLS обязателен
Панель слушает и отвечает. Сама не звонит.
Соединение
Отсутствие входящего порта убирает сканирование, но не отвечает на вопрос «а кто прислал это задание». Поэтому к каналу добавлены три вещи, и каждая работает без участия человека.
Агент сам открывает TLS-соединение наружу и держит его. Для управления на сервере не слушается ни один порт, так что открывать в файрволе нечего и закрывать потом нечего.
входящих портов: 0
Каждая операция подписана ключом панели. Без действительной подписи агент не делает ничего — даже если рецепт уже лежит у него в кэше. Рецепт подписан отдельно от конверта, и подпись проверяется при каждом чтении с диска, а не только при получении.
Ed25519 · отказ: bad_signature
Темы шины привязаны к учётной записи сервера. Агент одной машины не подпишется на темы другой: отказывает сама шина, а не вежливость программы на чужом сервере. Право на всё сразу не выдаётся никогда.
org.{org}.srv.{srv}.cmd
Смена ключа идёт в три приёма: сначала новый только объявляется, парк добавляет его в свой перечень, и лишь потом им начинают подписывать, а старый отзывается. Одним движением нельзя — подпись ключом, которого парк ещё не знает, остановила бы каждый сервер.
rotate → promote → revoke
Подключение машины
Подпись доказывает, что у собеседника есть ключ, но не то, что это та самая машина: строку установки могли подсмотреть. Поэтому при подключении панель показывает отпечаток, а вы сверяете его на сервере своими глазами.
отпечаток не сверен
Сервер на связи, факты о нём идут, операции не уходят.
сверен
Машина принимает задания. Подготовка стека начинается сама.
Строка установки с токеном показывается ровно один раз: в базе лежит только его отпечаток, и скопированная база не даёт подключить сервер.
Граница агента
В протоколе нет способа прислать агенту строку для оболочки. Есть закрытый перечень из 55 типизированных действий и подписанные рецепты, которые задают их последовательность. Сегодня рецептов 123 — столько видов работ панель умеет поручить машине.
Типизированные действия с проверкой результата. Повторное применение ничего не меняет.
Не «запрещено настройкой», а не предусмотрено устройством: такого поля в протоколе нет.
Права и границы
матрица прав по разделам
Право даётся на раздел и на действие в нём: смотреть, менять, заводить, удалять. Роли складываются, у роли бывает срез и срок действия. Разделов в панели больше сотни — от сайтов и баз до журнала входов и сессий терминала, и каждый настраивается отдельно.
два слоя: роль и модель
Первый слой — права роли, он закрывает разделы. Второй — отбор по организации на уровне самих данных. Второй нужен потому, что мимо экрана ходят и другие дороги: задание в очереди, консольная команда, вебхук, свой отчёт. Если срез живёт только в экране, такой запрос увидит всё — и выглядеть это будет благополучно.
Человек клиента
своя организация
Человек поставщика
свои клиенты
Персонал платформы
все, со следом в журнале
Мы не делаем вид, что сотрудник никогда не заходит в кабинет клиента. Заходит — и клиент видит, когда, зачем и что открывали.
Причина обязательна
Без неё вход не заводится. Запись о нём появляется у клиента, а не только у нас.
Просмотры тоже в журнале
Видно не только правки, но и какие разделы и объекты сотрудник открывал. Тихого чтения нет.
Срок истекает сам
Допуск выдаётся на 24 часа, самое большее — на неделю, и гаснет без напоминаний.
Клиент обрывает сессию
Одним действием. Незавершённые операции сотрудника при этом отменяются.
А если вам этого мало — в организации есть переключатель «запретить доступ поддержки». Включён — сотрудник обязан запросить допуск и дождаться вашего согласия.
Данные
Копия сайта шифруется ключом организации до отправки. В корзине лежит только шифротекст: кто имеет доступ к самому хранилищу — видит байты, а не ваши файлы.
Обратная сторона
Без ключа копию не расшифрует никто, и мы тоже. Это не оговорка мелким шрифтом, а то же самое свойство, за которое шифрование и берут.
Копию базы самой панели шифрует её собственный ключ. Пока машина жива, цепочка цела: потеряли базу — подняли из копии. Но если погибнет машина, погибнут оба — и копия, и ключ, который лежал на ней же.
Записать это в документацию недостаточно: человек, купивший панель, прочитает её в тот единственный день, когда уже поздно. Поэтому панель спрашивает сама и ждёт ответа.
Кто, когда и что менял — запись о каждом действии. У записи нет ни одного способа изменения: экран журнала умеет только читать и отбирать. Действие, сделанное сотрудником поддержки в вашей организации, помечается таким само — не там, где о пометке вспомнили, а везде.
Остальные двери
Шина — не единственный вход. Есть терминал, есть FTPS, есть сама панель и есть соседи на одной машине. Каждую из этих дверей честнее описать, чем не упоминать.
Сессия открывается под пользователем сайта. Root и участники sudo запрещены, и проверку делает агент на машине, а не экран: запрет, живущий в интерфейсе, обходится подстановкой в запросе. Отказ агента приезжает на экран дословно, а не превращается в «что-то пошло не так».
Запись обязательна: без неё сессия не открывается. Хранителей у записи два — файл на сервере и стенограмма в панели. Второй нужен потому, что вопрос «что там делали» задают как раз тогда, когда сервер уже недоступен.
Брошенная вкладка не держит оболочку до ночи: сессия закрывается после 10 минут без ответа и 60 минут без нажатия. А владелец организации может выключить терминал на сервере целиком.
Пользователи FTPS виртуальные: учётной записи в системе у них нет, то есть войти на сервер по ним нельзя. На каталог ставится квота, можно задать перечень разрешённых адресов.
Шифрование не «рекомендуется», а требуется: TLS=2 — незашифрованное соединение отвергает сам сервер. Обычный FTP не отключён настройкой, которую забудут включить обратно; он просто не работает.
Замков три, и у каждого своя задача. Пара «адрес и учётка»: несколько неудач подряд закрывают её на нарастающую паузу. Учётка: неудачи с любых адресов закрывают вход в неё, и верный пароль до конца паузы не пускает. Адрес: потолок неудач за окно, что бы с него ни перебирали.
Выдуманная учётка считается так же, как настоящая, и экран ведёт себя одинаково: перебором адресов не узнать, кто у вас заведён. Владельцу закрытой учётки уходит письмо, а строка «Заблокирован» — в журнал входов.
Аккаунт клиента живёт в своём контейнере Incus, а не в общих правах на каталог. Внутрь уезжает всё клиентское: PHP любых версий, задания планировщика, его службы, файлы, терминал. Память, процессор и диск — пределы из его тарифа, а не общий котёл, в котором один сосед кладёт остальных.
На хозяине остаются nginx, сертификаты, журналы сайтов и базы — они построены и проверены там, и переносить их внутрь ради симметрии незачем.
Подключите одну машину и просканируйте её снаружи. Управляющего порта там не будет — это и есть всё, что мы утверждаем на этой странице.
остались сомнения — спросите про устройство шины и рецептов, мы отвечаем подробно