Database audit fixes
Credential Storage: fixing all 4 checks
The credential storage audit finds database passwords in files other accounts can read: .env and wp-config.php in web roots, .git directories beside them, and client files like .my.cnf and .pgpass.
Two of the four checks skip when their search comes up empty: Web Config File Permissions only inspects the files the previous check found under /var/www, /srv/www or /usr/share/nginx/html, and Database Client Credentials skips when no .my.cnf, .pgpass, .mongoshrc.js, .dbshell or .rediscli_auth exists. A site under /home/user/public_html, or a service account whose home sits outside /home, therefore produces a SKIP, which records an unscanned path rather than a clean one.
Transcribed from the database-security-credential-storage audit script. For what the audit covers rather than how to fix it, see the Credential Storage checklist.
Find your finding
Listed in the order the audit runs them. Take the check name from the third field of the result line and open its page.
Config Files In Web Root
SoonChecks common web roots for credential-bearing config files such as .env and wp-config.php
MediumNo root2 resultsWeb Config File Permissions
SoonChecks whether credential-bearing config files inside web roots are world-readable
HighNo root3 resultsGit In Web Root
SoonChecks for .git directories inside web roots that would expose repository history and committed credentials
HighNo root2 resultsDatabase Client Credentials
SoonChecks that database client credential files are readable only by their owner (600)
HighNeeds root3 results
How the Credential Storage audit reads your server
Every check in this audit runs after the same preamble, and several of its results only make sense once you know what that preamble could and could not see.
Three run unprivileged; the fourth needs root for full coverage.
Engine detection: HAS_MY, HAS_PG, HAS_MG, HAS_RD are set from client binaries, server processes or config directories. MYOK=1 only if mysql -N -e 'SELECT 1' works as root over the socket; PGOK=1 only if su postgres -c 'psql -X -tAc "SELECT 1"' works. RDCONF is /etc/redis/redis.conf or /etc/redis.conf; MGCONF is /etc/mongod.conf. Containerised databases are not detected by these probes; audit them with the Docker checks or exec into the container.
A SKIP is never a pass
A skipped check verified nothing at all. The most common cause is privilege: 1 of the 4 checks in this audit need root for a complete result. Before every run, each script works out which of four privilege modes it is in.
| Mode | How it is reached | What it means for your results |
|---|---|---|
root | The audit runs as UID 0. | Every privileged branch runs directly. No check skips for lack of permission. |
nopass | sudo -n true succeeds, so the account has passwordless sudo. | Privileged commands run through sudo -n. |
pass | A sudo password was supplied in the CtrlOps audit settings and accepted. | Privileged commands run through sudo -S. |
none | None of the above worked. | CAN_ROOT=0. Every privileged branch returns SKIP with a "Need root" message rather than guessing. |
If many checks skip with a “need root” message, run the audit as root, grant the audit account sudo (with or without NOPASSWD), or supply the sudo password in the CtrlOps audit settings.
Credential Storage questions
Run all 4 Credential Storage checks, in one click
CtrlOps runs this audit over your existing SSH connection - no agents, no scripts to manage. $7/user/month after a 1 month free trial - no credit card required.
✓ Start instantly·✓ No credit card·✓ No sneaky autorenewals