- Introduced a new document outlining the inline DSSE provenance for SBOM, VEX, scan, and derived events. - Defined the Mongo schema for event patches, including key fields for provenance and trust verification. - Documented the write path for ingesting provenance metadata and backfilling historical events. - Created CI/CD snippets for uploading DSSE attestations and generating provenance metadata. - Established Mongo indexes for efficient provenance queries and provided query recipes for various use cases. - Outlined policy gates for managing VEX decisions based on provenance verification. - Included UI nudges for displaying provenance information and implementation tasks for future enhancements. --- Implement reachability lattice and scoring model - Developed a comprehensive document detailing the reachability lattice and scoring model. - Defined core types for reachability states, evidence, and mitigations with corresponding C# models. - Established a scoring policy with base score contributions from various evidence classes. - Mapped reachability states to VEX gates and provided a clear overview of evidence sources. - Documented the event graph schema for persisting reachability data in MongoDB. - Outlined the integration of runtime probes for evidence collection and defined a roadmap for future tasks. --- Introduce uncertainty states and entropy scoring - Created a draft document for tracking uncertainty states and their impact on risk scoring. - Defined core uncertainty states with associated entropy values and evidence requirements. - Established a schema for storing uncertainty states alongside findings. - Documented the risk score calculation incorporating uncertainty and its effect on final risk assessments. - Provided policy guidelines for handling uncertainty in decision-making processes. - Outlined UI guidelines for displaying uncertainty information and suggested remediation actions. --- Add Ruby package inventory management - Implemented Ruby package inventory management with corresponding data models and storage mechanisms. - Created C# records for Ruby package inventory, artifacts, provenance, and runtime details. - Developed a repository for managing Ruby package inventory documents in MongoDB. - Implemented a service for storing and retrieving Ruby package inventories. - Added unit tests for the Ruby package inventory store to ensure functionality and data integrity.
162 lines
6.3 KiB
C#
162 lines
6.3 KiB
C#
using System.Diagnostics;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Logging;
|
|
using Microsoft.Extensions.Options;
|
|
using StellaOps.Auth.Client;
|
|
using StellaOps.Configuration;
|
|
using StellaOps.Scanner.Cache;
|
|
using StellaOps.Scanner.Analyzers.OS.Plugin;
|
|
using StellaOps.Scanner.Analyzers.Lang.Plugin;
|
|
using StellaOps.Scanner.EntryTrace;
|
|
using StellaOps.Scanner.Core.Contracts;
|
|
using StellaOps.Scanner.Core.Security;
|
|
using StellaOps.Scanner.Surface.Env;
|
|
using StellaOps.Scanner.Surface.FS;
|
|
using StellaOps.Scanner.Surface.Secrets;
|
|
using StellaOps.Scanner.Surface.Validation;
|
|
using StellaOps.Scanner.Worker.Diagnostics;
|
|
using StellaOps.Scanner.Worker.Hosting;
|
|
using StellaOps.Scanner.Worker.Options;
|
|
using StellaOps.Scanner.Worker.Processing;
|
|
using StellaOps.Scanner.Worker.Processing.Surface;
|
|
using StellaOps.Scanner.Storage.Extensions;
|
|
using StellaOps.Scanner.Storage;
|
|
|
|
var builder = Host.CreateApplicationBuilder(args);
|
|
|
|
builder.Services.AddOptions<ScannerWorkerOptions>()
|
|
.BindConfiguration(ScannerWorkerOptions.SectionName)
|
|
.ValidateOnStart();
|
|
|
|
builder.Services.AddSingleton<IValidateOptions<ScannerWorkerOptions>, ScannerWorkerOptionsValidator>();
|
|
builder.Services.AddSingleton(TimeProvider.System);
|
|
builder.Services.AddScannerCache(builder.Configuration);
|
|
builder.Services.AddSurfaceEnvironment(options =>
|
|
{
|
|
options.ComponentName = "Scanner.Worker";
|
|
});
|
|
builder.Services.AddSurfaceValidation();
|
|
builder.Services.AddSurfaceFileCache();
|
|
builder.Services.AddSurfaceSecrets();
|
|
builder.Services.AddSingleton<IConfigureOptions<SurfaceCacheOptions>>(sp =>
|
|
new SurfaceCacheOptionsConfigurator(sp.GetRequiredService<ISurfaceEnvironment>()));
|
|
builder.Services.AddSingleton<ScannerWorkerMetrics>();
|
|
builder.Services.AddSingleton<ScanProgressReporter>();
|
|
builder.Services.AddSingleton<ScanJobProcessor>();
|
|
builder.Services.AddSingleton<LeaseHeartbeatService>();
|
|
builder.Services.AddSingleton<IDelayScheduler, SystemDelayScheduler>();
|
|
|
|
builder.Services.AddEntryTraceAnalyzer();
|
|
builder.Services.AddSingleton<IEntryTraceExecutionService, EntryTraceExecutionService>();
|
|
|
|
var storageSection = builder.Configuration.GetSection("ScannerStorage");
|
|
var connectionString = storageSection.GetValue<string>("Mongo:ConnectionString");
|
|
if (!string.IsNullOrWhiteSpace(connectionString))
|
|
{
|
|
builder.Services.AddScannerStorage(storageSection);
|
|
builder.Services.AddSingleton<IConfigureOptions<ScannerStorageOptions>, ScannerStorageSurfaceSecretConfigurator>();
|
|
builder.Services.AddSingleton<ISurfaceManifestPublisher, SurfaceManifestPublisher>();
|
|
builder.Services.AddSingleton<IScanStageExecutor, SurfaceManifestStageExecutor>();
|
|
}
|
|
else
|
|
{
|
|
builder.Services.TryAddSingleton<IRubyPackageInventoryStore, NullRubyPackageInventoryStore>();
|
|
}
|
|
|
|
builder.Services.TryAddSingleton<IScanJobSource, NullScanJobSource>();
|
|
builder.Services.TryAddSingleton<IPluginCatalogGuard, RestartOnlyPluginGuard>();
|
|
builder.Services.AddSingleton<IOSAnalyzerPluginCatalog, OsAnalyzerPluginCatalog>();
|
|
builder.Services.AddSingleton<ILanguageAnalyzerPluginCatalog, LanguageAnalyzerPluginCatalog>();
|
|
builder.Services.AddSingleton<IScanAnalyzerDispatcher, CompositeScanAnalyzerDispatcher>();
|
|
builder.Services.AddSingleton<IScanStageExecutor, RegistrySecretStageExecutor>();
|
|
builder.Services.AddSingleton<IScanStageExecutor, AnalyzerStageExecutor>();
|
|
|
|
builder.Services.AddSingleton<ScannerWorkerHostedService>();
|
|
builder.Services.AddHostedService(sp => sp.GetRequiredService<ScannerWorkerHostedService>());
|
|
|
|
var workerOptions = builder.Configuration.GetSection(ScannerWorkerOptions.SectionName).Get<ScannerWorkerOptions>() ?? new ScannerWorkerOptions();
|
|
builder.Services.AddStellaOpsCrypto(workerOptions.Crypto);
|
|
|
|
builder.Services.Configure<HostOptions>(options =>
|
|
{
|
|
options.ShutdownTimeout = workerOptions.Shutdown.Timeout;
|
|
});
|
|
|
|
builder.ConfigureScannerWorkerTelemetry(workerOptions);
|
|
|
|
if (workerOptions.Authority.Enabled)
|
|
{
|
|
builder.Services.AddStellaOpsAuthClient(clientOptions =>
|
|
{
|
|
clientOptions.Authority = workerOptions.Authority.Issuer?.Trim() ?? string.Empty;
|
|
clientOptions.ClientId = workerOptions.Authority.ClientId?.Trim() ?? string.Empty;
|
|
clientOptions.ClientSecret = workerOptions.Authority.ClientSecret;
|
|
clientOptions.EnableRetries = workerOptions.Authority.Resilience.EnableRetries ?? true;
|
|
clientOptions.HttpTimeout = TimeSpan.FromSeconds(workerOptions.Authority.BackchannelTimeoutSeconds);
|
|
|
|
clientOptions.DefaultScopes.Clear();
|
|
foreach (var scope in workerOptions.Authority.Scopes)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(scope))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
clientOptions.DefaultScopes.Add(scope);
|
|
}
|
|
|
|
clientOptions.RetryDelays.Clear();
|
|
foreach (var delay in workerOptions.Authority.Resilience.RetryDelays)
|
|
{
|
|
if (delay <= TimeSpan.Zero)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
clientOptions.RetryDelays.Add(delay);
|
|
}
|
|
|
|
if (workerOptions.Authority.Resilience.AllowOfflineCacheFallback is bool allowOffline)
|
|
{
|
|
clientOptions.AllowOfflineCacheFallback = allowOffline;
|
|
}
|
|
|
|
if (workerOptions.Authority.Resilience.OfflineCacheTolerance is { } tolerance && tolerance > TimeSpan.Zero)
|
|
{
|
|
clientOptions.OfflineCacheTolerance = tolerance;
|
|
}
|
|
});
|
|
}
|
|
|
|
builder.Logging.Configure(options =>
|
|
{
|
|
options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId
|
|
| ActivityTrackingOptions.TraceId
|
|
| ActivityTrackingOptions.ParentId;
|
|
});
|
|
|
|
var host = builder.Build();
|
|
|
|
await host.RunAsync();
|
|
|
|
public partial class Program;
|
|
|
|
internal sealed class SurfaceCacheOptionsConfigurator : IConfigureOptions<SurfaceCacheOptions>
|
|
{
|
|
private readonly ISurfaceEnvironment _surfaceEnvironment;
|
|
|
|
public SurfaceCacheOptionsConfigurator(ISurfaceEnvironment surfaceEnvironment)
|
|
{
|
|
_surfaceEnvironment = surfaceEnvironment ?? throw new ArgumentNullException(nameof(surfaceEnvironment));
|
|
}
|
|
|
|
public void Configure(SurfaceCacheOptions options)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(options);
|
|
var settings = _surfaceEnvironment.Settings;
|
|
options.RootDirectory = settings.CacheRoot.FullName;
|
|
}
|
|
}
|