Plesk Obsidian is one of the most common control panels for managed Linux servers. It also leaks the most fingerprint information by default — the X-Powered-By: PleskLin header is hardcoded into Plesk's nginx config generator. This guide walks through every fix our Security Audit raises on a Plesk-hosted site: removing X-Powered-By permanently, adding the six recommended HTTP security headers, configuring TLS protocols and publishing security.txt. Tested against Plesk Obsidian 18.0.77 on Ubuntu 24.04.
This is the most common Plesk finding. Plesk auto-generates nginx.conf for every domain and injects add_header X-Powered-By PleskLin; at the server level. The fix is a one-line change to Plesk's global panel.ini followed by a config rebuild — fully supported by Plesk and survives all future regenerations.
/usr/local/psa/admin/conf/panel.ini (with a symlink at /opt/psa/admin/conf/panel.ini). Open with your preferred editor:
nano /usr/local/psa/admin/conf/panel.iniAdd the following two lines at the end of the file:
[webserver] xPoweredByHeader = offSave and exit.
plesk repair web -yYou should see lines confirming the repair, ending with
Error messages: 0; Warnings: 0. If you prefer the UI, the same action is available at Tools & Settings → Diagnose & Repair → Repair Web.
curl -sI https://yourdomain.com/ | grep -iE "x-powered-by|server"You should see only
server: nginx — no x-powered-by line at all. Then re-run the Security Audit on your domain to confirm the check now passes.
panel.ini setting is server-wide — it removes X-Powered-By from every domain hosted on this Plesk server in one step. There is no per-domain version of this setting.The six headers our audit checks (CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy) can all be added through Plesk's Additional nginx directives field, per-domain. This field is preserved across Plesk regenerations and panel updates.
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always; add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always; add_header Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'" always;Plesk validates the syntax. If you get a config error, the most common cause is unbalanced quotes — copy-paste exactly as above.
preload to your HSTS header AFTER testing — submitting to the HSTS preload list is hard to undo. For a first deployment, omit preload and use just max-age=31536000; includeSubDomains.Plesk uses sensible TLS defaults on modern installs (TLS 1.2 and 1.3 enabled, older protocols disabled) but on legacy upgraded servers you may still have TLS 1.0 or 1.1 enabled. Check and disable them.
ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384";
security.txt tells researchers how to report vulnerabilities. Plesk does not have UI support for this — you create the file directly in your document root.
httpdocs/.well-known/security.txt with this content (replace the email and date):
Contact: mailto:security@yourdomain.com Expires: 2027-12-31T23:59:59.000Z Preferred-Languages: en Canonical: https://yourdomain.com/.well-known/security.txtThe
Expires field must be no more than one year in the future per RFC 9116.
.well-known/ directory rules in Plesk's templates). Force the right type by adding to your Additional nginx directives:
location = /.well-known/security.txt {
default_type "text/plain; charset=utf-8";
add_header Content-Type "text/plain; charset=utf-8" always;
}
Cookie flags (Secure, HttpOnly, SameSite) must be set by whatever application sets the cookies — Plesk cannot add them on cookies it did not create. For most Plesk-hosted sites this means your CMS or application code.
session.cookie_secure=1, session.cookie_httponly=1, session.cookie_samesite=Lax in php.ini, accessible via Plesk's PHP settingsIf your audit shows "CMS not exposing version: WARN", that finding is from your application not Plesk. Plesk itself does not add a <meta name="generator"> tag. For WordPress, follow the WordPress fix guide.
Plesk has built-in support for managing SPF, DMARC and DKIM via the Mail tab on each domain, even if you do not use Plesk's mail server. Even if you delegate email to Google Workspace or Microsoft 365, publishing these records on your domain in Plesk's DNS settings prevents your domain from being spoofed.
After applying these fixes, run the Security Audit again to confirm your score has improved. Each fix should move you closer to 100/100.
Run free security audit →