MikroTik Manager

Security whitepaper

What the manager stores, what it encrypts, who can reach what, and what it sends outbound. Written to be read by whoever has to sign off on running it.

Document Version
2.7
Product Version
1.94.0
Date
September 2026
Author
Ihor Hreskiv

Fully self-hosted. No cloud, no telemetry, no phone-home — nothing about your fleet is reported to us, ever. Anything that carries your data leaves only when you switch it on and point it somewhere yourself.

1. Architecture Overview

MikroTik Manager is a fully self-hosted network management application distributed as a Docker container. It runs entirely within the customer's own infrastructure. This document describes that software. The analytics this website itself uses are a separate matter, set out in the Cookie Policy.

CUSTOMER NETWORK Web Browser HTTPS / WSS MikroTik Manager Docker Container SQLite • Node.js • JWT MikroTik 1 SSH / REST / SNMP MikroTik 2 SSH / REST / SNMP MikroTik N SSH / REST / SNMP No Cloud No Telemetry

2. Data Residency & Privacy

AspectDetail
Data storageLocal SQLite database inside Docker volume
Data locationCustomer's server only — no cloud, no external storage
TelemetryNONE — no usage data, analytics, or crash reports
Phone-homeNONE — nothing about your fleet, devices, configuration or usage is ever sent to us or to any third party we choose. What leaves the server is only what an administrator switches on and points somewhere: see Webhooks and Cell tower lookup below
License activationOffline — validated locally, no external server contact
Device connectionsManaged MikroTik devices within the customer's network
Optional outbound — public feedsRead-only, GET-only fetches of public feeds — never carry any of your data. (1) RouterOS CVE feed and changelog from NVD and MikroTik; (2) latest RouterOS version from MikroTik; (3) Manager update check from GitHub Releases, which like any HTTPS request reveals your installation's public IP and the version you run, and nothing else. The CVE feed has a setting that switches it off; the other two have none — block them at the network level if you do not want them. All degrade gracefully with no internet (last known data is kept).
AI assistant accessOFF by default — the read-only MCP endpoint (v1.73.0+) exists only once you switch it on. While it is off, nothing about it runs and the path answers 404. Once you connect an assistant, what that assistant reads reaches whoever operates it — that is the point of connecting one, and it is bounded by the API key you authorise it with. Nothing is sent unless an assistant asks.
WebhooksOFF unless configured (v1.78.0+) — when you add a webhook, the Manager posts events to the URL you give it: what happened, when, and the device or site it concerns. The destination is yours, not ours. Each webhook can carry a secret, and deliveries are then signed with HMAC-SHA256 so the receiver can prove the message came from your install
Cell tower lookupOFF unless configured — resolving where an LTE device's tower is requires an OpenCelliD API key, entered by an administrator for the whole install. With a key set, a lookup sends that tower's identifiers (country, network, area and cell) to OpenCelliD. No key, no lookup, no request
Log collectionON by default — the Manager listens for syslog from your devices on port 5514, UDP and TCP, and the shipped compose file publishes both. Lines are matched to a device by source address, or by the identity the device puts in the message, and kept locally for 7 days or 10 000 lines per device. Syslog has no authentication, so treat the port as you would any log collector's: reachable by your devices, not by the internet. Turn it off with SYSLOG_ENABLED=false or by not publishing the port
Metrics exportOFF by default (v1.59.0+) — a Prometheus scrape endpoint at /metrics, serving fleet counts, CPU, memory, temperature and per-interface rates. While it is off the path answers 404. Set a scrape token when you enable it: the token is optional, and an endpoint without one answers any caller that can reach it
Config backupsStored in the local database

3. Authentication & Authorization

3.1 User Authentication

  • JWT-based authentication — short-lived access tokens (15 min) + refresh tokens (7 days)
  • bcrypt password hashing — passwords are never stored in plaintext
  • Automatic token refresh on expiration
  • Two-factor authentication (TOTP) — optional per-user RFC 6238 TOTP via any authenticator app (Google Authenticator, Authy, 1Password, Microsoft Authenticator). Secrets are encrypted at rest with AES-256-GCM; 8 single-use backup codes (bcrypt-hashed) are issued at enrolment. Admin reset endpoint clears 2FA on lost devices
  • Passkey / WebAuthn / FIDO2 (v1.28.0+) — additive second factor alongside TOTP. Apple/Google passkey, Touch ID, Face ID, Windows Hello, YubiKey. Multi-credential per user (each named at registration, with last-used timestamp). Counter regression check on every assertion (any non-zero counter decrease fails closed — possible cloned authenticator). Stored public keys only, no secrets. Admin reset endpoint clears all of a user's passkeys. Requires HTTPS on a real domain — the WebAuthn spec forbids IP addresses as RP IDs, so LAN-IP installs explicitly show the feature as Unavailable with a configuration hint rather than failing silently
  • Refresh tokens invalidated on password change — refresh tokens carry the password-change timestamp; the refresh endpoint rejects any token issued before the user's most recent password update
  • Auto-generated secrets on fresh installsJWT_SECRET and ENCRYPTION_KEY are auto-generated and persisted to data/.secrets.json (file mode 0600) when not supplied via environment, eliminating the public-default risk
  • Admin auto-seed only on empty database — the default admin/admin user is created once on first install; deleting it does not re-seed on the next restart

3.2 API Key Authentication

  • Machine-to-machine API keys (v1.37.0+) — long-lived bearer tokens for scripts, monitoring, and CI to call the REST API without a user login or token-refresh loop. Sent via an X-API-Key header or Authorization: Bearer mikr_…
  • Hashed at rest — only a SHA-256 hash of the token is stored; the plaintext is shown exactly once at creation and is never recoverable afterwards
  • Role + per-site scope — each key carries a role and an optional site allowlist, enforced through the same server-side RBAC checks as a user. A key can never hold the Super Admin role, so it cannot manage users or other keys (privilege-escalation cap)
  • Revocable and expirable — keys can be revoked instantly or given an expiry date; revoked/expired keys are rejected at authentication
  • Audited — key creation, revocation, and deletion are recorded in the activity log, and API calls made with a key are attributed to it (apikey:<name>)
  • Managed by Super Admins only, from a dedicated API Keys page

3.3 Role-Based Access Control

RoleCapabilities
Super AdminFull access plus user management and per-site access grants — the only role that can manage users and assign sites
AdminDevice CRUD, commands, upgrades, service toggles
OperatorDevice management, command execution, upgrades, backups
ViewerRead-only: dashboard, device status, interface views

Each non–Super Admin role can additionally be scoped to specific sites (per-site RBAC, v1.33.0+): the role decides what a user can do, the assigned site list decides where. A scoped user only ever sees and acts on their sites — across the dashboard, device list, sites, logs, backups, live status updates, and bulk commands/upgrades — enforced server-side at the data and WebSocket layers, not just in the UI. Users with no scope restriction retain full-fleet access.

3.4 Device Credential Security

  • Device passwords encrypted at rest using AES-256-GCM
  • Each encrypted value uses a unique initialization vector (IV)
  • Encryption key configurable via environment variable
  • Credentials decrypted only in memory at the moment of device communication

Recommended: create a dedicated MikroTik user group with minimal policies:

/user/group/add name=manager-group policy=ssh,reboot,read,write,sensitive,rest-api,policy,!local,!telnet,!ftp,!test,!winbox,!password,!web,!sniff,api,!romon

3.5 AI Assistant Access (MCP)

  • Off by default (v1.73.0+) — the read-only Model Context Protocol endpoint at /mcp exists only after an admin enables it. While it is off the path returns 404 to authenticated and anonymous callers alike, so an install that has not enabled it does not advertise it
  • Read-only by construction, not by policy — there is no tool for upgrading, rebooting, running a command or changing a setting, and the module behind the endpoint has no code path that issues anything but a read request
  • Authenticated with the same API keys — an assistant carries a key and inherits its role and site scope; every read it performs passes through the same server-side checks a browser session goes through, so it sees exactly what that key's owner would see
  • Browser-based clients sign in over OAuth (v1.74.0+) — a client running in a browser has no config file to read a key from, so it is sent to a consent screen served by the Manager. That screen asks for an API key and nothing else: there is no username-and-password path, and no user session is created
  • Tokens are anchored to the key, not independent of it — they are opaque strings stored as a SHA-256 hash, deliberately not self-contained tokens that would keep working after the key behind them is gone. Revoking the key stops every token issued from it on the very next request; changing the key's role or its site list applies just as immediately, with nothing to reauthorise
  • Short-lived, rotating, revocable — access tokens last one hour and refresh tokens are rotated on every use, as the OAuth 2.1 profile requires of public clients. A refresh token presented twice is treated as a replay and the entire authorisation is revoked. Each token is bound to /mcp and is refused anywhere else, including the rest of the REST API
  • Visible and severable — connected clients are listed on the API Keys page with the key each one used, when it connected and when it last read anything, and can be disconnected individually. Authorising a client is recorded in the activity log alongside key creation and revocation
  • Public exposure is opt-in and separate — the OAuth flow needs the Manager to be reachable over HTTPS from the browser signing in, so it is served only when an admin fills in a public URL. Left empty, every OAuth path answers 404 and an install on a private network is unaffected. This is the one feature in the product that asks for inbound access from outside; assistants running on your own machine need none of it

4. Network Security

4.1 Transport Encryption

  • HTTPS/TLS — optional TLS server on port 3443
  • WebSocket Secure (WSS) — automatic over HTTPS
  • Supports custom certificates or auto-generated self-signed
  • HTTP and HTTPS can run in parallel for migration

4.2 Device Communication

MethodProtocolEncryptionUse Case
SSHTCP/22EncryptedDefault, best compatibility
REST APIHTTPS/443TLSRouterOS 7.1+
SNMPUDP/161SNMPv2cMonitoring only, no write ops

4.3 Network Exposure

  • No inbound connections required from outside your network. Three things listen, and all three are meant for your own network: the web interface (3000 HTTP, 3443 HTTPS), the syslog receiver (5514 UDP and TCP, on by default), and — only if you enable it — the Prometheus scrape endpoint on the web port
  • The syslog receiver accepts what reaches it. Syslog carries no authentication anywhere, from any vendor, so the control is the network: let your devices reach 5514 and nothing else. Set SYSLOG_ENABLED=false, or simply do not publish the port, if you collect logs elsewhere
  • Reaching the Manager from a browser outside the network is optional and off unless configured — signing in a browser-based AI assistant (section 3.5) requires it
  • No outbound connection sends your data to us. The Manager reaches the internet in four places: three read-only public feeds that carry nothing of yours (below), and — if you configure them — webhooks and cell tower lookups, which go to destinations you choose and stay off until you set them up
  • Read-only public-feed checks (RouterOS CVE feed from NVD, latest RouterOS version from MikroTik, Manager update from GitHub Releases) — GET-only, no request body, degrading gracefully when offline. The CVE feed can be switched off in settings; the MikroTik and GitHub checks have no setting, so block them at the network level if you do not want them
  • Designed to run behind a reverse proxy for production

5. Data Protection

Encryption at Rest

DataProtection
Device passwordsAES-256-GCM with unique IV per value
User passwordsbcrypt hash (irreversible)
TOTP secretsAES-256-GCM (same key as device passwords)
2FA backup codesbcrypt hash (irreversible), single-use
Device configsLocal SQLite — OS-level file permissions
JWT & encryption secretsAuto-generated on fresh install, persisted to data/.secrets.json (mode 0600); env vars take priority when set

Encryption in Transit

ChannelProtection
Browser ↔ ManagerHTTPS/TLS (recommended for production)
Manager ↔ MikroTik (SSH)SSH protocol encryption
Manager ↔ MikroTik (REST)HTTPS/TLS
WebSocketWSS when TLS enabled

6. Container Security

  • Base image: node:22-alpine — minimal attack surface
  • Multi-stage build — build dependencies excluded from final image
  • Non-root execution — runs as non-privileged user
  • Minimal packages — Alpine-based with no extras
  • No privileged flags — no host network access required
  • Only required ports exposed — 3000 HTTP and 3443 HTTPS for the interface, 5514 UDP and TCP for the syslog receiver. The compose file publishes all four; drop the syslog lines if you do not collect logs here
  • Data persistence via Docker volume mount

7. Dependency Management

  • Runtime dependencies pinned in package-lock.json
  • No third-party SaaS, SDK, or tracking dependencies — core operation is fully self-contained. The only outbound traffic is the read-only public-feed checks described in §2 / §4.3 (NVD, MikroTik, GitHub Releases), which carry none of your data; the CVE feed is switched off in settings, the other two at the network level
  • Key dependencies: express, better-sqlite3, node-ssh, net-snmp, jsonwebtoken, bcrypt, ws

8. Supply Chain Security

MikroTik Manager minimizes supply chain risk through controlled dependencies, reproducible builds, and a fully self-contained distribution model.

8.1 Docker Image Integrity

  • Official base image — built on node:22-alpine from Docker Hub official library
  • Multi-stage build — build tools and dev dependencies are excluded from the final image
  • Immutable tags — each release is tagged with a specific version (e.g., v1.17.0), never overwritten
  • GitHub distribution — images distributed via GitHub Container Registry (ghcr.io), tied to the official repository

8.2 Dependency Controls

  • Locked dependenciespackage-lock.json ensures reproducible installs with exact versions and integrity hashes
  • Minimal dependency tree — only essential runtime packages, no unnecessary transitive dependencies
  • No post-install scripts — no npm lifecycle scripts that execute arbitrary code during installation
  • No CDN or external assets — all frontend assets bundled locally, no runtime fetches from third-party servers

8.3 Build Process

  • Reproducible builds — identical source + lockfile produces identical output
  • No remote code execution — the build process does not download or execute code outside of pinned npm packages
  • Single author — all code written and reviewed by the maintainer, no external contributors with commit access

8.4 Runtime Isolation

  • No auto-updates — the application never downloads or applies updates by itself
  • No plugin system — no mechanism for loading external code at runtime
  • No outbound connections of its own — the container calls out only where you have switched something on: the three public feeds, and any webhook or cell tower lookup you configure. Nothing else initiates a connection, and none of it is required to run

9. OWASP Top 10 Coverage

A01
Broken Access Control
RBAC with four roles and per-site scoping, enforced on every API route
A02
Cryptographic Failures
AES-256-GCM for secrets, bcrypt for passwords, TLS support
A03
Injection
Parameterized SQLite queries, input validation
A04
Insecure Design
Principle of least privilege for MikroTik user groups
A05
Security Misconfiguration
Secure defaults, configurable via environment variables
A06
Vulnerable Components
Alpine-based image, pinned dependencies
A07
Auth Failures
JWT with short expiry, bcrypt, role enforcement, refresh-token invalidation on password change, optional TOTP 2FA, optional WebAuthn / passkey (v1.28.0+)
A08
Data Integrity Failures
No external code execution, no untrusted deserialization
A09
Logging Failures
Structured logging, no sensitive data in logs
A10
SSRF
No user-controlled outbound requests, device IPs validated

10. Deployment Recommendations

1
Use HTTPS — enable TLS or deploy behind a TLS-terminating reverse proxy
2
Change the default admin/admin password immediately after first login. Delete the admin account once a named admin exists — it will not be re-created.
3
Back up data/.secrets.json alongside the database — secrets are auto-generated on fresh installs and losing this file invalidates all sessions and makes encrypted device passwords unrecoverable. To override or rotate, set JWT_SECRET / ENCRYPTION_KEY via environment (openssl rand -hex 48 / -hex 32).
4
Network segmentation — deploy in the management VLAN with MikroTik devices
5
Restrict access — firewall rules to limit access to management interface
6
Regular backups — back up data/mikr.db per your backup policy
7
Keep updated — apply updates for security fixes
8
Minimal MikroTik permissions — use the recommended limited user group

11. Compliance Notes

RequirementStatus
Data sovereigntyFull — all data stored locally, no cloud
GDPRNo personal data processed beyond user account names
Network isolationSupported — core management runs fully in air-gapped environments; the optional public-feed checks (CVE / version / update) simply stay idle with no errors
Audit trailCommand history with user attribution and timestamps
Access controlRole-based (four roles) with per-site scoping; API keys for machine-to-machine access; AI assistants read under an API key's role and scope, and only when the endpoint is enabled

12. Vulnerability Reporting

To report a security vulnerability, contact: security@mikr.app

We take security reports seriously and will respond within 48 hours.

The same contact is published in machine-readable form at /.well-known/security.txt, per RFC 9116.

The software is self-hosted, so every install runs on its operator's own server and there is no fleet of ours to probe. Please do not test against a server you do not run.