@etcsec-com/etc-collector 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +60 -0
- package/.env.test.example +33 -0
- package/.github/workflows/ci.yml +83 -0
- package/.github/workflows/release.yml +246 -0
- package/.prettierrc.json +10 -0
- package/CHANGELOG.md +15 -0
- package/Dockerfile +57 -0
- package/LICENSE +190 -0
- package/README.md +194 -0
- package/dist/api/controllers/audit.controller.d.ts +21 -0
- package/dist/api/controllers/audit.controller.d.ts.map +1 -0
- package/dist/api/controllers/audit.controller.js +179 -0
- package/dist/api/controllers/audit.controller.js.map +1 -0
- package/dist/api/controllers/auth.controller.d.ts +16 -0
- package/dist/api/controllers/auth.controller.d.ts.map +1 -0
- package/dist/api/controllers/auth.controller.js +146 -0
- package/dist/api/controllers/auth.controller.js.map +1 -0
- package/dist/api/controllers/export.controller.d.ts +27 -0
- package/dist/api/controllers/export.controller.d.ts.map +1 -0
- package/dist/api/controllers/export.controller.js +80 -0
- package/dist/api/controllers/export.controller.js.map +1 -0
- package/dist/api/controllers/health.controller.d.ts +5 -0
- package/dist/api/controllers/health.controller.d.ts.map +1 -0
- package/dist/api/controllers/health.controller.js +16 -0
- package/dist/api/controllers/health.controller.js.map +1 -0
- package/dist/api/controllers/jobs.controller.d.ts +13 -0
- package/dist/api/controllers/jobs.controller.d.ts.map +1 -0
- package/dist/api/controllers/jobs.controller.js +125 -0
- package/dist/api/controllers/jobs.controller.js.map +1 -0
- package/dist/api/controllers/providers.controller.d.ts +15 -0
- package/dist/api/controllers/providers.controller.d.ts.map +1 -0
- package/dist/api/controllers/providers.controller.js +112 -0
- package/dist/api/controllers/providers.controller.js.map +1 -0
- package/dist/api/dto/AuditRequest.dto.d.ts +6 -0
- package/dist/api/dto/AuditRequest.dto.d.ts.map +1 -0
- package/dist/api/dto/AuditRequest.dto.js +3 -0
- package/dist/api/dto/AuditRequest.dto.js.map +1 -0
- package/dist/api/dto/AuditResponse.dto.d.ts +17 -0
- package/dist/api/dto/AuditResponse.dto.d.ts.map +1 -0
- package/dist/api/dto/AuditResponse.dto.js +3 -0
- package/dist/api/dto/AuditResponse.dto.js.map +1 -0
- package/dist/api/dto/TokenRequest.dto.d.ts +6 -0
- package/dist/api/dto/TokenRequest.dto.d.ts.map +1 -0
- package/dist/api/dto/TokenRequest.dto.js +3 -0
- package/dist/api/dto/TokenRequest.dto.js.map +1 -0
- package/dist/api/dto/TokenResponse.dto.d.ts +12 -0
- package/dist/api/dto/TokenResponse.dto.d.ts.map +1 -0
- package/dist/api/dto/TokenResponse.dto.js +3 -0
- package/dist/api/dto/TokenResponse.dto.js.map +1 -0
- package/dist/api/middlewares/authenticate.d.ts +12 -0
- package/dist/api/middlewares/authenticate.d.ts.map +1 -0
- package/dist/api/middlewares/authenticate.js +141 -0
- package/dist/api/middlewares/authenticate.js.map +1 -0
- package/dist/api/middlewares/errorHandler.d.ts +3 -0
- package/dist/api/middlewares/errorHandler.d.ts.map +1 -0
- package/dist/api/middlewares/errorHandler.js +30 -0
- package/dist/api/middlewares/errorHandler.js.map +1 -0
- package/dist/api/middlewares/rateLimit.d.ts +3 -0
- package/dist/api/middlewares/rateLimit.d.ts.map +1 -0
- package/dist/api/middlewares/rateLimit.js +34 -0
- package/dist/api/middlewares/rateLimit.js.map +1 -0
- package/dist/api/middlewares/validate.d.ts +4 -0
- package/dist/api/middlewares/validate.d.ts.map +1 -0
- package/dist/api/middlewares/validate.js +31 -0
- package/dist/api/middlewares/validate.js.map +1 -0
- package/dist/api/routes/audit.routes.d.ts +5 -0
- package/dist/api/routes/audit.routes.d.ts.map +1 -0
- package/dist/api/routes/audit.routes.js +24 -0
- package/dist/api/routes/audit.routes.js.map +1 -0
- package/dist/api/routes/auth.routes.d.ts +6 -0
- package/dist/api/routes/auth.routes.d.ts.map +1 -0
- package/dist/api/routes/auth.routes.js +22 -0
- package/dist/api/routes/auth.routes.js.map +1 -0
- package/dist/api/routes/export.routes.d.ts +5 -0
- package/dist/api/routes/export.routes.d.ts.map +1 -0
- package/dist/api/routes/export.routes.js +16 -0
- package/dist/api/routes/export.routes.js.map +1 -0
- package/dist/api/routes/health.routes.d.ts +4 -0
- package/dist/api/routes/health.routes.d.ts.map +1 -0
- package/dist/api/routes/health.routes.js +11 -0
- package/dist/api/routes/health.routes.js.map +1 -0
- package/dist/api/routes/index.d.ts +10 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/index.js +20 -0
- package/dist/api/routes/index.js.map +1 -0
- package/dist/api/routes/providers.routes.d.ts +5 -0
- package/dist/api/routes/providers.routes.d.ts.map +1 -0
- package/dist/api/routes/providers.routes.js +13 -0
- package/dist/api/routes/providers.routes.js.map +1 -0
- package/dist/api/validators/audit.schemas.d.ts +60 -0
- package/dist/api/validators/audit.schemas.d.ts.map +1 -0
- package/dist/api/validators/audit.schemas.js +55 -0
- package/dist/api/validators/audit.schemas.js.map +1 -0
- package/dist/api/validators/auth.schemas.d.ts +17 -0
- package/dist/api/validators/auth.schemas.d.ts.map +1 -0
- package/dist/api/validators/auth.schemas.js +21 -0
- package/dist/api/validators/auth.schemas.js.map +1 -0
- package/dist/app.d.ts +3 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +62 -0
- package/dist/app.js.map +1 -0
- package/dist/config/config.schema.d.ts +65 -0
- package/dist/config/config.schema.d.ts.map +1 -0
- package/dist/config/config.schema.js +95 -0
- package/dist/config/config.schema.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +75 -0
- package/dist/config/index.js.map +1 -0
- package/dist/container.d.ts +47 -0
- package/dist/container.d.ts.map +1 -0
- package/dist/container.js +137 -0
- package/dist/container.js.map +1 -0
- package/dist/data/database.d.ts +13 -0
- package/dist/data/database.d.ts.map +1 -0
- package/dist/data/database.js +68 -0
- package/dist/data/database.js.map +1 -0
- package/dist/data/jobs/token-cleanup.job.d.ts +23 -0
- package/dist/data/jobs/token-cleanup.job.d.ts.map +1 -0
- package/dist/data/jobs/token-cleanup.job.js +96 -0
- package/dist/data/jobs/token-cleanup.job.js.map +1 -0
- package/dist/data/migrations/migration.runner.d.ts +13 -0
- package/dist/data/migrations/migration.runner.d.ts.map +1 -0
- package/dist/data/migrations/migration.runner.js +136 -0
- package/dist/data/migrations/migration.runner.js.map +1 -0
- package/dist/data/models/Token.model.d.ts +30 -0
- package/dist/data/models/Token.model.d.ts.map +1 -0
- package/dist/data/models/Token.model.js +3 -0
- package/dist/data/models/Token.model.js.map +1 -0
- package/dist/data/repositories/token.repository.d.ts +16 -0
- package/dist/data/repositories/token.repository.d.ts.map +1 -0
- package/dist/data/repositories/token.repository.js +97 -0
- package/dist/data/repositories/token.repository.js.map +1 -0
- package/dist/providers/azure/auth.provider.d.ts +5 -0
- package/dist/providers/azure/auth.provider.d.ts.map +1 -0
- package/dist/providers/azure/auth.provider.js +13 -0
- package/dist/providers/azure/auth.provider.js.map +1 -0
- package/dist/providers/azure/azure-errors.d.ts +40 -0
- package/dist/providers/azure/azure-errors.d.ts.map +1 -0
- package/dist/providers/azure/azure-errors.js +121 -0
- package/dist/providers/azure/azure-errors.js.map +1 -0
- package/dist/providers/azure/azure-retry.d.ts +41 -0
- package/dist/providers/azure/azure-retry.d.ts.map +1 -0
- package/dist/providers/azure/azure-retry.js +85 -0
- package/dist/providers/azure/azure-retry.js.map +1 -0
- package/dist/providers/azure/graph-client.d.ts +26 -0
- package/dist/providers/azure/graph-client.d.ts.map +1 -0
- package/dist/providers/azure/graph-client.js +146 -0
- package/dist/providers/azure/graph-client.js.map +1 -0
- package/dist/providers/azure/graph.provider.d.ts +23 -0
- package/dist/providers/azure/graph.provider.d.ts.map +1 -0
- package/dist/providers/azure/graph.provider.js +161 -0
- package/dist/providers/azure/graph.provider.js.map +1 -0
- package/dist/providers/azure/queries/app.queries.d.ts +6 -0
- package/dist/providers/azure/queries/app.queries.d.ts.map +1 -0
- package/dist/providers/azure/queries/app.queries.js +9 -0
- package/dist/providers/azure/queries/app.queries.js.map +1 -0
- package/dist/providers/azure/queries/policy.queries.d.ts +6 -0
- package/dist/providers/azure/queries/policy.queries.d.ts.map +1 -0
- package/dist/providers/azure/queries/policy.queries.js +9 -0
- package/dist/providers/azure/queries/policy.queries.js.map +1 -0
- package/dist/providers/azure/queries/user.queries.d.ts +7 -0
- package/dist/providers/azure/queries/user.queries.d.ts.map +1 -0
- package/dist/providers/azure/queries/user.queries.js +10 -0
- package/dist/providers/azure/queries/user.queries.js.map +1 -0
- package/dist/providers/interfaces/IGraphProvider.d.ts +31 -0
- package/dist/providers/interfaces/IGraphProvider.d.ts.map +1 -0
- package/dist/providers/interfaces/IGraphProvider.js +3 -0
- package/dist/providers/interfaces/IGraphProvider.js.map +1 -0
- package/dist/providers/interfaces/ILDAPProvider.d.ts +37 -0
- package/dist/providers/interfaces/ILDAPProvider.d.ts.map +1 -0
- package/dist/providers/interfaces/ILDAPProvider.js +3 -0
- package/dist/providers/interfaces/ILDAPProvider.js.map +1 -0
- package/dist/providers/ldap/acl-parser.d.ts +8 -0
- package/dist/providers/ldap/acl-parser.d.ts.map +1 -0
- package/dist/providers/ldap/acl-parser.js +157 -0
- package/dist/providers/ldap/acl-parser.js.map +1 -0
- package/dist/providers/ldap/ad-mappers.d.ts +8 -0
- package/dist/providers/ldap/ad-mappers.d.ts.map +1 -0
- package/dist/providers/ldap/ad-mappers.js +162 -0
- package/dist/providers/ldap/ad-mappers.js.map +1 -0
- package/dist/providers/ldap/ldap-client.d.ts +33 -0
- package/dist/providers/ldap/ldap-client.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-client.js +195 -0
- package/dist/providers/ldap/ldap-client.js.map +1 -0
- package/dist/providers/ldap/ldap-errors.d.ts +48 -0
- package/dist/providers/ldap/ldap-errors.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-errors.js +120 -0
- package/dist/providers/ldap/ldap-errors.js.map +1 -0
- package/dist/providers/ldap/ldap-retry.d.ts +14 -0
- package/dist/providers/ldap/ldap-retry.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-retry.js +102 -0
- package/dist/providers/ldap/ldap-retry.js.map +1 -0
- package/dist/providers/ldap/ldap-sanitizer.d.ts +12 -0
- package/dist/providers/ldap/ldap-sanitizer.d.ts.map +1 -0
- package/dist/providers/ldap/ldap-sanitizer.js +104 -0
- package/dist/providers/ldap/ldap-sanitizer.js.map +1 -0
- package/dist/providers/ldap/ldap.provider.d.ts +21 -0
- package/dist/providers/ldap/ldap.provider.d.ts.map +1 -0
- package/dist/providers/ldap/ldap.provider.js +165 -0
- package/dist/providers/ldap/ldap.provider.js.map +1 -0
- package/dist/providers/ldap/queries/computer.queries.d.ts +6 -0
- package/dist/providers/ldap/queries/computer.queries.d.ts.map +1 -0
- package/dist/providers/ldap/queries/computer.queries.js +9 -0
- package/dist/providers/ldap/queries/computer.queries.js.map +1 -0
- package/dist/providers/ldap/queries/group.queries.d.ts +6 -0
- package/dist/providers/ldap/queries/group.queries.d.ts.map +1 -0
- package/dist/providers/ldap/queries/group.queries.js +9 -0
- package/dist/providers/ldap/queries/group.queries.js.map +1 -0
- package/dist/providers/ldap/queries/user.queries.d.ts +7 -0
- package/dist/providers/ldap/queries/user.queries.d.ts.map +1 -0
- package/dist/providers/ldap/queries/user.queries.js +10 -0
- package/dist/providers/ldap/queries/user.queries.js.map +1 -0
- package/dist/providers/smb/smb.provider.d.ts +68 -0
- package/dist/providers/smb/smb.provider.d.ts.map +1 -0
- package/dist/providers/smb/smb.provider.js +382 -0
- package/dist/providers/smb/smb.provider.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +44 -0
- package/dist/server.js.map +1 -0
- package/dist/services/audit/ad-audit.service.d.ts +70 -0
- package/dist/services/audit/ad-audit.service.d.ts.map +1 -0
- package/dist/services/audit/ad-audit.service.js +1019 -0
- package/dist/services/audit/ad-audit.service.js.map +1 -0
- package/dist/services/audit/attack-graph.service.d.ts +62 -0
- package/dist/services/audit/attack-graph.service.d.ts.map +1 -0
- package/dist/services/audit/attack-graph.service.js +702 -0
- package/dist/services/audit/attack-graph.service.js.map +1 -0
- package/dist/services/audit/audit.service.d.ts +4 -0
- package/dist/services/audit/audit.service.d.ts.map +1 -0
- package/dist/services/audit/audit.service.js +10 -0
- package/dist/services/audit/audit.service.js.map +1 -0
- package/dist/services/audit/azure-audit.service.d.ts +37 -0
- package/dist/services/audit/azure-audit.service.d.ts.map +1 -0
- package/dist/services/audit/azure-audit.service.js +153 -0
- package/dist/services/audit/azure-audit.service.js.map +1 -0
- package/dist/services/audit/detectors/ad/accounts.detector.d.ts +37 -0
- package/dist/services/audit/detectors/ad/accounts.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/accounts.detector.js +881 -0
- package/dist/services/audit/detectors/ad/accounts.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/adcs.detector.d.ts +21 -0
- package/dist/services/audit/detectors/ad/adcs.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/adcs.detector.js +227 -0
- package/dist/services/audit/detectors/ad/adcs.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/advanced.detector.d.ts +63 -0
- package/dist/services/audit/detectors/ad/advanced.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/advanced.detector.js +867 -0
- package/dist/services/audit/detectors/ad/advanced.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.d.ts +16 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.js +369 -0
- package/dist/services/audit/detectors/ad/attack-paths.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/compliance.detector.d.ts +28 -0
- package/dist/services/audit/detectors/ad/compliance.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/compliance.detector.js +896 -0
- package/dist/services/audit/detectors/ad/compliance.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/computers.detector.d.ts +30 -0
- package/dist/services/audit/detectors/ad/computers.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/computers.detector.js +799 -0
- package/dist/services/audit/detectors/ad/computers.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/gpo.detector.d.ts +17 -0
- package/dist/services/audit/detectors/ad/gpo.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/gpo.detector.js +257 -0
- package/dist/services/audit/detectors/ad/gpo.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/groups.detector.d.ts +19 -0
- package/dist/services/audit/detectors/ad/groups.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/groups.detector.js +488 -0
- package/dist/services/audit/detectors/ad/groups.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/index.d.ts +15 -0
- package/dist/services/audit/detectors/ad/index.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/index.js +51 -0
- package/dist/services/audit/detectors/ad/index.js.map +1 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.d.ts +17 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.js +293 -0
- package/dist/services/audit/detectors/ad/kerberos.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.d.ts +23 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.js +328 -0
- package/dist/services/audit/detectors/ad/monitoring.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/network.detector.d.ts +39 -0
- package/dist/services/audit/detectors/ad/network.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/network.detector.js +257 -0
- package/dist/services/audit/detectors/ad/network.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/password.detector.d.ts +14 -0
- package/dist/services/audit/detectors/ad/password.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/password.detector.js +235 -0
- package/dist/services/audit/detectors/ad/password.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/permissions.detector.d.ts +20 -0
- package/dist/services/audit/detectors/ad/permissions.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/permissions.detector.js +392 -0
- package/dist/services/audit/detectors/ad/permissions.detector.js.map +1 -0
- package/dist/services/audit/detectors/ad/trusts.detector.d.ts +11 -0
- package/dist/services/audit/detectors/ad/trusts.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/ad/trusts.detector.js +186 -0
- package/dist/services/audit/detectors/ad/trusts.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/app-security.detector.d.ts +11 -0
- package/dist/services/audit/detectors/azure/app-security.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/app-security.detector.js +184 -0
- package/dist/services/audit/detectors/azure/app-security.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.d.ts +10 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.js +130 -0
- package/dist/services/audit/detectors/azure/conditional-access.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.d.ts +8 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.js +113 -0
- package/dist/services/audit/detectors/azure/privilege-security.detector.js.map +1 -0
- package/dist/services/audit/detectors/azure/user-security.detector.d.ts +14 -0
- package/dist/services/audit/detectors/azure/user-security.detector.d.ts.map +1 -0
- package/dist/services/audit/detectors/azure/user-security.detector.js +198 -0
- package/dist/services/audit/detectors/azure/user-security.detector.js.map +1 -0
- package/dist/services/audit/detectors/index.d.ts +2 -0
- package/dist/services/audit/detectors/index.d.ts.map +1 -0
- package/dist/services/audit/detectors/index.js +38 -0
- package/dist/services/audit/detectors/index.js.map +1 -0
- package/dist/services/audit/response-formatter.d.ts +176 -0
- package/dist/services/audit/response-formatter.d.ts.map +1 -0
- package/dist/services/audit/response-formatter.js +240 -0
- package/dist/services/audit/response-formatter.js.map +1 -0
- package/dist/services/audit/scoring.service.d.ts +15 -0
- package/dist/services/audit/scoring.service.d.ts.map +1 -0
- package/dist/services/audit/scoring.service.js +139 -0
- package/dist/services/audit/scoring.service.js.map +1 -0
- package/dist/services/auth/crypto.service.d.ts +19 -0
- package/dist/services/auth/crypto.service.d.ts.map +1 -0
- package/dist/services/auth/crypto.service.js +135 -0
- package/dist/services/auth/crypto.service.js.map +1 -0
- package/dist/services/auth/errors.d.ts +19 -0
- package/dist/services/auth/errors.d.ts.map +1 -0
- package/dist/services/auth/errors.js +46 -0
- package/dist/services/auth/errors.js.map +1 -0
- package/dist/services/auth/token.service.d.ts +41 -0
- package/dist/services/auth/token.service.d.ts.map +1 -0
- package/dist/services/auth/token.service.js +208 -0
- package/dist/services/auth/token.service.js.map +1 -0
- package/dist/services/config/config.service.d.ts +6 -0
- package/dist/services/config/config.service.d.ts.map +1 -0
- package/dist/services/config/config.service.js +64 -0
- package/dist/services/config/config.service.js.map +1 -0
- package/dist/services/export/export.service.d.ts +28 -0
- package/dist/services/export/export.service.d.ts.map +1 -0
- package/dist/services/export/export.service.js +28 -0
- package/dist/services/export/export.service.js.map +1 -0
- package/dist/services/export/formatters/csv.formatter.d.ts +8 -0
- package/dist/services/export/formatters/csv.formatter.d.ts.map +1 -0
- package/dist/services/export/formatters/csv.formatter.js +46 -0
- package/dist/services/export/formatters/csv.formatter.js.map +1 -0
- package/dist/services/export/formatters/json.formatter.d.ts +40 -0
- package/dist/services/export/formatters/json.formatter.d.ts.map +1 -0
- package/dist/services/export/formatters/json.formatter.js +58 -0
- package/dist/services/export/formatters/json.formatter.js.map +1 -0
- package/dist/services/jobs/azure-job-runner.d.ts +38 -0
- package/dist/services/jobs/azure-job-runner.d.ts.map +1 -0
- package/dist/services/jobs/azure-job-runner.js +199 -0
- package/dist/services/jobs/azure-job-runner.js.map +1 -0
- package/dist/services/jobs/index.d.ts +4 -0
- package/dist/services/jobs/index.d.ts.map +1 -0
- package/dist/services/jobs/index.js +20 -0
- package/dist/services/jobs/index.js.map +1 -0
- package/dist/services/jobs/job-runner.d.ts +64 -0
- package/dist/services/jobs/job-runner.d.ts.map +1 -0
- package/dist/services/jobs/job-runner.js +952 -0
- package/dist/services/jobs/job-runner.js.map +1 -0
- package/dist/services/jobs/job-store.d.ts +27 -0
- package/dist/services/jobs/job-store.d.ts.map +1 -0
- package/dist/services/jobs/job-store.js +261 -0
- package/dist/services/jobs/job-store.js.map +1 -0
- package/dist/services/jobs/job.types.d.ts +67 -0
- package/dist/services/jobs/job.types.d.ts.map +1 -0
- package/dist/services/jobs/job.types.js +36 -0
- package/dist/services/jobs/job.types.js.map +1 -0
- package/dist/types/ad.types.d.ts +74 -0
- package/dist/types/ad.types.d.ts.map +1 -0
- package/dist/types/ad.types.js +3 -0
- package/dist/types/ad.types.js.map +1 -0
- package/dist/types/adcs.types.d.ts +58 -0
- package/dist/types/adcs.types.d.ts.map +1 -0
- package/dist/types/adcs.types.js +38 -0
- package/dist/types/adcs.types.js.map +1 -0
- package/dist/types/attack-graph.types.d.ts +135 -0
- package/dist/types/attack-graph.types.d.ts.map +1 -0
- package/dist/types/attack-graph.types.js +58 -0
- package/dist/types/attack-graph.types.js.map +1 -0
- package/dist/types/audit.types.d.ts +34 -0
- package/dist/types/audit.types.d.ts.map +1 -0
- package/dist/types/audit.types.js +3 -0
- package/dist/types/audit.types.js.map +1 -0
- package/dist/types/azure.types.d.ts +61 -0
- package/dist/types/azure.types.d.ts.map +1 -0
- package/dist/types/azure.types.js +3 -0
- package/dist/types/azure.types.js.map +1 -0
- package/dist/types/config.types.d.ts +63 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +3 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/error.types.d.ts +33 -0
- package/dist/types/error.types.d.ts.map +1 -0
- package/dist/types/error.types.js +70 -0
- package/dist/types/error.types.js.map +1 -0
- package/dist/types/finding.types.d.ts +133 -0
- package/dist/types/finding.types.d.ts.map +1 -0
- package/dist/types/finding.types.js +3 -0
- package/dist/types/finding.types.js.map +1 -0
- package/dist/types/gpo.types.d.ts +39 -0
- package/dist/types/gpo.types.d.ts.map +1 -0
- package/dist/types/gpo.types.js +15 -0
- package/dist/types/gpo.types.js.map +1 -0
- package/dist/types/token.types.d.ts +26 -0
- package/dist/types/token.types.d.ts.map +1 -0
- package/dist/types/token.types.js +3 -0
- package/dist/types/token.types.js.map +1 -0
- package/dist/types/trust.types.d.ts +45 -0
- package/dist/types/trust.types.d.ts.map +1 -0
- package/dist/types/trust.types.js +71 -0
- package/dist/types/trust.types.js.map +1 -0
- package/dist/utils/entity-converter.d.ts +17 -0
- package/dist/utils/entity-converter.d.ts.map +1 -0
- package/dist/utils/entity-converter.js +285 -0
- package/dist/utils/entity-converter.js.map +1 -0
- package/dist/utils/graph.util.d.ts +66 -0
- package/dist/utils/graph.util.d.ts.map +1 -0
- package/dist/utils/graph.util.js +382 -0
- package/dist/utils/graph.util.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +86 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/type-name-normalizer.d.ts +5 -0
- package/dist/utils/type-name-normalizer.d.ts.map +1 -0
- package/dist/utils/type-name-normalizer.js +218 -0
- package/dist/utils/type-name-normalizer.js.map +1 -0
- package/docker-compose.yml +26 -0
- package/docs/api/README.md +178 -0
- package/docs/api/openapi.yaml +1524 -0
- package/eslint.config.js +54 -0
- package/jest.config.js +38 -0
- package/package.json +97 -0
- package/scripts/fetch-ad-cert.sh +142 -0
- package/src/.gitkeep +0 -0
- package/src/api/.gitkeep +0 -0
- package/src/api/controllers/.gitkeep +0 -0
- package/src/api/controllers/audit.controller.ts +313 -0
- package/src/api/controllers/auth.controller.ts +258 -0
- package/src/api/controllers/export.controller.ts +153 -0
- package/src/api/controllers/health.controller.ts +16 -0
- package/src/api/controllers/jobs.controller.ts +187 -0
- package/src/api/controllers/providers.controller.ts +165 -0
- package/src/api/dto/.gitkeep +0 -0
- package/src/api/dto/AuditRequest.dto.ts +8 -0
- package/src/api/dto/AuditResponse.dto.ts +19 -0
- package/src/api/dto/TokenRequest.dto.ts +8 -0
- package/src/api/dto/TokenResponse.dto.ts +14 -0
- package/src/api/middlewares/.gitkeep +0 -0
- package/src/api/middlewares/authenticate.ts +203 -0
- package/src/api/middlewares/errorHandler.ts +54 -0
- package/src/api/middlewares/rateLimit.ts +35 -0
- package/src/api/middlewares/validate.ts +32 -0
- package/src/api/routes/.gitkeep +0 -0
- package/src/api/routes/audit.routes.ts +77 -0
- package/src/api/routes/auth.routes.ts +71 -0
- package/src/api/routes/export.routes.ts +34 -0
- package/src/api/routes/health.routes.ts +14 -0
- package/src/api/routes/index.ts +40 -0
- package/src/api/routes/providers.routes.ts +24 -0
- package/src/api/validators/.gitkeep +0 -0
- package/src/api/validators/audit.schemas.ts +59 -0
- package/src/api/validators/auth.schemas.ts +59 -0
- package/src/app.ts +87 -0
- package/src/config/.gitkeep +0 -0
- package/src/config/config.schema.ts +108 -0
- package/src/config/index.ts +82 -0
- package/src/container.ts +221 -0
- package/src/data/.gitkeep +0 -0
- package/src/data/database.ts +78 -0
- package/src/data/jobs/token-cleanup.job.ts +166 -0
- package/src/data/migrations/.gitkeep +0 -0
- package/src/data/migrations/001_initial_schema.sql +47 -0
- package/src/data/migrations/migration.runner.ts +125 -0
- package/src/data/models/.gitkeep +0 -0
- package/src/data/models/Token.model.ts +35 -0
- package/src/data/repositories/.gitkeep +0 -0
- package/src/data/repositories/token.repository.ts +160 -0
- package/src/providers/.gitkeep +0 -0
- package/src/providers/azure/.gitkeep +0 -0
- package/src/providers/azure/auth.provider.ts +14 -0
- package/src/providers/azure/azure-errors.ts +189 -0
- package/src/providers/azure/azure-retry.ts +168 -0
- package/src/providers/azure/graph-client.ts +315 -0
- package/src/providers/azure/graph.provider.ts +294 -0
- package/src/providers/azure/queries/app.queries.ts +9 -0
- package/src/providers/azure/queries/policy.queries.ts +9 -0
- package/src/providers/azure/queries/user.queries.ts +10 -0
- package/src/providers/interfaces/.gitkeep +0 -0
- package/src/providers/interfaces/IGraphProvider.ts +117 -0
- package/src/providers/interfaces/ILDAPProvider.ts +142 -0
- package/src/providers/ldap/.gitkeep +0 -0
- package/src/providers/ldap/acl-parser.ts +231 -0
- package/src/providers/ldap/ad-mappers.ts +280 -0
- package/src/providers/ldap/ldap-client.ts +259 -0
- package/src/providers/ldap/ldap-errors.ts +188 -0
- package/src/providers/ldap/ldap-retry.ts +267 -0
- package/src/providers/ldap/ldap-sanitizer.ts +273 -0
- package/src/providers/ldap/ldap.provider.ts +293 -0
- package/src/providers/ldap/queries/computer.queries.ts +9 -0
- package/src/providers/ldap/queries/group.queries.ts +9 -0
- package/src/providers/ldap/queries/user.queries.ts +10 -0
- package/src/providers/smb/smb.provider.ts +653 -0
- package/src/server.ts +60 -0
- package/src/services/.gitkeep +0 -0
- package/src/services/audit/.gitkeep +0 -0
- package/src/services/audit/ad-audit.service.ts +1481 -0
- package/src/services/audit/attack-graph.service.ts +1104 -0
- package/src/services/audit/audit.service.ts +12 -0
- package/src/services/audit/azure-audit.service.ts +286 -0
- package/src/services/audit/detectors/ad/accounts.detector.ts +1232 -0
- package/src/services/audit/detectors/ad/adcs.detector.ts +449 -0
- package/src/services/audit/detectors/ad/advanced.detector.ts +1270 -0
- package/src/services/audit/detectors/ad/attack-paths.detector.ts +600 -0
- package/src/services/audit/detectors/ad/compliance.detector.ts +1421 -0
- package/src/services/audit/detectors/ad/computers.detector.ts +1188 -0
- package/src/services/audit/detectors/ad/gpo.detector.ts +485 -0
- package/src/services/audit/detectors/ad/groups.detector.ts +685 -0
- package/src/services/audit/detectors/ad/index.ts +84 -0
- package/src/services/audit/detectors/ad/kerberos.detector.ts +424 -0
- package/src/services/audit/detectors/ad/monitoring.detector.ts +501 -0
- package/src/services/audit/detectors/ad/network.detector.ts +538 -0
- package/src/services/audit/detectors/ad/password.detector.ts +324 -0
- package/src/services/audit/detectors/ad/permissions.detector.ts +637 -0
- package/src/services/audit/detectors/ad/trusts.detector.ts +315 -0
- package/src/services/audit/detectors/azure/app-security.detector.ts +246 -0
- package/src/services/audit/detectors/azure/conditional-access.detector.ts +186 -0
- package/src/services/audit/detectors/azure/privilege-security.detector.ts +176 -0
- package/src/services/audit/detectors/azure/user-security.detector.ts +280 -0
- package/src/services/audit/detectors/index.ts +18 -0
- package/src/services/audit/response-formatter.ts +604 -0
- package/src/services/audit/scoring.service.ts +234 -0
- package/src/services/auth/.gitkeep +0 -0
- package/src/services/auth/crypto.service.ts +230 -0
- package/src/services/auth/errors.ts +47 -0
- package/src/services/auth/token.service.ts +420 -0
- package/src/services/config/.gitkeep +0 -0
- package/src/services/config/config.service.ts +75 -0
- package/src/services/export/.gitkeep +0 -0
- package/src/services/export/export.service.ts +99 -0
- package/src/services/export/formatters/csv.formatter.ts +124 -0
- package/src/services/export/formatters/json.formatter.ts +160 -0
- package/src/services/jobs/azure-job-runner.ts +312 -0
- package/src/services/jobs/index.ts +9 -0
- package/src/services/jobs/job-runner.ts +1280 -0
- package/src/services/jobs/job-store.ts +384 -0
- package/src/services/jobs/job.types.ts +182 -0
- package/src/types/.gitkeep +0 -0
- package/src/types/ad.types.ts +91 -0
- package/src/types/adcs.types.ts +107 -0
- package/src/types/attack-graph.types.ts +260 -0
- package/src/types/audit.types.ts +42 -0
- package/src/types/azure.types.ts +68 -0
- package/src/types/config.types.ts +79 -0
- package/src/types/error.types.ts +69 -0
- package/src/types/finding.types.ts +284 -0
- package/src/types/gpo.types.ts +72 -0
- package/src/types/smb2.d.ts +73 -0
- package/src/types/token.types.ts +32 -0
- package/src/types/trust.types.ts +140 -0
- package/src/utils/.gitkeep +0 -0
- package/src/utils/entity-converter.ts +453 -0
- package/src/utils/graph.util.ts +609 -0
- package/src/utils/logger.ts +111 -0
- package/src/utils/type-name-normalizer.ts +302 -0
- package/tests/.gitkeep +0 -0
- package/tests/e2e/.gitkeep +0 -0
- package/tests/fixtures/.gitkeep +0 -0
- package/tests/integration/.gitkeep +0 -0
- package/tests/integration/README.md +156 -0
- package/tests/integration/ad-audit.integration.test.ts +216 -0
- package/tests/integration/api/.gitkeep +0 -0
- package/tests/integration/api/endpoints.integration.test.ts +431 -0
- package/tests/integration/auth/jwt-authentication.integration.test.ts +358 -0
- package/tests/integration/providers/.gitkeep +0 -0
- package/tests/integration/providers/azure-basic.integration.test.ts +167 -0
- package/tests/integration/providers/ldap-basic.integration.test.ts +152 -0
- package/tests/integration/providers/ldap-connectivity.test.ts +44 -0
- package/tests/integration/providers/ldap-provider.integration.test.ts +347 -0
- package/tests/mocks/.gitkeep +0 -0
- package/tests/setup.ts +16 -0
- package/tests/unit/.gitkeep +0 -0
- package/tests/unit/api/middlewares/authenticate.test.ts +446 -0
- package/tests/unit/providers/.gitkeep +0 -0
- package/tests/unit/providers/azure/azure-errors.test.ts +193 -0
- package/tests/unit/providers/azure/azure-retry.test.ts +254 -0
- package/tests/unit/providers/azure/graph-provider.test.ts +313 -0
- package/tests/unit/providers/ldap/ad-mappers.test.ts +392 -0
- package/tests/unit/providers/ldap/ldap-provider.test.ts +376 -0
- package/tests/unit/providers/ldap/ldap-retry.test.ts +377 -0
- package/tests/unit/providers/ldap/ldap-sanitizer.test.ts +301 -0
- package/tests/unit/sample.test.ts +19 -0
- package/tests/unit/services/.gitkeep +0 -0
- package/tests/unit/services/audit/detectors/ad/accounts.detector.test.ts +393 -0
- package/tests/unit/services/audit/detectors/ad/advanced.detector.test.ts +380 -0
- package/tests/unit/services/audit/detectors/ad/computers.detector.test.ts +440 -0
- package/tests/unit/services/audit/detectors/ad/groups.detector.test.ts +276 -0
- package/tests/unit/services/audit/detectors/ad/kerberos.detector.test.ts +215 -0
- package/tests/unit/services/audit/detectors/ad/password.detector.test.ts +226 -0
- package/tests/unit/services/audit/detectors/ad/permissions.detector.test.ts +244 -0
- package/tests/unit/services/audit/detectors/azure/app-security.detector.test.ts +349 -0
- package/tests/unit/services/audit/detectors/azure/conditional-access.detector.test.ts +374 -0
- package/tests/unit/services/audit/detectors/azure/privilege-security.detector.test.ts +374 -0
- package/tests/unit/services/audit/detectors/azure/user-security.detector.test.ts +297 -0
- package/tests/unit/services/auth/crypto.service.test.ts +296 -0
- package/tests/unit/services/auth/token.service.test.ts +579 -0
- package/tests/unit/services/export/export.service.test.ts +241 -0
- package/tests/unit/services/export/formatters/csv.formatter.test.ts +270 -0
- package/tests/unit/services/export/formatters/json.formatter.test.ts +258 -0
- package/tests/unit/utils/.gitkeep +0 -0
- package/tsconfig.json +50 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { AzureUser, AzureGroup, AzureApp, AzurePolicy } from '../../types/azure.types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Microsoft Graph Provider Interface
|
|
5
|
+
*
|
|
6
|
+
* Defines the contract for Microsoft Graph API / Azure AD connectivity.
|
|
7
|
+
* Implementations must support OAuth 2.0 client credentials flow with rate limiting.
|
|
8
|
+
*
|
|
9
|
+
* Task 1: Define Azure Provider Interface (Story 1.6)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Azure connection test result
|
|
14
|
+
*/
|
|
15
|
+
export interface AzureConnectionTestResult {
|
|
16
|
+
success: boolean;
|
|
17
|
+
message: string;
|
|
18
|
+
details?: {
|
|
19
|
+
tenantId: string;
|
|
20
|
+
clientId: string;
|
|
21
|
+
graphApiUrl: string;
|
|
22
|
+
authenticated: boolean;
|
|
23
|
+
permissions?: string[];
|
|
24
|
+
responseTime: number; // milliseconds
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Query options for Graph API
|
|
30
|
+
*/
|
|
31
|
+
export interface GraphQueryOptions {
|
|
32
|
+
filter?: string;
|
|
33
|
+
select?: string[];
|
|
34
|
+
expand?: string[];
|
|
35
|
+
orderBy?: string;
|
|
36
|
+
top?: number;
|
|
37
|
+
skip?: number;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Microsoft Graph Provider Interface
|
|
42
|
+
*
|
|
43
|
+
* Provides methods for connecting to Microsoft Graph API and querying Azure AD objects.
|
|
44
|
+
*/
|
|
45
|
+
export interface IGraphProvider {
|
|
46
|
+
/**
|
|
47
|
+
* Authenticate with Microsoft Graph
|
|
48
|
+
*
|
|
49
|
+
* Obtains an access token using OAuth 2.0 client credentials flow.
|
|
50
|
+
* The token is cached and automatically refreshed when expired.
|
|
51
|
+
*
|
|
52
|
+
* @throws {AzureAuthenticationError} If authentication fails
|
|
53
|
+
*/
|
|
54
|
+
authenticate(): Promise<void>;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Test connection to Microsoft Graph API
|
|
58
|
+
*
|
|
59
|
+
* Verifies that the client credentials are valid and can authenticate with Graph API.
|
|
60
|
+
* Returns detailed diagnostics including tenant info and permissions.
|
|
61
|
+
*
|
|
62
|
+
* @returns Connection test result with success status and diagnostics
|
|
63
|
+
*/
|
|
64
|
+
testConnection(): Promise<AzureConnectionTestResult>;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Query Azure AD users
|
|
68
|
+
*
|
|
69
|
+
* Retrieves users from Azure AD with optional filtering and pagination.
|
|
70
|
+
*
|
|
71
|
+
* @param options - Query options (filter, select, top, etc.)
|
|
72
|
+
* @returns Array of Azure AD users
|
|
73
|
+
* @throws {AzureAPIError} If the API request fails
|
|
74
|
+
*/
|
|
75
|
+
getUsers(options?: GraphQueryOptions): Promise<AzureUser[]>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Query Azure AD groups
|
|
79
|
+
*
|
|
80
|
+
* Retrieves security and Microsoft 365 groups from Azure AD.
|
|
81
|
+
*
|
|
82
|
+
* @param options - Query options (filter, select, top, etc.)
|
|
83
|
+
* @returns Array of Azure AD groups
|
|
84
|
+
* @throws {AzureAPIError} If the API request fails
|
|
85
|
+
*/
|
|
86
|
+
getGroups(options?: GraphQueryOptions): Promise<AzureGroup[]>;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Query Azure AD applications
|
|
90
|
+
*
|
|
91
|
+
* Retrieves application registrations from Azure AD.
|
|
92
|
+
*
|
|
93
|
+
* @param options - Query options (filter, select, top, etc.)
|
|
94
|
+
* @returns Array of Azure AD applications
|
|
95
|
+
* @throws {AzureAPIError} If the API request fails
|
|
96
|
+
*/
|
|
97
|
+
getApplications(options?: GraphQueryOptions): Promise<AzureApp[]>;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Query Conditional Access policies
|
|
101
|
+
*
|
|
102
|
+
* Retrieves Conditional Access policies from Azure AD.
|
|
103
|
+
*
|
|
104
|
+
* @param options - Query options (filter, select, top, etc.)
|
|
105
|
+
* @returns Array of Conditional Access policies
|
|
106
|
+
* @throws {AzureAPIError} If the API request fails
|
|
107
|
+
*/
|
|
108
|
+
getPolicies(options?: GraphQueryOptions): Promise<AzurePolicy[]>;
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Disconnect from Microsoft Graph
|
|
112
|
+
*
|
|
113
|
+
* Clears any cached tokens or connection state.
|
|
114
|
+
* Safe to call multiple times.
|
|
115
|
+
*/
|
|
116
|
+
disconnect(): Promise<void>;
|
|
117
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { ADUser, ADGroup, ADComputer, ADOU } from '../../types/ad.types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* LDAP Provider Interface
|
|
5
|
+
*
|
|
6
|
+
* Defines the contract for LDAP/Active Directory connectivity.
|
|
7
|
+
* Implementations must support LDAP (389) and LDAPS (636) with TLS verification.
|
|
8
|
+
*
|
|
9
|
+
* Task 1: Define LDAP Provider Interface (Story 1.5)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* LDAP Control
|
|
14
|
+
*/
|
|
15
|
+
export interface LDAPControl {
|
|
16
|
+
oid: string;
|
|
17
|
+
critical?: boolean;
|
|
18
|
+
value?: Buffer | string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* LDAP search options
|
|
23
|
+
*/
|
|
24
|
+
export interface SearchOptions {
|
|
25
|
+
filter: string;
|
|
26
|
+
scope: 'base' | 'one' | 'sub';
|
|
27
|
+
attributes?: string[];
|
|
28
|
+
sizeLimit?: number;
|
|
29
|
+
timeLimit?: number;
|
|
30
|
+
paged?: boolean;
|
|
31
|
+
controls?: LDAPControl[];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Connection test result
|
|
36
|
+
*/
|
|
37
|
+
export interface ConnectionTestResult {
|
|
38
|
+
success: boolean;
|
|
39
|
+
message: string;
|
|
40
|
+
details?: {
|
|
41
|
+
url: string;
|
|
42
|
+
baseDN: string;
|
|
43
|
+
protocol: 'ldap' | 'ldaps';
|
|
44
|
+
bindDN: string;
|
|
45
|
+
responseTime: number; // milliseconds
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* LDAP Provider Interface
|
|
51
|
+
*
|
|
52
|
+
* Provides methods for connecting to Active Directory and querying objects.
|
|
53
|
+
*/
|
|
54
|
+
export interface ILDAPProvider {
|
|
55
|
+
/**
|
|
56
|
+
* Connect and bind to LDAP server
|
|
57
|
+
*
|
|
58
|
+
* Establishes connection and authenticates with bind DN/password.
|
|
59
|
+
* Supports both LDAP (389) and LDAPS (636) protocols.
|
|
60
|
+
*
|
|
61
|
+
* @throws Error if connection or bind fails
|
|
62
|
+
*/
|
|
63
|
+
connect(): Promise<void>;
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Disconnect from LDAP server
|
|
67
|
+
*
|
|
68
|
+
* Cleanly closes the LDAP connection.
|
|
69
|
+
* Safe to call even if not connected.
|
|
70
|
+
*/
|
|
71
|
+
disconnect(): Promise<void>;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Test LDAP connection
|
|
75
|
+
*
|
|
76
|
+
* Verifies connectivity to LDAP server and performs a test bind.
|
|
77
|
+
* Returns detailed connection information including response time.
|
|
78
|
+
*
|
|
79
|
+
* @returns Connection test result with success status and details
|
|
80
|
+
*/
|
|
81
|
+
testConnection(): Promise<ConnectionTestResult>;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Search for users in Active Directory
|
|
85
|
+
*
|
|
86
|
+
* Queries for user objects matching the filter.
|
|
87
|
+
* Default filter: (objectClass=user)(objectCategory=person)
|
|
88
|
+
*
|
|
89
|
+
* @param filter - Optional LDAP filter (default: all users)
|
|
90
|
+
* @param attributes - Optional attributes to retrieve (default: all)
|
|
91
|
+
* @returns Array of AD user objects
|
|
92
|
+
*/
|
|
93
|
+
searchUsers(filter?: string, attributes?: string[]): Promise<ADUser[]>;
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Search for groups in Active Directory
|
|
97
|
+
*
|
|
98
|
+
* Queries for group objects matching the filter.
|
|
99
|
+
* Default filter: (objectClass=group)
|
|
100
|
+
*
|
|
101
|
+
* @param filter - Optional LDAP filter (default: all groups)
|
|
102
|
+
* @param attributes - Optional attributes to retrieve (default: all)
|
|
103
|
+
* @returns Array of AD group objects
|
|
104
|
+
*/
|
|
105
|
+
searchGroups(filter?: string, attributes?: string[]): Promise<ADGroup[]>;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Search for computers in Active Directory
|
|
109
|
+
*
|
|
110
|
+
* Queries for computer objects matching the filter.
|
|
111
|
+
* Default filter: (objectClass=computer)
|
|
112
|
+
*
|
|
113
|
+
* @param filter - Optional LDAP filter (default: all computers)
|
|
114
|
+
* @param attributes - Optional attributes to retrieve (default: all)
|
|
115
|
+
* @returns Array of AD computer objects
|
|
116
|
+
*/
|
|
117
|
+
searchComputers(filter?: string, attributes?: string[]): Promise<ADComputer[]>;
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Search for organizational units in Active Directory
|
|
121
|
+
*
|
|
122
|
+
* Queries for OU objects matching the filter.
|
|
123
|
+
* Default filter: (objectClass=organizationalUnit)
|
|
124
|
+
*
|
|
125
|
+
* @param filter - Optional LDAP filter (default: all OUs)
|
|
126
|
+
* @param attributes - Optional attributes to retrieve (default: all)
|
|
127
|
+
* @returns Array of AD OU objects
|
|
128
|
+
*/
|
|
129
|
+
searchOUs(filter?: string, attributes?: string[]): Promise<ADOU[]>;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Generic LDAP search
|
|
133
|
+
*
|
|
134
|
+
* Performs a low-level LDAP search with custom base DN and options.
|
|
135
|
+
* Use this for advanced queries or custom object types.
|
|
136
|
+
*
|
|
137
|
+
* @param baseDN - Base distinguished name for search
|
|
138
|
+
* @param options - Search options (filter, scope, attributes, etc.)
|
|
139
|
+
* @returns Array of search results
|
|
140
|
+
*/
|
|
141
|
+
search<T>(baseDN: string, options: SearchOptions): Promise<T[]>;
|
|
142
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Windows Security Descriptor & ACL Parser
|
|
3
|
+
*
|
|
4
|
+
* Parses binary ntSecurityDescriptor attribute from AD
|
|
5
|
+
* to extract Access Control Entries (ACEs) for security analysis.
|
|
6
|
+
*
|
|
7
|
+
* References:
|
|
8
|
+
* - MS-DTYP: Security Descriptor
|
|
9
|
+
* - https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-dtyp/
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { AclEntry } from '../../types/ad.types';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* ACE Types
|
|
16
|
+
*/
|
|
17
|
+
enum AceType {
|
|
18
|
+
ACCESS_ALLOWED = 0x00,
|
|
19
|
+
ACCESS_DENIED = 0x01,
|
|
20
|
+
SYSTEM_AUDIT = 0x02,
|
|
21
|
+
ACCESS_ALLOWED_OBJECT = 0x05,
|
|
22
|
+
ACCESS_DENIED_OBJECT = 0x06,
|
|
23
|
+
SYSTEM_AUDIT_OBJECT = 0x07,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* ACE Flags for Object ACEs
|
|
28
|
+
*/
|
|
29
|
+
enum ObjectAceFlags {
|
|
30
|
+
NONE = 0x00,
|
|
31
|
+
ACE_OBJECT_TYPE_PRESENT = 0x01,
|
|
32
|
+
ACE_INHERITED_OBJECT_TYPE_PRESENT = 0x02,
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parse ntSecurityDescriptor binary data into ACL entries
|
|
37
|
+
*
|
|
38
|
+
* @param securityDescriptor Binary security descriptor buffer
|
|
39
|
+
* @param objectDn DN of the object (for reference)
|
|
40
|
+
* @returns Array of ACL entries
|
|
41
|
+
*/
|
|
42
|
+
export function parseSecurityDescriptor(securityDescriptor: Buffer, objectDn: string): AclEntry[] {
|
|
43
|
+
if (!securityDescriptor || securityDescriptor.length < 20) {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
parseStats.total++;
|
|
49
|
+
const aclEntries: AclEntry[] = [];
|
|
50
|
+
|
|
51
|
+
// Parse Security Descriptor header
|
|
52
|
+
// const revision = securityDescriptor.readUInt8(0); // Not used
|
|
53
|
+
const control = securityDescriptor.readUInt16LE(2);
|
|
54
|
+
|
|
55
|
+
// Check if DACL is present (SE_DACL_PRESENT = 0x0004)
|
|
56
|
+
const daclPresent = (control & 0x0004) !== 0;
|
|
57
|
+
if (!daclPresent) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Get DACL offset
|
|
62
|
+
const daclOffset = securityDescriptor.readUInt32LE(16);
|
|
63
|
+
if (daclOffset === 0 || daclOffset >= securityDescriptor.length) {
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Parse DACL
|
|
68
|
+
const dacl = securityDescriptor.slice(daclOffset);
|
|
69
|
+
// const aclRevision = dacl.readUInt8(0); // Not used
|
|
70
|
+
const aclSize = dacl.readUInt16LE(2);
|
|
71
|
+
const aceCount = dacl.readUInt16LE(4);
|
|
72
|
+
|
|
73
|
+
// Parse each ACE
|
|
74
|
+
let aceOffset = 8; // ACL header is 8 bytes
|
|
75
|
+
for (let i = 0; i < aceCount; i++) {
|
|
76
|
+
if (aceOffset >= aclSize) break;
|
|
77
|
+
|
|
78
|
+
const ace = parseAce(dacl, aceOffset, objectDn);
|
|
79
|
+
if (ace) {
|
|
80
|
+
aclEntries.push(ace);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Move to next ACE
|
|
84
|
+
const aceSize = dacl.readUInt16LE(aceOffset + 2);
|
|
85
|
+
aceOffset += aceSize;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (aclEntries.length > 0) {
|
|
89
|
+
parseStats.withACEs++;
|
|
90
|
+
}
|
|
91
|
+
return aclEntries;
|
|
92
|
+
} catch (error) {
|
|
93
|
+
// Silently fail on parse errors - many objects may have unusual security descriptors
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Track parsing stats (for debugging)
|
|
99
|
+
let parseStats = { total: 0, withACEs: 0 };
|
|
100
|
+
export function getParseStats() {
|
|
101
|
+
return parseStats;
|
|
102
|
+
}
|
|
103
|
+
export function resetParseStats() {
|
|
104
|
+
parseStats = { total: 0, withACEs: 0 };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Parse a single ACE from DACL
|
|
109
|
+
*/
|
|
110
|
+
function parseAce(dacl: Buffer, offset: number, objectDn: string): AclEntry | null {
|
|
111
|
+
try {
|
|
112
|
+
const aceType = dacl.readUInt8(offset);
|
|
113
|
+
// const aceFlags = dacl.readUInt8(offset + 1); // Not used
|
|
114
|
+
// const aceSize = dacl.readUInt16LE(offset + 2); // Read in caller loop
|
|
115
|
+
const accessMask = dacl.readUInt32LE(offset + 4);
|
|
116
|
+
|
|
117
|
+
// We only care about ACCESS_ALLOWED and ACCESS_ALLOWED_OBJECT ACEs
|
|
118
|
+
if (aceType !== AceType.ACCESS_ALLOWED && aceType !== AceType.ACCESS_ALLOWED_OBJECT) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
let sidOffset = 8; // Standard ACE: type(1) + flags(1) + size(2) + mask(4)
|
|
123
|
+
let objectType: string | undefined;
|
|
124
|
+
|
|
125
|
+
// Handle Object ACEs (have optional GUIDs before SID)
|
|
126
|
+
if (aceType === AceType.ACCESS_ALLOWED_OBJECT) {
|
|
127
|
+
const objectFlags = dacl.readUInt32LE(offset + 8);
|
|
128
|
+
sidOffset = 12; // Object ACE: + flags(4)
|
|
129
|
+
|
|
130
|
+
// If ACE_OBJECT_TYPE_PRESENT flag is set, there's a GUID
|
|
131
|
+
if ((objectFlags & ObjectAceFlags.ACE_OBJECT_TYPE_PRESENT) !== 0) {
|
|
132
|
+
objectType = parseGuid(dacl, offset + sidOffset);
|
|
133
|
+
sidOffset += 16; // GUID is 16 bytes
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// If ACE_INHERITED_OBJECT_TYPE_PRESENT flag is set, skip inherited GUID
|
|
137
|
+
if ((objectFlags & ObjectAceFlags.ACE_INHERITED_OBJECT_TYPE_PRESENT) !== 0) {
|
|
138
|
+
sidOffset += 16;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Parse SID
|
|
143
|
+
const sid = parseSid(dacl, offset + sidOffset);
|
|
144
|
+
|
|
145
|
+
return {
|
|
146
|
+
objectDn,
|
|
147
|
+
trustee: sid,
|
|
148
|
+
accessMask,
|
|
149
|
+
aceType: aceTypeToString(aceType),
|
|
150
|
+
objectType,
|
|
151
|
+
};
|
|
152
|
+
} catch (error) {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Parse Windows SID from binary format
|
|
159
|
+
*/
|
|
160
|
+
function parseSid(buffer: Buffer, offset: number): string {
|
|
161
|
+
try {
|
|
162
|
+
const revision = buffer.readUInt8(offset);
|
|
163
|
+
const subAuthorityCount = buffer.readUInt8(offset + 1);
|
|
164
|
+
|
|
165
|
+
// Read identifier authority (6 bytes, big-endian)
|
|
166
|
+
const identifierAuthority =
|
|
167
|
+
buffer.readUInt8(offset + 2) * 0x0000010000000000 +
|
|
168
|
+
buffer.readUInt8(offset + 3) * 0x0000000100000000 +
|
|
169
|
+
buffer.readUInt8(offset + 4) * 0x0000000001000000 +
|
|
170
|
+
buffer.readUInt8(offset + 5) * 0x0000000000010000 +
|
|
171
|
+
buffer.readUInt8(offset + 6) * 0x0000000000000100 +
|
|
172
|
+
buffer.readUInt8(offset + 7);
|
|
173
|
+
|
|
174
|
+
// Build SID string
|
|
175
|
+
let sid = `S-${revision}-${identifierAuthority}`;
|
|
176
|
+
|
|
177
|
+
// Read sub-authorities (4 bytes each, little-endian)
|
|
178
|
+
let subAuthOffset = offset + 8;
|
|
179
|
+
for (let i = 0; i < subAuthorityCount; i++) {
|
|
180
|
+
const subAuth = buffer.readUInt32LE(subAuthOffset);
|
|
181
|
+
sid += `-${subAuth}`;
|
|
182
|
+
subAuthOffset += 4;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
return sid;
|
|
186
|
+
} catch (error) {
|
|
187
|
+
return 'S-1-0-0'; // Return null SID on error
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Parse GUID from binary format to string
|
|
193
|
+
*/
|
|
194
|
+
function parseGuid(buffer: Buffer, offset: number): string {
|
|
195
|
+
try {
|
|
196
|
+
const data1 = buffer.readUInt32LE(offset).toString(16).padStart(8, '0');
|
|
197
|
+
const data2 = buffer.readUInt16LE(offset + 4).toString(16).padStart(4, '0');
|
|
198
|
+
const data3 = buffer.readUInt16LE(offset + 6).toString(16).padStart(4, '0');
|
|
199
|
+
const data4 = buffer.readUInt8(offset + 8).toString(16).padStart(2, '0');
|
|
200
|
+
const data5 = buffer.readUInt8(offset + 9).toString(16).padStart(2, '0');
|
|
201
|
+
const data6 = buffer
|
|
202
|
+
.slice(offset + 10, offset + 16)
|
|
203
|
+
.toString('hex');
|
|
204
|
+
|
|
205
|
+
return `${data1}-${data2}-${data3}-${data4}${data5}-${data6}`;
|
|
206
|
+
} catch (error) {
|
|
207
|
+
return '00000000-0000-0000-0000-000000000000';
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Convert ACE type enum to string
|
|
213
|
+
*/
|
|
214
|
+
function aceTypeToString(aceType: number): string {
|
|
215
|
+
switch (aceType) {
|
|
216
|
+
case AceType.ACCESS_ALLOWED:
|
|
217
|
+
return 'ACCESS_ALLOWED';
|
|
218
|
+
case AceType.ACCESS_DENIED:
|
|
219
|
+
return 'ACCESS_DENIED';
|
|
220
|
+
case AceType.SYSTEM_AUDIT:
|
|
221
|
+
return 'SYSTEM_AUDIT';
|
|
222
|
+
case AceType.ACCESS_ALLOWED_OBJECT:
|
|
223
|
+
return 'ACCESS_ALLOWED_OBJECT';
|
|
224
|
+
case AceType.ACCESS_DENIED_OBJECT:
|
|
225
|
+
return 'ACCESS_DENIED_OBJECT';
|
|
226
|
+
case AceType.SYSTEM_AUDIT_OBJECT:
|
|
227
|
+
return 'SYSTEM_AUDIT_OBJECT';
|
|
228
|
+
default:
|
|
229
|
+
return `UNKNOWN_${aceType}`;
|
|
230
|
+
}
|
|
231
|
+
}
|