Seal Report
Overview
Seal Report is a free, open source framework for producing database reports and dashboards. It connects to your SQL and NoSQL data sources and lets you design reports and dynamic dashboards from a metadata model, using LINQ and Razor templating. A Web Report Server publishes them through a browser interface.
Reports can pivot, chart, drill down and render as HTML, PDF, Excel or CSV. A task scheduler can run them on a schedule and distribute the results by email or to a folder. A repository of shared connections and elements lets report authors reuse data definitions across many reports.
This SecureAnyCloud image builds the Seal Report 10.0 Web Report Server from the official open source (MIT-licensed) release. It runs under systemd as the unprivileged seal system user on Ubuntu's native .NET 10 runtime. Seal listens on the loopback address 127.0.0.1:5000 only, and an nginx reverse proxy on port 80 is the only public entry point.
A unique administrator password is generated on the first boot of every VM. It is hashed into Seal's own configuration exactly the way Seal stores passwords, and the plain credentials are written to a root-only file, so no shared credential ships in the image.
Secure by default. A stock Seal Report demo repository ships a security script that lets a blank user name sign in anonymously, a hardcoded backdoor account, and a set of demo logins. This image does not ship in that state. The security script is replaced with one that only authenticates a real login, every demo account is removed, and a single administrator is defined in a full-rights group. Seal is bound to loopback behind nginx, and nginx comes up only after the unique administrator password is generated on each virtual machine's first boot.
What you get:
- Seal Report 10.0 Web Report Server, built from the official MIT licensed source and recorded in
/opt/seal/VERSION - A systemd service that runs as the unprivileged
sealsystem user with a hardened sandbox (NoNewPrivileges,PrivateTmp,ProtectSystem=full,ProtectHome) - Seal bound to the loopback address
127.0.0.1:5000, with nginx on port 80 as the only public listener - A unique administrator password generated on first boot, hashed into the configuration and recorded in a root-only file
- The shipped anonymous login, backdoor account and demo logins all removed
- An unauthenticated
/healthzendpoint for Azure Load Balancer health probes - A built-in self-test at
/usr/local/bin/seal-report-selftestthat proves the credential path end to end - An Ubuntu 24.04 LTS base with the latest security patches applied at build time, and the Ubuntu-native ASP.NET Core 10 runtime. Unattended security upgrades patch both
- Azure Linux Agent for seamless cloud integration and SSH key injection
- 24/7 SecureAnyCloud support with a guaranteed 24 hour response SLA
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region. Standard_B2s (2 vCPU / 4 GiB RAM) is a comfortable starting point.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network for SSH and 80/tcp for the Web Report Server. Seal reaches your databases over their own outbound ports, so no other inbound port is required.
The web interface is served over plain HTTP on port 80. For production, terminate TLS in front of it with your own domain (see Maintenance).
Step 1 - Deploy from the Azure Marketplace
Sign in to the Azure portal, choose Create a resource, search the Marketplace for Seal Report by SecureAnyCloud, and select Create.
On Basics, pick your subscription, resource group, region and size. Under Administrator account, choose SSH public key and paste your key. Under Inbound port rules, allow SSH (22) and HTTP (80).
Choose Review + create, then Create.
Step 2 - Deploy from the Azure CLI
# Accept the Marketplace terms once per subscription (required before the first CLI deploy)
az vm image terms accept --urn sac1647283583153:seal-report-ubuntu-24-04:default:latest
az vm create \
--resource-group <your-rg> \
--name seal-report \
--image sac1647283583153:seal-report-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--ssh-key-values ~/.ssh/id_ed25519.pub \
--vnet-name <your-vnet> --subnet <your-subnet> \
--public-ip-sku Standard
az vm open-port --resource-group <your-rg> --name seal-report --port 80 --priority 1010Step 3 - Connect to your VM
ssh azureuser@<vm-public-ip>Step 4 - Confirm the services are running
systemctl is-active seal-report.service nginx.serviceBoth report active. Seal Report serves its Web Report Server on the loopback address 127.0.0.1:5000, and nginx fronts it on port 80. Because Seal is bound to loopback, it is never reachable directly from the network. The only public path is nginx.
active activeStep 5 - Retrieve your admin login
Your VM generates a unique Seal Report administrator password on first boot and writes it to a root-only file. Read the file:
sudo cat /root/seal-report-credentials.txtThis file contains SEAL_REPORT_URL, SEAL_REPORT_ADMIN_USER (which is admin) and SEAL_REPORT_ADMIN_PASSWORD. The administrator password signs you in to the Web Report Server. Store it somewhere safe.
Step 6 - Confirm the login round trip from the command line
Before you open a browser, you can verify the appliance end to end. The unauthenticated health endpoint answers without a credential, a blank (anonymous) login is refused, and the shipped self-test signs in with the real per-VM password:
curl -s http://127.0.0.1/healthzokcurl -s -X POST --data-urlencode "user=" --data-urlencode "password=" http://127.0.0.1/SWILoginThe anonymous login is rejected, which shows that authentication is enforced:
{"error":"Invalid user name or password","authenticated":false}sudo /usr/local/bin/seal-report-selftestOKStep 7 - Sign in to the Web Report Server
Open http://<vm-public-ip>/ in a browser. Seal Report presents a login prompt, and there is no anonymous access. Enter admin and the password from your credentials file.
After you sign in, the report explorer opens. The folder tree is on the left and the reports of the selected folder are on the right.
Step 8 - Explore the sample reports
Expand Reports, then Samples, to see the bundled example reports: charts, cross tabs, gauges, cards, data tables and more. Select a report to open it, then choose Execute to render it.
The samples are a quick way to confirm that the server renders reports and to learn the report model before you point Seal at your own databases.
Step 9 - Review the data sources
Select the Sources node to see the data sources the repository ships with, including the bundled offline Northwind sample and connection templates for SQL Server, PostgreSQL, MySQL, Oracle, SQLite and MongoDB. From here you connect Seal to your own databases and build your metadata model.
To add a new source and design new reports, use the Seal Report Server Manager and Report Designer (the Windows design tools) against this repository, or edit the repository files directly.
Step 10 - Review the security posture
You can confirm the hardening at any time. Only the admin login exists (the shipped demo logins are gone), the server runs as the unprivileged seal user, and the runtime is the Ubuntu-native ASP.NET Core 10 shared framework:
grep -oE "<Id>[a-z]+</Id>" /var/lib/seal/Repository/Security/Security.xml | sort -u<Id>admin</Id>ps -o user= -C dotnet | sort -usealMaintenance
Change the administrator password. The password is stored as a salted hash in /var/lib/seal/Repository/Security/Security.xml. To rotate it, generate a new hash with the shipped helper, then restart the service:
sudo /usr/local/sbin/seal-report-set-admin-password.py \
/var/lib/seal/Repository/Security/Security.xml '<your-new-password>'
sudo chown seal:seal /var/lib/seal/Repository/Security/Security.xml
sudo systemctl restart seal-report.serviceUpdate /root/seal-report-credentials.txt to match, and keep it safe.
Terminate TLS for production. The Web Report Server is served over plain HTTP on port 80. For production, place your own TLS certificate in front of it. For example, get a certificate for <your-domain> from your CA or from Let's Encrypt via certbot, and proxy HTTPS to http://127.0.0.1:5000. Alternatively, add a server block for <your-domain> to the nginx site at /etc/nginx/sites-available/sac-seal-report.
Operating system and runtime updates. The base image is patched at build time and ships with unattended security upgrades enabled. The ASP.NET Core 10 runtime is the Ubuntu-native package, so it receives security updates from the OS.
Reports, data sources and security settings live under /var/lib/seal/Repository. Back up that directory.
Service management. Use these commands:
systemctl status seal-report.service --no-pagersudo journalctl -u seal-report.service -n 50 --no-pagerSupport
SecureAnyCloud backs every image with 24/7 support and a guaranteed 24 hour response SLA. Contact sales@secureanycloud.com with the offer name and your VM details.
Seal Report is open source software distributed under the MIT License. The SecureAnyCloud charge covers packaging, hardening, security patching, image maintenance and support.
Deploy on Azure
Launch Seal Report on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
Overview
Seal Report is a popular open source framework for producing database reports and dashboards. It connects to your SQL and NoSQL data sources and lets you design reports and dynamic dashboards from a metadata model, using LINQ and Razor templating. A Web Report Server publishes them through a browser interface.
Reports can pivot, chart, drill down and render as HTML, PDF, Excel or CSV. A task scheduler can run them on a schedule and distribute the results by email or to a folder.
The SecureAnyCloud image builds the Seal Report Web Report Server from the official MIT-licensed source. The vendor ships only a Windows installer, so this image compiles the Linux-runnable server itself. It runs as a dedicated unprivileged system user under systemd on the Ubuntu-native .NET runtime. The server is bound to the loopback interface and fronted by nginx on port 80.
A unique administrator password is generated on each instance's first boot, so the report server starts with no shared or default credential.
Seal Report is a trademark of its respective owner. This image is produced by SecureAnyCloud and is not affiliated with, endorsed by, or sponsored by the project. It ships the free and open source MIT-licensed software, built unmodified from the official source.
What you get:
- Seal Report 10.0 Web Report Server, built from the official MIT source at a pinned commit
- The Ubuntu-native ASP.NET Core 10 runtime, security-patched by the operating system, with no third-party Microsoft apt feed
seal-report.servicerunning as the unprivilegedsealuser, bound to127.0.0.1:5000(loopback only)nginx.servicereverse proxy on port80, the only public path, with an unauthenticated/healthzendpoint for load balancer probes- A unique administrator password generated per instance on first boot and hashed into the configuration exactly the way Seal Report stores passwords, never baked into the image
- The shipped anonymous login, hardcoded backdoor and demo accounts removed, leaving a single
adminlogin in a full-rights group - Ubuntu 24.04 LTS base with the latest security patches applied at build time
- 24/7 SecureAnyCloud support
Connecting to your instance
Connect over SSH on port 22 with the key pair you selected at launch. On Ubuntu 24.04, the login user is ubuntu:
ssh -i <your-key.pem> ubuntu@<instance-public-ip>Prerequisites
You need an AWS account, an EC2 key pair in the target Region, a VPC with a subnet, and a security group. m5.large (2 vCPU / 8 GiB RAM) is a good starting point.
Seal Report serves its web interface on port 80, so allow inbound 22/tcp (SSH) and 80/tcp (HTTP) from your management network. Add 443/tcp if you terminate TLS at the instance (see Adding TLS below).
Launching the instance
From the AWS Marketplace console
- Open the Seal Report listing on AWS Marketplace and choose Continue to Subscribe, then Continue to Configuration.
- Select the Region and the Seal Report on Ubuntu 24.04 delivery option, then choose Continue to Launch.
- Choose an instance type (m5.large recommended), your key pair, a subnet, and a security group that allows
22/tcpand80/tcp. Then launch.
From the AWS CLI
aws ec2 run-instances \
--image-id <seal-report-ami-id> \
--instance-type m5.large \
--key-name <your-key-pair> \
--security-group-ids <sg-allowing-22-and-80> \
--subnet-id <your-subnet> \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=seal-report}]'Find the AMI id for your Region on the listing's launch page. Alternatively, subscribe and copy it from EC2, then AMIs, then Private images once the subscription is active.
Retrieving the administrator password
Each instance generates its own administrator password on first boot and writes it, with the web URL, to a root-only file. First boot takes a minute or two after the instance reaches the running state. Read the file over SSH:
sudo cat /root/seal-report-credentials.txtThe file shows the per-instance values. The password is unique to your instance:
SEAL_REPORT_URL=http://<instance-public-ip>/ SEAL_REPORT_ADMIN_USER=admin SEAL_REPORT_ADMIN_PASSWORD=<SEAL_REPORT_ADMIN_PASSWORD>Verifying the services
Confirm that the report server and the reverse proxy are both active:
systemctl is-active seal-report.service nginx.serviceactive activeThe report server is bound to loopback and nginx serves the public port 80:
sudo ss -tlnp | grep -E ':80|:5000' | sed -E 's/users:.*//'LISTEN 0 512 127.0.0.1:5000 0.0.0.0:* LISTEN 0 511 0.0.0.0:80 0.0.0.0:* LISTEN 0 511 [::]:80 [::]:*The unauthenticated health endpoint served by nginx returns ok. Use it for a load balancer probe. It never touches Seal Report and needs no credential:
curl -s http://127.0.0.1/healthzokSigning in to the Web Report Server
Open http://<instance-public-ip>/ in your browser. The Seal Report login page appears. Sign in with the user name admin and the password from the credentials file.
After you sign in, the report explorer opens. The folder tree of report categories is on the left and the reports in the selected folder are on the right.
The image ships the standard Seal Report sample repository, so you can explore example reports right away under Reports, then Samples.
Executing a report
Open a folder such as Reports, then Samples, then 02-LINQ. Double-click a report, for example 201-LINQ Samples, to execute it.
The Web Report Server runs the report against its data source and renders the result in the browser, with tabbed views and grouped result tables. You can then export the same result as HTML, PDF, Excel, CSV, JSON or XML from the report menu.
From here you can create your own data sources (SQL and NoSQL), design reports and dashboards with LINQ and Razor, and schedule report execution and distribution from the web interface.
Security model
This image is secure by default:
- No shared or default credential. A stock Seal Report demo repository ships a security script that lets a blank user name sign in anonymously, a hardcoded backdoor account, and a set of demo logins. This image removes all of them and defines a single administrator in a full-rights group.
- Unique per-instance password. The administrator password is generated on each instance's first boot and hashed into the configuration exactly the way Seal Report stores passwords (PBKDF2-HMAC-SHA256). Nothing usable is baked into the image, so no two deployments share a credential.
- Loopback-only report server. The Web Report Server binds
127.0.0.1:5000and is never network-exposed directly. The only public path is the nginx reverse proxy on port 80, which first boot brings up last, only after the administrator password is set. No unauthenticated instance is ever exposed.
You can verify that the login is enforced with the shipped self-test. It checks that anonymous and wrong-password logins are refused, and that the real password authenticates and lists the report folder tree:
sudo /usr/local/bin/seal-report-selftestOKAn anonymous login attempt through the proxy is refused:
curl -s -X POST --data-urlencode "user=" --data-urlencode "password=" http://127.0.0.1/SWILogin{"error":"Invalid user name or password","authenticated":false}Adding TLS
Seal Report is served over plain HTTP on port 80 by default. For production, terminate HTTPS in front of it using one of these options:
- At a load balancer. Put an Application Load Balancer (or CloudFront) in front of the instance, attach an ACM certificate, and forward to port 80. Restrict the instance security group so that only the load balancer can reach port 80.
- At the instance. Add a TLS
serverblock to the nginx configuration in/etc/nginx/sites-available/sac-seal-reportwith your certificate, and open443/tcpin the security group.
Support
SecureAnyCloud provides 24/7 technical support for this product by email and live chat, covering deployment, connecting data sources, designing reports and dashboards, scheduling, reverse proxy and TLS, sizing, and upgrades.
Email: sales@secureanycloud.com
Deploy on AWS
Launch Seal Report with 24/7 support from SecureAnyCloud.
View on Marketplace
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com