网站首页 > 开源技术 正文
背 景
公司A拥有一套云上DNS服务,主要用于支持云中应用和服务的域名解析。为了满足线下门店之间的服务互联需求,公司在内网自建一套Windows DNS服务器,以实现门店之间的高效域名解析。此方案旨在保证内部网络的稳定性与安全性,同时与云上DNS服务进行有效集成,需要监控证书有效性和域名解析的记录查询。
目 标
- 自建DNS服务:在不登录window dns服务器的情况下,通过日志系统进行查询解析记录。
- HTTPS安全通信:为所有域名服务打印域名证书的时间信息。
- 告警系统:监控域名证书状态,并在出现问题时及时告警。
业务流程
- 域名解析测试
- 在内部网络的客户端上测试域名解析,确保所有服务都能正确解析。
- 验证HTTPS证书连接,确保浏览器或客户端能够安全访问服务。
- 证书和域名监控
- 监控证书的有效期,设置告警阈值(如到期前60天)。
- 监控HTTPS服务的可用性,确保服务在DNS解析和证书有效的情况下正常运行。
- 告警机制
- 如果证书即将到期或已过期,发出告警,确保运维人员能够及时更新证书。
- 实现自动化脚本,当证书即将到期时,生产新的证书进替换
服务器安装openssl服务
- openssl软件下载地址https://slproweb.com/download/Win64OpenSSL-3_3_2.msi
- 软件下载后直接点击下一步进行安装,直到安装完成.
- 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#39;, '.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门户、配置密钥保管库、实施流量回放和监控,我们不仅提高了资产的可见性,还确保了数据的安全性和合规性。随着企业数字化转型的不断深入,资产梳理和安全运营将变得愈发重要。我们鼓励大家定期进行资产审查和监控,以应对不断变化的安全威胁和业务需求。感谢您对安全运营工作的关注与支持,让我们共同努力,提升企业的安全防护水平,确保业务的持续稳定运行。
如有相关问题,请在文章后面给小编留言,小编安排作者第一时间和您联系,为您答疑解惑。
- 上一篇: 零基础学习网站必知—http协议等资料大全
- 下一篇: 极端容器场景下的远程文件下载思路
猜你喜欢
- 2025-01-17 借助 Terraform 功能协调部署 CI/CD 流水线-Part 2
- 2025-01-17 (超文本传输协议)什么是http协议?
- 2025-01-17 ADG (Active Data Guard) 数据容灾架构下,如何配置 Druid 连接池?
- 2025-01-17 Cadence Allegro 16.6操作技巧_ 如何布线
- 2025-01-17 求生之路2服务器搭建插件安装及详细的游戏参数配置教程windows
- 2025-01-17 极端容器场景下的远程文件下载思路
- 2025-01-17 零基础学习网站必知—http协议等资料大全
- 2025-01-17 F5安全的多云网络解决方案 助力简化分布式云环境的网络和应用连接
- 2025-01-17 推荐:PaGoDo一款功能强大的被动式Google Dork
- 2025-01-17 netstat命令详解
你 发表评论:
欢迎- 最近发表
-
- 6月游戏推荐(二)(6月份新出的游戏)
- 37【源码】数据可视化:基于 Echarts + Python 动态实时大屏
- Kubernetes Kube-Proxy 组件 IPVS 模式工作原理及常用故障排查
- 《茶余饭后顶级英文歌曲精选》(茶余饭后的经典句子)
- rainx和MediaTek携手推出101产品生态,为5G FWA提供创新
- KAPITAL 推出蓝染风格 Aloha Shirt 系列
- 欧美经典怀旧歌曲Free loop-管不住的音符
- Mac 下php5.3-7.0的二进制包 ── PHP-OS
- 如何把一个Python应用程序装进Docker
- 为何推荐 JsonTree.js 做 JSON 可视化?
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)