Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Надёжно хранить apikey/токены для /tool/fetch... Какие варианты? == $SECRET

    Надёжно хранить apikey/токены для /tool/fetch... Какие варианты? == $SECRET

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Надёжно хранить apikey/токены для /tool/fetch... Какие варианты? == $SECRET, RouterOS
     
    Amm0
    Guest
    #1
    0
    22.02.2022 18:17:00
    В V7 я пытался «перенести» несколько bash/javascript скриптов, которые мы используем. Большинство из них просто обращаются к разным REST API. Пользуюсь RouterOS скриптом с /tool/fetch, чтобы повторить часть из них, так как запускать их прямо на роутере иногда удобнее для некоторых задач.

    Проблема в том, что для некоторых REST API нужны «apikey» или «token» — по сути, пароли для доступа к API. Например:  
    :global apikey [???????]
    /tool/fetch url=... http-header-field="Authorization: bearer $apikey" ...

    Поскольку я просто экспериментирую с этим подходом, сделал их глобальными переменными, которые загружаются скриптом — и это, конечно, работает. Но с точки зрения безопасности — не очень, ведь код скрипта хорошо виден в конфигурации (например, через :export или другими способами). Даже если хранить их в файле в /files, насколько я знаю, нельзя ограничить доступ к файлам только для одного пользователя.

    Для таких сервисов как AWS и других API можно использовать X.509 сертификаты — которые поддерживаются в /tool/fetch под V7, например:  
    /tool/fetch url=... certificate=...

    Но не все REST API поддерживают клиентские X.509 сертификаты.

    Короче… хочу «спрятать» внешний REST API apikey/token/пароль в Mikrotik так, чтобы он существовал после перезагрузки, но не отображался при «:export». Похоже на то, как работают сертификаты (например, при «backup» они сохраняются, а при «:export» — нет), только здесь речь о строках длиной 8-64 символа, а не о сертификатах.

    Или, аналогично концепции «encrypted-secrets», которые хранят приватные данные для GitHub репозиториев/actions и т.п. (чтобы не держать пароли в файлах/коде).

    В общем, интересно, есть ли у кого-нибудь какие-то «клёвые» решения на этот счёт?
     
     
     
    abligh
    Guest
    #2
    0
    22.12.2023 01:28:00
    Это очень полезно. Думаю, можно улучшить этот момент, сохранив имена пользователей в поле caller-id. Это позволило бы хранить пары имя пользователя/пароль, которые можно было бы искать по «имени». Если это кажется разумным, я могу попробовать этим заняться.
     
     
     
    avggeek
    Guest
    #3
    0
    09.01.2025 09:10:00
    Привет, Amm0! Я пытаюсь использовать этот скрипт для хранения токенов в ROS 7.16.2, но не могу получить пароль внутри скрипта. Я создал два скрипта следующим образом:

    /system script
    add dont-require-permissions=no name=SECRET owner=admin policy=read,write,test source="
    # Credit: https://forum.mikrotik.com/viewtopic.php?p=916159#p916159
    ### $SECRET
    #   get <name>
    #   set <name> password=<password>
    # . remove <name>
    #   print
    :global SECRET
    :set $SECRET do={
       :global SECRET

       # вспомогательные функции
       :local fixprofile do={
           :if ([/ppp profile find name=\"null\"]) do={:put \"nothing\"} else={
               /ppp profile add bridge-learning=no change-tcp-mss=no local-address=0.0.0.0 name=\"null\" only-one=yes remote-address=0.0.0.0 session-timeout=1s use-compression=no use-encryption=no use-mpls=no use-upnp=no
           }
       }
       :local lppp [:len [/ppp secret find where name=$2]]
       :local checkexist do={
           :if (lppp=0) do={
               :error \"\$SECRET: не могу найти $2 в хранилище секретов\"
           }
       }

       # $SECRET
       :if ([:typeof $1]!=\"str\") do={
           :put \"\$SECRET\"
           :put \"   использует /ppp/secrets для хранения, например, REST apikey или других конфиденциальных данных\"
           :put \"\t\$SECRET print - выводит сохранённые пароли\"
           :put \"\t\$SECRET get <name> - получает сохранённый секрет\"
           :put \"\t\$SECRET set <name> password=\\\"YOUR_SECRET\\\" - устанавливает пароль\"
           :put \"\t\$SECRET remove <name> - удаляет секрет\"
       }

       # $SECRET print
       :if ($1~\"^pr\") do={
           /ppp secret print where comment~\"\\\\\$SECRET\"
           :return [:nothing]
       }

       # $SECRET get
       :if ($1~\"get\") do={
           $checkexist
           :return [/ppp secret get $2 password]
       }

       # $SECRET set
       :if ($1~\"set|add\") do={
           :if ([:typeof $password]=\"str\") do={} else={:error \"\$SECRET: требуется password=\"}
           :if (lppp=0) do={
               /ppp secret add name=$2 password=$password
           } else={
               /ppp secret set $2 password=$password
           }
           $fixprofile
           /ppp secret set $2 comment=\"used by \$SECRET\"
           /ppp secret set $2 profile=\"null\"
           /ppp secret set $2 service=\"async\"
           :return [$SECRET get $2]
       }

       # $SECRET remove
       :if ($1~\"rm|rem|del\") do={
           $checkexist
           :return [/ppp secret remove $2]
       }
       :error \"\$SECRET: неправильная команда\"
    }"

    add dont-require-permissions=no name=testscript owner=admin policy=read,write,test source="
    :global SECRET
    :local user \"avggeek\"
    :local thepass
    :set thepass \"\$[\$SECRET get rest_apikey]\"
    :log info \"Пароль: \$thepass\""

    Я могу выполнить команду $SECRET в терминале без проблем:

    > $SECRET add "rest_apikey" password="mikrotik"
    nothing
    > :put [$SECRET get rest_apikey]
    mikrotik

    Но когда я запускаю скрипт через /system script run testscript, в логах появляется только "Пароль: ", то есть пароль не подставляется. Может, это проблема с правами или что-то ещё упускаю?
     
     
     
    jaclaz
    Guest
    #4
    0
    09.01.2025 10:47:00
    Попробуй добавить политику, то есть: policy=read,write,test,policy. Не то чтобы я это рекомендовал, но примитивный метод, который я использую при тестировании скриптов, — дать им все возможные права, а потом убирать их по одному, пока скрипт не перестанет работать. http://forum.mikrotik.com/t/netwatch-with-fetch-stopped-working-after-7-13/172865/12
     
     
     
    avggeek
    Guest
    #5
    0
    09.01.2025 12:17:00
    Добавление политики к разрешениям скрипта сработало — спасибо!
     
     
     
    Amm0
    Guest
    #6
    0
    09.01.2025 17:27:00
    Да, вся идея $SECRET в том, что он использует переменную /ppp/profile password=, которая в политике RouterOS считается «чувствительной» — для неё действительно требуется разрешение в политике. Основное преимущество использования такой «чувствительной» переменной для хранения «секрета» в том, что, например, API-ключи не появятся при экспорте через :export, чтобы избежать их утечки. Но, к сожалению, для работы с ней всё равно нужно соответствующее разрешение в политике. В идеальном мире скрипты RouterOS поддерживали бы постоянные защищённые переменные, потому что часто для любого вызова /tool/fetch к облачным сервисам нужен какой-то ключ и т.п. По моему мнению, $SECRET всё равно лучше, чем просто вписывать пароль прямо в скрипт, ведь даже «только для чтения» пользователь сможет увидеть любые ключи в атрибуте /system/script source=.
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры