Skip to content

Hosting Platform Integrations

Fencer integrates with popular hosting platforms to scan your cloud infrastructure for security misconfigurations. By connecting Heroku, Render, Railway, Vercel, DigitalOcean, or Supabase, you get automated security checks tailored to each platform — covering areas like database exposure, access control, environment variable hygiene, and deployment protection.

Each integration creates a cloud account asset in Fencer and triggers infrastructure scanning. All of them except DigitalOcean also sync team member identities for access tracking.

  • The Administrator role in Fencer and a valid subscription.
  • An account on the hosting platform you want to connect.
  • For OAuth-based platforms (Heroku, Railway, Vercel, DigitalOcean): you must be able to authorize Fencer’s OAuth application.
  • For Render: an API key. For Supabase: a personal access token. Each needs read access to your account resources.

When you connect a hosting platform, Fencer stores your credentials securely (encrypted at rest) and queries the platform’s API to enumerate your infrastructure resources — services, databases, storage buckets, team members, and configuration. Each resource is checked against a set of platform-specific security rules. Fencer scans right after you connect, then daily (weekly on plans without daily scans).

Findings are reported as vulnerabilities with severity levels (Critical, High, Medium, Low) and linked to the specific asset where the issue was detected. Team members discovered through the integration are synced as vendor identities for identity management when your plan includes it.

Navigate to Admin > Integrations in your organization, click the card of the hosting platform you want to connect, and click Continue. The rest of the flow varies by platform:

  1. Enter Name or alias for this Heroku connection and choose an Environment (e.g., Production).
  2. Click Connect Heroku. A popup takes you to Heroku to authorize Fencer with the identity, read, and read-protected scopes.
  3. After authorization, Fencer stores the OAuth tokens and begins scanning.
  1. Enter Name or alias for this Render connection, choose an Environment, and paste your Render API key.
  2. Fencer loads the workspaces the key can access. Select one under Render workspace.
  3. Click Connect.
  1. Click Connect Railway. You are redirected to Railway to authorize Fencer via OAuth.
  2. Review the permissions and click Allow. Fencer then fetches your workspaces, projects, and services.
  1. Click Connect Vercel. You are redirected to Vercel to add the Fencer integration.
  2. After authorization, Fencer detects whether you connected a team or personal account and begins scanning projects.
  1. Click Connect DigitalOcean. You are redirected to DigitalOcean; review the permissions and click Authorize Application.
  2. Back in Fencer, enter Name or alias for this DigitalOcean connection, choose an Environment, and select the DigitalOcean Project to scan.
  3. Optionally turn Scan registry images and Scan container images on or off, and limit Regions to scan.
  4. Click Connect to create the connection and start the first scan.
  1. Enter Name or alias for this Supabase connection, choose an Environment, and paste a personal access token into Supabase API key.
  2. Select your Supabase organization, then choose a Supabase project or All Projects.
  3. Click Connect. Fencer validates the token and begins scanning.

Each platform has tailored checks based on its infrastructure model.

CheckSeverityDescription
Account 2FAHighVerifies two-factor authentication is enabled on the Heroku account.
Deprecated stackHighFlags apps running on deprecated runtime stacks.
Beta stackMediumFlags apps running on beta runtime stacks.
Addon open to internetMediumTests whether addon database URLs are reachable from the public internet.
CheckSeverityDescription
Public databaseHighDetects Postgres databases with no IP allowlist.
Account 2FAHighFlags workspace members without MFA enabled.
Shell access without 2FAHighMembers with admin or developer roles must have MFA for shell access.
Internal service exposedMediumServices named “internal”, “admin”, “backend”, or “private” deployed as public web services.
Cross-environment secret leakMediumSensitive environment variables shared between production and non-production.
Missing health checkLowWeb services missing a configured health check path.
Missing runtime versionLowServices missing explicit runtime version pinning.
Excessive admin permissionsLowTeam workspaces where 50% or more of members have admin roles.
CheckSeverityDescription
Exposed TCP portHighDatabase services exposed via public TCP proxy domains.
Default template passwordHighServices using default passwords (e.g., “postgres”, “password”, “changeme”).
Team 2FA enforcementHighWorkspace members without two-factor authentication.
Public database URLHighServices using public database URLs instead of private network URLs.
Deployment protectionMediumAuto-deploy to production without required approval gates.
Environment variable leakageMediumSensitive variables shared identically between production and non-production.
Resource limitsMediumWorkspaces without usage hard limits configured.
Root containerLowServices using default builders that run as root.
CheckSeverityDescription
SAML SSO disabledHighTeam accounts without enforced SAML single sign-on.
Deployment protection disabledMediumPreview deployments without password, SSO, or authentication protection.
Firewall not enabledMediumProjects without the Web Application Firewall enabled.
Sensitive env var exposed to previewMediumSensitive environment variables scoped to both production and preview.
Excessive function timeoutMediumServerless functions with timeout exceeding 60 seconds.
CORS wildcard originMediumRoutes allowing unrestricted cross-origin requests.
Attack challenge mode disabledLowProjects without browser verification for suspected attacks.
Excessive function memoryLowServerless functions with memory allocation exceeding 1024 MB.
CheckSeverityDescription
Public write on Spaces bucketCriticalObject storage buckets allowing public write access.
Unrestricted public ingressCriticalFirewalls allowing all inbound ports from the public internet.
Public databaseHighDatabases with missing or overly permissive firewall rules.
Database engine end of lifeHighManaged database engine versions at or near end of life.
Public read on Spaces bucketHighObject storage buckets allowing public read access.
Firewall allows public SSH/RDPHighFirewalls exposing SSH (port 22) or RDP (port 3389) to the internet.
Droplet without cloud firewallHighDroplets with a public IP that are not attached to a cloud firewall.
Load balancer accepts plaintext HTTPHighLoad balancers accepting HTTP without redirecting to HTTPS.
Expired TLS certificateHighExpired TLS certificates.
CDN custom domain without certificateHighCDN custom domains whose certificate is expired or missing.
Kubernetes control plane unrestrictedHighKubernetes control plane APIs reachable from the public internet.
Kubernetes workload excessive privilegeHighKubernetes workloads that run privileged or share the node namespace.
Team MFA not requiredHighTeam accounts without MFA enforcement.
Public list on Spaces bucketMediumObject storage buckets allowing public enumeration.
Spaces versioning disabledMediumObject storage buckets without versioning enabled.
Droplet backups disabledMediumDroplets without backups enabled.
Kubernetes auto-upgrade disabledMediumKubernetes clusters that do not auto-upgrade patch releases.
Kubernetes surge upgrade disabledLowKubernetes clusters with surge upgrades disabled.
CheckSeverityDescription
RLS disabledHighDatabase tables without Row Level Security enabled.
Permissive RLS policyHighRLS policies with overly broad rules (e.g., USING (true)).
Account 2FAHighOrganization members without MFA enabled.
Public storage bucketHighStorage buckets marked public with sensitive names.
Email confirmation disabledMediumSign-up configured to skip email verification.
Weak password policyMediumMinimum password length below 8 characters.
Insecure redirect URLMediumOAuth redirect URLs using wildcards, localhost, or non-HTTPS.
Security definer functionMediumDatabase functions running with elevated privileges.
Auth users policyMediumMissing RLS policies on the auth.users table (High when a policy uses USING (true)).
Webhook securityMediumDatabase webhooks configured without an authorization header.
CAPTCHA disabledLowSign-up forms without CAPTCHA protection.

Heroku and DigitalOcean also have separate monitor integrations that forward activity to Security Monitoring, where detection rules evaluate it. Both need a Fencer plan that includes Security Monitoring.

Heroku (Monitor) forwards Heroku application and router logs to Fencer through an HTTPS log drain. You must be an Org Admin on the Heroku app (Cedar/standard apps), or an admin of the Shield Private Space. Heroku Fir (OTLP) and Enterprise Audit Trail events are not supported.

  1. Go to Admin > Integrations, click the Heroku (Monitor) card, and click Continue.
  2. Enter an Integration Name (for example, web-prod) and click Connect.
  3. On the connection’s edit page, copy the Drain URL with Copy URL. It embeds the drain credentials, so treat it as a secret.
  4. Add the drain in Heroku:
    • Cedar / standard apps: heroku drains:add '<drain URL>' -a <app-name>
    • Shield Private Space: heroku spaces:drains:add '<drain URL>' --space <space-name>

Regenerate drain URL on the edit page issues a new URL and immediately invalidates the old one, so every Heroku drain using it stops delivering logs until you update it.

DigitalOcean (Monitor) polls the DigitalOcean Actions API every five minutes for team activity such as Droplet creation and deletion and firewall changes. There is nothing to set up on the DigitalOcean side beyond a token.

  1. In DigitalOcean, create a Personal Access Token with the actions:read scope.
  2. Go to Admin > Integrations, click the DigitalOcean (Monitor) card, and click Continue.
  3. Enter an Integration Name and the Personal Access Token, then click Connect. Fencer starts polling as soon as you save. Submit a new token on the edit page to rotate it.

DigitalOcean Security History, DOKS control-plane audit logs, and App Platform and Functions logs are not available through this integration. Forward App Platform and Functions logs with a Custom Source instead.

To edit a hosting platform connection, navigate to Admin > Integrations, find the connection under Active Integrations, and click Edit. What you can change depends on the platform:

  • Heroku: the connection name and environment.
  • Render and Supabase: the connection name, environment, and API key (leave the key blank to keep the stored one). The workspace, organization, and project cannot be changed.
  • DigitalOcean: the connection name, environment, and the registry and container image scanning toggles. The project cannot be changed.
  • Railway and Vercel have no edit page. To change them, remove the connection and connect again.

To disconnect, click Remove on the connection and confirm. Fencer clears the stored credentials and removes the connection and its vendor record. You can reconnect at any time by going through the setup flow again.

  • OAuth authorization fails: Ensure you have the required permissions on the hosting platform. For Heroku and DigitalOcean, you must be the account owner or have admin-level access.
  • API key rejected: Verify the key has not been revoked and has sufficient read permissions. For Render, the key needs access to the workspace you selected. For Supabase, the personal access token needs access to the organization.
  • Missing checks or incomplete results: Some checks require specific permissions. For example, Heroku addon connectivity checks require the read-protected OAuth scope. If a scope was not granted during authorization, reconnect the integration.
  • Stale data after infrastructure changes: Scans run daily (weekly on some plans). To see updated results sooner, open the account on Posture > Infrastructure and click Run scan.