예제 #1
0
        private static void ConfigureServices(IServiceCollection services)
        {
            services.AddOptions();
            services.AddLogging(l => l.AddConsole());
            services.AddDbContext <DnsDbContext>(opt =>
                                                 opt.UseNpgsql(EnvironmentExtensions.GetVariable(EnvVars.PG_CONNECTION_STRING_WRITE), dbOpt => dbOpt.MigrationsAssembly("Dns.DAL")));
            services.AddDbContext <DnsReadOnlyDbContext>(opt =>
                                                         opt.UseNpgsql(EnvironmentExtensions.GetVariable(EnvVars.PG_CONNECTION_STRING_READ)));

            services.AddTransient <ResolveService>();
            services.AddSingleton <RedisService>();
            services.AddTransient <Bootstrapper>();
        }
예제 #2
0
        public Task AuthorizeAsync(string login, string pass)
        {
            var authServer = EnvironmentExtensions.GetVariable(EnvVars.AUTH_SERVER_URL);
            var loginUrl   = authServer.TrimEnd('/') + "/api/Auth/Login";
            var loginModel = new LoginModel
            {
                Login    = login,
                Password = pass
            };
            var body = new StringContent(loginModel.ToJson(), Encoding.Default, MediaTypeHeaderValue.Parse("application/json").MediaType);

            return(_httpClient.PostAsync(new Uri(loginUrl, UriKind.Absolute), body));
        }
예제 #3
0
        public async Task ResolveDomains()
        {
            var whiteDomains = await GetWhiteDomains();

            var blackDomains = await GetBlackDomains();

            var stopWatch = new Stopwatch();

            stopWatch.Start();
            var resolvedWhiteDomains = await _resolve.ResolveDomainsWithRetry(whiteDomains, 3);

            stopWatch.Stop();
            _logger.LogWarning($"[RESOLVING, PARALLELISM - {EnvironmentExtensions.GetVariable(EnvVars.RESOLVER_MAX_DEGREE_OF_PARALLELISM)}, BUFFER - {EnvironmentExtensions.GetVariable(EnvVars.RESOLVER_BUFFER_BLOCK_SIZE)}] {resolvedWhiteDomains.Count()} domains took {stopWatch.Elapsed}");
            stopWatch.Restart();
            var resolvedBlackDomains = await _resolve.ResolveDomainsWithRetry(blackDomains, 3);

            _logger.LogWarning($"[RESOLVING, PARALLELISM - {EnvironmentExtensions.GetVariable(EnvVars.RESOLVER_MAX_DEGREE_OF_PARALLELISM)}, BUFFER - {EnvironmentExtensions.GetVariable(EnvVars.RESOLVER_BUFFER_BLOCK_SIZE)}] {resolvedBlackDomains.Count()} domains took {stopWatch.Elapsed}");
            stopWatch.Stop();

            await _redis.SaveResolvedDomains(RedisKeys.WHITE_DOMAINS_RESOLVED, resolvedWhiteDomains);

            await _redis.SaveResolvedDomains(RedisKeys.BLACK_DOMAINS_RESOLVED, resolvedBlackDomains);
        }
예제 #4
0
        private NotificationEmail BuildGroupEmailMessage(IEnumerable <AttackGroups> attacks)
        {
            var emailBody = File.ReadAllText(Path.Combine(EmailPath, EMAIL_GROUP_TEMPLATE));
            var row       = File.ReadAllText(Path.Combine(EmailPath, EMAIL_GROUP_TEMPLATE_ADDITION));

            var htmlBody = new HtmlDocument();

            htmlBody.LoadHtml(emailBody);

            var tableBody = htmlBody.DocumentNode.Descendants("tbody").First();

            foreach (var attack in attacks)
            {
                var blackDomain = attack.Attacks.FirstOrDefault().BlackDomain;
                var whiteDomain = attack.Attacks.FirstOrDefault().WhiteDomain;
                var lastChange  = attack.GroupHistories.OrderByDescending(x => x.Id).FirstOrDefault();
                var newStatus   = lastChange.CurrentEnum.GetDisplayName();
                var statusText  = newStatus;
                if (lastChange.PrevStatusEnum != AttackGroupStatusEnum.None)
                {
                    statusText = $"{lastChange.PrevStatusEnum.GetDisplayName()} -> {newStatus}";
                }

                var newRow = row
                             .Replace(EMAIL_BLACK_DOMAIN_KEY, blackDomain)
                             .Replace(EMAIL_WHITE_DOMAIN_KEY, whiteDomain)
                             .Replace(EMAIL_STATUS_KEY, statusText)
                             .Replace(EMAIL_URL_KEY, attack.Id.ToString());
                tableBody.AppendChild(HtmlNode.CreateNode(newRow));
            }
            return(new NotificationEmail
            {
                Body = htmlBody.DocumentNode.OuterHtml,
                From = EnvironmentExtensions.GetVariable(EnvVars.NOTIFICATION_EMAIL_FROM),
                Subject = EMAIL_SUBJECT
            });
        }
예제 #5
0
 public RedisService(ILogger <RedisService> logger)
 {
     _logger = logger;
     _redis  = ConnectionMultiplexer.Connect(EnvironmentExtensions.GetVariable(EnvVars.REDIS_CONNECTION));
 }
예제 #6
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext <DnsDbContext>(opt =>
                                                 opt.UseNpgsql(EnvironmentExtensions.GetVariable(EnvVars.PG_CONNECTION_STRING_WRITE), dbOpt => dbOpt.MigrationsAssembly("Dns.DAL")));
            services.AddDbContext <DnsReadOnlyDbContext>(opt =>
                                                         opt.UseNpgsql(EnvironmentExtensions.GetVariable(EnvVars.PG_CONNECTION_STRING_READ)));


            services.AddSwaggerGen(x =>
            {
                x.SwaggerDoc("v1", new OpenApiInfo
                {
                    Version     = "v1",
                    Title       = "DNS API",
                    Description = "Service of analyze domains"
                });
                x.IncludeXmlComments("Dns.Site.xml");
                x.DescribeAllEnumsAsStrings();
            });


            services.AddCors(options =>
            {
                options.AddPolicy("AllowAll",
                                  builder =>
                {
                    builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader();
                });
            });

            services.AddStackExchangeRedisCache(opts =>
            {
                opts.Configuration = EnvironmentExtensions.GetVariable(EnvVars.REDIS_CONNECTION);
                opts.InstanceName  = "Dns_Redis_Cache";
            });

            services.AddControllersWithViews()
            .AddNewtonsoftJson();

            services.AddSignalR(opts => opts.EnableDetailedErrors = true)
            .AddStackExchangeRedis(EnvironmentExtensions.GetVariable(EnvVars.REDIS_CONNECTION), opt =>
                                   opt.Configuration.ChannelPrefix = "Dns_SignalR_");

            if (HostEnvironment.IsProduction())
            {
                services.ConfigureSharedCookieAuthentication();

                services.AddAuthorization(opts =>
                {
                    opts.AddPolicy("DnsPolicy", policy => policy.RequireAssertion(context => context.User.HasRole(UserRoles.DnsViewer)));
                });
            }

            //ADD SERVICES
            services.AddScoped <AttackService>();
            services.AddScoped <NotifyService>();
            services.AddScoped <ExcelService>();

            services.AddHttpClient <IUserService, AuthService.Client>((provider, client) =>
            {
                client.BaseAddress = new Uri(EnvironmentExtensions.GetVariable(EnvVars.AUTH_SERVER_URL));
            });

            services.AddHttpClient <INotifyApiService, NotificationService.Client>((provider, client) =>
            {
                client.BaseAddress = new Uri(EnvironmentExtensions.GetVariable(EnvVars.NOTIFY_SERVICE_URL));
            });
            services.AddHttpClient <IVigruzkiService, VigruzkiService.Client>((provider, client) =>
            {
                client.BaseAddress = new Uri(EnvironmentExtensions.GetVariable(EnvVars.VIGRUZKI_SERVICE_URL));
            });

            services.AddSingleton <RedisService>();
        }
예제 #7
0
 public ResolveService(ILogger <ResolveService> logger)
 {
     _logger    = logger;
     _dnsServer = EnvironmentExtensions.GetVariable(EnvVars.HYPERLOCAL_SERVER);
 }