Audit & hardening: Xây dựng script bảo mật VPS Windows tự động cho DevOps

Tác giả: Trần Thảo 18 tháng 07, 2026

Bạn vừa nhận bàn giao một máy chủ Windows Server hoàn toàn mới từ Cloud Provider. RDP mượt mà, IP tĩnh đã gán, tài nguyên cấp phát dư dả. Nhưng chỉ 5 phút sau khi kết nối Internet, hàng nghìn request rác và các công cụ brute-force đã bắt đầu dội thẳng vào cổng 3389. Nếu bạn cho rằng hệ điều hành mới nhất đã an toàn tuyệt đối ngay khi vừa cài đặt (out-of-the-box), bạn có thể sẽ phải trả giá bằng một đợt rò rỉ dữ liệu hoặc bị mã hóa toàn bộ hệ thống ngay trong đêm.

Mặc dù Microsoft đã liên tục cập nhật bảo mật cho các hệ điều hành hiện đại, nhưng thực tế triển khai ở môi trường Production lại là một câu chuyện khác. Rất nhiều VPS được nhân bản từ các OS Template (image) cũ của nhà cung cấp để ép thời gian khởi động nhanh hơn, hoặc các phần mềm quản trị di sản (legacy) tự động can thiệp làm suy yếu lớp phòng thủ mặc định. Để không biến máy chủ thành zombie trong các mạng botnet, việc tích hợp một script bảo mật VPS Windows để tự động rà soát và đóng chặt các lỗ hổng là công cụ bắt buộc phải có của mọi SysAdmin và kỹ sư DevOps.

Vậy những lầm tưởng nào về cấu hình mặc định đang cất giấu bom hẹn giờ trong hệ thống? Và làm thế nào để xây dựng một kịch bản chuẩn hóa bảo mật (Security Baseline) theo tiêu chuẩn Enterprise, đón đầu cả những công nghệ mới nhất trên Windows Server 2025?

Bàn giao VPS thiếu audit: Những lỗ hổng thường bị hiểu lầm

Nhiều tài liệu bảo mật cũ thường phóng đại các rủi ro bằng những thông tin chưa cập nhật, nhưng trong môi trường thực chiến, mối đe dọa lại đến từ những nguyên nhân tinh vi hơn rất nhiều. Dưới đây là những điểm mù chí mạng mà DevOps thường bỏ sót khi vội vàng đẩy VPS lên Production.

Infographic so sánh bề mặt tấn công của VPS Windows cấu hình mặc định và VPS đã được hardening bảo mật bằng script.

Bề mặt tấn công (Attack Surface) của một VPS Windows sẽ giảm đi đáng kể sau khi được rà soát và cấu hình Security Baseline.

Chính sách khóa tài khoản (Account Lockout) bị tùy biến sai lệch

Trước đây, ngưỡng khóa tài khoản mặc định trên Windows Server là 0 (không bao giờ khóa). Kể từ bản cập nhật tích lũy cuối năm 2022, Microsoft đã nâng cấp tính năng tự động khóa tài khoản sau 10 lần đăng nhập sai, và chính sách này áp dụng cho cả tài khoản Built-in Administrator.

Tuy nhiên, rủi ro vẫn hiển hiện bởi phần lớn các nhà cung cấp VPS giá rẻ thường sử dụng các OS Template tự chế. Quá trình tối ưu hóa image (sysprep) thường vô tình hoặc cố ý tắt bỏ các chính sách an toàn này để tránh việc khách hàng bị tự khóa (lockout) khỏi máy chủ của chính họ. Việc chủ động triển khai phương án chặn brute force RDP bằng PowerShell là thao tác sống còn giúp ngăn chặn botnet liên tục thu thập dữ liệu và nhồi mật khẩu vào cổng RDP.

Sự hồi sinh âm thầm của SMBv1 và WDigest

Trên các phiên bản Windows Server 2022 và 2025, giao thức SMBv1 (nguyên nhân gây ra thảm họa ransomware WannaCry) đã bị loại bỏ hoàn toàn. Tính năng WDigest (cho phép lưu mật khẩu dạng văn bản thuần trong bộ nhớ RAM) cũng bị vô hiệu hóa mặc định từ lâu.

Nhưng kẻ thù lại thường đến từ bên trong. Các script cài đặt phần mềm di sản (legacy installers) hoặc các cấu hình chia sẻ file nội bộ đôi khi vô tình gọi các API kích hoạt lại hai tính năng này mà SysAdmin không hề hay biết. Kẻ tấn công khi thâm nhập thành công có thể sử dụng công cụ Mimikatz để trích xuất mật khẩu dạng văn bản thuần từ LSASS (Local Security Authority Subsystem Service). Việc chạy kịch bản hardening đóng vai trò như một chốt chặn cuối cùng để dọn dẹp các tàn dư nguy hiểm này trước khi đưa ứng dụng lên môi trường đang hoạt động (Live).

Ghi nhật ký hệ thống (Audit Policy) thiếu hụt

Để phát hiện tấn công và rà soát pháp y (network forensic analysis), Audit Log chính là con mắt của hệ thống. Dù hệ điều hành mới đã có nhiều cải tiến, một số chính sách kiểm tra nâng cao (Advanced Audit Policy) quan trọng như theo dõi quản lý tài khoản đặc quyền (Event ID 4964), thay đổi nhóm bảo mật (Event ID 4728) vẫn thường bị bỏ ngỏ ở trạng thái No Auditing.

Nếu máy chủ bị xâm nhập bằng kỹ thuật Pass-the-Hash (sử dụng mã băm mật khẩu thay vì mật khẩu gốc), hệ thống giám sát SIEM của bạn sẽ hoàn toàn mất khả năng quan sát và không có bất kỳ manh mối nào để kích hoạt cảnh báo (alert).

Quản lý Administrator cục bộ theo cách thủ công

Nhiều đội ngũ DevOps vẫn giữ thói quen cũ là đổi tên tài khoản SID-500 (Administrator) sang một tên khác rồi gán cho nó một mật khẩu siêu dài. Tuy nhiên, các môi trường hiện đại đòi hỏi sự quản lý linh hoạt hơn. Việc đặt một mật khẩu tĩnh duy nhất cho Local Admin trên hàng loạt máy chủ tạo ra kẽ hở khổng lồ. Nếu hacker lấy được mã băm (hash) của mật khẩu này trên một máy chủ thử nghiệm (Staging), chúng có thể lập tức di chuyển ngang (lateral movement) và chiếm toàn bộ các Node Production.

Tư duy thiết kế script bảo mật chuẩn doanh nghiệp (Enterprise-grade)

Để đạt chuẩn doanh nghiệp (theo CIS Benchmarks hoặc Microsoft Security Baselines), một kịch bản bảo mật không thể chỉ là vài dòng lệnh can thiệp Registry một cách thô sơ. Hệ sinh thái DevOps hiện đại đòi hỏi kịch bản phải có tính lũy đẳng (Idempotent Design), nghĩa là kịch bản có thể được chạy hàng trăm lần mà vẫn tuyệt đối an toàn. Nó chỉ thực thi thay đổi nếu phát hiện cấu hình hiện tại đang sai lệch (Configuration Drift) so với Baseline.

Dưới đây là các công nghệ cốt lõi cần tích hợp vào script để đáp ứng tiêu chuẩn hiện đại:

Tích hợp Native Windows LAPS (Local Administrator Password Solution)

Kể từ tháng 4 năm 2023, Microsoft đã tích hợp sẵn LAPS vào thẳng Windows Server 2022 và Windows 11. Đừng quản lý mật khẩu thủ công nữa. Script của bạn cần có cơ chế kiểm tra và kích hoạt LAPS để tự động xoay vòng mật khẩu local admin theo thời gian thực (ví dụ: đổi mật khẩu mỗi 7 ngày hoặc ngay sau khi sử dụng). Mã băm mật khẩu sẽ được đẩy thẳng và mã hóa an toàn trên Active Directory hoặc Entra ID.

Module SmbShare thay cho Feature cũ

Quên lệnh Get-WindowsOptionalFeature chậm chạp đi. Các script hiện đại ưu tiên sử dụng cmdlet Get-SmbServerConfigurationSet-SmbServerConfiguration để xử lý giao thức SMB. Cách này tương tác trực tiếp với Service đang hoạt động, cho kết quả tức thì và chính xác hơn ở cấp độ dịch vụ thay vì kiểm tra gói cài đặt (Feature) của Windows.

Chặn NTLM qua SMB (SMB NTLM Blocking)

Đặc biệt trên Windows Server 2025, việc chỉ tắt SMBv1 không còn là mối bận tâm duy nhất. Script cần rà soát tính năng khóa hoàn toàn NTLM cho các kết nối SMB. Việc ép buộc hệ thống chỉ sử dụng Kerberos sẽ ngăn chặn triệt để các kỹ thuật tấn công NTLM Relay, chặn đứng nỗ lực giả mạo thông tin xác thực trên mạng nội bộ.

Bắt buộc Network Level Authentication (NLA)

NLA là tấm khiên thép chặn RDP Brute-force. Khi NLA không được kích hoạt, máy chủ sẽ tiêu tốn RAM và CPU để tạo một phiên kết nối và render màn hình đăng nhập (Logon Screen) cho bất kỳ IP nào request đến. NLA buộc người dùng phải xác thực danh tính với mạng (Pre-authentication) trước khi session RDP được cấp phát. Kịch bản phải tự động ép khóa Registry UserAuthentication lên mức 1.

Sơ đồ luồng hoạt động của script bảo mật VPS Windows tự động theo mô hình Audit và Auto-Remediation chuẩn DevOps.

Chu trình Audit và AutoFix chuẩn mực của một kịch bản bảo mật, tuân thủ nguyên lý Lũy đẳng (Idempotent) để không làm hỏng cấu hình hệ thống.

Triển khai script đánh giá & chấm điểm server

Dưới đây là một phần mã nguồn PowerShell được thiết kế theo chuẩn DevOps hiện đại, tập trung vào mô hình rà soát (Audit) và chấm điểm hệ thống (Scoring). Bạn có thể lưu đoạn code này thành file Security-Baseline-Audit.ps1 và đưa vào quy trình CI/CD hoặc chạy ngay trên máy chủ vừa nhận bàn giao.

<#
.SYNOPSIS
    Windows VPS Security Baseline Audit (Phiên bản Hiện đại)
.DESCRIPTION
    Tự động rà soát các cấu hình nhạy cảm (SMB NTLM Blocking, Native LAPS, NLA, 
    Firewall, Account Lockout) theo tiêu chuẩn Windows Server 2022/2025.
    Script hoạt động ở chế độ Read-Only, an toàn cho môi trường Production.
#>

# 1. Pre-flight Check: Yêu cầu quyền Administrator
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Write-Warning "[LỖI] Quy trình Audit yêu cầu đặc quyền hệ thống. Vui lòng mở PowerShell bằng 'Run as Administrator'."
    exit
}

$Score = 100
$Results = @()

# Hàm xử lý kết quả và trừ điểm nếu cấu hình không đạt chuẩn
function Add-AuditResult {
    param(
        [string]$Name, 
        [bool]$Passed, 
        [string]$Remediation, 
        [int]$Penalty
    )
    
    $Status = if ($Passed) { "PASS" } else { "FAIL" }
    if (-not $Passed) { $global:Score -= $Penalty }
    
    $global:Results += [PSCustomObject]@{
        "Hạng Mục Kiểm Tra" = $Name
        "Trạng Thái"        = $Status
        "Lệnh Khắc Phục (Gợi Ý)" = if($Passed) {"N/A - Đã đạt chuẩn"} else {$Remediation}
    }
}

Write-Host "`n[+] BẮT ĐẦU QUÁ TRÌNH AUDIT BẢO MẬT VPS (SERVER 2022/2025)..." -ForegroundColor Cyan
Write-Host "Tiến trình đang thu thập dữ liệu WMI và Registry..." -ForegroundColor DarkGray

# 2. Rà soát rủi ro SMB & NTLM Relay (Trọng số rủi ro: 20 điểm)
$smbConfig = Get-SmbClientConfiguration -ErrorAction SilentlyContinue
$ntlmBlocked = ($null -ne $smbConfig -and $smbConfig.BlockNTLM -eq $true)
Add-AuditResult -Name "SMB NTLM Blocking (Chặn NTLM Relay)" -Passed $ntlmBlocked -Remediation "Set-SmbClientConfiguration -BlockNTLM `$true -Force" -Penalty 20

# 3. Rà soát quản lý đặc quyền: Native LAPS (Trọng số rủi ro: 15 điểm)
$lapsEnabled = (Get-Command "Set-LapsAdComputerSelfPermission" -ErrorAction SilentlyContinue) -ne $null
Add-AuditResult -Name "Tích hợp Native Windows LAPS" -Passed $lapsEnabled -Remediation "Yêu cầu cấu hình Group Policy / Intune để tự động xoay vòng mật khẩu Local Admin" -Penalty 15

# 4. Rà soát bề mặt RDP: NLA (Trọng số rủi ro: 15 điểm)
$nlaVal = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -ErrorAction SilentlyContinue).UserAuthentication
$nlaPassed = ($nlaVal -eq 1)
Add-AuditResult -Name "RDP Network Level Authentication (NLA)" -Passed $nlaPassed -Remediation "Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp' -Name UserAuthentication -Value 1" -Penalty 15

# 5. Rà soát Windows Firewall (Trọng số rủi ro: 15 điểm)
$fw = Get-NetFirewallProfile
$fwPassed = ($fw.Enabled -notcontains $false)
Add-AuditResult -Name "Windows Firewall (Bật trên tất cả Profiles)" -Passed $fwPassed -Remediation "Set-NetFirewallProfile -All -Enabled True" -Penalty 15

# 6. Rà soát Account Lockout Threshold chống Brute-force (Trọng số rủi ro: 10 điểm)
$lockout = (net accounts | Select-String "Lockout threshold").ToString() -replace '\D',''
$lockoutPassed = ([int]$lockout -ge 10)
Add-AuditResult -Name "Ngưỡng khóa tài khoản (>=10 lần sai)" -Passed $lockoutPassed -Remediation "net accounts /lockoutthreshold:10" -Penalty 10

# 7. Rà soát WDigest Plaintext (Trọng số rủi ro: 15 điểm)
$wdVal = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" -Name "UseLogonCredential" -ErrorAction SilentlyContinue).UseLogonCredential
$wdPassed = ($wdVal -eq 0 -or $null -eq $wdVal)
Add-AuditResult -Name "Vô hiệu hóa WDigest (Chống Mimikatz)" -Passed $wdPassed -Remediation "Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest' -Name 'UseLogonCredential' -Value 0" -Penalty 15

# In Báo Cáo Nghiệm Thu
Write-Host "`n========== BÁO CÁO NGHIỆM THU BẢO MẬT ==========" -ForegroundColor Yellow
$Results | Format-Table -AutoSize -Wrap

Write-Host "ĐIỂM BẢO MẬT ĐẠT ĐƯỢC: $Score / 100" -ForegroundColor $(if($Score -ge 85){"Green"}elseif($Score -ge 60){"Yellow"}else{"Red"})

if ($Score -lt 85) {
    Write-Host "[!] CẢNH BÁO: Máy chủ tồn tại nhiều lỗ hổng rủi ro. KHÔNG ĐƯỢC phép đẩy lên Production lúc này." -ForegroundColor Red
} else {
    Write-Host "[v] AN TOÀN: Máy chủ đáp ứng chuẩn Security Baseline cơ bản." -ForegroundColor Green
}

Đoạn script trên chỉ thực hiện quyền đọc trạng thái. Kết quả xuất ra sẽ cho bạn một bức tranh toàn cảnh về điểm bảo mật, hiển thị chính xác cấu hình nào đang lỏng lẻo và gợi ý ngay chuỗi lệnh khắc phục. Bạn hoàn toàn có thể xuất kết quả phân tích từ script PowerShell kiểm tra hệ thống ra file CSV để nộp báo cáo nghiệm thu cho Trưởng phòng IT hoặc bộ phận DevSecOps.

Nâng tầm Enterprise: AutoFix, OSConfig và Configuration as Code

Nếu bạn quản lý hàng trăm server thay vì một vài VPS đơn lẻ, việc phải chạy script rồi thủ công copy từng lệnh gợi ý dán vào Terminal sẽ tạo ra nút thắt cổ chai (bottleneck) khổng lồ. Kịch bản của bạn cần tiến hóa lên cấp độ cao hơn.

Module Auto-Remediation (Tự động vá lỗi)

Bạn có thể dễ dàng nâng cấp script bằng cách bọc logic vá lỗi vào một tham số -AutoFix. Khi chạy script kèm tham số này, nó sẽ tự động phát hiện lỗi và áp dụng bản vá dựa trên nguyên tắc lũy đẳng.

param([switch]$AutoFix)

# ... [Các logic kiểm tra ở trên] ...

if ($AutoFix) {
    Write-Host "`n[+] ĐANG KÍCH HOẠT TIẾN TRÌNH AUTO-HARDENING..." -ForegroundColor Yellow
    if (-not $nlaPassed) {
        Write-Host " -> Đang ép buộc RDP NLA..." -NoNewline
        Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" -Name "UserAuthentication" -Value 1
        Write-Host " [Đã vá]" -ForegroundColor Green
    }
    # Tương tự cho các hạng mục khác...
    Write-Host "[v] Hoàn tất AutoFix. Vui lòng Reboot hệ thống." -ForegroundColor Cyan
}

Lưu ý sinh tử: Trước khi chạy cờ -AutoFix trên môi trường thực tế, hãy luôn khởi tạo Snapshot hoặc chạy kịch bản script PowerShell backup VPS để dự phòng cấu hình hệ thống. Việc vô hiệu hóa các giao thức di sản có thể làm đứt gãy kết nối của các phần mềm CRM/ERP cũ đang chạy ngầm trên VPS.

Áp dụng PowerShell DSC & Security Compliance Toolkit (SCT)

Thay vì các lệnh rời rạc, DevOps hiện đại sử dụng PowerShell Desired State Configuration (DSC) hoặc công cụ LGPO.exe nằm trong bộ Microsoft SCT. Phương pháp này áp dụng triệt để nguyên lý Configuration as Code (Cấu hình như Code). Bạn định nghĩa trạng thái bảo mật hoàn hảo trên một file manifest. Máy chủ sẽ tự động đối chiếu định kỳ và tự sửa chữa ngay lập tức nếu có bất kỳ ai tự ý thay đổi cấu hình sai lệch, đảm bảo trạng thái tuân thủ liên tục.

Vũ khí tối thượng trên Windows Server 2025: Module OSConfig

Tiến lên Server 2025, Microsoft đã chính thức DevOps hóa hoàn toàn quy trình Hardening. Thay vì viết script hàng nghìn dòng để chỉnh sửa Registry, Microsoft cung cấp module OSConfig nguyên bản. Kịch bản bảo mật của bạn giờ đây chỉ cần gọi trực tiếp module này để áp dụng toàn bộ hàng trăm chính sách bảo mật chuẩn (Security Baseline) do chính hãng khuyến nghị. Việc này không chỉ giúp tiết kiệm code, đảm bảo tính toàn vẹn của hệ điều hành mà còn cho phép khả năng Roll-back sạch sẽ chỉ bằng một lệnh duy nhất nếu ứng dụng gặp sự cố không tương thích.

Infographic tổng hợp các công nghệ bảo mật hiện đại trên Windows Server 2025 bao gồm module OSConfig, Windows LAPS và SMB over QUIC.

Kỷ nguyên DevSecOps trên Windows Server 2025 chứng kiến sự ra đời của các công cụ quản lý cấu hình bằng mã (Configuration as Code) mạnh mẽ.

Giao thức SMB over QUIC

Một sự thay đổi mang tính cách mạng khác trên Windows Server 2025 là SMB over QUIC. Quên đi việc phải thiết lập VPN cồng kềnh để truy cập file share an toàn. Giao thức SMB giờ đây có thể chạy trực tiếp qua QUIC (sử dụng cổng UDP 443). Mọi luồng dữ liệu đều được đóng gói và mã hóa chuẩn TLS 1.3 siêu tốc ngay trên môi trường Internet công cộng. Script của bạn trong tương lai có thể mở rộng thêm module kiểm tra trạng thái QUIC để tối ưu hóa truy cập từ xa một cách an toàn nhất cho nhân viên. Tuy nhiên, đối với các tác vụ quản trị hệ thống khác, bạn vẫn có thể áp dụng thêm 10 script PowerShell quản trị VPS để tối ưu hoàn toàn quy trình vận hành.

Câu hỏi thường gặp (FAQ)

1. Tại sao cần dùng script bảo mật VPS Windows thay vì cấu hình tay?

Tốc độ, tính đồng nhất và loại bỏ 100% Human Error (lỗi con người). Script giúp bạn áp chuẩn Security Baseline cho hàng trăm server cùng lúc chỉ trong vài giây, điều mà việc click chuột cấu hình bằng tay không bao giờ làm được.

2. LAPS trên Windows Server 2022 có gì mới?

Nó trở thành tính năng cốt lõi (Native), không cần cài thêm file MSI như bản cũ. Điểm vượt trội nhất là hỗ trợ đẩy và mã hóa băm mật khẩu Local Admin trực tiếp lên đám mây (Entra ID) thay vì chỉ dùng Active Directory nội bộ.

3. Tôi nên chạy kịch bản này với tần suất bao lâu một lần?

Nên chạy tự động mỗi 12 – 24 giờ qua Task Scheduler hoặc CI/CD. Nhờ cơ chế lũy đẳng (Idempotent), script chỉ vá lỗi khi phát hiện cấu hình bị thay đổi, giúp duy trì trạng thái an toàn liên tục.

4. Chạy tham số -AutoFix có làm ảnh hưởng đến các ứng dụng cũ (legacy apps) không?

Có rủi ro. Việc vô hiệu hóa các giao thức di sản (SMBv1, NTLM, TLS 1.0) có thể làm đứt kết nối của các phần mềm kế toán/ERP quá cũ. Bắt buộc phải tạo Snapshot/Backup trước khi chạy AutoFix trên Production.

5. Tại sao tôi bị văng khỏi phiên Remote Desktop (RDP) ngay sau khi chạy AutoFix?

Đây là dấu hiệu tốt! Script vừa ép bật xác thực NLA hoặc nâng chuẩn mã hóa TLS. Các session RDP đang dùng chuẩn cũ, lỏng lẻo sẽ bị ngắt kết nối ngay lập tức. Bạn chỉ cần đợi 30 giây và kết nối lại bình thường.

6. Script này có thay thế được Antivirus/EDR chuyên dụng không?

Tuyệt đối không. Script đảm nhiệm việc phòng bệnh (Hardening, giảm bề mặt tấn công). Bạn vẫn bắt buộc phải cài giải pháp EDR/Antivirus để chữa bệnh (săn lùng và tiêu diệt mã độc nếu chúng lọt qua vỏ bọc).

7. Kịch bản này có tương thích với Windows Server 2012 R2 không?

Không. Server 2012 R2 đã dừng hỗ trợ và thiếu hụt các API/Cmdlet hiện đại (như SmbShare, LAPS native). Lời khuyên duy nhất: Hãy nâng cấp lên Windows Server 2019, 2022 hoặc 2025.

Kết luận

Cấu hình mặc định của một máy chủ Windows Server được thiết kế để phục vụ tính tương thích tối đa, không phải là một chiếc két sắt chống đạn. Việc triển khai một script bảo mật VPS Windows tự động không chỉ là kỹ năng sinh tồn cơ bản của các SysAdmin, mà còn đóng sập cánh cửa khai thác của các chiến dịch tấn công diện rộng. Để khép kín vòng tròn bảo mật và vận hành, hãy đối chiếu hệ thống của bạn với danh sách 10 script PowerShell quản trị VPS Windows Server 2025.

Đặc biệt, hãy khởi tạo và thử nghiệm ngay trên một VPS Windows cấu hình cao tại môi trường Staging để tự mình đánh giá hiệu quả của quy trình Security Hardening trước khi áp dụng trên toàn bộ hạ tầng Production.

Tài liệu tham khảo