dockerls 1.0.0__tar.gz → 1.0.2__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.
- {dockerls-1.0.0 → dockerls-1.0.2}/PKG-INFO +50 -1
- {dockerls-1.0.0 → dockerls-1.0.2}/README.md +49 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/PKG-INFO +50 -1
- {dockerls-1.0.0 → dockerls-1.0.2}/pyproject.toml +1 -1
- {dockerls-1.0.0 → dockerls-1.0.2}/LICENSE +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/dto/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/dto/analysis.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/alternatives_lookup.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/composite_repository.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/cross_validation.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/ecosystems.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/fallback_scanner.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/hardening_analysis.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/migration.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/progress.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/remediation.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/scan_history_store.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/scanner_factory.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/source_registry.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/tag_history_store.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/teardown.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/verdict.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/services/version_discovery.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/analyze_dockerfile.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/analyze_image.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/build_image.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/compare_images.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/fleet_scan.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/recommend_images.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/registry_audit.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/search_images.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/application/use_cases/upgrade_base.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cache/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cache/sqlite_cache.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/analysis_baseline.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/app.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/advisor.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/alternatives.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/analyze.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/analyze_dockerfile.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/base_cmd.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/base_image.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/build.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/cache_cmd.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/compare.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/controls.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/doctor.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/export.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/fleet.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/health.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/login.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/policy_cmd.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/provenance_cmd.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/recommend.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/registry_audit_cmd.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/sbom.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/search.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/verify.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/version.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/commands/vex_cmd.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/dependencies.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/image_names.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/options.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/progress.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/publish_prompt.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/rendering.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/runtime.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/scan_failure.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/text.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/validators.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/cli/vulnerability_view.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/declared_metadata.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/dockerfile_analysis.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/image.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/image_facts.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/recommendation.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/scan_result.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/entities/vulnerability.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/cache_store.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/dockerfile_validator.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/eol_checker.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/image_repository.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/interfaces/scanner.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/security_controls.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/attack_surface.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/base_recipe.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/base_upgrade.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/build_labels.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/build_policy.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/confidence.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/fleet.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/gate.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/hardening.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/image_reference.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/inheritance.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/network_policy.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/production_readiness.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/provenance.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/recipe_diff.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/registry_audit.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/registry_target.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/remediation_score.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/scan_history.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/scan_plan.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/scanner_db.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/security_score.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/security_tier.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/tag_history.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/tool_release.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/tristate.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/domain/value_objects/vex.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exit_codes.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/base.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/csv_exporter.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/factory.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/html_exporter.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/json_exporter.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/markdown_exporter.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/exporters/sarif_exporter.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/config/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/config/policy_file.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/config/settings.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/database/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/database/models.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/dockerfile_validator.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/evidence.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/hashing.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/logging/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/logging/setup.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/network/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/network/guarded_client.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/network/host_guard.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/redaction.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/distroless.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-distroless.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go-scratch.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/go.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/gradle-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/gradle.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-distroless.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java-ubuntu.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/java.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/maven-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/maven.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-distroless.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node-ubuntu.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/node.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php-debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php-ubuntu.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/php.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-distroless.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python-ubuntu.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/python.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/ruby-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/ruby-debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust-alpine.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust-debian.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust-scratch.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/rust.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/templates/hardening/ubuntu.dockerfile +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/toolchain/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/toolchain/db_metadata.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/infrastructure/toolchain/installer.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/catalog.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/definition.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dhi/repository.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dockerhub/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dockerhub/client.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/dockerhub/urls.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/endoflife/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/endoflife/checker.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/batch.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/client.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/engine/locator.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/exploitdb/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/exploitdb/client.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/grype/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/grype/scanner.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/hardened.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/inspector.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/oci.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/private.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/registry/urls.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/scan_errors.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/scan_target.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/signing/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/signing/cosign.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/threat_intel/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/threat_intel/client.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/trivy/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/trivy/cache_pool.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/integrations/trivy/scanner.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/__init__.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/auth.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/executables.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/ignore_file.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/rate_limit.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/resources.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/retry.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/safe_yaml.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/subprocess_runner.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls/utils/validation.py +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/SOURCES.txt +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/dependency_links.txt +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/entry_points.txt +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/requires.txt +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/dockerls.egg-info/top_level.txt +0 -0
- {dockerls-1.0.0 → dockerls-1.0.2}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dockerls
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: Enterprise Docker Image Security Advisor
|
|
5
5
|
Author: Ivomsantiago
|
|
6
6
|
License: MIT
|
|
@@ -253,6 +253,11 @@ preciso". `base-image` faz essa escolha acontecer antes de qualquer coisa
|
|
|
253
253
|
existir: sem `--with`, ele mostra um menu com o custo de cada pacote em
|
|
254
254
|
superfície de ataque, não só o que ele serve.
|
|
255
255
|
|
|
256
|
+

|
|
257
|
+
|
|
258
|
+
<details>
|
|
259
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
260
|
+
|
|
256
261
|
```console
|
|
257
262
|
$ dockerls base-image --os alpine --runtime node
|
|
258
263
|
|
|
@@ -288,6 +293,8 @@ processes
|
|
|
288
293
|
Comma-separated numbers (empty = no packages): 1,2,9
|
|
289
294
|
```
|
|
290
295
|
|
|
296
|
+
</details>
|
|
297
|
+
|
|
291
298
|
Repare no `curl`: o propósito ("HEALTHCHECK e diagnóstico de rede") é
|
|
292
299
|
legítimo, mas o custo dito ali do lado é o mesmo que um atacante usa pra
|
|
293
300
|
buscar o segundo estágio de um ataque. O menu não esconde isso pra depois —
|
|
@@ -296,6 +303,11 @@ mostra na hora de marcar.
|
|
|
296
303
|
Em pipeline não tem menu pra responder. `--with` aceita a mesma lista
|
|
297
304
|
separada por vírgula e pula direto pro Dockerfile:
|
|
298
305
|
|
|
306
|
+

|
|
307
|
+
|
|
308
|
+
<details>
|
|
309
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
310
|
+
|
|
299
311
|
```console
|
|
300
312
|
$ dockerls base-image --os alpine --runtime node \
|
|
301
313
|
--with "ca-certificates,tzdata,tini" -o Dockerfile \
|
|
@@ -311,6 +323,8 @@ Next step
|
|
|
311
323
|
until then it is only an intention.
|
|
312
324
|
```
|
|
313
325
|
|
|
326
|
+
</details>
|
|
327
|
+
|
|
314
328
|
Existem três pacotes que esse catálogo se recusa a oferecer, mesmo por
|
|
315
329
|
`--with` — são recusas documentadas, não omissões:
|
|
316
330
|
|
|
@@ -330,6 +344,11 @@ travada no catálogo (`RUNTIME_BASES`, em
|
|
|
330
344
|
pra cada um. Se você precisa de outra versão, o caminho é editar a linha
|
|
331
345
|
`FROM` manualmente e resolver o digest de novo:
|
|
332
346
|
|
|
347
|
+

|
|
348
|
+
|
|
349
|
+
<details>
|
|
350
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
351
|
+
|
|
333
352
|
```console
|
|
334
353
|
$ sed -i 's/FROM node:22-alpine@\${BASE_DIGEST}/FROM node:20-alpine/; s/ARG BASE_DIGEST=.*/ARG BASE_DIGEST=/' Dockerfile
|
|
335
354
|
$ dockerls base .
|
|
@@ -351,6 +370,8 @@ Rebuild and scan before publishing: changing the base digest changes the image,
|
|
|
351
370
|
and only a scan tells you whether for the better.
|
|
352
371
|
```
|
|
353
372
|
|
|
373
|
+
</details>
|
|
374
|
+
|
|
354
375
|
`base` não sabe (nem tenta adivinhar) se a troca de versão é segura — ele só
|
|
355
376
|
garante que, seja qual for a tag, ela fica pinada por digest antes de ir pra
|
|
356
377
|
frente. A resposta sobre segurança vem do scan, no passo 5.
|
|
@@ -366,6 +387,11 @@ do PowerShell inteiro a partir dali.
|
|
|
366
387
|
|
|
367
388
|
### 4. Validar antes de construir
|
|
368
389
|
|
|
390
|
+

|
|
391
|
+
|
|
392
|
+
<details>
|
|
393
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
394
|
+
|
|
369
395
|
```console
|
|
370
396
|
$ dockerls analyze-dockerfile .
|
|
371
397
|
|
|
@@ -393,6 +419,8 @@ Summary: 9 passed | 4 warnings | 0 errors
|
|
|
393
419
|
Security Score: 90/100 Tier: A Production Ready: Yes
|
|
394
420
|
```
|
|
395
421
|
|
|
422
|
+
</details>
|
|
423
|
+
|
|
396
424
|
Isso roda sem Docker, sem scanner, sem rede — é análise estática do texto do
|
|
397
425
|
Dockerfile. Os warnings aqui (sem multi-stage, sem HEALTHCHECK, sem
|
|
398
426
|
`.dockerignore`) são exatamente o que aparece de novo como sugestão depois do
|
|
@@ -408,6 +436,11 @@ findings (base vs. suas camadas). `--fail-on critical,kev` soma mais um
|
|
|
408
436
|
critério: falhar também se algum CVE encontrado está no catálogo CISA KEV —
|
|
409
437
|
sendo explorado ativamente, mesmo que não seja CRITICAL.
|
|
410
438
|
|
|
439
|
+

|
|
440
|
+
|
|
441
|
+
<details>
|
|
442
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
443
|
+
|
|
411
444
|
```console
|
|
412
445
|
$ dockerls build . -t minhaapp:1.0 --production --fail-on critical,kev `
|
|
413
446
|
--owner "team-x" `
|
|
@@ -455,6 +488,8 @@ OUTPUT (measured after the build)
|
|
|
455
488
|
Image sha256:5e5a079bbd616d166b155f15dac48c9c603a9d605876c732fde620a7aa7958bc
|
|
456
489
|
```
|
|
457
490
|
|
|
491
|
+
</details>
|
|
492
|
+
|
|
458
493
|
Sem `--owner`, `--source` e `--security-contact`, esse mesmo comando falha —
|
|
459
494
|
de propósito: `required_labels` é parte do perfil `--production`, e o motivo
|
|
460
495
|
está no próprio erro quando isso acontece: "sem isso ninguém sabe pra quem
|
|
@@ -462,17 +497,29 @@ ligar quando essa imagem aparecer num alerta às três da manhã".
|
|
|
462
497
|
|
|
463
498
|
### 6. Usando a imagem depois de construída
|
|
464
499
|
|
|
500
|
+

|
|
501
|
+
|
|
502
|
+
<details>
|
|
503
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
504
|
+
|
|
465
505
|
```console
|
|
466
506
|
$ docker run --rm minhaapp:1.0 id
|
|
467
507
|
uid=1000(node) gid=1000(node) groups=1000(node),1000(node)
|
|
468
508
|
```
|
|
469
509
|
|
|
510
|
+
</details>
|
|
511
|
+
|
|
470
512
|
`uid=1000`, não `uid=0`. É o `USER node` do Dockerfile confirmado em
|
|
471
513
|
execução, não só lido no texto — a mesma checagem que `non_root_user` faz de
|
|
472
514
|
forma estática no passo 4, agora contra o container de verdade.
|
|
473
515
|
|
|
474
516
|
### 7. Fechando o loop
|
|
475
517
|
|
|
518
|
+

|
|
519
|
+
|
|
520
|
+
<details>
|
|
521
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
522
|
+
|
|
476
523
|
```console
|
|
477
524
|
$ dockerls analyze minhaapp:1.0
|
|
478
525
|
|
|
@@ -492,6 +539,8 @@ Analysis: minhaapp:1.0
|
|
|
492
539
|
Scanner trivy
|
|
493
540
|
```
|
|
494
541
|
|
|
542
|
+
</details>
|
|
543
|
+
|
|
495
544
|
O mesmo `analyze` que você rodaria contra `node:22-alpine` pra decidir se
|
|
496
545
|
confia nela funciona igual contra o que você acabou de construir. Não existe
|
|
497
546
|
um comando separado pra "auditar a própria imagem" — é o mesmo raio-x, na
|
|
@@ -202,6 +202,11 @@ preciso". `base-image` faz essa escolha acontecer antes de qualquer coisa
|
|
|
202
202
|
existir: sem `--with`, ele mostra um menu com o custo de cada pacote em
|
|
203
203
|
superfície de ataque, não só o que ele serve.
|
|
204
204
|
|
|
205
|
+

|
|
206
|
+
|
|
207
|
+
<details>
|
|
208
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
209
|
+
|
|
205
210
|
```console
|
|
206
211
|
$ dockerls base-image --os alpine --runtime node
|
|
207
212
|
|
|
@@ -237,6 +242,8 @@ processes
|
|
|
237
242
|
Comma-separated numbers (empty = no packages): 1,2,9
|
|
238
243
|
```
|
|
239
244
|
|
|
245
|
+
</details>
|
|
246
|
+
|
|
240
247
|
Repare no `curl`: o propósito ("HEALTHCHECK e diagnóstico de rede") é
|
|
241
248
|
legítimo, mas o custo dito ali do lado é o mesmo que um atacante usa pra
|
|
242
249
|
buscar o segundo estágio de um ataque. O menu não esconde isso pra depois —
|
|
@@ -245,6 +252,11 @@ mostra na hora de marcar.
|
|
|
245
252
|
Em pipeline não tem menu pra responder. `--with` aceita a mesma lista
|
|
246
253
|
separada por vírgula e pula direto pro Dockerfile:
|
|
247
254
|
|
|
255
|
+

|
|
256
|
+
|
|
257
|
+
<details>
|
|
258
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
259
|
+
|
|
248
260
|
```console
|
|
249
261
|
$ dockerls base-image --os alpine --runtime node \
|
|
250
262
|
--with "ca-certificates,tzdata,tini" -o Dockerfile \
|
|
@@ -260,6 +272,8 @@ Next step
|
|
|
260
272
|
until then it is only an intention.
|
|
261
273
|
```
|
|
262
274
|
|
|
275
|
+
</details>
|
|
276
|
+
|
|
263
277
|
Existem três pacotes que esse catálogo se recusa a oferecer, mesmo por
|
|
264
278
|
`--with` — são recusas documentadas, não omissões:
|
|
265
279
|
|
|
@@ -279,6 +293,11 @@ travada no catálogo (`RUNTIME_BASES`, em
|
|
|
279
293
|
pra cada um. Se você precisa de outra versão, o caminho é editar a linha
|
|
280
294
|
`FROM` manualmente e resolver o digest de novo:
|
|
281
295
|
|
|
296
|
+

|
|
297
|
+
|
|
298
|
+
<details>
|
|
299
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
300
|
+
|
|
282
301
|
```console
|
|
283
302
|
$ sed -i 's/FROM node:22-alpine@\${BASE_DIGEST}/FROM node:20-alpine/; s/ARG BASE_DIGEST=.*/ARG BASE_DIGEST=/' Dockerfile
|
|
284
303
|
$ dockerls base .
|
|
@@ -300,6 +319,8 @@ Rebuild and scan before publishing: changing the base digest changes the image,
|
|
|
300
319
|
and only a scan tells you whether for the better.
|
|
301
320
|
```
|
|
302
321
|
|
|
322
|
+
</details>
|
|
323
|
+
|
|
303
324
|
`base` não sabe (nem tenta adivinhar) se a troca de versão é segura — ele só
|
|
304
325
|
garante que, seja qual for a tag, ela fica pinada por digest antes de ir pra
|
|
305
326
|
frente. A resposta sobre segurança vem do scan, no passo 5.
|
|
@@ -315,6 +336,11 @@ do PowerShell inteiro a partir dali.
|
|
|
315
336
|
|
|
316
337
|
### 4. Validar antes de construir
|
|
317
338
|
|
|
339
|
+

|
|
340
|
+
|
|
341
|
+
<details>
|
|
342
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
343
|
+
|
|
318
344
|
```console
|
|
319
345
|
$ dockerls analyze-dockerfile .
|
|
320
346
|
|
|
@@ -342,6 +368,8 @@ Summary: 9 passed | 4 warnings | 0 errors
|
|
|
342
368
|
Security Score: 90/100 Tier: A Production Ready: Yes
|
|
343
369
|
```
|
|
344
370
|
|
|
371
|
+
</details>
|
|
372
|
+
|
|
345
373
|
Isso roda sem Docker, sem scanner, sem rede — é análise estática do texto do
|
|
346
374
|
Dockerfile. Os warnings aqui (sem multi-stage, sem HEALTHCHECK, sem
|
|
347
375
|
`.dockerignore`) são exatamente o que aparece de novo como sugestão depois do
|
|
@@ -357,6 +385,11 @@ findings (base vs. suas camadas). `--fail-on critical,kev` soma mais um
|
|
|
357
385
|
critério: falhar também se algum CVE encontrado está no catálogo CISA KEV —
|
|
358
386
|
sendo explorado ativamente, mesmo que não seja CRITICAL.
|
|
359
387
|
|
|
388
|
+

|
|
389
|
+
|
|
390
|
+
<details>
|
|
391
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
392
|
+
|
|
360
393
|
```console
|
|
361
394
|
$ dockerls build . -t minhaapp:1.0 --production --fail-on critical,kev `
|
|
362
395
|
--owner "team-x" `
|
|
@@ -404,6 +437,8 @@ OUTPUT (measured after the build)
|
|
|
404
437
|
Image sha256:5e5a079bbd616d166b155f15dac48c9c603a9d605876c732fde620a7aa7958bc
|
|
405
438
|
```
|
|
406
439
|
|
|
440
|
+
</details>
|
|
441
|
+
|
|
407
442
|
Sem `--owner`, `--source` e `--security-contact`, esse mesmo comando falha —
|
|
408
443
|
de propósito: `required_labels` é parte do perfil `--production`, e o motivo
|
|
409
444
|
está no próprio erro quando isso acontece: "sem isso ninguém sabe pra quem
|
|
@@ -411,17 +446,29 @@ ligar quando essa imagem aparecer num alerta às três da manhã".
|
|
|
411
446
|
|
|
412
447
|
### 6. Usando a imagem depois de construída
|
|
413
448
|
|
|
449
|
+

|
|
450
|
+
|
|
451
|
+
<details>
|
|
452
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
453
|
+
|
|
414
454
|
```console
|
|
415
455
|
$ docker run --rm minhaapp:1.0 id
|
|
416
456
|
uid=1000(node) gid=1000(node) groups=1000(node),1000(node)
|
|
417
457
|
```
|
|
418
458
|
|
|
459
|
+
</details>
|
|
460
|
+
|
|
419
461
|
`uid=1000`, não `uid=0`. É o `USER node` do Dockerfile confirmado em
|
|
420
462
|
execução, não só lido no texto — a mesma checagem que `non_root_user` faz de
|
|
421
463
|
forma estática no passo 4, agora contra o container de verdade.
|
|
422
464
|
|
|
423
465
|
### 7. Fechando o loop
|
|
424
466
|
|
|
467
|
+

|
|
468
|
+
|
|
469
|
+
<details>
|
|
470
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
471
|
+
|
|
425
472
|
```console
|
|
426
473
|
$ dockerls analyze minhaapp:1.0
|
|
427
474
|
|
|
@@ -441,6 +488,8 @@ Analysis: minhaapp:1.0
|
|
|
441
488
|
Scanner trivy
|
|
442
489
|
```
|
|
443
490
|
|
|
491
|
+
</details>
|
|
492
|
+
|
|
444
493
|
O mesmo `analyze` que você rodaria contra `node:22-alpine` pra decidir se
|
|
445
494
|
confia nela funciona igual contra o que você acabou de construir. Não existe
|
|
446
495
|
um comando separado pra "auditar a própria imagem" — é o mesmo raio-x, na
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dockerls
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.2
|
|
4
4
|
Summary: Enterprise Docker Image Security Advisor
|
|
5
5
|
Author: Ivomsantiago
|
|
6
6
|
License: MIT
|
|
@@ -253,6 +253,11 @@ preciso". `base-image` faz essa escolha acontecer antes de qualquer coisa
|
|
|
253
253
|
existir: sem `--with`, ele mostra um menu com o custo de cada pacote em
|
|
254
254
|
superfície de ataque, não só o que ele serve.
|
|
255
255
|
|
|
256
|
+

|
|
257
|
+
|
|
258
|
+
<details>
|
|
259
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
260
|
+
|
|
256
261
|
```console
|
|
257
262
|
$ dockerls base-image --os alpine --runtime node
|
|
258
263
|
|
|
@@ -288,6 +293,8 @@ processes
|
|
|
288
293
|
Comma-separated numbers (empty = no packages): 1,2,9
|
|
289
294
|
```
|
|
290
295
|
|
|
296
|
+
</details>
|
|
297
|
+
|
|
291
298
|
Repare no `curl`: o propósito ("HEALTHCHECK e diagnóstico de rede") é
|
|
292
299
|
legítimo, mas o custo dito ali do lado é o mesmo que um atacante usa pra
|
|
293
300
|
buscar o segundo estágio de um ataque. O menu não esconde isso pra depois —
|
|
@@ -296,6 +303,11 @@ mostra na hora de marcar.
|
|
|
296
303
|
Em pipeline não tem menu pra responder. `--with` aceita a mesma lista
|
|
297
304
|
separada por vírgula e pula direto pro Dockerfile:
|
|
298
305
|
|
|
306
|
+

|
|
307
|
+
|
|
308
|
+
<details>
|
|
309
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
310
|
+
|
|
299
311
|
```console
|
|
300
312
|
$ dockerls base-image --os alpine --runtime node \
|
|
301
313
|
--with "ca-certificates,tzdata,tini" -o Dockerfile \
|
|
@@ -311,6 +323,8 @@ Next step
|
|
|
311
323
|
until then it is only an intention.
|
|
312
324
|
```
|
|
313
325
|
|
|
326
|
+
</details>
|
|
327
|
+
|
|
314
328
|
Existem três pacotes que esse catálogo se recusa a oferecer, mesmo por
|
|
315
329
|
`--with` — são recusas documentadas, não omissões:
|
|
316
330
|
|
|
@@ -330,6 +344,11 @@ travada no catálogo (`RUNTIME_BASES`, em
|
|
|
330
344
|
pra cada um. Se você precisa de outra versão, o caminho é editar a linha
|
|
331
345
|
`FROM` manualmente e resolver o digest de novo:
|
|
332
346
|
|
|
347
|
+

|
|
348
|
+
|
|
349
|
+
<details>
|
|
350
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
351
|
+
|
|
333
352
|
```console
|
|
334
353
|
$ sed -i 's/FROM node:22-alpine@\${BASE_DIGEST}/FROM node:20-alpine/; s/ARG BASE_DIGEST=.*/ARG BASE_DIGEST=/' Dockerfile
|
|
335
354
|
$ dockerls base .
|
|
@@ -351,6 +370,8 @@ Rebuild and scan before publishing: changing the base digest changes the image,
|
|
|
351
370
|
and only a scan tells you whether for the better.
|
|
352
371
|
```
|
|
353
372
|
|
|
373
|
+
</details>
|
|
374
|
+
|
|
354
375
|
`base` não sabe (nem tenta adivinhar) se a troca de versão é segura — ele só
|
|
355
376
|
garante que, seja qual for a tag, ela fica pinada por digest antes de ir pra
|
|
356
377
|
frente. A resposta sobre segurança vem do scan, no passo 5.
|
|
@@ -366,6 +387,11 @@ do PowerShell inteiro a partir dali.
|
|
|
366
387
|
|
|
367
388
|
### 4. Validar antes de construir
|
|
368
389
|
|
|
390
|
+

|
|
391
|
+
|
|
392
|
+
<details>
|
|
393
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
394
|
+
|
|
369
395
|
```console
|
|
370
396
|
$ dockerls analyze-dockerfile .
|
|
371
397
|
|
|
@@ -393,6 +419,8 @@ Summary: 9 passed | 4 warnings | 0 errors
|
|
|
393
419
|
Security Score: 90/100 Tier: A Production Ready: Yes
|
|
394
420
|
```
|
|
395
421
|
|
|
422
|
+
</details>
|
|
423
|
+
|
|
396
424
|
Isso roda sem Docker, sem scanner, sem rede — é análise estática do texto do
|
|
397
425
|
Dockerfile. Os warnings aqui (sem multi-stage, sem HEALTHCHECK, sem
|
|
398
426
|
`.dockerignore`) são exatamente o que aparece de novo como sugestão depois do
|
|
@@ -408,6 +436,11 @@ findings (base vs. suas camadas). `--fail-on critical,kev` soma mais um
|
|
|
408
436
|
critério: falhar também se algum CVE encontrado está no catálogo CISA KEV —
|
|
409
437
|
sendo explorado ativamente, mesmo que não seja CRITICAL.
|
|
410
438
|
|
|
439
|
+

|
|
440
|
+
|
|
441
|
+
<details>
|
|
442
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
443
|
+
|
|
411
444
|
```console
|
|
412
445
|
$ dockerls build . -t minhaapp:1.0 --production --fail-on critical,kev `
|
|
413
446
|
--owner "team-x" `
|
|
@@ -455,6 +488,8 @@ OUTPUT (measured after the build)
|
|
|
455
488
|
Image sha256:5e5a079bbd616d166b155f15dac48c9c603a9d605876c732fde620a7aa7958bc
|
|
456
489
|
```
|
|
457
490
|
|
|
491
|
+
</details>
|
|
492
|
+
|
|
458
493
|
Sem `--owner`, `--source` e `--security-contact`, esse mesmo comando falha —
|
|
459
494
|
de propósito: `required_labels` é parte do perfil `--production`, e o motivo
|
|
460
495
|
está no próprio erro quando isso acontece: "sem isso ninguém sabe pra quem
|
|
@@ -462,17 +497,29 @@ ligar quando essa imagem aparecer num alerta às três da manhã".
|
|
|
462
497
|
|
|
463
498
|
### 6. Usando a imagem depois de construída
|
|
464
499
|
|
|
500
|
+

|
|
501
|
+
|
|
502
|
+
<details>
|
|
503
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
504
|
+
|
|
465
505
|
```console
|
|
466
506
|
$ docker run --rm minhaapp:1.0 id
|
|
467
507
|
uid=1000(node) gid=1000(node) groups=1000(node),1000(node)
|
|
468
508
|
```
|
|
469
509
|
|
|
510
|
+
</details>
|
|
511
|
+
|
|
470
512
|
`uid=1000`, não `uid=0`. É o `USER node` do Dockerfile confirmado em
|
|
471
513
|
execução, não só lido no texto — a mesma checagem que `non_root_user` faz de
|
|
472
514
|
forma estática no passo 4, agora contra o container de verdade.
|
|
473
515
|
|
|
474
516
|
### 7. Fechando o loop
|
|
475
517
|
|
|
518
|
+

|
|
519
|
+
|
|
520
|
+
<details>
|
|
521
|
+
<summary>Ver como texto (copiar/colar)</summary>
|
|
522
|
+
|
|
476
523
|
```console
|
|
477
524
|
$ dockerls analyze minhaapp:1.0
|
|
478
525
|
|
|
@@ -492,6 +539,8 @@ Analysis: minhaapp:1.0
|
|
|
492
539
|
Scanner trivy
|
|
493
540
|
```
|
|
494
541
|
|
|
542
|
+
</details>
|
|
543
|
+
|
|
495
544
|
O mesmo `analyze` que você rodaria contra `node:22-alpine` pra decidir se
|
|
496
545
|
confia nela funciona igual contra o que você acabou de construir. Não existe
|
|
497
546
|
um comando separado pra "auditar a própria imagem" — é o mesmo raio-x, na
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|