Files
qinglong/test/back/ql3SecurityAdministrationKubernetesLiveAudit.test.cjs

209 lines
6.6 KiB
JavaScript

const assert = require('node:assert/strict');
const { test } = require('node:test');
const {
FIXTURE,
LIMITATIONS,
validateSecurityAdministrationKubernetesLiveReport,
} = require('../../scripts/ql3-security-administration-kubernetes-live-audit.cjs');
const digest = (value) => `sha256:${value.repeat(64)}`;
function report() {
return {
schemaVersion: 1,
fixture: FIXTURE,
observedAt: '2026-08-25T04:00:00.000Z',
platform: {
distribution: 'k3s',
kubernetesVersion: 'v1.34.3+k3s1',
architecture: 'amd64',
kubernetesImageId: digest('1'),
administrationImageId: digest('2'),
controlImageId: digest('4'),
cniName: 'flannel',
cniDistributionBinding: 'rancher/k3s:v1.34.3-k3s1',
controlPlaneNodes: 1,
workerNodes: 2,
readyNodes: 3,
},
database: {
operator: 'cloudnative-pg',
operatorVersion: '1.30.0',
postgresVersionNumber: 180004,
postgresImageId: digest('3'),
instances: 3,
readyInstances: 3,
administrationRole: 'ql3_admin',
roleConnectionLimit: 4,
commandConnectionLimit: 1,
migrationCount: 71,
controlCoreCapability: 70,
tlsVerified: true,
leastPrivilege: true,
},
ceremony: {
operations: [
'identity.register',
'audit.list',
'credential.issue.old',
'credential.issue.old.replay',
'credential.key-references.before-activate',
'credential.issue.new',
'credential.rotate.new',
'credential.key-references.after-activate',
'credential.revoke.old',
'credential.key-references.after-converge',
],
completedJobs: 10,
failedJobs: 1,
authenticationProbeJobs: 5,
controlReplicas: 2,
controlRollouts: 3,
controlReplicaAntiAffinity: true,
callerDriven: true,
backoffLimit: 0,
activeDeadlineSeconds: 300,
ttlSecondsAfterFinished: 600,
serviceAccount: 'ql3-security-administration',
serviceAccountTokenMounted: false,
rbacGranted: false,
responseLossReplayObserved: true,
overlapGenerationCount: 2,
contractedGenerationCount: 1,
activeGenerationChanged: true,
oldReferencesBeforeActivation: 1,
oldReferencesAfterActivation: 1,
oldReferencesAfterConvergence: 0,
oldAuthenticationBeforeActivation: true,
oldAuthenticationDuringOverlap: true,
newAuthenticationDuringOverlap: true,
oldAuthenticationRejectedAfterConvergence: true,
newAuthenticationAfterContraction: true,
contractedToActiveGeneration: true,
sensitiveMaterialReported: false,
},
inputBoundary: {
immutableSecret: true,
projectedMode0440: true,
memoryBackedPrivateStage: true,
targetDirectoryMode0700: true,
targetFilesMode0600: true,
kubeletAtomicWriterProjectionAccepted: true,
worldReadableProjectionRejected: true,
mainContainerNotStartedAfterStageFailure: true,
},
deliveryCustody: {
persistentVolumeClaim: true,
accessMode: 'ReadWriteOnce',
fixtureRootProvisioned: true,
fixtureRootMode: '2770',
fixtureProvisionerRanAsRoot: true,
privateDirectoryMode: '0700',
fileMode: '0600',
fileCount: 3,
issueDigest: digest('4'),
rotationDigest: digest('5'),
distinctRotationMaterial: true,
persistentAcrossJobs: true,
noReplaceReplayPreserved: true,
deliverySchemaValidated: true,
bearerFormatValidatedInPod: true,
sensitiveMaterialReported: false,
},
isolation: {
dnsAndDatabaseEgressAllowed: true,
kubernetesApiEgressDenied: true,
publicInternetEgressDenied: true,
secretReadRbacDenied: true,
jobMutationRbacDenied: true,
},
durability: {
identityVersion: 1,
identityStatus: 'active',
oldCredentialVersion: 2,
oldCredentialState: 'revoked',
newCredentialVersion: 2,
newCredentialState: 'active',
identityMutationCount: 1,
credentialMutationCount: 4,
issueMutationCount: 1,
credentialVersionCount: 4,
oldGenerationVersionCount: 1,
newGenerationVersionCount: 3,
latestGenerationsAreNew: true,
allowedAuditCount: 5,
authenticationDeniedAuditCount: 4,
authenticationRejectedAuditCount: 1,
},
cleanup: {
jobsDeleted: true,
inputSecretsDeleted: true,
evidenceJobsDeleted: true,
storageProvisionJobDeleted: true,
deliveryVolumeClaimDeleted: true,
controlDeploymentDeleted: true,
controlServiceDeleted: true,
controlRuntimeSecretDeleted: true,
},
gates: {
realThreeNodeKubernetes: true,
realCloudNativePg: true,
realKubeletSecretProjection: true,
realAdministrationProductCommands: true,
realPersistentCredentialCustody: true,
realClusterControlAuthenticationRotation: true,
responseLossReplay: true,
failedInputStageClosed: true,
leastPrivilege: true,
contentFreeEvidence: true,
passed: true,
},
limitations: [...LIMITATIONS],
};
}
test('accepts the exact content-free Security Administration live report', () => {
const result = validateSecurityAdministrationKubernetesLiveReport(report());
assert.equal(result.compatible, true);
assert.deepEqual(result.findings, []);
});
test('rejects widened authority, false custody and replay duplication', () => {
const candidate = report();
candidate.ceremony.serviceAccountTokenMounted = true;
candidate.deliveryCustody.noReplaceReplayPreserved = false;
candidate.durability.issueMutationCount = 2;
candidate.ceremony.oldReferencesAfterConvergence = 1;
candidate.gates.passed = false;
const codes = validateSecurityAdministrationKubernetesLiveReport(
candidate,
).findings.map((finding) => finding.code);
assert.ok(
codes.includes('QL3_SECURITY_ADMINISTRATION_KUBERNETES_LIVE_CEREMONY'),
);
assert.ok(
codes.includes('QL3_SECURITY_ADMINISTRATION_KUBERNETES_LIVE_DELIVERY'),
);
assert.ok(
codes.includes('QL3_SECURITY_ADMINISTRATION_KUBERNETES_LIVE_DURABILITY'),
);
assert.ok(codes.includes('QL3_SECURITY_ADMINISTRATION_KUBERNETES_LIVE_GATES'));
});
test('rejects any credential or assertion material in evidence', () => {
const candidate = report();
candidate.deliveryCustody.proof = {
token: 'ql3c_example_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
};
const result = validateSecurityAdministrationKubernetesLiveReport(candidate);
assert.equal(result.compatible, false);
assert.ok(
result.findings.some(
(finding) =>
finding.code ===
'QL3_SECURITY_ADMINISTRATION_KUBERNETES_LIVE_MATERIAL_EXPOSURE',
),
);
});