π How We Secured ARI, AMI, Prometheus & Exporters in a Live PBX Environment
Modern telecom SaaS platforms are not just about call routing and dialplans. They are distributed systems handling:
- SIP signaling
- RTP media
- ARI call control
- AMI management
- Redis state
- Prometheus monitoring
- Node-level infrastructure metrics
By default, many of these services expose ports on 0.0.0.0.
That means:
Anyone on the LAN (or worse β public network) can access your control and monitoring plane.
That is unacceptable in a production PBX environment.
So we hardened the entire monitoring + control stack.
π― The Initial Exposure (Default State)
Running:
ss -lntp | egrep '9090|9100|8088|5038|6379'Revealed:
- π΄ Prometheus (9090) β exposed
- π΄ Node Exporter (9100) β exposed
- π΄ ARI (8088) β exposed
- π΄ AMI (5038) β exposed
- π’ Redis (6379) β alreadylocalhost-only
This means:
- Anyone could access /classic/alerts
- Anyone could scrape system metrics
- Anyone could attempt ARI/AMI brute-force
- Anyone could query internal topology
For a telecom SaaS platform β this is a serious risk.
π What We Secured
1οΈβ£ Prometheus (9090)
Changed systemd configuration:
--web.listen-address=127.0.0.1:9090Result:
- No LAN access
- Only backend service can query metrics
- Monitoring plane fully internalized
2οΈβ£ Node Exporter (9100)
Modified service:
--web.listen-address=127.0.0.1:9100Now:
- CPU, memory, disk metrics no longer publicly accessible
- Prometheus scrapes locally only
3οΈβ£ ARI (8088) β Asterisk REST Interface
Updated /etc/asterisk/http.conf:
bindaddr=127.0.0.1Now:
- No external call-control API exposure
- Only internal NestJS services can access ARI
This prevents:
- Remote call injection attempts
- ARI brute-force attacks
- Stasis app manipulation
4οΈβ£ AMI (5038) β Asterisk Manager Interface
Updated /etc/asterisk/manager.conf:
bindaddr=127.0.0.1AMI exposure is one of the biggest PBX attack vectors.
If compromised, an attacker can:
- Originate calls
- Spy on channels
- Modify dialplan behavior
- Execute administrative commands
Binding it tolocalhosteliminates this risk.
π§ The Final Secure Architecture
Frontend (443)
β
NestJS API
β
Prometheus (localhost)
β
Node Exporter (localhost)
β
ARI / AMI (localhost)Only public-facing services remain:
- 80 / 443 (Frontend)
- SIP signaling (if required)
- RTP ports (media)
Everything else is internal-only.
π Why This Matters for Telecom SaaS
Telecom infrastructure is frequently scanned and attacked.
Exposed monitoring + control ports allow attackers to:
- Map your topology
- Identify infrastructure weaknesses
- Attempt credential brute-force
- Trigger expensive PromQL queries
- Potentially manipulate call flows
Production-grade telecom systems must isolate:
- Monitoring plane
- Control plane
- Data plane
π Security Score: Before vs After
ComponentBeforeAfterPrometheusExposedLocalhostNode ExporterExposedLocalhostARIExposedLocalhostAMIExposedLocalhostRedisSecureSecure
Result:
β Monitoring secured β Control plane secured β Attack surface reduced β Telecom SaaS hardened
π‘ Key Takeaway
If you are running:
- Asterisk
- ARI
- AMI
- Prometheus
- Exporters
- Redis
And you havenβt checked:
ss -lntpYou should.
Default installs are rarely production-hardened.
Security in telecom isnβt optional β itβs architectural.
π¬ If You're Building Telecom SaaS
Secure your:
- Monitoring stack
- Control interfaces
- Exporter ports
- Internal APIs
Before scaling.
Infrastructure maturity is what separates hobby PBX installs from real SaaS platforms.
If you're exploring similar solutions or want to implement this in your business, Iβm open to a quick discussion. Letβs evaluate your use case and identify the most efficient approach to get results.