webconf-audit 0.1.1__tar.gz
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.
- webconf_audit-0.1.1/.gitignore +27 -0
- webconf_audit-0.1.1/CHANGELOG.md +85 -0
- webconf_audit-0.1.1/PKG-INFO +12 -0
- webconf_audit-0.1.1/README.md +420 -0
- webconf_audit-0.1.1/pyproject.toml +88 -0
- webconf_audit-0.1.1/src/__init__.py +0 -0
- webconf_audit-0.1.1/src/webconf_audit/__init__.py +0 -0
- webconf_audit-0.1.1/src/webconf_audit/apache_module_names.py +64 -0
- webconf_audit-0.1.1/src/webconf_audit/assessment.py +1596 -0
- webconf_audit-0.1.1/src/webconf_audit/assessment_models.py +329 -0
- webconf_audit-0.1.1/src/webconf_audit/assessment_renderers.py +204 -0
- webconf_audit-0.1.1/src/webconf_audit/audit_policy.py +1755 -0
- webconf_audit-0.1.1/src/webconf_audit/baselines.py +368 -0
- webconf_audit-0.1.1/src/webconf_audit/cli/__init__.py +1652 -0
- webconf_audit-0.1.1/src/webconf_audit/cli/__main__.py +6 -0
- webconf_audit-0.1.1/src/webconf_audit/cli/coverage.py +462 -0
- webconf_audit-0.1.1/src/webconf_audit/coverage_ledger.py +2238 -0
- webconf_audit-0.1.1/src/webconf_audit/coverage_models.py +352 -0
- webconf_audit-0.1.1/src/webconf_audit/crosswalk_integrity.py +241 -0
- webconf_audit-0.1.1/src/webconf_audit/csp.py +60 -0
- webconf_audit-0.1.1/src/webconf_audit/csp_ast.py +520 -0
- webconf_audit-0.1.1/src/webconf_audit/data/__init__.py +1 -0
- webconf_audit-0.1.1/src/webconf_audit/data/control_source_coverage.yml +12229 -0
- webconf_audit-0.1.1/src/webconf_audit/execution_manifest.py +428 -0
- webconf_audit-0.1.1/src/webconf_audit/external/__init__.py +4 -0
- webconf_audit-0.1.1/src/webconf_audit/external/html_recon.py +137 -0
- webconf_audit-0.1.1/src/webconf_audit/external/recon/__init__.py +3346 -0
- webconf_audit-0.1.1/src/webconf_audit/external/recon/_cookie.py +74 -0
- webconf_audit-0.1.1/src/webconf_audit/external/recon/port_discovery.py +162 -0
- webconf_audit-0.1.1/src/webconf_audit/external/recon/tls_probe.py +874 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/__init__.py +6 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_conditional.py +614 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_cookies.py +246 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_cors.py +112 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_disclosure.py +179 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_headers.py +813 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_helpers.py +288 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_https.py +277 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_methods.py +349 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_runner.py +563 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_sensitive_paths.py +107 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/_tls.py +688 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/iis_native_header_probe.py +105 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/nginx_runtime_probes.py +178 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/script_src_missing_sri.py +123 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/tls_cert_probes.py +216 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/tls_handshake_probes.py +232 -0
- webconf_audit-0.1.1/src/webconf_audit/external/rules/unknown_host_runtime_response.py +116 -0
- webconf_audit-0.1.1/src/webconf_audit/external/safe_probe_catalog.py +2568 -0
- webconf_audit-0.1.1/src/webconf_audit/external/tls_inventory.py +1088 -0
- webconf_audit-0.1.1/src/webconf_audit/finding_factory.py +51 -0
- webconf_audit-0.1.1/src/webconf_audit/fingerprints.py +168 -0
- webconf_audit-0.1.1/src/webconf_audit/header_policy.py +177 -0
- webconf_audit-0.1.1/src/webconf_audit/hsts_policy.py +54 -0
- webconf_audit-0.1.1/src/webconf_audit/local/__init__.py +0 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/__init__.py +862 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/authorization.py +1013 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/effective.py +853 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/htaccess.py +512 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/include.py +301 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/module_inventory.py +527 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/parser/__init__.py +25 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/parser/parser.py +396 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/path_matching.py +68 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/root_directory.py +107 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/__init__.py +1 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_block_policy_utils.py +345 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_log_policy_utils.py +296 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_modsecurity_inventory_utils.py +234 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_policy_semantics_utils.py +875 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_redirect_scope_utils.py +190 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_tls_policy_utils.py +250 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/_vhost_rejection_utils.py +219 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/allowoverride_all.py +230 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/allowoverride_not_none.py +149 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/backup_files_restricted.py +200 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/basic_auth_over_http.py +112 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/content_security_policy_missing_frame_ancestors.py +55 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/content_security_policy_missing_reporting_endpoint.py +54 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/context_sensitive_directive_utils.py +83 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/csp_value_review.py +135 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/custom_log_missing.py +85 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/custom_log_uses_default_format.py +94 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/default_content_probe.py +141 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/default_tls_vhost_not_rejecting_unknown_hosts.py +108 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/default_vhost_not_rejecting_unknown_hosts.py +195 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/directory_without_allowoverride.py +417 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/effective_directive_check.py +399 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_document_404_missing.py +75 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_document_500_missing.py +75 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_document_utils.py +42 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_log_missing.py +85 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/error_log_unsafe_destination.py +96 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/file_etag_inodes.py +105 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/generated_artifacts_restricted.py +126 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/hsts_header_policy.py +198 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ht_files_restricted.py +118 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_auth_without_require.py +102 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_disables_security_headers.py +103 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_enables_cgi.py +93 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_enables_directory_listing.py +96 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_overrides_security.py +109 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_rewrite_without_limit.py +80 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_rule_utils.py +42 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/htaccess_weakens_security.py +242 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/http_method_policy_unsafe.py +134 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/http_protocol_options_unsafe.py +98 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/http_to_https_redirect_missing.py +204 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/index_options_fancyindexing_enabled.py +72 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/index_options_scanhtmltitles_enabled.py +73 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ip_based_requests_allowed.py +167 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/keepalive_disabled.py +56 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/keepalive_timeout_too_high.py +66 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_body.py +172 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_body_value_review.py +81 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_field_size_too_high.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_fields.py +169 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/limit_request_line_too_high.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/listen_requires_explicit_address.py +133 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/location_endpoint_utils.py +207 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/log_format_missing_fields.py +125 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/log_level_too_restrictive.py +109 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/max_keepalive_requests_too_low.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_http_method_restrictions.py +158 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_log_format.py +77 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_permissions_policy_header.py +45 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_referrer_policy_header.py +48 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/missing_x_frame_options_header.py +51 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/modsecurity_crs_not_configured.py +67 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/modsecurity_module_missing.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_execcgi_enabled.py +68 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_includes_enabled.py +71 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_indexes.py +71 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_multiviews_enabled.py +72 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/options_not_none_in_root_directory.py +258 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/os_root_access_not_denied.py +212 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/permissions_policy_runtime_quality.py +104 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/permissions_policy_unsafe.py +48 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/referrer_policy_unsafe.py +48 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/request_read_timeout_semantics.py +183 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/scope_phrase.py +25 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/security_header_utils.py +1000 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/sensitive_config_files_restricted.py +142 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/sensitive_path_environment_policy.py +104 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_directive_utils.py +109 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_info_exposed.py +78 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_signature_off.py +142 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_status_exposed.py +78 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/server_tokens_prod.py +164 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/sitewide_http_method_policy_missing.py +176 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_cipher_suite_missing.py +55 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_cipher_suite_weak.py +83 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_compression.py +55 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_honor_cipher_order.py +55 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_insecure_renegotiation.py +59 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_protocol_policy.py +190 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_proxy_peer_name_check_disabled.py +102 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_proxy_verify_disabled.py +98 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_session_cache_missing.py +56 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_session_cache_timeout.py +68 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_stapling_cache_missing.py +58 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/ssl_use_stapling.py +54 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/timeout_keepalive_default_policy.py +93 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/timeout_too_high.py +60 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/trace_enable_off.py +141 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/vcs_metadata_restricted.py +127 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules/x_frame_options_unsafe.py +54 -0
- webconf_audit-0.1.1/src/webconf_audit/local/apache/rules_runner.py +171 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/__init__.py +615 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/ASPNET_schema.xml +670 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/FX_schema.xml +443 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/IIS_schema.xml +1570 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/README.md +5 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/_iis_schema/__init__.py +41 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/discovery.py +323 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/effective.py +656 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/iis_defaults.py +167 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/parser/__init__.py +23 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/parser/parser.py +288 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/registry.py +1704 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/__init__.py +1 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/anonymous_auth_enabled.py +236 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/application_pool_policy.py +382 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/asp_script_error_sent_to_browser.py +58 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/auth_policy.py +799 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/binding_without_host_header.py +100 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/cgi_handler_enabled.py +124 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/compilation_debug_enabled.py +66 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/content_security_policy_missing_frame_ancestors.py +138 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/content_security_policy_missing_reporting_endpoint.py +141 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/custom_errors_off.py +79 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/custom_headers_expose_server.py +79 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/directory_browse_enabled.py +79 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/forms_auth_require_ssl_missing.py +140 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/handler_access_policy.py +146 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/hsts_header_unsafe.py +126 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/http_errors_detailed.py +79 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/http_runtime_version_header_enabled.py +114 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/logging_fields_review.py +133 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/logging_not_configured.py +111 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/max_allowed_content_length_missing.py +150 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/missing_hsts_header.py +136 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/redirect_scope_utils.py +37 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/request_filtering_allow_double_escaping.py +88 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/request_filtering_allow_high_bit.py +89 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/request_filtering_policy.py +704 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/rule_utils.py +219 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/schannel_tls_policy.py +348 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/session_state_cookieless.py +67 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/ssl_not_required.py +118 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/ssl_weak_cipher_strength.py +92 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/system_web_policy.py +757 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/trace_enabled.py +58 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules/webdav_module_enabled.py +112 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/rules_runner.py +83 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/schannel_defaults.py +126 -0
- webconf_audit-0.1.1/src/webconf_audit/local/iis/schannel_models.py +293 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/__init__.py +213 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/conditions.py +167 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/effective.py +665 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/include.py +402 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/parser/__init__.py +27 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/parser/parser.py +779 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/__init__.py +1 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/access_log_format_missing_fields.py +198 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/access_log_format_review.py +179 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/access_log_missing.py +122 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/auth_backend_policy.py +185 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/basic_auth_over_http.py +179 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/content_security_policy_missing_frame_ancestors.py +92 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/content_security_policy_missing_reporting_endpoint.py +166 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/content_security_policy_unsafe.py +107 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/dir_listing_enabled.py +104 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/directive_value_utils.py +96 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/error_log_missing.py +66 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/header_policy_parity.py +313 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/header_tuple_utils.py +125 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/idle_timeout_policy.py +199 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/max_connections_missing.py +74 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/max_request_size_missing.py +72 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/max_request_size_policy.py +169 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_http_method_restrictions.py +92 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_http_to_https_redirect.py +101 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_strict_transport_security.py +96 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/missing_x_content_type_options.py +96 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/mod_cgi_enabled.py +82 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/mod_status_public.py +196 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/mod_webdav_enabled.py +64 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/redirect_scope_utils.py +91 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/rule_utils.py +138 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/sensitive_path_policy.py +228 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/server_tag_not_blank.py +137 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_compression.py +162 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_conf_cmd_utils.py +80 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_engine_not_enabled.py +197 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_honor_cipher_order_missing.py +159 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_insecure_renegotiation.py +188 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_pemfile_missing.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/ssl_protocol_policy.py +508 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/strict_transport_security_unsafe.py +177 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/url_access_deny_missing.py +241 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/weak_ssl_cipher_list.py +70 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/webdav_write_access_enabled.py +117 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules/x_frame_options_unsafe.py +88 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/rules_runner.py +110 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/shell.py +51 -0
- webconf_audit-0.1.1/src/webconf_audit/local/lighttpd/variables.py +234 -0
- webconf_audit-0.1.1/src/webconf_audit/local/load_context.py +58 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/__init__.py +438 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/access_control_semantics.py +558 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/__init__.py +5 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/logging.py +966 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/rate_limits.py +945 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/response_headers.py +1581 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/reverse_proxy_headers.py +807 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/assessments/sensitive_locations.py +1007 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/effective_scope.py +309 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/include.py +272 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/location_matcher.py +324 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/logging_semantics.py +618 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/__init__.py +28 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/ast.py +57 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/parser.py +341 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/parser/tokens.py +28 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/proxy_headers.py +659 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rate_limit_semantics.py +787 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/response_header_semantics.py +398 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/__init__.py +1 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_default_server_rejection_utils.py +25 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_exposure_utils.py +55 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_limit_utils.py +113 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_proxy_tls_utils.py +88 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_scope_utils.py +194 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_value_utils.py +199 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/_variable_taint_utils.py +349 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/access_log_uses_default_format.py +102 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/alias_traversal_classic_pattern.py +82 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/alias_without_trailing_slash.py +61 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/allow_all_with_deny_all.py +56 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/auth_basic_over_http.py +140 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/autoindex_on.py +46 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_body_timeout_too_high.py +69 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_header_buffer_size_too_large.py +73 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_header_timeout_too_high.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_max_body_size_too_large.py +73 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/client_max_body_size_unlimited.py +68 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/content_security_policy_missing_frame_ancestors.py +96 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/content_security_policy_missing_reporting_endpoint.py +89 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/content_security_policy_unsafe.py +147 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/crlf_in_add_header.py +90 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/crlf_in_return.py +100 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/csp_value_review.py +106 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/default_server_not_rejecting_unknown_hosts.py +71 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/default_tls_server_not_rejecting_unknown_hosts.py +140 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/duplicate_listen.py +74 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/error_log_too_restrictive.py +64 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/executable_scripts_allowed_in_uploads.py +151 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/header_utils.py +86 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/hsts_header_unsafe.py +94 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/http3_alt_svc_review.py +274 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/http_method_policy_allows_unapproved.py +84 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/if_in_location.py +58 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/keepalive_timeout_too_high.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/large_client_header_buffers_too_large.py +89 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/large_client_header_buffers_too_restrictive.py +79 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_conn_invalid_limit.py +48 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_conn_zone_not_per_ip.py +53 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_conn_zone_review.py +92 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_unknown_zone.py +57 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_zone_invalid_rate.py +51 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_zone_not_per_ip.py +53 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/limit_req_zone_rate_review.py +80 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/log_format_missing_fields.py +322 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/merge_slashes_off.py +62 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_access_log.py +95 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_access_restrictions_on_sensitive_locations.py +140 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_allowed_methods_restriction_for_uploads.py +79 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_auth_basic_user_file.py +80 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_backup_file_deny.py +119 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_client_body_timeout.py +59 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_client_header_timeout.py +59 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_client_max_body_size.py +89 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_content_security_policy.py +131 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_error_log.py +108 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_generated_artifact_deny.py +145 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_hidden_files_deny.py +81 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_hsts_header.py +71 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_http2_on_tls_listener.py +97 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_http_method_restrictions.py +77 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_http_to_https_redirect.py +158 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_keepalive_timeout.py +59 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_conn.py +91 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_conn_zone.py +87 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_req.py +91 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_limit_req_zone.py +59 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_log_format.py +88 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_permissions_policy.py +71 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_referrer_policy.py +71 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_send_timeout.py +59 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_server_name.py +60 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_certificate.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_certificate_key.py +70 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_ciphers.py +80 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_prefer_server_ciphers.py +91 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_ssl_protocols.py +72 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_x_content_type_options.py +72 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_x_frame_options.py +102 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/missing_x_xss_protection.py +71 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/permissions_policy_unsafe.py +69 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_missing_source_ip_headers.py +223 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_pass_user_controlled_destination.py +98 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_set_header_host_spoofing.py +85 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_ssl_trusted_certificate_missing.py +76 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/proxy_ssl_verify_disabled.py +72 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/public_autoindex_rate_limit_policy_weak.py +246 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/referrer_policy_unsafe.py +73 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/send_timeout_too_high.py +63 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/sensitive_config_files_restricted.py +150 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/sensitive_location_missing_ip_filter.py +179 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/server_block_accepts_unknown_host.py +148 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/server_tokens_on.py +46 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/sitewide_http_method_policy_missing.py +310 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_ciphers_weak.py +134 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_conf_command_options.py +200 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_session_cache_missing.py +91 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_session_tickets_disabled.py +52 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_session_timeout_missing_or_invalid.py +100 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_stapling_disabled.py +126 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_stapling_missing_resolver.py +109 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/ssl_stapling_without_verify.py +104 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/tls_listener_utils.py +90 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules/weak_ssl_protocols.py +119 -0
- webconf_audit-0.1.1/src/webconf_audit/local/nginx/rules_runner.py +76 -0
- webconf_audit-0.1.1/src/webconf_audit/local/normalized.py +206 -0
- webconf_audit-0.1.1/src/webconf_audit/local/normalizers/__init__.py +91 -0
- webconf_audit-0.1.1/src/webconf_audit/local/normalizers/apache_normalizer.py +901 -0
- webconf_audit-0.1.1/src/webconf_audit/local/normalizers/iis_normalizer.py +559 -0
- webconf_audit-0.1.1/src/webconf_audit/local/normalizers/lighttpd_normalizer.py +676 -0
- webconf_audit-0.1.1/src/webconf_audit/local/normalizers/nginx_normalizer.py +505 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rule_runner_utils.py +83 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/__init__.py +1 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/__init__.py +1 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/directory_listing_enabled.py +60 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/listen_on_all_interfaces.py +82 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/missing_hsts.py +89 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/missing_security_header.py +378 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/server_identification_disclosed.py +69 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/tls_intent_without_config.py +120 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/tls_required_for_authenticated_routes.py +82 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/weak_tls_ciphers.py +87 -0
- webconf_audit-0.1.1/src/webconf_audit/local/rules/universal/weak_tls_protocol.py +70 -0
- webconf_audit-0.1.1/src/webconf_audit/local/sensitive_artifact_policy.py +67 -0
- webconf_audit-0.1.1/src/webconf_audit/local/universal_rules.py +53 -0
- webconf_audit-0.1.1/src/webconf_audit/models.py +171 -0
- webconf_audit-0.1.1/src/webconf_audit/openssl_conf_policy.py +56 -0
- webconf_audit-0.1.1/src/webconf_audit/policy_models.py +1578 -0
- webconf_audit-0.1.1/src/webconf_audit/report/__init__.py +1556 -0
- webconf_audit-0.1.1/src/webconf_audit/rule_registry.py +530 -0
- webconf_audit-0.1.1/src/webconf_audit/rule_severity.py +505 -0
- webconf_audit-0.1.1/src/webconf_audit/rule_standards.py +2153 -0
- webconf_audit-0.1.1/src/webconf_audit/standard_catalog.py +431 -0
- webconf_audit-0.1.1/src/webconf_audit/standards.py +591 -0
- webconf_audit-0.1.1/src/webconf_audit/suppressions.py +451 -0
- webconf_audit-0.1.1/src/webconf_audit/tls_cipher_policy.py +152 -0
- webconf_audit-0.1.1/uv.lock +719 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.pyc
|
|
4
|
+
src/*.egg-info/
|
|
5
|
+
|
|
6
|
+
# Virtual environments
|
|
7
|
+
.venv/
|
|
8
|
+
|
|
9
|
+
# Tooling caches
|
|
10
|
+
.pytest_cache/
|
|
11
|
+
.ruff_cache/
|
|
12
|
+
.mypy_cache/
|
|
13
|
+
|
|
14
|
+
# Editors and IDEs
|
|
15
|
+
.vscode/
|
|
16
|
+
|
|
17
|
+
# Local working directory and generated reports
|
|
18
|
+
/.lab/
|
|
19
|
+
/.tmp/
|
|
20
|
+
/.codex-tmp/
|
|
21
|
+
/.codex-docx-render*/
|
|
22
|
+
/tmpkd_ok9wt/
|
|
23
|
+
/demo/local_admin/reports/
|
|
24
|
+
|
|
25
|
+
# Office documents and temp files
|
|
26
|
+
/*.docx
|
|
27
|
+
/~$*.docx
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable project changes are recorded here.
|
|
4
|
+
|
|
5
|
+
This project is still in the pre-1.0 stage. Public releases use `vX.Y.Z` Git
|
|
6
|
+
tags, and each released version must have a matching section in this file before
|
|
7
|
+
release artifacts are prepared.
|
|
8
|
+
|
|
9
|
+
## [Unreleased]
|
|
10
|
+
|
|
11
|
+
## [0.1.1] - 2026-06-16
|
|
12
|
+
|
|
13
|
+
- Add a schema-versioned packaged control-source coverage ledger, strict
|
|
14
|
+
registry reconciliation, deterministic Markdown/JSON views, additive
|
|
15
|
+
`coverage validate/show/export` commands, and release checks for document
|
|
16
|
+
and package-artifact drift without increasing any coverage numerator.
|
|
17
|
+
- Add deterministic offline crosswalk validation, canonical OWASP/ASVS/PCI
|
|
18
|
+
identifiers, and declared-versus-derived provenance in rule catalog and
|
|
19
|
+
report JSON; conservatively correct ASVS, OWASP Top 10:2025, and PCI DSS
|
|
20
|
+
coverage claims without changing detector behavior.
|
|
21
|
+
- Expand OpenAPI / Swagger external probes with common JSON schema paths and
|
|
22
|
+
map Swagger/OpenAPI exposure to ASVS v5.0.0-13.4.5 partial documentation
|
|
23
|
+
endpoint coverage.
|
|
24
|
+
- Expand dependency-manifest external probes with Java Maven/Gradle and
|
|
25
|
+
.NET/NuGet manifest paths, and map the rule to ASVS v5.0.0-13.4.6 partial
|
|
26
|
+
version-disclosure coverage.
|
|
27
|
+
- Add exposed Nginx, Apache HTTP Server, and Lighttpd configuration-file
|
|
28
|
+
probes to the external safe-probe catalog.
|
|
29
|
+
- Add policy-gated `nginx.response_headers` control assessments with shared
|
|
30
|
+
Nginx `add_header` / `add_header_inherit` semantics, a structured CSP AST,
|
|
31
|
+
and route-manifest evaluation for CSP, Referrer-Policy, HSTS,
|
|
32
|
+
`X-Content-Type-Options`, and COOP without changing canonical coverage
|
|
33
|
+
percentages.
|
|
34
|
+
- Add declared endpoint/SNI TLS inventory analysis with a dedicated
|
|
35
|
+
`analyze-tls-inventory` command, typed `external.tls_inventories` policy
|
|
36
|
+
input, bounded TLS observation records, and follow-up-04-compatible native
|
|
37
|
+
control assessment evidence without changing canonical coverage percentages.
|
|
38
|
+
- Correct the reviewed no-policy Nginx header edge cases called out by the
|
|
39
|
+
follow-up design: location or `if in location` header replacement can now
|
|
40
|
+
surface a missing CSP that was previously hidden, report-only CSP does not
|
|
41
|
+
satisfy enforcement, and multiple enforcing CSP headers use conjunction
|
|
42
|
+
semantics for unsafe-inline / unsafe-eval checks.
|
|
43
|
+
- Add application settings JSON exposure probes to the external safe-probe
|
|
44
|
+
catalog.
|
|
45
|
+
- Document the TLS source-coverage explanation across NIST, PCI DSS, ISO/IEC
|
|
46
|
+
27002, and FSTEC mappings.
|
|
47
|
+
- Add JavaScript source map exposure probes to the external safe-probe catalog.
|
|
48
|
+
- Expand dependency-manifest external probes with Python, Ruby, Go, and Rust
|
|
49
|
+
project manifest and lockfile paths.
|
|
50
|
+
- Rework the project roadmap around source coverage from the pre-diploma
|
|
51
|
+
benchmark and relevance sources.
|
|
52
|
+
- Expand the external safe-probe catalog with additional environment-file,
|
|
53
|
+
database-dump, dependency-manifest, and archive path variants for existing
|
|
54
|
+
catalog-backed rules.
|
|
55
|
+
- Document the standards-mapping health snapshot after the `v0.1.0` tag and
|
|
56
|
+
pin the remaining mapping backlog to safe-probe catalog growth.
|
|
57
|
+
- Continue parser/effective-configuration precision work for the current
|
|
58
|
+
four-server scope.
|
|
59
|
+
- Continue standards mapping, safe external probe growth, report explanation
|
|
60
|
+
improvements, and release-readiness work.
|
|
61
|
+
|
|
62
|
+
## [0.1.0] - 2026-06-05
|
|
63
|
+
|
|
64
|
+
### Added
|
|
65
|
+
|
|
66
|
+
- Local static analyzers for Nginx, Apache HTTP Server, Lighttpd, and Microsoft
|
|
67
|
+
IIS.
|
|
68
|
+
- External safe probing for HTTP, HTTPS, TLS, certificate, redirect, cookie,
|
|
69
|
+
CORS, method, fingerprinting, and sensitive-path observations.
|
|
70
|
+
- Central rule registry with `list-rules`, rule metadata, standards mapping,
|
|
71
|
+
and profile-based severity calibration.
|
|
72
|
+
- Text and JSON reports with stable finding fingerprints, standards grouping,
|
|
73
|
+
and repeated-finding grouping.
|
|
74
|
+
- CI-oriented exit behavior through `--fail-on` and `--fail-on-new`.
|
|
75
|
+
- Suppression files with required reasons and expiry dates.
|
|
76
|
+
- Baseline creation and diff reporting for new, unchanged, resolved, and
|
|
77
|
+
suppressed findings.
|
|
78
|
+
- Repository CI, optional Docker-backed integration checks, and a repeatable
|
|
79
|
+
release check that builds and smoke-tests installed package artifacts.
|
|
80
|
+
|
|
81
|
+
### Documented
|
|
82
|
+
|
|
83
|
+
- Current project status, architecture, roadmap, severity methodology,
|
|
84
|
+
standards coverage, CI integration, real-world-style fixture testing, and
|
|
85
|
+
release preparation boundaries.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: webconf-audit
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Web server configuration security audit tool
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Requires-Dist: click<9.0,>=8.1
|
|
7
|
+
Requires-Dist: cryptography<47,>=46.0.7
|
|
8
|
+
Requires-Dist: defusedxml<1.0,>=0.7
|
|
9
|
+
Requires-Dist: pydantic<3.0,>=2.12.5
|
|
10
|
+
Requires-Dist: pyopenssl<27,>=26.0.0
|
|
11
|
+
Requires-Dist: pyyaml<7,>=6.0.3
|
|
12
|
+
Requires-Dist: typer<1.0,>=0.24.1
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
# webconf-audit
|
|
2
|
+
|
|
3
|
+
A security auditing tool for web server configurations.
|
|
4
|
+
|
|
5
|
+
`webconf-audit` has two independent analysis modes:
|
|
6
|
+
|
|
7
|
+
- **Local** — static analysis of configuration files on the host that
|
|
8
|
+
runs the web server.
|
|
9
|
+
- **External** — black-box probing of a running web endpoint over the
|
|
10
|
+
network using observable HTTP, HTTPS, and TLS signals.
|
|
11
|
+
|
|
12
|
+
## Supported servers
|
|
13
|
+
|
|
14
|
+
Local analysis covers four web servers:
|
|
15
|
+
|
|
16
|
+
- Nginx
|
|
17
|
+
- Apache HTTP Server
|
|
18
|
+
- Lighttpd
|
|
19
|
+
- Microsoft IIS
|
|
20
|
+
|
|
21
|
+
External probing is server-agnostic; a few checks are activated only
|
|
22
|
+
after fingerprinting identifies the underlying server (for example,
|
|
23
|
+
Apache `mod_status` exposure or IIS detailed error pages).
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
`webconf-audit` requires Python 3.10 or later.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pip install .
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The package exposes a `webconf-audit` console entry point. Every
|
|
34
|
+
command is also available via `python -m webconf_audit.cli`.
|
|
35
|
+
|
|
36
|
+
## Quick start
|
|
37
|
+
|
|
38
|
+
### Local analysis
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
webconf-audit analyze-nginx /etc/nginx/nginx.conf
|
|
42
|
+
webconf-audit analyze-apache /etc/apache2/httpd.conf
|
|
43
|
+
webconf-audit analyze-lighttpd /etc/lighttpd/lighttpd.conf
|
|
44
|
+
webconf-audit analyze-iis C:\inetpub\wwwroot\web.config
|
|
45
|
+
webconf-audit analyze-iis C:\inetpub\wwwroot\web.config --tls-registry schannel.json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### External analysis
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
webconf-audit analyze-external https://example.com
|
|
52
|
+
webconf-audit analyze-external example.com --ports 80,443,8443
|
|
53
|
+
webconf-audit analyze-external example.com --no-scan-ports
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Output formats
|
|
57
|
+
|
|
58
|
+
Every `analyze-*` command supports text (default) and JSON output:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
webconf-audit analyze-nginx config.conf --format json
|
|
62
|
+
webconf-audit analyze-external example.com -f json
|
|
63
|
+
webconf-audit analyze-nginx config.conf --group-by standard
|
|
64
|
+
webconf-audit analyze-nginx config.conf --group-repeated
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
The JSON envelope contains a generation timestamp, a summary, the
|
|
68
|
+
per-target results, the deduplicated findings list, repeated finding groups
|
|
69
|
+
under `finding_groups`, standards references under each finding and the
|
|
70
|
+
top-level `standards` summary, and the issues list. Schema version 1 also
|
|
71
|
+
adds top-level `schema_version` and `generator` fields so downstream tooling
|
|
72
|
+
can verify the report format, generator package name and version, and registry
|
|
73
|
+
revision. See [docs/report-format.md](docs/report-format.md) for the full JSON
|
|
74
|
+
contract.
|
|
75
|
+
|
|
76
|
+
When an explicit policy is supplied, JSON results also include additive
|
|
77
|
+
`result.metadata.audit_policy` and `result.metadata.rule_execution` entries.
|
|
78
|
+
See [docs/audit-policy.md](docs/audit-policy.md) and
|
|
79
|
+
[docs/report-format.md](docs/report-format.md).
|
|
80
|
+
|
|
81
|
+
Use `--group-repeated` with text output to collapse repeated findings that
|
|
82
|
+
share the same rule, severity, recommendation, and report grouping cause while
|
|
83
|
+
preserving each exact source location.
|
|
84
|
+
|
|
85
|
+
Use `--group-by standard` with text output to review findings by mapped
|
|
86
|
+
standards such as CWE, OWASP Top 10, and OWASP ASVS. Findings with no mapped
|
|
87
|
+
standard are grouped under `Unmapped`.
|
|
88
|
+
|
|
89
|
+
### CI gating
|
|
90
|
+
|
|
91
|
+
Every `analyze-*` command can act as a CI gate with `--fail-on`:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
webconf-audit analyze-nginx nginx.conf --fail-on medium
|
|
95
|
+
webconf-audit analyze-external example.com --fail-on high --format json
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Exit codes in CI-gating mode:
|
|
99
|
+
|
|
100
|
+
- `0` - analysis completed and no findings at or above the selected severity
|
|
101
|
+
were found.
|
|
102
|
+
- `1` - analysis produced an execution or configuration error.
|
|
103
|
+
- `2` - analysis completed and at least one finding met the selected severity
|
|
104
|
+
threshold.
|
|
105
|
+
|
|
106
|
+
JSON findings include a stable `fingerprint` field that is designed for CI,
|
|
107
|
+
suppressions, and baseline/diff reporting.
|
|
108
|
+
|
|
109
|
+
When `--fail-on` is used, `.webconf-audit-ignore.yml` is read from the current
|
|
110
|
+
working directory if it exists. Suppressions require `rule_id`, either a
|
|
111
|
+
`fingerprint` or locator fields, a human-readable `reason`, and an `expires`
|
|
112
|
+
date. Expired suppressions stop hiding findings and are reported as analysis
|
|
113
|
+
issues.
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
suppressions:
|
|
117
|
+
- rule_id: nginx.server_tokens_on
|
|
118
|
+
source: nginx.conf
|
|
119
|
+
line: 12
|
|
120
|
+
reason: Accepted for staging until the shared image is rebuilt.
|
|
121
|
+
expires: 2026-12-31
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Use `--suppressions <path>` to point at a non-default suppression file. Full CI
|
|
125
|
+
examples are available in [docs/ci-integration.md](docs/ci-integration.md).
|
|
126
|
+
|
|
127
|
+
### Baseline and diff mode
|
|
128
|
+
|
|
129
|
+
Use `--write-baseline` to capture the current accepted finding set:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
webconf-audit analyze-nginx nginx.conf --write-baseline webconf-audit-baseline.json
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Use `--baseline` to compare a later run against that known state. Text output
|
|
136
|
+
shows a short diff summary, and JSON output includes `new_findings`,
|
|
137
|
+
`unchanged_findings`, `resolved_findings`, and `suppressed_findings`.
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
webconf-audit analyze-nginx nginx.conf --baseline webconf-audit-baseline.json
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
CI can block only new debt with `--fail-on-new` while leaving existing baseline
|
|
144
|
+
findings unchanged:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
webconf-audit analyze-nginx nginx.conf --baseline webconf-audit-baseline.json --fail-on-new medium
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Explicit audit policy
|
|
151
|
+
|
|
152
|
+
Policies are always opt-in and must be passed explicitly:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
webconf-audit policy validate --policy .webconf-audit-policy.yml
|
|
156
|
+
webconf-audit policy show --policy .webconf-audit-policy.yml --mode local --server-type nginx --target /etc/nginx/nginx.conf
|
|
157
|
+
webconf-audit analyze-nginx /etc/nginx/nginx.conf --policy .webconf-audit-policy.yml
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
Policies request evidence review scope and opt-in rule tags, but they do not
|
|
161
|
+
hide findings or raise coverage percentages by themselves.
|
|
162
|
+
|
|
163
|
+
### Control assessment
|
|
164
|
+
|
|
165
|
+
Assessment is a separate step that consumes a versioned analysis report with
|
|
166
|
+
embedded resolved policy and rule-execution metadata:
|
|
167
|
+
|
|
168
|
+
```bash
|
|
169
|
+
webconf-audit analyze-nginx nginx.conf --policy .webconf-audit-policy.yml --format json > analysis.json
|
|
170
|
+
webconf-audit assess --report analysis.json
|
|
171
|
+
webconf-audit assess --report analysis.json --format json
|
|
172
|
+
webconf-audit assess --report analysis.json --fail-on fail,indeterminate
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
`assess` produces a conservative evidence report for resolved policy controls.
|
|
176
|
+
It does not emit a compliance percentage or certification claim, and a
|
|
177
|
+
zero-finding run does not automatically become `pass`.
|
|
178
|
+
|
|
179
|
+
Assessment exit codes:
|
|
180
|
+
|
|
181
|
+
- `0` - assessment was produced and no requested gate status was present.
|
|
182
|
+
- `1` - the report, ledger, policy verification, or output path could not be
|
|
183
|
+
trusted.
|
|
184
|
+
- `2` - invalid CLI usage.
|
|
185
|
+
- `3` - assessment was produced successfully and a requested `--fail-on`
|
|
186
|
+
status was present.
|
|
187
|
+
|
|
188
|
+
Use `--policy` with `assess` only to verify that the supplied policy resolves
|
|
189
|
+
to the same embedded hashes as the original analysis report. See
|
|
190
|
+
[docs/control-assessment.md](docs/control-assessment.md).
|
|
191
|
+
|
|
192
|
+
## Local analysis pipeline
|
|
193
|
+
|
|
194
|
+
Each local analyzer:
|
|
195
|
+
|
|
196
|
+
1. Reads the main configuration file passed on the command line.
|
|
197
|
+
2. Resolves includes or rebuilds the inheritance chain.
|
|
198
|
+
3. Builds an effective configuration where the server model
|
|
199
|
+
requires it.
|
|
200
|
+
4. Runs server-specific rules over the parsed/effective form.
|
|
201
|
+
5. Runs universal rules over a normalized representation shared by
|
|
202
|
+
all four servers.
|
|
203
|
+
6. Returns a structured result with findings, technical issues, and
|
|
204
|
+
source metadata.
|
|
205
|
+
|
|
206
|
+
What each analyzer handles:
|
|
207
|
+
|
|
208
|
+
- **Nginx** — tokenizer, parser, `include` resolution with glob
|
|
209
|
+
support and cycle detection, AST traversal, source-location
|
|
210
|
+
tracking on every directive.
|
|
211
|
+
- **Apache** — `Include` and `IncludeOptional` resolution,
|
|
212
|
+
`.htaccess` discovery from `Directory` blocks and `DocumentRoot`,
|
|
213
|
+
`AllowOverride` filtering, per-`VirtualHost` analysis contexts,
|
|
214
|
+
`Location` and `LocationMatch` layering, header merge semantics.
|
|
215
|
+
- **Lighttpd** — variable expansion, `include` resolution,
|
|
216
|
+
`include_shell` handling (skipped with a warning by default, with
|
|
217
|
+
explicit opt-in execution via `--execute-shell`),
|
|
218
|
+
conditional blocks such as `$HTTP["host"] == "..."`, optional
|
|
219
|
+
per-host targeted analysis via `--host`.
|
|
220
|
+
- **IIS** — safe XML parsing through `defusedxml`, three-level
|
|
221
|
+
inheritance chain `machine.config` → `applicationHost.config`
|
|
222
|
+
→ `web.config`, `<add>` / `<remove>` / `<clear>` collection
|
|
223
|
+
semantics, `<location>` inheritance, `--machine-config` option for
|
|
224
|
+
explicit base config selection, and Windows SChannel TLS registry
|
|
225
|
+
enrichment by default on Windows hosts. Use `--tls-registry <path>`
|
|
226
|
+
for a JSON export from the target IIS server or `--no-tls-registry`
|
|
227
|
+
to disable live registry enrichment.
|
|
228
|
+
|
|
229
|
+
Each finding records severity, description, remediation hint, and a
|
|
230
|
+
source reference: file and line for text configurations, file and XML
|
|
231
|
+
path for IIS, observable endpoint or header for external mode.
|
|
232
|
+
|
|
233
|
+
## External analysis
|
|
234
|
+
|
|
235
|
+
External mode probes a target without access to its configuration. It
|
|
236
|
+
performs:
|
|
237
|
+
|
|
238
|
+
- Port discovery for bare-host targets (default ports: 80, 443, 8080,
|
|
239
|
+
8443, 8000, 8888, 3000, 5000, 9443; can be overridden with
|
|
240
|
+
`--ports` or disabled with `--no-scan-ports`).
|
|
241
|
+
- HTTP and HTTPS probing with `HEAD` → `GET` fallback plus a separate
|
|
242
|
+
`OPTIONS` flow.
|
|
243
|
+
- TLS enrichment: negotiated protocol and cipher, supported TLS
|
|
244
|
+
versions, certificate chain completeness, SAN extraction.
|
|
245
|
+
- Server fingerprinting from response headers, default error pages,
|
|
246
|
+
and reactions to deliberately malformed requests.
|
|
247
|
+
- Sensitive-path probing for paths such as `/.git/HEAD`, `/.env`,
|
|
248
|
+
`/.htaccess`, `/phpinfo.php`, `/web.config`, `/robots.txt`,
|
|
249
|
+
`/sitemap.xml`.
|
|
250
|
+
- Redirect chain analysis: loops, scheme switches, off-domain hops.
|
|
251
|
+
|
|
252
|
+
External rules cover HTTPS availability and HSTS, common security
|
|
253
|
+
headers, server identification, cookies, CORS, HTTP methods,
|
|
254
|
+
sensitive paths, TLS protocol versions, and certificate validity.
|
|
255
|
+
|
|
256
|
+
## Rule catalog
|
|
257
|
+
|
|
258
|
+
The rule catalog is browsable through the CLI:
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
webconf-audit list-rules
|
|
262
|
+
webconf-audit list-rules --category local --server-type nginx
|
|
263
|
+
webconf-audit list-rules --severity high --tag tls
|
|
264
|
+
webconf-audit list-rules --format json
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Filters: `--category` (`local`, `external`, `universal`),
|
|
268
|
+
`--server-type` (`nginx`, `apache`, `lighttpd`, `iis`),
|
|
269
|
+
`--severity` (`critical`, `high`, `medium`, `low`, `info`),
|
|
270
|
+
`--tag`.
|
|
271
|
+
|
|
272
|
+
Use `--format json` to get a machine-readable inventory with the full
|
|
273
|
+
`RuleMeta` payload (rule_id, severity, category, server_type,
|
|
274
|
+
input_kind, tags, severity_profile, standards, order, etc.). The full
|
|
275
|
+
inventory and the standards mapping plan live in
|
|
276
|
+
[docs/rule-coverage.md](docs/rule-coverage.md). Severity calibration is
|
|
277
|
+
documented in [docs/severity-methodology.md](docs/severity-methodology.md).
|
|
278
|
+
Each standard reference includes additive `origin` and `derived_from` fields,
|
|
279
|
+
so independently reviewed mappings can be distinguished from automatic
|
|
280
|
+
edition alignments.
|
|
281
|
+
|
|
282
|
+
## Control-source coverage ledger
|
|
283
|
+
|
|
284
|
+
The counted coverage snapshot is stored in the versioned package file
|
|
285
|
+
`src/webconf_audit/data/control_source_coverage.yml`. It records stable source
|
|
286
|
+
and item IDs, applicability, grouped requirements, evidence limitations,
|
|
287
|
+
registry claims, exclusions, and review provenance. The ledger describes
|
|
288
|
+
implemented scanner evidence within the documented scope; it is not a claim
|
|
289
|
+
of certification or target compliance.
|
|
290
|
+
|
|
291
|
+
Explicit audit policies are a separate layer on top of the ledger. They can
|
|
292
|
+
select sources and request opt-in evidence, but they do not change the counted
|
|
293
|
+
coverage snapshot on their own. Per-target status belongs to the separate
|
|
294
|
+
assessment artifact, not to the coverage percentages shown here.
|
|
295
|
+
|
|
296
|
+
Validate or inspect the shipped ledger with:
|
|
297
|
+
|
|
298
|
+
```bash
|
|
299
|
+
webconf-audit coverage validate
|
|
300
|
+
webconf-audit coverage validate --format json
|
|
301
|
+
webconf-audit coverage reconcile --check
|
|
302
|
+
webconf-audit coverage reconcile --check --format json
|
|
303
|
+
webconf-audit coverage reconcile --write
|
|
304
|
+
webconf-audit coverage show --source owasp-asvs-5.0.0
|
|
305
|
+
webconf-audit coverage show --status partial --format json
|
|
306
|
+
webconf-audit coverage export --format markdown
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Custom local ledgers can be supplied with `--ledger PATH`. Exports refuse to
|
|
310
|
+
overwrite an existing file unless `--force` is given. The `reconcile`
|
|
311
|
+
maintainer command checks or atomically rewrites the tracked coverage
|
|
312
|
+
documents from the packaged ledger. The generated human-readable view remains available at
|
|
313
|
+
[docs/control-source-coverage-tracker.md](docs/control-source-coverage-tracker.md);
|
|
314
|
+
the methodology and headline summary are documented in
|
|
315
|
+
[docs/benchmarks-covering.md](docs/benchmarks-covering.md).
|
|
316
|
+
|
|
317
|
+
The catalog currently contains 473 rules:
|
|
318
|
+
|
|
319
|
+
| Category | Rules |
|
|
320
|
+
|----------|------:|
|
|
321
|
+
| Local — Nginx | 96 |
|
|
322
|
+
| Local — Apache | 88 |
|
|
323
|
+
| Local — Lighttpd | 50 |
|
|
324
|
+
| Local — IIS | 53 |
|
|
325
|
+
| Universal (local) | 14 |
|
|
326
|
+
| External | 172 |
|
|
327
|
+
|
|
328
|
+
Ten rules in the inventory above are opt-in `policy-review` rules.
|
|
329
|
+
They are excluded from default `analyze-*` runs and surfaced only when
|
|
330
|
+
`--enable-policy-review` is passed. See
|
|
331
|
+
[docs/rule-coverage.md](docs/rule-coverage.md#documented-scope-limits)
|
|
332
|
+
for the rationale.
|
|
333
|
+
|
|
334
|
+
## Reporting
|
|
335
|
+
|
|
336
|
+
Results are aggregated into a `ReportData` structure with a summary by
|
|
337
|
+
severity, analysis mode, server type, and mapped standards. Two output
|
|
338
|
+
formatters are available:
|
|
339
|
+
|
|
340
|
+
- `TextFormatter` — human-readable command-line output.
|
|
341
|
+
- `JsonFormatter` — machine-readable output suitable for downstream
|
|
342
|
+
tooling.
|
|
343
|
+
|
|
344
|
+
Universal rule findings are deduplicated when a more specific
|
|
345
|
+
server-specific rule has already reported the same issue at the same
|
|
346
|
+
location.
|
|
347
|
+
|
|
348
|
+
## Project status
|
|
349
|
+
|
|
350
|
+
The post-practice project baseline is recorded in
|
|
351
|
+
[docs/project-status.md](docs/project-status.md). It summarizes the current
|
|
352
|
+
implemented scope, validation status, known boundaries, and the next
|
|
353
|
+
graduation-project work items.
|
|
354
|
+
|
|
355
|
+
User-visible changes are tracked in [CHANGELOG.md](CHANGELOG.md). Release
|
|
356
|
+
preparation, versioning, tag rules, and package smoke checks are documented in
|
|
357
|
+
[docs/release.md](docs/release.md).
|
|
358
|
+
|
|
359
|
+
## Demo
|
|
360
|
+
|
|
361
|
+
A working local-analysis demo with reproducible Docker-based syntax
|
|
362
|
+
checks is provided in `demo/local_admin/`. See
|
|
363
|
+
[demo/local_admin/README.md](demo/local_admin/README.md) for the
|
|
364
|
+
full walkthrough.
|
|
365
|
+
|
|
366
|
+
A separate defensive validation dataset with public-source-derived config
|
|
367
|
+
fixtures lives in [demo/real_world_configs/](demo/real_world_configs/).
|
|
368
|
+
Security-focused known-bad/known-good fixture testing is documented in
|
|
369
|
+
[docs/testing-real-world-configs.md](docs/testing-real-world-configs.md).
|
|
370
|
+
|
|
371
|
+
## Roadmap
|
|
372
|
+
|
|
373
|
+
The current development plan is tracked in
|
|
374
|
+
[docs/roadmap.md](docs/roadmap.md).
|
|
375
|
+
|
|
376
|
+
Near-term work is focused on parser/effective-configuration precision,
|
|
377
|
+
standards-driven coverage, safe external probe growth, false-positive
|
|
378
|
+
reduction, and release preparation. New server-family support should be planned
|
|
379
|
+
separately after the current four-server core is stable.
|
|
380
|
+
|
|
381
|
+
## Development
|
|
382
|
+
|
|
383
|
+
Install the development dependency group:
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
uv sync --group dev --locked
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
Run the same fast checks as the pull-request CI workflow:
|
|
390
|
+
|
|
391
|
+
```bash
|
|
392
|
+
uv run --locked ruff check .
|
|
393
|
+
uv run --locked python -m compileall -q src
|
|
394
|
+
uv run --locked pytest tests --ignore=tests/integration_external --ignore=tests/integration_local --ignore=tests/integration_rule_coverage --ignore=tests/integration_real_world_cross_mode -q
|
|
395
|
+
uv run --locked webconf-audit list-rules
|
|
396
|
+
uv run --locked interrogate -c pyproject.toml
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
The `interrogate` check enforces a 40% docstring coverage floor over
|
|
400
|
+
`src/` with sensible exclusions (private / dunder / nested helpers).
|
|
401
|
+
The threshold reflects the project's "default to no comments, only
|
|
402
|
+
explain non-obvious WHY" convention while still requiring docstrings
|
|
403
|
+
on module entries, data models, and the public API surface.
|
|
404
|
+
|
|
405
|
+
Run the Docker-backed integration slice when Docker Engine is available:
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
uv run --locked pytest tests/integration_external tests/integration_local tests/integration_rule_coverage -q
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
Run the release check before preparing a public package artifact:
|
|
412
|
+
|
|
413
|
+
```bash
|
|
414
|
+
uv run --locked python scripts/release_check.py
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
The release check builds wheel and source distribution artifacts, installs the
|
|
418
|
+
wheel into a clean virtual environment, verifies the installed console entry
|
|
419
|
+
point, and runs a small installed-package smoke test. See
|
|
420
|
+
[docs/release.md](docs/release.md) for the full checklist.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "webconf-audit"
|
|
3
|
+
version = "0.1.1"
|
|
4
|
+
description = "Web server configuration security audit tool"
|
|
5
|
+
requires-python = ">=3.10"
|
|
6
|
+
dependencies = [
|
|
7
|
+
# In the absence of a dedicated oldest-supported CI job, keep the
|
|
8
|
+
# lower bounds aligned with the dependency set exercised by the
|
|
9
|
+
# current test environment. Cap the next major so SemVer breakage
|
|
10
|
+
# does not silently land via a fresh `pip install`.
|
|
11
|
+
"click>=8.1,<9.0",
|
|
12
|
+
"defusedxml>=0.7,<1.0",
|
|
13
|
+
"cryptography>=46.0.7,<47",
|
|
14
|
+
"pydantic>=2.12.5,<3.0",
|
|
15
|
+
"pyOpenSSL>=26.0.0,<27",
|
|
16
|
+
"PyYAML>=6.0.3,<7",
|
|
17
|
+
"typer>=0.24.1,<1.0",
|
|
18
|
+
]
|
|
19
|
+
|
|
20
|
+
[project.scripts]
|
|
21
|
+
webconf-audit = "webconf_audit.cli:app"
|
|
22
|
+
|
|
23
|
+
[build-system]
|
|
24
|
+
requires = ["hatchling>=1.28,<2"]
|
|
25
|
+
build-backend = "hatchling.build"
|
|
26
|
+
|
|
27
|
+
[tool.hatch.build.targets.wheel]
|
|
28
|
+
packages = ["src/webconf_audit"]
|
|
29
|
+
|
|
30
|
+
[tool.hatch.build.targets.sdist]
|
|
31
|
+
include = [
|
|
32
|
+
"/src",
|
|
33
|
+
"/README.md",
|
|
34
|
+
"/CHANGELOG.md",
|
|
35
|
+
"/LICENSE",
|
|
36
|
+
"/pyproject.toml",
|
|
37
|
+
"/uv.lock",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
[dependency-groups]
|
|
41
|
+
dev = [
|
|
42
|
+
"interrogate>=1.7.0,<2",
|
|
43
|
+
"pytest>=9.0.3,<10",
|
|
44
|
+
"ruff>=0.15.12,<1",
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
[tool.ruff]
|
|
48
|
+
line-length = 100
|
|
49
|
+
exclude = [".tmp"]
|
|
50
|
+
|
|
51
|
+
[tool.pytest.ini_options]
|
|
52
|
+
testpaths = ["tests"]
|
|
53
|
+
cache_dir = ".tmp/pytest-cache"
|
|
54
|
+
norecursedirs = [
|
|
55
|
+
".git",
|
|
56
|
+
".venv",
|
|
57
|
+
".tmp",
|
|
58
|
+
"pytest-run-*",
|
|
59
|
+
"pytest-tmp-*",
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
# Docstring coverage. The 40% floor reflects the project convention
|
|
63
|
+
# "Default to writing no comments. Only add one when the WHY is
|
|
64
|
+
# non-obvious." Public API surfaces, data models, and module-level
|
|
65
|
+
# docstrings are documented; small internal helpers with
|
|
66
|
+
# self-documenting names are intentionally left bare. The exclusions
|
|
67
|
+
# below skip categories where docstrings add noise rather than value
|
|
68
|
+
# (private/dunder methods, nested helpers, overloaded stubs).
|
|
69
|
+
[tool.interrogate]
|
|
70
|
+
fail-under = 40
|
|
71
|
+
ignore-init-method = true
|
|
72
|
+
ignore-init-module = true
|
|
73
|
+
ignore-magic = true
|
|
74
|
+
ignore-private = true
|
|
75
|
+
ignore-semiprivate = true
|
|
76
|
+
ignore-nested-functions = true
|
|
77
|
+
ignore-nested-classes = true
|
|
78
|
+
ignore-overloaded-functions = true
|
|
79
|
+
ignore-property-decorators = true
|
|
80
|
+
ignore-property-setters = true
|
|
81
|
+
exclude = [
|
|
82
|
+
"tests",
|
|
83
|
+
".tmp",
|
|
84
|
+
".venv",
|
|
85
|
+
".codex-tmp",
|
|
86
|
+
".codex-docx-render*",
|
|
87
|
+
"tmpkd_ok9wt",
|
|
88
|
+
]
|
|
File without changes
|
|
File without changes
|