Apply AppLocker trên Intune bằng Custom OMA-URI: chuyển GPO on-premises sang thiết bị cloud
Công ty mình chặn phần mềm không được phép bằng AppLocker qua GPO từ lâu. Cách này chạy tốt với máy nằm trong mạng nội bộ. Nhưng khi ngày càng nhiều laptop làm việc từ xa, ít khi kết nối về domain controller, policy trên máy cứ cũ dần, và app vừa bị chặn ở văn phòng lại chạy bình thường ở nhà. Intune không có giao diện cấu hình AppLocker riêng, nhưng có thể đẩy chính các rule đó xuống máy qua AppLocker CSP. Bài này hướng dẫn cách mình chuyển rule từ GPO lên Intune cho môi trường Hybrid.
Tóm tắt nhanh: Export AppLocker từ GPO on-premises ra XML. Mỗi loại rule (Exe, Msi, Appx, Script) lấy phần từ
<RuleCollection ...>đến</RuleCollection>, dán vào một dòng OMA-URI trong Intune Custom Profile, kiểu String. Assign profile cho group, rồi kiểm tra kết quả trong Event Viewer: Applications and Services Logs > Microsoft > Windows > AppLocker.
Bối cảnh: vì sao cần đưa AppLocker lên Intune
| GPO on-premises | Intune Custom Profile | |
|---|---|---|
| Máy nhận policy khi | Kết nối được tới domain controller | Có Internet và check-in với Intune |
| Máy làm việc từ xa | Policy dễ bị cũ | Luôn nhận policy mới |
| Giao diện cấu hình | Có sẵn trong GPMC | Không có, phải dùng OMA-URI và XML |
| Báo cáo | Không có | Có trạng thái Succeeded / Error theo từng máy |
Intune không có mục cấu hình AppLocker trên giao diện. Cách làm là dùng Custom profile và gửi XML qua AppLocker CSP (./Vendor/MSFT/AppLocker). Như vậy GPMC vẫn là nơi soạn rule, còn Intune chỉ là kênh đưa rule xuống máy.
Bước 1: Export AppLocker từ GPO on-premises
Có hai cách lấy XML.
Cách 1: dùng GPMC
- Mở Group Policy Management, edit GPO AppLocker.
- Vào Computer Configuration > Policies > Windows Settings > Security Settings > Application Control Policies > AppLocker.
- Chuột phải AppLocker > Export Policy…, lưu ra file
.xml.
Cách 2: dùng PowerShell
# Export policy từ GPO (đổi đường dẫn LDAP theo GPO của bạn)
Get-AppLockerPolicy -Domain -Ldap "LDAP://CN={GPO-GUID},CN=Policies,CN=System,DC=contoso,DC=local" -Xml |
Out-File C:\Temp\AppLocker_GPO.xml -Encoding utf8
# Hoặc export policy hiệu lực trên một máy đã nhận GPO
Get-AppLockerPolicy -Effective -Xml | Out-File C:\Temp\AppLocker_Effective.xml -Encoding utf8
File XML có cấu trúc như sau. Mỗi khối RuleCollection tương ứng với một dòng OMA-URI trên Intune:
<AppLockerPolicy Version="1">
<RuleCollection Type="Exe" EnforcementMode="NotConfigured"> ... </RuleCollection>
<RuleCollection Type="Msi" EnforcementMode="NotConfigured"> ... </RuleCollection>
<RuleCollection Type="Appx" EnforcementMode="NotConfigured"> ... </RuleCollection>
<RuleCollection Type="Script" EnforcementMode="NotConfigured"> ... </RuleCollection>
<RuleCollection Type="Dll" EnforcementMode="NotConfigured"> ... </RuleCollection>
</AppLockerPolicy>
Trong mỗi khối có thể có ba loại điều kiện: FilePublisherRule (theo chữ ký số), FilePathRule (theo đường dẫn) và FileHashRule (theo hash file).
Tách XML theo từng loại
Script dưới đây tách file export thành từng file nhỏ, mỗi file đúng một khối RuleCollection, để copy vào Intune cho tiện:
[xml]$xml = Get-Content C:\Temp\AppLocker_GPO.xml -Raw
foreach ($rc in $xml.AppLockerPolicy.RuleCollection) {
$out = "C:\Temp\AppLocker_$($rc.Type).xml"
$rc.OuterXml | Out-File $out -Encoding utf8
Write-Host "$($rc.Type): $($rc.ChildNodes.Count) rule(s) -> $out"
}
Script của mình
# Export-AppLockerForIntune.ps1
# Export GPO -> tách theo RuleCollection -> sẵn sàng dán vào OMA-URI
Bước 2: Tạo Custom Configuration Profile trên Intune
- Vào Intune admin center > Devices > Windows > Configuration > Create > New policy.
- Platform: Windows 10 and later. Profile type: Templates > Custom.
- Đặt tên profile, ví dụ
AppLocker - Block Apps. - Ở Configuration settings, thêm 4 dòng OMA-URI như bảng dưới.
| Name | OMA-URI | Data type | Value |
|---|---|---|---|
| Block EXE | ./Vendor/MSFT/AppLocker/ApplicationLaunchRestrictions/apps/EXE/Policy |
String | Khối <RuleCollection Type="Exe" ...> |
| Block MSI | ./Vendor/MSFT/AppLocker/ApplicationLaunchRestrictions/apps/MSI/Policy |
String | Khối <RuleCollection Type="Msi" ...> |
| Block Appx | ./Vendor/MSFT/AppLocker/ApplicationLaunchRestrictions/apps/StoreApps/Policy |
String | Khối <RuleCollection Type="Appx" ...> |
| Block Script | ./Vendor/MSFT/AppLocker/ApplicationLaunchRestrictions/apps/Script/Policy |
String | Khối <RuleCollection Type="Script" ...> |
Phần apps trong đường dẫn là tên nhóm (Grouping) do mình tự đặt. Cả 4 dòng phải dùng cùng một tên nhóm.
Value: copy đúng một khối RuleCollection
Ở ô Value, copy từ dòng mở <RuleCollection Type="Exe" EnforcementMode="NotConfigured"> đến dòng đóng </RuleCollection>. Không copy thẻ <AppLockerPolicy> bên ngoài.
<RuleCollection Type="Exe" EnforcementMode="NotConfigured">
<FilePathRule Id="..." Name="Allow all" Description="" UserOrGroupSid="S-1-1-0" Action="Allow">
<Conditions>
<FilePathCondition Path="*" />
</Conditions>
</FilePathRule>
<FilePublisherRule Id="..." Name="Razer Synapse" Description="TICKET-ID - Block Razer Synapse" UserOrGroupSid="S-1-1-0" Action="Deny">
<Conditions>
<FilePublisherCondition PublisherName="..." ProductName="*" BinaryName="*">
<BinaryVersionRange LowSection="*" HighSection="*" />
</FilePublisherCondition>
</Conditions>
</FilePublisherRule>
</RuleCollection>
Hình 1: dòng OMA-URI Block EXE, kiểu String, Value là khối RuleCollection.
Mô hình mình dùng là Allow all + Deny từng app: một rule Allow cho Path="*", sau đó thêm các rule Deny cho app cần chặn. Vì Deny luôn được ưu tiên hơn Allow, app nằm trong rule Deny sẽ bị chặn, còn các app khác vẫn chạy bình thường.
EnforcementMode="NotConfigured" không có nghĩa là tắt. Khi một rule collection có rule, AppLocker sẽ enforce nó. Nếu muốn chạy thử mà không chặn, đổi thành AuditOnly và theo dõi event 8003 / 8006 trước. Ngoài ra, nếu một collection chỉ có rule Deny mà không có rule Allow, mọi thứ thuộc loại đó sẽ bị chặn.Script của mình
<!-- Block EXE - Value -->
<!-- Block MSI - Value -->
<!-- Block Appx - Value -->
<!-- Block Script - Value -->
Bước 3: Assign profile cho group
- Ở Assignments, chọn group thiết bị hoặc người dùng cần áp dụng.
- Thêm Scope tag nếu môi trường có nhiều quốc gia hoặc nhiều đội quản trị.
- Review + create.
Hình 2: profile Custom với 4 dòng Block EXE, MSI, Appx, Script.
Nên rollout theo vòng: nhóm IT pilot → một phòng ban nhỏ → toàn công ty. Mỗi vòng chờ vài ngày để phát hiện app bị chặn nhầm.
Bước 4: Kiểm tra kết quả trên thiết bị
Ép máy đồng bộ với Intune
Trên máy: Settings > Accounts > Access work or school > chọn tài khoản > Info > Sync. Hoặc trên Intune: Devices > chọn máy > Sync.
Kiểm tra policy đã xuống máy chưa
# Service AppLocker phải đang chạy
Get-Service AppIDSvc
# Policy đang hiệu lực trên máy
Get-AppLockerPolicy -Effective -Xml | Out-File C:\Temp\Effective.xml
Select-String -Path C:\Temp\Effective.xml -Pattern 'Razer'
# Policy do Intune (CSP) đẩy xuống
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\PolicyManager\current\device\ApplicationLaunchRestrictions' -ErrorAction SilentlyContinue
# Test một file cụ thể có bị chặn không
Get-AppLockerFileInformation -Path "C:\Path\To\App.exe" |
Test-AppLockerPolicy -XmlPolicy C:\Temp\Effective.xml -User Everyone
Kiểm tra trong Event Viewer
- Trên máy, chạy file cài đặt của app muốn chặn. Nếu rule hoạt động, Windows sẽ báo app đã bị quản trị viên chặn.
- Mở Event Viewer, vào Applications and Services Logs > Microsoft > Windows > AppLocker.
- Xem log tương ứng với loại file:
| Log | Allowed | Audit (sẽ bị chặn) | Blocked |
|---|---|---|---|
| EXE and DLL | 8002 | 8003 | 8004 |
| MSI and Script | 8005 | 8006 | 8007 |
| Packaged app-Execution | 8020 | 8021 | 8022 |
| Packaged app-Deployment | 8023 | 8024 | 8025 |
Hoặc lấy nhanh bằng PowerShell:
Get-WinEvent -LogName 'Microsoft-Windows-AppLocker/EXE and DLL' -MaxEvents 100 |
Where-Object Id -in 8003,8004 | Select-Object TimeCreated, Id, Message | Format-List
Get-WinEvent -LogName 'Microsoft-Windows-AppLocker/MSI and Script' -MaxEvents 100 |
Where-Object Id -in 8006,8007 | Select-Object TimeCreated, Id, Message | Format-List
Những lỗi mình đã gặp
| Lỗi | Triệu chứng | Nguyên nhân gốc | Cách xử lý |
|---|---|---|---|
| Profile báo Error trên Intune | Trạng thái 0x87d1fde8 hoặc Remediation failed | Copy cả thẻ <AppLockerPolicy>, hoặc XML bị lỗi cú pháp |
Chỉ copy từ <RuleCollection> đến </RuleCollection>, kiểm tra XML trước khi dán |
| Profile Succeeded nhưng không chặn | Không có event 8004 | Service AppIDSvc không chạy |
Kiểm tra service; với GPO thì set Automatic, với Intune có thể dùng thêm Settings catalog / script để bật |
| App vẫn chạy | Rule không khớp | Rule Publisher không khớp chữ ký của file cài đặt, hoặc app chạy từ %LOCALAPPDATA% |
Lấy Publisher bằng Get-AppLockerFileInformation từ chính file exe, thêm rule cho file cài đặt và file chạy |
| Chặn nhầm cả Windows | User không mở được app hệ thống | Collection chỉ có rule Deny, không có rule Allow | Luôn có rule Allow (Allow all hoặc default rules) trong mỗi collection |
| Rule cũ vẫn còn | Đã xóa rule trên GPO nhưng máy vẫn chặn | Máy nhận cùng lúc cả GPO và Intune, policy hiệu lực là kết hợp của cả hai | Xóa rule ở cả hai nơi, hoặc loại máy khỏi GPO khi đã chuyển hẳn sang Intune |
| Policy không có hiệu lực trên một số máy | Không chặn dù đã nhận profile | Edition Windows không hỗ trợ enforce AppLocker | Kiểm tra edition (Get-ComputerInfo WindowsEditionId), đối chiếu với tài liệu AppLocker CSP |
Một lưu ý nhỏ nhưng quan trọng: không ghi link nội bộ hay thông tin nhạy cảm vào trường Description của profile và của rule. Trường này có thể được người khác đọc qua báo cáo và trên máy. Hãy ghi mã ticket là đủ.
Kết luận
Intune không có giao diện cấu hình AppLocker, nhưng với 4 dòng OMA-URI, bạn có thể dùng lại toàn bộ rule đã xây trên GPO và đưa chúng xuống cả những máy không bao giờ về văn phòng. Hãy bắt đầu bằng AuditOnly trên nhóm pilot, đọc event 8003 / 8006 trong một tuần, rồi mới chuyển sang enforce.
Bạn đang dùng AppLocker, WDAC (App Control for Business) hay giải pháp bên thứ ba để kiểm soát ứng dụng?
Bình luận