<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Mikrotik.moscow [тема: Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET]</title>
		<link>http://mikrotik.moscow</link>
		<description>Новое в теме Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET форума RouterOS на сайте Mikrotik.moscow [mikrotik.moscow]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Fri, 31 Jul 2026 04:27:58 -0400</pubDate>
		<item>
			<title>Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407899">Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Да, вся идея $SECRET в том, что он использует переменную /ppp/profile password=, которая в политике RouterOS считается «чувствительной» — для неё действительно требуется разрешение в политике. Основное преимущество использования такой «чувствительной» переменной для хранения «секрета» в том, что, например, API-ключи не появятся при экспорте через :export, чтобы избежать их утечки. Но, к сожалению, для работы с ней всё равно нужно соответствующее разрешение в политике. В идеальном мире скрипты RouterOS поддерживали бы постоянные защищённые переменные, потому что часто для любого вызова /tool/fetch к облачным сервисам нужен какой-то ключ и т.п. По моему мнению, $SECRET всё равно лучше, чем просто вписывать пароль прямо в скрипт, ведь даже «только для чтения» пользователь сможет увидеть любые ключи в атрибуте /system/script source=. <br />
			<i>09.01.2025 17:27:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407899</link>
			<guid>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407899</guid>
			<pubDate>Thu, 09 Jan 2025 17:27:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407898">Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Добавление политики к разрешениям скрипта сработало — спасибо! <br />
			<i>09.01.2025 12:17:00, avggeek.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407898</link>
			<guid>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407898</guid>
			<pubDate>Thu, 09 Jan 2025 12:17:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407897">Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Попробуй добавить политику, то есть: policy=read,write,test,policy. Не то чтобы я это рекомендовал, но примитивный метод, который я использую при тестировании скриптов, — дать им все возможные права, а потом убирать их по одному, пока скрипт не перестанет работать. <noindex><a href="http://forum.mikrotik.com/t/netwatch-with-fetch-stopped-working-after-7-13/172865/12" target="_blank" rel="nofollow" >http://forum.mikrotik.com/t/netwatch-with-fetch-stopped-working-after-7-13/172865/12</a></noindex> <br />
			<i>09.01.2025 10:47:00, jaclaz.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407897</link>
			<guid>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407897</guid>
			<pubDate>Thu, 09 Jan 2025 10:47:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407896">Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Привет, Amm0! Я пытаюсь использовать этот скрипт для хранения токенов в ROS 7.16.2, но не могу получить пароль внутри скрипта. Я создал два скрипта следующим образом:<br /><br />/system script<br />add dont-require-permissions=no name=SECRET owner=admin policy=read,write,test source="<br /># Credit: <noindex><a href="https://forum.mikrotik.com/viewtopic.php?p=916159#p916159" target="_blank" rel="nofollow" >https://forum.mikrotik.com/viewtopic.php?p=916159#p916159</a></noindex><br />### $SECRET<br /># &nbsp; get &lt;name&gt;<br /># &nbsp; set &lt;name&gt; password=&lt;password&gt;<br /># . remove &lt;name&gt;<br /># &nbsp; print<br />:global SECRET<br />:set $SECRET do={<br /> &nbsp; &nbsp;:global SECRET<br /><br /> &nbsp; &nbsp;# вспомогательные функции<br /> &nbsp; &nbsp;:local fixprofile do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if ([/ppp profile find name=\"null\"]) do={:put \"nothing\"} else={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/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<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp;}<br /> &nbsp; &nbsp;:local lppp [:len [/ppp secret find where name=$2]]<br /> &nbsp; &nbsp;:local checkexist do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if (lppp=0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:error \"\$SECRET: не могу найти $2 в хранилище секретов\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;# $SECRET<br /> &nbsp; &nbsp;:if ([:typeof $1]!=\"str\") do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put \"\$SECRET\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put \" &nbsp; использует /ppp/secrets для хранения, например, REST apikey или других конфиденциальных данных\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put \"\t\$SECRET print - выводит сохранённые пароли\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put \"\t\$SECRET get &lt;name&gt; - получает сохранённый секрет\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put \"\t\$SECRET set &lt;name&gt; password=\\\"YOUR_SECRET\\\" - устанавливает пароль\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;:put \"\t\$SECRET remove &lt;name&gt; - удаляет секрет\"<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;# $SECRET print<br /> &nbsp; &nbsp;:if ($1~\"^pr\") do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;/ppp secret print where comment~\"\\\\\$SECRET\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;:return [:nothing]<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;# $SECRET get<br /> &nbsp; &nbsp;:if ($1~\"get\") do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;$checkexist<br /> &nbsp; &nbsp; &nbsp; &nbsp;:return [/ppp secret get $2 password]<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;# $SECRET set<br /> &nbsp; &nbsp;:if ($1~\"set|add\") do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if ([:typeof $password]=\"str\") do={} else={:error \"\$SECRET: требуется password=\"}<br /> &nbsp; &nbsp; &nbsp; &nbsp;:if (lppp=0) do={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/ppp secret add name=$2 password=$password<br /> &nbsp; &nbsp; &nbsp; &nbsp;} else={<br /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/ppp secret set $2 password=$password<br /> &nbsp; &nbsp; &nbsp; &nbsp;}<br /> &nbsp; &nbsp; &nbsp; &nbsp;$fixprofile<br /> &nbsp; &nbsp; &nbsp; &nbsp;/ppp secret set $2 comment=\"used by \$SECRET\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;/ppp secret set $2 profile=\"null\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;/ppp secret set $2 service=\"async\"<br /> &nbsp; &nbsp; &nbsp; &nbsp;:return [$SECRET get $2]<br /> &nbsp; &nbsp;}<br /><br /> &nbsp; &nbsp;# $SECRET remove<br /> &nbsp; &nbsp;:if ($1~\"rm|rem|del\") do={<br /> &nbsp; &nbsp; &nbsp; &nbsp;$checkexist<br /> &nbsp; &nbsp; &nbsp; &nbsp;:return [/ppp secret remove $2]<br /> &nbsp; &nbsp;}<br /> &nbsp; &nbsp;:error \"\$SECRET: неправильная команда\"<br />}"<br /><br />add dont-require-permissions=no name=testscript owner=admin policy=read,write,test source="<br />:global SECRET<br />:local user \"avggeek\"<br />:local thepass<br />:set thepass \"\$[\$SECRET get rest_apikey]\"<br />:log info \"Пароль: \$thepass\""<br /><br />Я могу выполнить команду $SECRET в терминале без проблем:<br /><br />&gt; $SECRET add "rest_apikey" password="mikrotik"<br />nothing<br />&gt; :put [$SECRET get rest_apikey]<br />mikrotik<br /><br />Но когда я запускаю скрипт через /system script run testscript, в логах появляется только "Пароль: ", то есть пароль не подставляется. Может, это проблема с правами или что-то ещё упускаю? <br />
			<i>09.01.2025 09:10:00, avggeek.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407896</link>
			<guid>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407896</guid>
			<pubDate>Thu, 09 Jan 2025 09:10:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407895">Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			Это очень полезно. Думаю, можно улучшить этот момент, сохранив имена пользователей в поле caller-id. Это позволило бы хранить пары имя пользователя/пароль, которые можно было бы искать по «имени». Если это кажется разумным, я могу попробовать этим заняться. <br />
			<i>22.12.2023 01:28:00, abligh.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407895</link>
			<guid>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407895</guid>
			<pubDate>Fri, 22 Dec 2023 01:28:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
		<item>
			<title>Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</title>
			<description><![CDATA[<b><a href="http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407894">Надёжно хранить apikey/токены для /tool/fetch... Какие варианты?  == $SECRET</a></b> <i>RouterOS</i> в форуме <a href="http://mikrotik.moscow/forum/forum57/">RouterOS</a>. <br />
			В V7 я пытался «перенести» несколько bash/javascript скриптов, которые мы используем. Большинство из них просто обращаются к разным REST API. Пользуюсь RouterOS скриптом с /tool/fetch, чтобы повторить часть из них, так как запускать их прямо на роутере иногда удобнее для некоторых задач.<br /><br />Проблема в том, что для некоторых REST API нужны «apikey» или «token» — по сути, пароли для доступа к API. Например: &nbsp;<br />:global apikey [???????]  <br />/tool/fetch url=... http-header-field="Authorization: bearer $apikey" ...<br /><br />Поскольку я просто экспериментирую с этим подходом, сделал их глобальными переменными, которые загружаются скриптом — и это, конечно, работает. Но с точки зрения безопасности — не очень, ведь код скрипта хорошо виден в конфигурации (например, через :export или другими способами). Даже если хранить их в файле в /files, насколько я знаю, нельзя ограничить доступ к файлам только для одного пользователя.<br /><br />Для таких сервисов как AWS и других API можно использовать X.509 сертификаты — которые поддерживаются в /tool/fetch под V7, например: &nbsp;<br />/tool/fetch url=... certificate=...<br /><br />Но не все REST API поддерживают клиентские X.509 сертификаты.<br /><br />Короче… хочу «спрятать» внешний REST API apikey/token/пароль в Mikrotik так, чтобы он существовал после перезагрузки, но не отображался при «:export». Похоже на то, как работают сертификаты (например, при «backup» они сохраняются, а при «:export» — нет), только здесь речь о строках длиной 8-64 символа, а не о сертификатах.<br /><br />Или, аналогично концепции «encrypted-secrets», которые хранят приватные данные для GitHub репозиториев/actions и т.п. (чтобы не держать пароли в файлах/коде).<br /><br />В общем, интересно, есть ли у кого-нибудь какие-то «клёвые» решения на этот счёт? <br />
			<i>22.02.2022 18:17:00, Amm0.</i>]]></description>
			<link>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407894</link>
			<guid>http://mikrotik.moscow/forum/forum57/86545-nadyezhno-khranit-apikey_tokeny-dlya-_tool_fetch...-kakie-varianty_-_-_secret/message407894</guid>
			<pubDate>Tue, 22 Feb 2022 18:17:00 -0500</pubDate>
			<category>RouterOS</category>
		</item>
	</channel>
</rss>
