Tổng quan về PowerShell Execution Policy

PowerShell Execution Policy là một tính năng bảo mật quan trọng trong Windows, kiểm soát cách các script PowerShell được thực thi trên hệ thống. Việc hiểu rõ cách thiết lập PowerShell Execution Policy giúp người dùng và quản trị viên vừa đảm bảo an toàn hệ thống vừa linh hoạt trong công việc.
Execution Policy không phải là một hệ thống phân quyền người dùng mà là một cơ chế giới hạn việc chạy script dựa trên chữ ký số và nguồn gốc tệp tin. Mỗi policy quy định một mức độ rủi ro khác nhau, từ hoàn toàn khóa chặt đến cho phép mọi script chạy tự do.
Trong môi trường doanh nghiệp, việc thiết lập đúng policy giúp ngăn chặn mã độc lợi dụng PowerShell để tấn công. Theo thống kê từ Microsoft, hơn 80% các cuộc tấn công ransomware trong năm gần đây có sử dụng PowerShell làm công cụ khởi đầu.
Các loại PowerShell Execution Policy cơ bản
Restricted – Chính sách mặc định trên Windows client
Restricted là mức chính sách an toàn nhất, không cho phép chạy bất kỳ script nào (cả.ps1 lẫn.psm1). Người dùng chỉ có thể sử dụng PowerShell ở chế độ tương tác, gõ lệnh trực tiếp. Đây là thiết lập mặc định trên tất cả phiên bản Windows 10 và Windows 11 cho người dùng thông thường.
AllSigned – Yêu cầu tất cả script phải được ký số
Với AllSigned, script từ nguồn đáng tin cậy vẫn cần có chữ ký số hợp lệ. Người dùng phải tin tưởng nhà phát hành trước khi chạy. Đây là lựa chọn phù hợp cho các tổ chức muốn kiểm soát chặt chẽ mọi tệp script, kể cả do chính họ viết.
RemoteSigned – Chính sách cân bằng nhất
RemoteSigned cho phép script cục bộ chạy tự do, nhưng script tải từ internet (email, trình duyệt, mạng chia sẻ) phải có chữ ký số. Đây là policy được khuyên dùng phổ biến nhất, đặc biệt với các nhà phát triển và quản trị viên hệ thống.
Unrestricted – Không giới hạn (đã lỗi thời)
Mặc dù cho phép mọi script chạy, Unrestricted vẫn cảnh báo người dùng nếu script đến từ internet. Từ PowerShell 5.0 trở đi, Microsoft đã chuyển sang sử dụng RemoteSigned làm mặc định cho các hệ thống quản trị.
Bypass – Bỏ qua hoàn toàn bảo vệ
Bypass không chặn script nhưng không cảnh báo. Thường dùng trong các tình huống cài đặt tự động hoặc script nội bộ đã được kiểm tra trước. Đây là mức rủi ro cao nhất và chỉ nên dùng tạm thời.
Undefined – Chính sách chưa được cấu hình
Khi policy chưa được thiết lập cho một scope cụ thể, hệ thống sẽ áp dụng policy của scope cha hoặc Restricted nếu không có scope nào được cấu hình.
Hướng dẫn cách thiết lập PowerShell Execution Policy chi tiết

Kiểm tra Execution Policy hiện tại
Trước khi thực hiện thay đổi, cần biết chính sách đang áp dụng bằng lệnh:
Get-ExecutionPolicy
Để xem policy của tất cả các scope (MachinePolicy, UserPolicy, Process, CurrentUser, LocalMachine):
Get-ExecutionPolicy -List
Thiết lập Execution Policy cho tất cả người dùng
Sử dụng lệnh Set-ExecutionPolicy với tham số -Scope LocalMachine (yêu cầu quyền Admin):
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine
Khi thực thi, hệ thống sẽ hỏi xác nhận với ba lựa chọn: Yes, Yes to All, No. Chọn Yes hoặc Y để áp dụng.
Thiết lập cho người dùng hiện tại
Nếu không có quyền Admin, vẫn có thể thay đổi cho riêng tài khoản của mình bằng scope CurrentUser:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Cách này thường được lập trình viên sử dụng khi làm việc trên máy cá nhân không có quyền quản trị.
Thiết lập bằng Group Policy (dành cho quản trị mạng)
Trong môi trường Active Directory, quản trị viên có thể áp dụng Execution Policy qua Group Policy Object tại đường dẫn: Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell. Chọn Turn on Script Execution và đặt chính sách tương ứng.
Thiết lập tạm thời cho một phiên làm việc
Để áp dụng policy chỉ trong phiên PowerShell hiện tại, sử dụng scope Process. Khi đóng cửa sổ, policy trở về mặc định:
Set-ExecutionPolicy Bypass -Scope Process
Cách này hữu ích khi cần chạy script một lần mà không muốn thay đổi cấu hình hệ thống.
Bảng so sánh các mức Execution Policy
| Policy | Script cục bộ | Script từ internet | Yêu cầu ký số | Mức độ an toàn |
|---|---|---|---|---|
| Restricted | Không cho phép | Không cho phép | Không | Cao nhất |
| AllSigned | Cho phép nếu ký | Cho phép nếu ký | Có | Cao |
| RemoteSigned | Cho phép | Cho phép nếu ký | Một phần | Trung bình |
| Unrestricted | Cho phép (cảnh báo) | Cho phép (cảnh báo) | Không | Thấp |
| Bypass | Cho phép hoàn toàn | Cho phép hoàn toàn | Không | Thấp nhất |
Lợi ích và hạn chế của việc thiết lập Execution Policy

Lợi ích chính
- Ngăn chặn mã độc chạy script tự động: Phần lớn mã độc hiện đại đều cố gọi PowerShell để tải payload. Chính sách chặt chẽ như Restricted hoặc AllSigned ngăn chặn hiệu quả.
- Kiểm soát nguồn gốc script: RemoteSigned yêu cầu script từ internet phải có chữ ký, giúp tránh chạy file lạ tai hại.
- Tuân thủ quy định bảo mật: Nhiều tiêu chuẩn ISO 27001, PCI-DSS yêu cầu quản lý Execution Policy.
- Linh hoạt trong phát triển: Lập trình viên có thể sử dụng CurrentUser scope để chạy script mà không ảnh hưởng người dùng khác.
- Gây khó khăn khi triển khai tự động: Script cài đặt phần mềm hoặc cập nhật có thể bị chặn nếu policy quá chặt.
- Tốn thời gian ký số: Với AllSigned, mọi script nội bộ đều phải ký, làm chậm quy trình phát triển nếu không có hạ tầng PKI.
- Người dùng dễ bỏ qua bảo vệ: Nếu thường xuyên gặp lỗi, người dùng có khuynh hướng chọn Bypass hoặc Unrestricted, vô tình tạo lỗ hổng.
- Không thay thế được antivirus: Execution Policy chỉ là một lớp bảo vệ, không thể ngăn chặn hoàn toàn mã độc nếu script hợp lệ.
- Luôn chạy PowerShell với quyền Administrator khi thay đổi policy cho LocalMachine.
- Kiểm tra Group Policy trước: nếu có GPO, thay đổi local sẽ bị ghi đè sau lần refresh tiếp theo (mặc định 90 phút).
- Sử dụng tham số -Force để bỏ qua bước xác nhận khi viết script tự động hóa.
- Ghi nhật ký thay đổi: dùng Event Viewer để theo dõi ai đã thay đổi policy và lúc nào.
- Cân nhắc sử dụng Constrained Language Mode để bảo vệ thêm nếu cần chạy script không ký.
Hạn chế cần lưu ý
Sai lầm thường gặp khi thiết lập PowerShell Execution Policy
Đặt policy Bypass toàn hệ thống
Nhiều quản trị viên gặp lỗi script liên tục và đặt Bypass trên LocalMachine để giải quyết nhanh. Điều này tạo ra lỗ hổng bảo mật nghiêm trọng. Chỉ nên dùng Bypass tạm thời với scope Process và trong phiên duy nhất.
Không kiểm tra scope trước khi thay đổi
Nếu có policy Group Policy áp dụng từ server, việc Set-ExecutionPolicy trên máy local sẽ bị ghi đè. Hãy chạy Get-ExecutionPolicy -List trước để biết scope nào đang có hiệu lực.
Bỏ qua cảnh báo khi chạy script từ internet
Ngay cả khi policy là RemoteSigned, hệ thống vẫn đánh dấu file tải từ trình duyệt bằng Zone Identifier. Người dùng thường bỏ qua bước unblock file, dẫn đến lỗi khi chạy.
Không áp dụng cho PowerShell 7 (Core)
PowerShell 7 (Core) là phiên bản đa nền tảng, có Execution Policy riêng biệt với PowerShell 5.1 (Windows PowerShell). Nếu chỉ thiết lập trên Windows PowerShell, script chạy trên PowerShell Core vẫn bị ảnh hưởng khác.
Ứng dụng thực tế của từng loại policy

Môi trường máy trạm người dùng thông thường
Nên giữ Restricted hoặc chuyển lên RemoteSigned nếu người dùng cần chạy script quản trị cơ bản. Không cài đặt AllSigned vì gây phiền hà khi không có chữ ký.
Môi trường máy chủ sản xuất
AllSigned là lựa chọn tối ưu, kết hợp với hệ thống ký số nội bộ để kiểm soát mọi script. Các script tự động bảo trì nên được ký và lưu trữ an toàn.
Máy tính của lập trình viên
RemoteSigned với scope CurrentUser là chuẩn mực. Nếu cần chạy script thử nghiệm nhiều, có thể dùng Bypass tạm trong phiên làm việc.
Kiểm thử bảo mật và penetration testing
Chuyển sang Bypass để tránh bị giới hạn khi chạy công cụ kiểm thử. Tuy nhiên, cần khôi phục lại policy ngay sau khi hoàn thành.
Lưu ý quan trọng khi thiết lập Execution Policy
Câu hỏi thường gặp về cách thiết lập PowerShell Execution Policy

Làm thế nào để bỏ qua Execution Policy chỉ một lần?
Có thể chạy script trực tiếp bằng cách sử dụng tham số -ExecutionPolicy Bypass khi khởi động PowerShell. Ví dụ: powershell.exe -ExecutionPolicy Bypass -File script.ps1. Chỉ có hiệu lực cho lệnh đó.
Tại sao tôi không thể thay đổi Execution Policy dù đã là Admin?
Nguyên nhân thường do Group Policy chặn. Kiểm tra bằng lệnh Get-ExecutionPolicy -List, nếu thấy MachinePolicy là Unrestricted hoặc AllSigned, có nghĩa GPO đang áp dụng. Liên hệ quản trị viên mạng để thay đổi.
Execution Policy có áp dụng cho PowerShell ISE không?
PowerShell ISE (Integrated Scripting Environment) tuân theo cùng Execution Policy như console. Nếu bạn đặt RemoteSigned, cả ISE và console đều bị ảnh hưởng đồng nhất.
Làm thế nào để đặt Execution Policy mặc định lại ban đầu?
Sử dụng lệnh Set-ExecutionPolicy Restricted -Scope LocalMachine để đưa về mặc định trên Windows client. Trên Windows Server, mặc định là RemoteSigned.
PowerShell Core và Windows PowerShell có khác biệt gì về Execution Policy?
PowerShell 7 trở lên sử dụng cơ chế giống hệt nhưng lưu trữ cấu hình riêng tại $PSHOME. Cần thiết lập riêng cho từng phiên bản nếu bạn dùng song song.
Kết luận
Cách thiết lập PowerShell Execution Policy là kỹ năng cơ bản mà bất kỳ ai làm việc với Windows và PowerShell đều cần nắm vững. Tùy vào bối cảnh sử dụng – cá nhân, doanh nghiệp hay máy chủ – mà lựa chọn policy phù hợp: RemoteSigned cho đa số trường hợp, Restricted cho môi trường yêu cầu bảo mật cao, AllSigned khi cần kiểm soát tuyệt đối.
Luôn nhớ rằng Execution Policy là lớp phòng thủ đầu tiên, không phải là giải pháp duy nhất. Kết hợp với các biện pháp khác như Windows Defender, AppLocker, và quản lý cập nhật thường xuyên để đảm bảo an toàn toàn diện cho hệ thống. Thực hành kiểm tra policy định kỳ và đào tạo người dùng về rủi ro khi thay đổi policy mà không hiểu rõ hậu quả.
Việc áp dụng đúng cách thiết lập PowerShell Execution Policy giúp doanh nghiệp vừa tận dụng sức mạnh tự động hóa của PowerShell vừa duy trì hàng rào bảo mật vững chắc trước các mối đe dọa từ script độc hại trong thời đại số.







