{"id":946,"date":"2026-11-14T17:00:00","date_gmt":"2026-11-14T17:00:00","guid":{"rendered":"https:\/\/heartcareforyou.in\/blog\/?p=946"},"modified":"2026-11-15T07:00:00","modified_gmt":"2026-11-15T07:00:00","slug":"kubesecops-ninety-day-audit-checklist","status":"publish","type":"post","link":"https:\/\/heartcareforyou.in\/blog\/kubesecops-ninety-day-audit-checklist\/","title":{"rendered":"A 90-Day KubernetesSecOps Audit Checklist for Digital Health Teams"},"content":{"rendered":"<p>Digital health products run on infrastructure that someone has to keep orderly, and for many teams that infrastructure is a Kubernetes cluster. This checklist turns KubernetesSecOps into a ninety-day audit you can hand to an engineering lead, a platform owner or an external reviewer. It is non-clinical: nothing here touches patient care, only the way the computing platform behind an application is configured and watched. Each step is phrased as a check with an expected result, so the outcome can be recorded as pass, partial or fail.<\/p>\n<p>The ninety-day structure follows the staged plan described in the Ops Atlas, which splits the work into a &#8220;see&#8221; phase, a &#8220;guard&#8221; phase and a &#8220;verify&#8221; phase. I have rewritten the steps as a checklist and added the evidence to collect at each stage. The original discussion is at <a href=\"https:\/\/www.xopsschool.com\/kubernetessecops\/\">the Ops Atlas page for KubernetesSecOps<\/a>, and it is worth skimming before you assign owners.<\/p>\n<h2>Before you start: scope and owners<\/h2>\n<p>Write down which clusters are in scope, who owns each, and who can approve a change to security rules. A checklist without named owners becomes a wish list. Also decide the unit of reporting; the Atlas&#8217;s worked example counts workload namespaces, which is a sensible unit because rules are applied per namespace. Record the total number so that every later percentage has a denominator.<\/p>\n<h2>Days 1 to 30: see what exists<\/h2>\n<p>The aim of the first phase is visibility. Do not change enforcement yet.<\/p>\n<ol>\n<li><strong>Inventory namespaces and owners.<\/strong> Expected result: every namespace has a named owner and a purpose. Evidence: a table exported from the cluster and reconciled by hand.<\/li>\n<li><strong>Turn on authentication through the organisation&#8217;s identity provider.<\/strong> Expected result: people sign in with individual accounts, not a shared certificate. Evidence: the cluster configuration and a test login.<\/li>\n<li><strong>Enable audit logging.<\/strong> Expected result: an audit policy exists, logs are shipped somewhere they cannot be edited by cluster administrators, and retention is written down. On a self-managed cluster nothing is logged until a policy file is supplied, and managed services differ in what they record by default, so verify the actual behaviour rather than assuming it.<\/li>\n<li><strong>Switch Pod Security to warn mode at the baseline level everywhere.<\/strong> Expected result: violations are visible but nothing is blocked. Evidence: the list of warnings by namespace.<\/li>\n<li><strong>Run a benchmark scan.<\/strong> Expected result: a report against the current CIS Kubernetes Benchmark with each failing item assigned an owner. Tools such as kube-bench perform this scan.<\/li>\n<\/ol>\n<h2>Days 31 to 60: put guardrails in place<\/h2>\n<p>The second phase begins enforcement, but carefully.<\/p>\n<ol start=\"6\">\n<li><strong>Announce an enforcement date for the baseline profile.<\/strong> Expected result: owners have had roughly two weeks of warnings, the date is published, and an exception register with expiry dates exists.<\/li>\n<li><strong>Enforce baseline.<\/strong> Expected result: at least nine in ten workload namespaces comply, the remainder covered by dated exceptions. Remember that enforcement does not remove pods that are already running, so review those separately.<\/li>\n<li><strong>Pilot default-deny network rules.<\/strong> Expected result: one or two namespaces run with explicit allow lists. Note that connections opened before the rule was applied may continue, depending on the network plugin, so restart workloads during the test.<\/li>\n<li><strong>Turn on encryption of secrets at rest.<\/strong> Expected result: secrets are encrypted using an external key service via the current provider interface. Per the Atlas, the first generation of that interface has been on its way out since v1.28 and is off by default in the next release, while the plain symmetric cipher option earns a &#8220;weak&#8221; rating. Confirm any data stored before encryption was enabled has been rewritten.<\/li>\n<li><strong>Connect alerts to the team that responds.<\/strong> Expected result: runtime detection output reaches an on-call queue with a named recipient.<\/li>\n<\/ol>\n<h2>Days 61 to 90: verify and rehearse<\/h2>\n<ol start=\"11\">\n<li><strong>Apply the restricted profile to new namespaces.<\/strong> Expected result: new spaces start with non-root users, no privilege escalation, the runtime-default syscall filter and all extra capabilities dropped.<\/li>\n<li><strong>Add a rule that pins images by digest.<\/strong> Expected result: workloads that refer to mutable tags are rejected in the pilot scope.<\/li>\n<li><strong>Pilot signature checking at admission.<\/strong> Expected result: unsigned images are refused in one namespace. The Atlas argues for checking here as well as in the pipeline, because command-line tools and package managers can reach the cluster without passing through the pipeline.<\/li>\n<li><strong>Run a tabletop drill with the security operations team.<\/strong> Expected result: a written record of what the team did with a simulated alert, and what they would change.<\/li>\n<li><strong>Review the numbers.<\/strong> Expected result: percentages for baseline, restricted and default-deny coverage, plus an actionable-alert rate.<\/li>\n<\/ol>\n<h2>How to score the audit<\/h2>\n<p>Give each of the fifteen checks a score: two for pass with evidence, one for partial, zero for fail. Thirty is the maximum. Do not average away the zeros; list them first in the report. A score is a conversation starter and not a grade, because a team that scores twenty-two and has a dated plan for the rest is in better shape than a team that scores twenty-six and cannot say who owns the failures.<\/p>\n<p>For the metric lines, borrow the style of the Atlas&#8217;s example, which reported coverage as simple fractions of namespaces: baseline-or-better, restricted and default-deny. Fractions are easy to recompute and hard to inflate. The same example reported that a high-volume alert feed contained only a small share of items needing action until expected on-call activity was excluded, which is a reminder to report an actionable rate next to raw volume.<\/p>\n<h2>The evidence pack to keep<\/h2>\n<p>Audits fail quietly when proof lives in people&#8217;s heads. Keep a folder, with one subfolder per phase, holding the artefacts that justify each score: exported role lists, screenshots of the identity provider settings, the audit policy file, the benchmark report, the warning counts before and after enforcement, the exception register and the notes from the drill. Date every file. A reviewer who arrives six months later should be able to reconstruct why a check passed without interviewing anyone.<\/p>\n<p>Keep the pack small enough to read. Ten well-labelled files beat two hundred raw exports, and a one-page index that lists each check beside its evidence file saves the most time of all.<\/p>\n<h2>A reporting template for the sponsor<\/h2>\n<p>Executives do not read fifteen checks. Give the sponsor four lines: the score and its change since the last round, the three lowest-scoring checks with owners and dates, the count of open exceptions past their expiry, and one decision needed from them. That last line is what turns an audit into progress, because most stuck items wait on a decision about priority or budget, not on engineering effort.<\/p>\n<h2>Items auditors often forget<\/h2>\n<ul>\n<li>Namespaces are an organisational boundary, not a hard wall, because pods share machine kernels.<\/li>\n<li>Automation that removes pods on an alert can destroy the evidence you need and does not revoke stolen tokens.<\/li>\n<li>Quarantining a pod with a network rule does not work, since rules only add permissions; changing the pod&#8217;s label so it leaves the selected group is the way to isolate it.<\/li>\n<li>The CI system&#8217;s service account should not hold cluster-wide administrator rights.<\/li>\n<\/ul>\n<p>Finally, plan the cadence after day ninety. The rhythm proposed in the Atlas runs from short weekly looks at refused requests and alerts, through a monthly pass over open exceptions, to a quarterly access and benchmark review, topped by an annual tabletop with the security operations group. Put those four rhythms in the shared calendar on day ninety-one, while the momentum from the audit is still fresh, and name the person who owns each recurring slot.<\/p>\n<h2>Where this sits among your other reading<\/h2>\n<p>Teams in this space often follow engineering write-ups to see how others organise their platform work. One example is a <a href=\"https:\/\/heartcareforyou.in\/blog\/how-cotocus-is-transforming-indias-digital-domain-through-innovation-engineering-discipline-and-digital-ecosystem-thinking\/\">post on engineering discipline and digital ecosystem thinking in India<\/a>, which makes a useful companion for the process side of this checklist. For the monitoring mindset, a <a href=\"https:\/\/heartcareforyou.in\/blog\/cardiac-telemetry-unit-definition-clinical-context-and-cardiology-overview\/\">definitional overview of a telemetry unit<\/a> is a loose parallel: continuous observation only helps when someone is assigned to respond to what it shows.<\/p>\n<p>Print the fifteen checks, assign a date to each and review progress every fortnight. By day ninety you should have a score, a list of dated exceptions and a calendar for the next round.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A fifteen-point, three-phase KubernetesSecOps audit checklist for digital health platform teams, with evidence to collect and a simple scoring method.<\/p>\n","protected":false},"author":5,"featured_media":947,"comment_status":"","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[399],"tags":[],"class_list":["post-946","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-digital-health"],"_links":{"self":[{"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/posts\/946","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/comments?post=946"}],"version-history":[{"count":1,"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/posts\/946\/revisions"}],"predecessor-version":[{"id":1044,"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/posts\/946\/revisions\/1044"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/media\/947"}],"wp:attachment":[{"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/media?parent=946"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/categories?post=946"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/heartcareforyou.in\/blog\/wp-json\/wp\/v2\/tags?post=946"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}