
Your servers, from the outside and the inside
FortWatch’s scanners see your servers the way an attacker does, from the internet. The optional FortWatch Server Agent, a small read-only program on your Linux servers, sees what runs inside them: vulnerable packages, who can log in, which ports listen, their Docker containers, and how much room each disk has left. Every problem becomes an issue beside your outside-scan issues.
Ubuntu · Debian · Alpine · Rocky Linux · AlmaLinux · Red Hat Enterprise Linux
web-01
Ubuntu 24.04 LTS · Production
Problems
5
1 critical
CPU busy
12%
load 0.4 on 4 cores
Memory used
61%
of 8 GB
Fullest disk
84%
/var · 6 GB free
Accounts with no password
no password set for deploy
openssl: 4 known vulnerabilities fixed by an update
3.0.13-0ubuntu3.1 installed; 3.0.13-0ubuntu3.4 fixes it
PostgreSQL listening on every address
PostgreSQL listens on 0.0.0.0:5432, every address of the server; a firewall may still block it
SSH allows root to log in with a password
PermitRootLogin yes
Reboot pending after updates
updated kernel or libraries wait for a reboot (/run/reboot-required)
Each one is also an issue on the Issues page, with its fix and deadline.
Installed in two commands
Any Linux server on amd64 or arm64 with systemd. The agent reports out over HTTPS and nothing connects to your server, so there is no port to open and no SSH access to give.
Add the server
On the Servers page, click Add server, name it and pick its project. FortWatch shows the server's token once.
Run the installer
Download the installer and run it as root. It checks the agent against its published SHA-256, creates the agent's own account, asks for the token and starts the service.
Read its problems
The first report arrives within a minute. The server's page shows its problems with the fix for each, its health, packages, open ports, containers and accounts.
$ curl -fsSL https://fortwatch.ai/agent/install.sh -o fortwatch-install.sh$ sudo sh fortwatch-install.shThe installer is a short shell script: read it first if you like. With Ansible, cloud-init or Terraform, pipe the token on standard input instead of typing it. Each server gets its own token.
Health every minute, a full check every hour
The minute reports draw the health graphs for the last hour, day and week. The hourly check reads the server’s packages, open ports, login accounts, SSH settings and Docker containers, and every check below runs on it.
Every minute: health
- Load and CPU use
- Memory and swap
- Every disk's space and inodes
- The 10 processes using the most memory
Every hour: a full check
- Installed packages, matched against your distribution's own security advisories
- Open ports, with the address and user each one listens as
- Login accounts and their SSH keys
- SSH settings: root login, passwords, empty passwords
- Accounts with root's powers, or with no password
- A pending reboot, and automatic security updates
- Docker containers, from Docker's own files: privileged, the Docker socket, published ports
- Whether your release still gets free security updates
Every problem, an issue you can act on
Each problem lands on the Issues page beside the issues from your outside scans, with what the agent saw, the fix in plain words and a deadline, ready to assign. A vulnerable package comes with its CVEs, the version to install and the command that installs it.
- From the advisory
Vulnerable packages
An installed version with a known vulnerability an update fixes, with its CVEs, the version to install and the command.
- Critical
SSH empty passwords
SSH accepts an empty password.
- Critical
Extra root account
An account other than root holds root's powers.
- Critical
Account with no password
Anyone can log in as it.
- High
SSH root login
Root may log in with a password.
- Critical, high or low
Database listening on every address
MySQL, PostgreSQL, Redis, MongoDB, Elasticsearch and others listening beyond the machine and its private network. Critical when your outside scan finds it open, low when a firewall blocks it.
- Critical, high or low
Database published by Docker
A running container publishes a database port on every address, and Docker's rules bypass ufw and firewalld. Rated by the outside scan the same way.
- High
Privileged container
A running container runs privileged, with every device and capability of the server.
- High
Docker socket in a container
A running container mounts the Docker socket, which gives it control of Docker and the server.
- High or medium
Release end of life
The release's free security updates have ended, or end within 90 days. An Ubuntu LTS release on Ubuntu Pro counts as covered.
- Medium or high
Disk space
A disk 90% full, high at 95%.
- Medium
Inodes
A disk that has used 90% of its inodes, its file slots.
- Medium
SSH passwords
SSH accepts passwords, not keys alone.
- Medium
Memory
Less than 10% of memory available.
- Low
Reboot pending
An updated kernel or libraries waiting for a restart.
- Low
Automatic security updates
A Debian or Ubuntu server that does not install them.
FortWatch also watches what changes
These come from what FortWatch keeps between reports: when the last one arrived, the readings of the last six hours, and every port, account and key it has seen. A high one alerts at once.
- High
Server silent
No report for five minutes: the server, its network or its agent is down. Closes with the first report back.
- High or medium
Disk filling
A disk that has grown steadily for two hours and fills within a day at that rate. A one-off copy does not count.
- High
New login account
An account that can log in, first seen in the last day.
- High
New SSH key
A key added to an account's authorized_keys in the last day.
- Medium
New open port
A port open beyond the machine itself, first seen in the last day.
- Medium
Memory growth
A process whose memory has risen in a straight line for three hours, by a quarter and 256 MB at least, and still rises.
Alerts where you work
A critical or high problem alerts in the app and by mail, like any issue. Connect Slack or a webhook for alerts, and Jira, Linear, Notion or WebWork for tickets, with the rules you set.
New advisories every hour
FortWatch reads the distributions' new advisories every hour and matches every server on a changed release again at once, without waiting for its next report.
Closes when it's fixed
Update the package or turn off root login, and the next full check sees it pass. The issue closes by itself within about two hours, and reopens if the problem returns.
See which ports the internet really reaches
FortWatch’s port scan sees which ports answer from the internet. The agent sees which programs listen on the server, and on which addresses. Link the server to its IP or domain assets, which FortWatch proposes from the server’s own addresses, and every listening port says whether the internet reaches it.
Open, blocked or local
Open: the outside port scan found it. Blocked: a scan of every TCP port did not, so a firewall stops it. No: it listens only on the machine or its private network.
Severity that follows the internet
A database on every address is critical when the outside scan finds it open and low when a firewall blocks it. A database a container publishes is rated the same way.
The outside issue, explained
An open-port issue from the outside scan names what holds the port on each linked server, the program and its user, with the fix for that program. A port open with nothing listening names the Docker container that publishes it.
web-01 · Open ports
Linked to 203.0.113.10 · full port scan today
sshd
root · 0.0.0.0
nginx
root · 0.0.0.0
postgres
postgres · 0.0.0.0
redis-server
redis · 127.0.0.1
statsd
statsd · 0.0.0.0
Open outside, with nothing listening here
8080/tcp published by container shop-web-1
image acme/shop:2.4 · Compose service web
Built so a break-in at FortWatch can’t command the agent
An agent on your server must never become a way in. This one sends reports and reads nothing back but a status code, so FortWatch, hacked or not, cannot make it do anything but read and report.
It only reads
The agent changes nothing on your server. It reads the files its checks need and sends a report. That is all it can do.
It takes no orders
It sends reports and reads nothing back but the status code. FortWatch cannot make it run a command, read another file, change a setting or update itself.
Your settings, your file
How often it reports and which checks it skips live in a file on your server, /etc/fortwatch-agent/agent.conf. FortWatch cannot change it.
See what is sent
sudo fortwatch-agent -print collects a full report and prints it on your screen. It sends nothing.
Results, not files
/etc/shadow and your SSH settings are read on the server and only each check's result leaves. An SSH key travels as its fingerprint, the machine id as a hash.
Least privilege
It runs as its own user with one power, reading files. systemd locks the rest: the machine read-only to it, no new privileges, 128 MB of memory and 10% of one CPU at most.
Updates you control
The agent never updates itself. Running the installer again is the update, when you choose, and it installs the agent only when the download matches its published SHA-256.
Gone in one command
sudo sh fortwatch-install.sh --uninstall removes the service, the program, its settings, its token and its account. Then remove the server in FortWatch.
What leaves your server
- Host: hostname, a hash of the machine id, OS, kernel, architecture, uptime, a pending reboot, and the machine's own IP addresses
- Health: CPU, load, memory and swap, each disk's mount, sizes and inodes, and the 10 processes using the most memory, by name and user
- Inventory: packages and their versions; listening ports with their address, user and, when readable, program; the accounts that can log in, have uid 0 or hold SSH keys, with their shell and key fingerprints
- Docker containers: id, name, image, Compose project and service, state, user, privileged, host network or processes, added capabilities, the Docker socket mounted, published ports
- Each check's result: pass or fail, its severity and one line of evidence
- The name of any reader that failed, with its error, such as shadow: permission denied
What never does
- File contents
- Password hashes
- Keys
- Command lines
- Environment variables
- Process memory
- Logs
- Network traffic
Anything not on the first list never leaves. The reports travel over HTTPS, and your server’s token works only for that one server.
Only want the outside view? The server hardening audit and the rest of FortWatch’s 13 scanners need nothing installed. The agent adds the inside of the servers you choose.
Frequently asked questions
Answers to the most common questions about the FortWatch Server Agent.
What is the FortWatch Server Agent?+
A small read-only program for Linux servers. It reports the server's health every minute and a full check every hour: installed packages with known vulnerabilities, open ports, login accounts and SSH keys, SSH settings, Docker containers, disk and memory. FortWatch also says when the server's release stops getting free security updates, and turns every problem into an issue beside the issues from its outside scans.
Do I need the agent to use FortWatch?+
No. FortWatch's 13 scanners work from the outside and need nothing installed. The agent is optional: add it to the Linux servers where you also want the inside view. A team that runs only on Vercel or Cloudflare has no server to install it on and keeps the outside scans.
Can FortWatch run commands on my server through the agent?+
No. The agent only sends reports. It reads nothing from FortWatch's answer but the status code, follows no redirect, and cannot be told to run a command, read a file its checks do not need, change a setting or update itself. Someone who broke into FortWatch could read the reports already sent, but could not make an agent do anything.
What data leaves my server?+
Host facts (hostname, a hash of the machine id, OS, kernel, uptime and the machine's IP addresses), health readings, the package list, listening ports, the accounts that can log in with their SSH key fingerprints, each Docker container's name, image, Compose service, state, user, privileges and published ports, each check's result with one line of evidence, and the name of any reader that failed. Never file contents, password hashes, keys, command lines, environment variables, logs or network traffic. Run sudo fortwatch-agent -print to see a full report on your screen.
Does it show which ports the internet can reach?+
Yes, once the server is linked to its IP or domain assets in FortWatch; FortWatch proposes the assets at the server's own addresses and you confirm each link. Each listening port then shows Open when the outside port scan found it, Blocked when a scan of every TCP port did not, No when it listens only on the machine or a private network, and Not checked when no scan decides it. Ports open from outside with nothing listening on the server are listed too, with the Docker container that publishes each.
Will FortWatch tell me when a server goes down?+
Yes. A server with no report for five minutes becomes a high problem and alerts like any issue; the first report back closes it. FortWatch also alerts when a disk will fill within a day at its current rate, when a process's memory keeps growing, and when a new open port, login account or SSH key appears.
Which Linux distributions does it support?+
Any Linux on amd64 or arm64; it reads packages from dpkg, rpm or apk. Vulnerable packages are matched against the distribution's own security advisories for Ubuntu, Debian, Alpine, Rocky Linux, AlmaLinux and Red Hat Enterprise Linux, and the same six get the end-of-life notice. On other distributions every other check runs. The installer starts the agent as a systemd service; on a machine without systemd, install it with --no-start and run it under your own supervisor.
How much does it use on the server?+
Under 7 MB on disk. The systemd service is capped at 128 MB of memory and 10% of one CPU, and runs at low priority. It needs outbound HTTPS on port 443, to fortwatch.ai for the download and api.fortwatch.ai for the reports, and nothing connects to your server.
How do I update or remove it?+
Run the installer again to update: it replaces the program and keeps your settings and token. Then run sudo systemctl restart fortwatch-agent to start the new version. The agent never updates itself. To remove it, run sudo sh fortwatch-install.sh --uninstall, which removes the service, the program, its settings, its token and its account; then remove the server in FortWatch.

Explore more of FortWatch
Every feature runs on one platform and shares the same data. Jump to another, or see the full set.
Scanning & discovery
Secure your entire stack today
Start scanning in under 5 minutes. No credit card required. 7-day free trial included.