Разрешения

Путь расположения

Путь в контейнере

/var/lib/era_files/syncroot/domains/<MASTER_DOMAIN>/cmd/permissions.json

Обзор

Определяет разрешения на использование различных ресурсов.

При отсутствии файла или ключа для некоего приложения, это приложение ведет себя в соответствии со своим дефолтным поведением.

По умолчанию файл отсутствует.

Формат:
{
  "exec_perm": {
    "user": "root" | "domain" | "custom"
    "commands": array<str>,
    "domains": array<object>
  },

  "erlang_apply": {
    "function_groups": {
      GroupKey: array<str>
    },

    "common": array<str>,

    "domains": {
      Domain: array<str>
    }
  },

  "allowed_nodes": [
    {
      "node": str,
      "cookie": str
    },
    ...
  ]
}

Раздел "exec_perm"

Содержит объект разрешений для прямого запуска процессов и приложений ОС (консольных) по абсолютному пути из сценариев компонентом "Запуск процесса".

По умолчанию выполнение внешних команд запрещено.

  • "user" – содержит название режима, устанавливающего имя пользователя, от которого будет производиться запуск разрешенных приложений. По умолчанию "domain". Варианты значений:

    • "root" – приложение выполняется от имени пользователя "root". Если иное не указано в свойствах конкретного домена в списке "domains".

    • "domain" – приложение выполняется от пользователя с именем, совпадающем с именем домена, в котором исполняется сценарий. Если иное не указано в свойствах домена в списке "domains".

    • "custom" – приложение выполняется от имени пользователя, определенного в свойствах конкретного домена в списке "domains". В этом случае каждый домен, в котором указанные приложения разрешены к исполнению, должен быть указан в списке "domains", и у него должно быть задано значение в поле "user".

  • "commands" – содержит набор разрешенных к выполнению команд (суть приложений). По умолчанию пустой список - ничего не разрешено к запуску компонентом "Запуск процесса".

  • "domains" – содержит набор доменов и их индивидуальных свойств. По умолчанию пустой список. Если домен, в котором исполняется сценарий, обнаруживается в списке доменов, то в качестве списка разрешенных к выполнению команд (приложений) берется список из поля "commands" домена. А в качестве пользователя, от имени которого приложение исполняется – значение из поля "user" домена, причем если там пусто, то значение из общего раздела.

Формат элемента в списке доменов:
{
  "name": "DOMAIN_NAME",
  "user": "USER_NAME",
  "commands": array<str>
}
  • name – название домена.

  • user – имя пользователя ОС.

  • commands – набор разрешенных к выполнению команд.

Примеры элементов в списке разрешенных команд:
[
  "echo",
  "myprogram1",
  "/bin/myprogram2",
  ":SYNC/common/cmd/echo.sh",
  ":GLOBALSHARE/common/cmd/myprogram3"
]

В сценарии можно указать макро путь, либо любой путь. Макро путь приводится к общему макросу, прочие пути остаются без изменения. Результат должен обязательно содержаться в списке разрешенных команд. Также можно указать путь через команду 'bash', например 'bash :GLOBALSHARE_COMMON/cmd/myprogram3.sh'. В этом случае в разрешенных командах bash упоминать не следует, но следует упомянуть приведенный путь к самому bash-скрипту.'

Раздел "erlang_apply"

Содержит объект разрешений для выполнения функций из выражений сценариев.

Выражения сценариев представляют собой выражения на erlang, которые интерпретируются с применением спец синтаксиса (обращение к переменным и встроенным функциям и операциям сценариев). Таким образом, выражение может содержать сложный код для специфической обработки данных.

Этот код может содержать обращения к внешним функциям, продекларированным в модулях коммуникационной платформы, либо в загруженных с помощью патчей модулях, либо в модулях Erlang OTP. Такое обращения могут быть небезопасны как с точки зрения данных, так и влияния конкретного сценария на работу всей системы. Поэтому по умолчанию выполнение внешних функций запрещено полностью.

Однако при настройке системы могут быть добавлены разрешения на конкретные функции, на отдельные модули, либо открыты любые разрешения (кроме определенных системных модулей):

  • "module_name" - открыт модуль;

  • "module:function_name" - открыта конкретная функция по имени в любом экспортируемом варианте;

  • "module:function_name/arity" - открыта конкретная функция по имени и количеству параметров;

  • "*" - открыты любые функции кроме модулей os, file, code, init, rpc, erlang. Для того чтобы разрешить работать с одним из перечисленных модулей, необходимо включить его в разрешение явно.

Настройка может содержать особые разрешения для конкретных доменов по их именам. Для удобства функции собираются в группы (allowed_functions), а при настройке доменов указываются имена подключаемых групп. Для всех доменов доступны группы, указанные в списке "common".

Пример настройки
{
  "allowed_functions": {
    "public": ["math","maps","lists"],
    "erlang": [
      "erlang:!", "erlang:*", "erlang:+", "erlang:++", "erlang:-", "erlang:--", "erlang:/", "erlang:/=",
      "erlang:<", "erlang:=/=", "erlang:=:=", "erlang:=<", "erlang:==", "erlang:>", "erlang:>=", "erlang:abs",
      "erlang:adler32", "erlang:adler32_combine", "erlang:and", "erlang:append", "erlang:append_element",
      "erlang:atom_to_binary", "erlang:atom_to_list", "erlang:band", "erlang:binary_part", "erlang:binary_to_atom",
      "erlang:binary_to_existing_atom", "erlang:binary_to_float", "erlang:binary_to_integer", "erlang:binary_to_list",
      "erlang:binary_to_term", "erlang:bit_size", "erlang:bitstring_to_list", "erlang:bnot", "erlang:bor",
      "erlang:bsl", "erlang:bsr", "erlang:bxor", "erlang:byte_size", "erlang:ceil", "erlang:convert_time_unit",
      "erlang:crc32", "erlang:crc32_combine", "erlang:date", "erlang:decode_packet", "erlang:delete_element",
      "erlang:display", "erlang:display_string", "erlang:div", "erlang:element", "erlang:erase", "erlang:float",
      "erlang:float_to_binary", "erlang:float_to_list", "erlang:floor", "erlang:function_exported", "erlang:get",
      "erlang:insert_element", "erlang:integer_to_binary", "erlang:integer_to_list", "erlang:iolist_size",
      "erlang:iolist_to_binary", "erlang:is_alive", "erlang:is_atom", "erlang:is_binary", "erlang:is_bitstring",
      "erlang:is_boolean", "erlang:is_builtin", "erlang:is_float", "erlang:is_function", "erlang:is_integer",
      "erlang:is_list", "erlang:is_map", "erlang:is_map_key", "erlang:is_number", "erlang:is_pid", "erlang:is_record",
      "erlang:is_reference", "erlang:is_tuple", "erlang:length", "erlang:list_to_atom", "erlang:list_to_binary",
      "erlang:list_to_bitstring", "erlang:list_to_existing_atom", "erlang:list_to_float", "erlang:list_to_integer",
      "erlang:list_to_ref", "erlang:list_to_tuple", "erlang:localtime", "erlang:localtime_to_universaltime",
      "erlang:make_ref", "erlang:make_tuple", "erlang:map_get", "erlang:map_size", "erlang:max", "erlang:md5",
      "erlang:md5_final", "erlang:md5_init", "erlang:md5_update", "erlang:memory", "erlang:min",
      "erlang:monotonic_time", "erlang:node", "erlang:not", "erlang:now", "erlang:or", "erlang:phash", "erlang:phash2",
      "erlang:pid_to_list", "erlang:posixtime_to_universaltime", "erlang:put", "erlang:ref_to_list", "erlang:rem",
      "erlang:round", "erlang:self", "erlang:setelement", "erlang:size", "erlang:split_binary", "erlang:subtract",
      "erlang:term_to_binary", "erlang:time", "erlang:time_offset", "erlang:timestamp", "erlang:tl", "erlang:trunc",
      "erlang:tuple_size", "erlang:tuple_to_list", "erlang:unique_integer", "erlang:universaltime",
      "erlang:universaltime_to_localtime", "erlang:universaltime_to_posixtime", "erlang:xor"
    ],
    "extra": ["patch_module:my_method/3"],
    "all": ["*"]
  },

  "common": ["public","erlang"],

  "domains": {
    "era-platform.ru": ["all"],
    "pbx.era-platform.ru": ["extra"]
  }
}

Раздел "allowed_nodes"

Cодержит список нод которые следует разрешить к прямому подключению.

Для каждой из них задается значение erlang cookie, который устанавливается для указанной ноды предварительно.

Отладочный режим. Позволяет, например, настроить подключение внешней мониторинговой erlang-ноды.