К содержимому

Безопасность

Снаружи нечего
сканировать

Панель не заходит на ваши машины. Соединение держит агент — он сам звонит шине наружу и забирает задания оттуда. Входящих портов для управления на сервере не открывается ни одного.

Направление связи на связи
srv-12 почта и DNS исх. TLS →
srv-13 сайты клиентов исх. TLS →
srv-41 контейнеры аккаунтов исх. TLS →

шина NATS · TLS обязателен

Панель слушает и отвечает. Сама не звонит.

Входящих портов на машине
0
Видов работ в перечне
123

Соединение

Агент звонит сам, и этого мало

Отсутствие входящего порта убирает сканирование, но не отвечает на вопрос «а кто прислал это задание». Поэтому к каналу добавлены три вещи, и каждая работает без участия человека.

01

Только исходящее

Агент сам открывает TLS-соединение наружу и держит его. Для управления на сервере не слушается ни один порт, так что открывать в файрволе нечего и закрывать потом нечего.

входящих портов: 0

02

Подпись — условие исполнения

Каждая операция подписана ключом панели. Без действительной подписи агент не делает ничего — даже если рецепт уже лежит у него в кэше. Рецепт подписан отдельно от конверта, и подпись проверяется при каждом чтении с диска, а не только при получении.

Ed25519 · отказ: bad_signature

03

Своя учётка на шине у каждой машины

Темы шины привязаны к учётной записи сервера. Агент одной машины не подпишется на темы другой: отказывает сама шина, а не вежливость программы на чужом сервере. Право на всё сразу не выдаётся никогда.

org.{org}.srv.{srv}.cmd

04

Ключ меняется без простоя

Смена ключа идёт в три приёма: сначала новый только объявляется, парк добавляет его в свой перечень, и лишь потом им начинают подписывать, а старый отзывается. Одним движением нельзя — подпись ключом, которого парк ещё не знает, остановила бы каждый сервер.

rotate → promote → revoke

Подключение машины

Отпечаток сверяет человек

Подпись доказывает, что у собеседника есть ключ, но не то, что это та самая машина: строку установки могли подсмотреть. Поэтому при подключении панель показывает отпечаток, а вы сверяете его на сервере своими глазами.

отпечаток не сверен

Сервер на связи, факты о нём идут, операции не уходят.

сверен

Машина принимает задания. Подготовка стека начинается сама.

Строка установки с токеном показывается ровно один раз: в базе лежит только его отпечаток, и скопированная база не даёт подключить сервер.

Граница агента

Агент не исполняет команды. Он исполняет рецепты

В протоколе нет способа прислать агенту строку для оболочки. Есть закрытый перечень из 55 типизированных действий и подписанные рецепты, которые задают их последовательность. Сегодня рецептов 123 — столько видов работ панель умеет поручить машине.

Умеет

Типизированные действия с проверкой результата. Повторное применение ничего не меняет.

Положить файл настроек по шаблону рецепта, проверить его и перечитать службу file.write · service.reload
Поставить пакет из перечня и узнать его версию apt.install · apt.version
Завести пользователя, базу, ящик, доступ по FTPS user.create · mysql.database · ftp.user
Выпустить и продлить сертификат, пока запас по сроку не кончился cert.obtain · HTTP-01
Собрать копию, зашифровать и отправить в хранилище backup.archive · backup.upload
Запустить заранее названную проверку — восемь имён, без аргументов со стороны nginx.test · apache.test · php.fpm.test

Не умеет вовсе

Не «запрещено настройкой», а не предусмотрено устройством: такого поля в протоколе нет.

Исполнить присланную строку Прислать sh -c нельзя: поля для произвольной команды в протоколе не существует.
Собрать команду из шаблона Подстановка идёт только в типизированные поля действия; запуск по имени шаблон не принимает вообще.
Сделать что-то без подписи Отказ приходит до первого шага, даже если рецепт уже лежал в кэше агента.
Принять рецепт с незнакомым действием Рецепт объявляет, что ему нужно. Нет умения — отказ целиком, а не падение посередине.
Зайти в служебные каталоги Менеджер файлов не ходит в /proc, /sys, /dev, /boot и в каталоги самого агента.
Открыть терминал по своей воле Сессию начинает только человек. Панель не открывает её ни при каком сценарии.

Права и границы

Клиент не видит чужого, а поддержка не ходит молча

Роли, а не два уровня «можно» и «нельзя»

матрица прав по разделам

Право даётся на раздел и на действие в нём: смотреть, менять, заводить, удалять. Роли складываются, у роли бывает срез и срок действия. Разделов в панели больше сотни — от сайтов и баз до журнала входов и сессий терминала, и каждый настраивается отдельно.

Сайты Базы данных Пользователи серверов Сессии терминала Файрвол Копии Журнал входов Допуски поддержки

Срез организации стоит под экраном, а не на нём

два слоя: роль и модель

Первый слой — права роли, он закрывает разделы. Второй — отбор по организации на уровне самих данных. Второй нужен потому, что мимо экрана ходят и другие дороги: задание в очереди, консольная команда, вебхук, свой отчёт. Если срез живёт только в экране, такой запрос увидит всё — и выглядеть это будет благополучно.

Человек клиента

своя организация

Человек поставщика

свои клиенты

Персонал платформы

все, со следом в журнале

Вход поддержки в кабинет — с причиной и со следом

Мы не делаем вид, что сотрудник никогда не заходит в кабинет клиента. Заходит — и клиент видит, когда, зачем и что открывали.

Причина обязательна

Без неё вход не заводится. Запись о нём появляется у клиента, а не только у нас.

Просмотры тоже в журнале

Видно не только правки, но и какие разделы и объекты сотрудник открывал. Тихого чтения нет.

Срок истекает сам

Допуск выдаётся на 24 часа, самое большее — на неделю, и гаснет без напоминаний.

Клиент обрывает сессию

Одним действием. Незавершённые операции сотрудника при этом отменяются.

А если вам этого мало — в организации есть переключатель «запретить доступ поддержки». Включён — сотрудник обязан запросить допуск и дождаться вашего согласия.

Данные

Копия, которую не прочтёт даже владелец хранилища

Копия сайта шифруется ключом организации до отправки. В корзине лежит только шифротекст: кто имеет доступ к самому хранилищу — видит байты, а не ваши файлы.

Обратная сторона

Без ключа копию не расшифрует никто, и мы тоже. Это не оговорка мелким шрифтом, а то же самое свойство, за которое шифрование и берут.

Ключ, который лежит рядом с копией, — это не ключ

Копию базы самой панели шифрует её собственный ключ. Пока машина жива, цепочка цела: потеряли базу — подняли из копии. Но если погибнет машина, погибнут оба — и копия, и ключ, который лежал на ней же.

Записать это в документацию недостаточно: человек, купивший панель, прочитает её в тот единственный день, когда уже поздно. Поэтому панель спрашивает сама и ждёт ответа.

01 Панель показывает отпечаток ключа Короткий, чтобы было видно, тот ли ключ вы держите в руках.
02 Вы выносите ключ с машины и подтверждаете это Подтверждение — действие человека, и оно ложится в общий журнал вместе с остальными.
03 Сменился ключ — вопрос задаётся заново Галочка пережила бы смену и уверяла бы, что ключ сохранён. Отпечаток — нет.

Журнал не правится и не чистится

Кто, когда и что менял — запись о каждом действии. У записи нет ни одного способа изменения: экран журнала умеет только читать и отбирать. Действие, сделанное сотрудником поддержки в вашей организации, помечается таким само — не там, где о пометке вспомнили, а везде.

Остальные двери

Там, где внутрь всё-таки заходят

Шина — не единственный вход. Есть терминал, есть FTPS, есть сама панель и есть соседи на одной машине. Каждую из этих дверей честнее описать, чем не упоминать.

Сессия открывается под пользователем сайта. Root и участники sudo запрещены, и проверку делает агент на машине, а не экран: запрет, живущий в интерфейсе, обходится подстановкой в запросе. Отказ агента приезжает на экран дословно, а не превращается в «что-то пошло не так».

Запись обязательна: без неё сессия не открывается. Хранителей у записи два — файл на сервере и стенограмма в панели. Второй нужен потому, что вопрос «что там делали» задают как раз тогда, когда сервер уже недоступен.

Брошенная вкладка не держит оболочку до ночи: сессия закрывается после 10 минут без ответа и 60 минут без нажатия. А владелец организации может выключить терминал на сервере целиком.

Пользователи FTPS виртуальные: учётной записи в системе у них нет, то есть войти на сервер по ним нельзя. На каталог ставится квота, можно задать перечень разрешённых адресов.

Шифрование не «рекомендуется», а требуется: TLS=2 — незашифрованное соединение отвергает сам сервер. Обычный FTP не отключён настройкой, которую забудут включить обратно; он просто не работает.

Замков три, и у каждого своя задача. Пара «адрес и учётка»: несколько неудач подряд закрывают её на нарастающую паузу. Учётка: неудачи с любых адресов закрывают вход в неё, и верный пароль до конца паузы не пускает. Адрес: потолок неудач за окно, что бы с него ни перебирали.

Выдуманная учётка считается так же, как настоящая, и экран ведёт себя одинаково: перебором адресов не узнать, кто у вас заведён. Владельцу закрытой учётки уходит письмо, а строка «Заблокирован» — в журнал входов.

Аккаунт клиента живёт в своём контейнере Incus, а не в общих правах на каталог. Внутрь уезжает всё клиентское: PHP любых версий, задания планировщика, его службы, файлы, терминал. Память, процессор и диск — пределы из его тарифа, а не общий котёл, в котором один сосед кладёт остальных.

На хозяине остаются nginx, сертификаты, журналы сайтов и базы — они построены и проверены там, и переносить их внутрь ради симметрии незачем.

Проверить проще, чем поверить

Подключите одну машину и просканируйте её снаружи. Управляющего порта там не будет — это и есть всё, что мы утверждаем на этой странице.

остались сомнения — спросите про устройство шины и рецептов, мы отвечаем подробно