Mặc định, cài đặt Windows ngăn chặn chạy script PowerShell. Từ góc độ bảo mật, việc hạn chế mã không tin cậy và độc hại chạy từ script PowerShell là quan trọng. Chính sách thực thi (Execution Policy) xác định cài đặt để chạy script PowerShell. Trong bài viết này, chúng ta sẽ xem các cài đặt có sẵn để chạy script PS trên Windows, cách thay đổi Execution Policy và cấu hình chính sách thực thi script PowerShell cho máy tính trong miền bằng GPO.
Chạy script PowerShell bị vô hiệu hóa trên hệ thống này
Khi cố chạy bất kỳ script PowerShell nào (file PS1) trên Windows 10 sạch, lỗi sau xảy ra:
File C:\ps\script.ps1 cannot be loaded because running scripts is disabled on this system. For more information, see about_Execution_Policies at https:/go.microsoft.com/fwlink/?LinkID=135170. + CategoryInfo : SecurityError: (:) [], PSSecurityException + FullyQualifiedErrorId : UnauthorizedAccess
Bạn có thể lấy cài đặt hiện tại cho Chính sách thực thi script PowerShell trong Windows bằng lệnh:
Get-ExecutionPolicy
Các giá trị Chính sách thực thi PowerShell sau có sẵn:
- Restricted – chạy script PowerShell bị vô hiệu hóa, bạn chỉ có thể thực thi lệnh tương tác trong bảng điều khiển PS;
- AllSigned – chỉ cho phép script PS đã ký với chữ ký số bởi nhà phát hành tin cậy (bạn có thể ký script bằng chứng chỉ tự ký và thêm vào chứng chỉ gốc tin cậy). Khi chạy script không tin cậy, cảnh báo sau xuất hiện:
Do you want to run software from this untrusted publisher? File .ps1 is published by CN=test1 and is not trusted on your system. Only run scripts from trusted publishers.
- RemoteSigned – bạn có thể chạy script PowerShell cục bộ không giới hạn. Bạn có thể chạy file PS từ xa có chữ ký số (không thể chạy file PS1 tải từ Internet hoặc khởi chạy từ thư mục chia sẻ mạng qua đường dẫn UNC);
- Unrestricted – cho phép chạy tất cả script PowerShell; Khi cố chạy script PowerShell của bên thứ ba, bạn có thể được yêu cầu xác nhận khởi chạy.
- Bypass – cho phép chạy bất kỳ file PS nào (không hiển thị cảnh báo). Chính sách thường dùng để chạy script PS tự động không hiển thị thông báo (ví dụ: khi script chạy qua GPO, SCCM, Task Scheduler, v.v.) và không khuyến khích dùng thường xuyên;
- Default – đặt lại cài đặt thực thi script PowerShell về mặc định; Trên Windows 10 giá trị mặc định cho PowerShell Execution Policy là Restricted, và trên Windows Server 2016 là RemoteSigned.
- Undefined – chính sách không được đặt. Chính sách Restricted áp dụng cho hệ điều hành desktop và RemoteSigned cho server.
Cách cho phép PowerShell chạy script bằng Execution Policy?
Để thay đổi giá trị hiện tại của Chính sách thực thi script PowerShell, cmdlet Set-ExecutionPolicy được sử dụng.
Ví dụ, hãy cho phép chạy file script PS cục bộ:
Set-ExecutionPolicy RemoteSigned
Xác nhận thay đổi Execution Policy cho script PS1 bằng cách nhấn Y hoặc A.
Để tránh hiển thị lời nhắc xác nhận, bạn có thể dùng tham số Force.
Set-ExecutionPolicy RemoteSigned –Force
Nếu bạn đặt giá trị PowerShell Execution Policy là Unrestricted, bạn vẫn sẽ thấy lời nhắc khi cố chạy script từ xa từ thư mục chia sẻ qua đường dẫn UNC hoặc file tải từ Internet:
Security warning Run only scripts that you trust. While scripts from the internet can be useful, this script can potentially harm your computer. If you trust this script, use the Unblock-File cmdlet to allow the script to run without this warning message. Do you want to run? [D] Do not run [R] Run once [S] Suspend [?] Help (default is "D")
PowerShell phân biệt script cục bộ và từ xa như thế nào? Đó là do định danh ZoneId mà trình duyệt đặt trong luồng thay thế khi tải file (xem bài viết "Làm thế nào Windows biết file được tải từ Internet?"). Bạn có thể bỏ chặn file bằng cách tích Unblock trong thuộc tính file hoặc xóa nhãn zone bằng cmdlet Unblock-File.
Bạn cũng phải phân biệt các phạm vi khác nhau của PowerShell Execution Policy:
- MachinePolicy – được đặt bằng GPO và áp dụng cho tất cả người dùng của máy tính;
- UserPolicy – cũng được đặt bằng GPO và áp dụng cho người dùng máy tính;
- Process — Cài đặt Execution Policy áp dụng chỉ cho phiên PowerShell hiện tại (và reset sau khi tiến trình powershell.exe kết thúc);
- CurrentUser – Execution Policy áp dụng chỉ cho người dùng hiện tại (tham số của khóa registry HKEY_CURRENT_USER);
- LocalMachine là chính sách cho tất cả người dùng của máy tính (tham số từ khóa registry HKEY_LOCAL_MACHINE).
Bạn có thể đặt phạm vi chính sách bằng tham số Scope của cmdlet Set-ExecutionPolicy. Ví dụ:
Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass –Force
Hãy kiểm tra cài đặt ExecutionPolicy hiện tại cho tất cả phạm vi:
Get-ExecutionPolicy -List
Scope ExecutionPolicy ----- --------------- MachinePolicy Undefined UserPolicy Undefined Process Bypass CurrentUser Undefined LocalMachine RemoteSigned
Giá trị Execution Policy bạn đặt bằng cmdlet Set-ExecutionPolicy cho phạm vi CurrentUser và LocalMachine được lưu trong registry. Ví dụ, chạy lệnh này:
Set-ExecutionPolicy -Scope LocalMachine -ExecutionPolicy Restricted –Force
Mở khóa registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell và kiểm tra giá trị REG_SZ của tham số ExecutionPolicy. Nó nên thay thành Restricted (giá trị tham số cho phép là Restricted, AllSigned, RemoteSigned, Bypass, Unrestricted và Undefined).
Cài đặt tương tự cho phạm vi CurrentUser nằm tại HKEY_CURRENT_USER\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell.
Điều này có nghĩa là bạn có thể triển khai cài đặt chính sách thực thi script PowerShell qua registry bằng Group Policy Preferences.
Lưu ý rằng ExecutionPolicy với giá trị AllSigned ở cấp LocalMachine được dùng trong môi trường doanh nghiệp nhiều nhất. Nó cung cấp cân bằng tốt nhất giữa bảo mật và tiện lợi. Đối với sử dụng cá nhân, bạn có thể dùng cài đặt RemoteSigned trên máy tính của mình. Chính sách Bypass chỉ nên dùng để chạy một số tác vụ (ví dụ: chạy script qua GPO hoặc tác vụ trong Task Scheduler).
Đặt PowerShell Execution Policy trong Active Directory bằng GPO
Bạn có thể cấu hình Execution Policy cho script PowerShell trên server hoặc máy tính miền trong Active Directory domain bằng Group Policies.
- Trong trình soạn thảo GPO miền (
gpmc.msc), tạo GPO mới hoặc chỉnh sửa GPO hiện có và liên kết nó với OU chứa máy tính bạn muốn áp dụng Chính sách thực thi script PowerShell; - Mở Computer Configuration -> Policies -> Administrative Templates -> Windows Components -> Windows PowerShell trong trình soạn thảo GPO và tìm tham số Turn on Script Execution. Có chính sách tương tự trong phần user GPO — User Configuration, nhưng chính sách máy tính có độ ưu tiên cao hơn.
- Chính sách có thể có ba giá trị:
- Allow only signed scripts – tương ứng với chính sách AllSigned
- Allow local scripts and remote signed scripts – tương ứng với chính sách PS RemoteSigned
- Allow all scripts – tương ứng với chính sách Unrestricted
- Đặt giá trị chính sách bạn muốn, lưu GPO và cập nhật cài đặt Group Policy trên máy tính;
- Đảm bảo cài đặt thực thi mới đã được áp dụng cho phạm vi MachinePolicy.
Sau khi cấu hình Execution Policy bằng GPO, bạn sẽ không thể thay đổi cài đặt chính sách thực thi script thủ công. Nếu bạn cố thay đổi cài đặt Execution Policy trên máy tính được áp dụng GPO, lỗi sau xuất hiện:
Set-ExecutionPolicy: Windows PowerShell updated your execution policy successfully, but the setting is overridden by a policy defined at a more specific scope. Due to the override, your shell will retain its current effective execution policy of RemoteSigned. Type "Get-ExecutionPolicy -List" to view your execution policy settings.
Cùng cách, bạn có thể cấu hình Execution Policy trên máy tính độc lập bằng trình soạn thảo GPO cục bộ — gpedit.msc.
Cách bỏ qua PowerShell Execution Policy trên Windows?
Có một số thủ thuật giúp bạn nếu muốn chạy script PowerShell trên máy tính mà không thay đổi cài đặt Execution Policy. Ví dụ, tôi muốn chạy một script PS1 đơn giản kiểm tra xem nó có chạy với quyền quản trị không.
Bạn có thể lấy nội dung script bằng Get-Content và chuyển hướng nó vào luồng đầu vào tiêu chuẩn của bảng điều khiển PS.
Get-Content c:\ps\check_process_elevation.ps1 | PowerShell.exe -noprofile –
Hoặc bạn có thể chạy tiến trình powershell.exe mới với chính sách Bypass:
powershell.exe -noprofile -executionpolicy bypass -file c:\ps\check_process_elevation.ps1