Sep 4, 2026
LinSentry is complete — v1.0.0
LinSentry started as a way for me to actually learn Bash. Not just read tutorials about loops and subshells and parameter expansion, but build something real with them — something that had to work correctly, handle edge cases, and behave safely when it touched a live system. A security hardening auditor turned out to be the perfect project: every check is a small, self-contained problem with a clear goal, and the whole thing composes into a tool that's useful on its own.
Today I'm tagging v1.0.0 — the release that completes the original 10-check roadmap. Here's what the full audit looks like end to end.
The checks
A LinSentry run works through each area of system posture — port exposure, SSH hardening, file permissions, user accounts, sudo privileges, firewall status, pending updates, AppArmor, malware scanner presence, and an overall risk summary that ties it together.
- Port exposure — scans listening TCP and UDP ports, then flags any bound to
0.0.0.0or[::]. A port on all interfaces is reachable from the network, not just localhost. - SSH hardening — audits
PermitRootLogin,PasswordAuthentication, andPermitEmptyPasswords, plus thesshd_configfile's ownership and write permissions. - File permissions — scans the home directory for world-writable files that any local user could tamper with.
- User accounts — flags duplicate UID 0 (root-level) accounts and any account with an empty password.
- Sudo privileges — lists sudo group members and detects NOPASSWD entries: accounts that can run admin commands without a password prompt.
- Firewall status — checks whether
ufwis installed and active, offers to install or enable it, and lets you selectively close exposed ports. - Pending security updates — checks for apt packages tagged specifically as security-related, and offers to install them.
- AppArmor — verifies Linux's mandatory access control system is installed and actively enforcing profiles, with WSL-specific handling for the kernel's known enforcement limitations.
- Malware scanner presence — confirms a baseline scanning tool (
rkhunterorchkrootkit) is installed, and offers to install one if not. - Overall risk summary — tallies warnings across every check into a final result: Excellent, Good, or Needs Attention.
What LinSentry is not
The more I built, the more I wanted to be honest about the boundaries. LinSentry audits configuration and access control. It is not a rootkit detector or a supply-chain verifier — and those aren't gaps I'm hiding from. They're structural limits of any configuration-based auditor: if the kernel lies to userspace, every tool that asks the kernel inherits the lie, and a compromised package that ships correct permissions looks identical to a clean one.
I wrote all of this up properly in the new Scope & Limitations documentation page — the kernel-rootkit case, the supply-chain case (I use the 2024 xz-utils backdoor as the example), and the tools that actually address those categories.
What's next
The Bash version has reached a natural end point. The next real step is a cross-platform rewrite in Rust — the same audit logic compiled for Linux, macOS, Windows, and Termux. A lot of what was painful in Bash (portable privilege checks, structured output, safe interactive prompts on terminals that differ platform to platform) gets much more tractable in a compiled language.
For now: if you're on Linux or WSL, grab the script from the GitHub repo, run it, and look at the risk summary at the end. Then go fix the things it flags — that's the whole point.