百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

自建dns获取域名解析与证书告警

nanshan 2025-02-15 16:44 9 浏览 0 评论

背 景

公司A拥有一套云上DNS服务,主要用于支持云中应用和服务的域名解析。为了满足线下门店之间的服务互联需求,公司在内网自建一套Windows DNS服务器,以实现门店之间的高效域名解析。此方案旨在保证内部网络的稳定性与安全性,同时与云上DNS服务进行有效集成,需要监控证书有效性和域名解析的记录查询。

目 标

  1. 自建DNS服务:在不登录window dns服务器的情况下,通过日志系统进行查询解析记录。
  2. HTTPS安全通信:为所有域名服务打印域名证书的时间信息。
  3. 告警系统:监控域名证书状态,并在出现问题时及时告警。

业务流程

  1. 域名解析测试
  2. 在内部网络的客户端上测试域名解析,确保所有服务都能正确解析。
  3. 验证HTTPS证书连接,确保浏览器或客户端能够安全访问服务。
  4. 证书和域名监控
  5. 监控证书的有效期,设置告警阈值(如到期前60天)。
  6. 监控HTTPS服务的可用性,确保服务在DNS解析和证书有效的情况下正常运行。
  7. 告警机制
  8. 如果证书即将到期或已过期,发出告警,确保运维人员能够及时更新证书。
  9. 实现自动化脚本,当证书即将到期时,生产新的证书进替换

服务器安装openssl服务

  1. openssl软件下载地址https://slproweb.com/download/Win64OpenSSL-3_3_2.msi
  2. 软件下载后直接点击下一步进行安装,直到安装完成.
  3. openssl环境变量配置

使用命令查询openssl -version版本信息

脚本查询域名的A记录、CNAME记录、域名证书信息

1.手动查询自建window dns的A记录和CNAME记录命令信息

Get-DnsServerResourceRecord -ZoneName "text" | Where-Object { $_.RecordType -eq "CNAME" -or $_.RecordType -eq "A"} | Format-Table -AutoSize

2.在powershell上查询单个域名的证书信息

$domain = "zi.lu.cn" 

cmd /c "echo | openssl s_client -servername `"$($domain)`" -connect `"$($domain):443`" 2>&1 | openssl x509 -noout -dates | findstr /C:notAfter"


3.通过powershell脚本获取域名详细信息

$zoneName = "lu.cn"
# domaininput.txt需要排除的域名列表信息
$inputFilePath = "D:\domain\domaininput.txt"
# domainoutput.txt需要输出日志记录的域名列表信息
$outputFilePath = "D:\domain\domainoutput.txt"
# 飞书webhook
$feishuWebhookUrl = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxx"  # 替换为你的飞书 Webhook URL

function Send-FeishuNotification {
    param (
        [string]$message,
        [string]$color
    )

    if ($color -eq "blue") {
        $formattedMessage = "*Success:* $message"
    } elseif ($color -eq "black") {
        $formattedMessage = "*Error:* $message"
    } else {
        $formattedMessage = $message
    }

    $payload = @{
        msg_type = "text"
        content  = @{
            text = $formattedMessage
        }
    }

    $jsonPayload = $payload | ConvertTo-Json -Depth 1

    Invoke-RestMethod -Uri $feishuWebhookUrl -Method Post -Body $jsonPayload -ContentType 'application/json'
}

function Get-CertificateEndDate {
    param (
        [string]$domain
    )
    
    Write-Host "正在处理域名: $domain"
    try {
        # 获取证书到期信息
        $certInfo = cmd /c "echo | openssl s_client -servername `"$($domain)`" -connect `"$($domain):443`" 2>&1 | openssl x509 -noout -dates | findstr /C:notAfter"
        
        Write-Host "获取的证书信息: $certInfo"

        if ($certInfo -match "notAfter=(.*)") {
            $formattedDate = $matches[1].Trim()  # 获取到期时间并去掉空格
            Write-Host "证书到期时间: $formattedDate"

            # 修剪多余空格
            $formattedDate = $formattedDate -replace '\s+', ' '

            # 解析日期时,指定格式并转换为 yyyy-MM-dd
            $parsedDate = [datetime]::ParseExact($formattedDate, "MMM d HH:mm:ss yyyy 'GMT'", [System.Globalization.CultureInfo]::InvariantCulture)
            $endDate = $parsedDate.ToString("yyyy-MM-dd")

            Write-Host "格式化后的日期: $endDate"
            return $endDate
        } else {
            Write-Host "未找到证书信息: $certInfo"
            return "2008-08-08"  # 默认日期
        }
    } catch {
        Write-Host "发生错误: $_"
        return "2008-08-08"  # 默认日期
    }
}

try {
    if (-Not (Test-Path $inputFilePath)) {
        $errorMessage = "输入文件不存在:$inputFilePath"
        $failureMessage = "failed $zoneName $errorMessage"
        Send-FeishuNotification -message $failureMessage -color "black"
        exit
    }

    $excludedDomains = Get-Content -Path $inputFilePath | Where-Object { $_.Trim() -ne "" }
    $dnsRecords = Get-DnsServerResourceRecord -ZoneName $zoneName |
                  Where-Object { $_.RecordType -eq "CNAME" -or $_.RecordType -eq "A" }

    $output = @{}
    $ignoredDomains = @()

    foreach ($record in $dnsRecords) {
        $hostName = $record.HostName

        if ($hostName.EndsWith($zoneName, [System.StringComparison]::OrdinalIgnoreCase)) {
            $fullDomain = $hostName
        } else {
            $fullDomain = "$hostName.$zoneName"
        }

        # 修正重复的域名问题
        $fullDomain = $fullDomain -replace '\.lu\.cn\.lu\.cn$', '.lu.cn'

        if ($excludedDomains -notcontains $fullDomain) {
            $endDate = Get-CertificateEndDate -domain $fullDomain

            $key = "$fullDomain|$($record.RecordType)"
            if (-not $output.ContainsKey($key)) {
                $output[$key] = @{
                    RecordType = $record.RecordType
                    domain     = $fullDomain
                    EndDate    = $endDate
                    CimInstanceProperties = $record.RecordData
                }
            }
        } else {
            $ignoredDomains += $fullDomain
        }
    }

    $outputArray = $output.Values
    $outputLines = $outputArray | ForEach-Object {
        $_ | ConvertTo-Json -Depth 1 -Compress
    }

    $outputLines | Set-Content -Path $outputFilePath -Encoding utf8

    $lineCount = $outputLines.Count
    $uniqueIgnoredDomains = $ignoredDomains | Select-Object -Unique

    $ignoredJson = @{}
    foreach ($domain in $uniqueIgnoredDomains) {
        $ignoredJson["domain_$($ignoredJson.Count + 1)"] = $domain
    }
    $ignoredJsonString = $ignoredJson | ConvertTo-Json -Depth 10

    $successMessage = "domain:$zoneName path:$outputFilePath row:$lineCount ignore: `n$ignoredJsonString"
    Send-FeishuNotification -message $successMessage -color "blue"

} catch {
    $errorMessage = $_.Exception.Message
    $failureMessage = "failed $zoneName $errorMessage"
    Send-FeishuNotification -message $failureMessage -color "black"
    throw
} 


#domainoutput.txt文件内容输出JSON LOG信息
{"CimInstanceProperties":{"CimClass":"root/Microsoft/Windows/DNS:DnsServerResourceRecordA","CimInstanceProperties":"IPv4Address = \"20.20.20.20\"","CimSystemProperties":"Microsoft.Management.Infrastructure.CimSystemProperties"},"RecordType":"A","domain":"view.lu.cn","EndDate":"2008-08-08"}
{"CimInstanceProperties":{"CimClass":"root/Microsoft/Windows/DNS:DnsServerResourceRecordCName","CimInstanceProperties\"":"HostNameAlias = \"alb-cs.cn","CimSystemProperties":"Microsoft.Management.Infrastructure.CimSystemProperties"},"RecordType":"CNAME","domain":"pa.lu.cn","EndDate":"2025-05-31"}

使用json-hand插件进行格式化输出展示

4.飞书输出信息提示,成功的域名地址、路径、域名多少数量、排除的域名是那几个

互配置日志接入与查询SQL

1.配置阿里云sls接入window dns单层json日志信息window dns文件的路径地址为D:\domain\domainoutput.txt


2.通过sls查询sql输出window dns日志信息

* | SELECT "content.domain", "content.RecordType", "content.CimInstanceProperties.CimInstanceProperties" , "content.EndDate"   from log     LIMIT 1000


配置告警输出

根据查询的sls sql语句进行针对性的配置告警和行动策略通知聚道(钉钉、短信、电话等等)

在本文中,我们详细探讨了如何通过自建DNS实现域名解析与证书告警的管理。通过创建Purview门户、配置密钥保管库、实施流量回放和监控,我们不仅提高了资产的可见性,还确保了数据的安全性和合规性。随着企业数字化转型的不断深入,资产梳理和安全运营将变得愈发重要。我们鼓励大家定期进行资产审查和监控,以应对不断变化的安全威胁和业务需求。感谢您对安全运营工作的关注与支持,让我们共同努力,提升企业的安全防护水平,确保业务的持续稳定运行。

如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。

相关推荐

虚拟机“播放器”:VMware Player 12.0.1下载

IT之家讯免费虚拟机软件VMwareWorkstationPlayer更新至12.0.1,本次更新为维护性更新,同今天更新的WorkstationPro版本一样,解决了某些情况下Skylake...

ZLG嵌入式笔记 | 移动硬盘和虚拟机的那些事儿

在Linux开发中,编译内核是一项常见任务,但不少开发者在移动硬盘或虚拟机环境下尝试时会遭遇失败。本文将简要探讨这些问题的成因,并介绍一些虚拟机使用技巧,帮助大家更好地应对相关问题。在移动硬盘里编译...

IT 技术小课堂「虚拟机」

你知道什么是虚拟机吗?虚拟机就是可以用一台电脑变成多台电脑的计算机魔法。推荐上手最快的虚拟机软件VMwareWorkstation。如果你的物理机是Win10以下的可以安装VMwareWo...

最简单的虚拟机安装黑苹果

给所有还没体验过Macos的人们。本文会以最简单的方式介绍虚拟机安装黑苹果的教程,准备四个工具,一次性安装黑苹果,中间基本不会有出现任何问题。一、准备工具,先把以下工具都准备好,网上搜索即可。1、...

VMware虚拟机与物理机文件交互,这8种方法送给你

上一期我们讲解过用VMWare虚拟机打造一个金刚不坏之身的操作系统,小伙伴们反应说方法不错,只是虚拟机与物理机文件交互方式不好操作,这期应小伙伴们的要求,给大家讲解下虚拟机与物理机文件交互的8种方式,...

VMware虚拟机:第二节安装VMware并创建Win10虚拟机

VMware虚拟机:第二节安装VMware并创建Windows10虚拟机本节我们介绍如何安装VMwareWorkStationPro17.6.2,以及利用VMware创建Windows10虚拟机。...

vSphere环境虚拟机安装VMware Tools(Windows操作系统)

本文描述Windows操作系统的VMwareTools安装。Windows操作系统的VMwareTools安装操作步骤Windows操作系统安装完成后,VMwarevSphere控制台会提示“该...

windows7虚拟机VMware tools报错——一招解决

前言最近,把VMwareworkstation更新到版本17后,在一次安装windows7虚拟机的时候,发现VMwaretools各种安装报错,安装无法正常进行,这可愁坏了我,让我把自己本来不多的...

博通紧急修复VMware Tools高危认证绕过漏洞

IT之家3月26日消息,博通昨日(3月25日)发布安全公告,修复VMwareToolsforWindows中存在的高危认证绕过漏洞(CVE-2025-22230)。该漏洞由俄罗...

linux中如何安装VMwaretools--一定要保存

安装好VMware后,有时候我想把真机的文件放到虚拟机了,除了使用远程工具外,也会用到VMwaretools,今天给大家说说如何安装VMwaretools。其实在网上也可以搜到,只是网上的东西太乱了。...

精品博文解决安装Ubuntu14.04不弹出图像界面的问题

今天遇到一个糗事,不写出来不足以解恨。暑期开始了,给一个辅导班做嵌入式系统的讲座。问题就出在讲完以后系统的安装这个环境。班里面好些同学安装好以后进入不了图像界面,举手问我啊,oh,mygod!就到了这...

虚拟机VMware Workstation 17教程,从入门到精通No.3-vmwaretools

安装VMwareTools是创建新的虚拟机过程的一部分,而升级VMwareTools是使虚拟机更易于使用的关键。尽管客户机操作系统在未安装VMwareTools的情况下仍可运行,但许...

国产操作系统虚拟机安装vm-tools

使用vmwareworkstation安装国产化操作系统虚拟机后,不会像windows一样自动安装vmtools工具,按vmware默认的由虚拟机菜单中安装的方法步骤比较复杂,且最终结果不理想,经实...

VmwareTools的安装 这个功能很强大 #计算机

vmwareTools的安装。现在装完之后,这么点看起来也别扭,怎么办?装工具:vmwaretools。·在这个地方选择虚拟机,虚拟机这里边有安装vmwaretools,安装这个工具点击一下。·下边这...

VMware Tools安装失败?手把手教你本地安装

VMwareTools安装失败?作为虚拟机与物理机之间的"桥梁",VMwareTools能实现文件拖拽、剪贴板共享、分辨率自适应等关键功能。没有它,VMware虚拟机就变得非常不好...

取消回复欢迎 发表评论: