Bảo mật thông tin nhạy cảm qua việc mã hoá PowerShell
20/06/2023 lúc 10:10
Trong bài hướng dẫn này, chúng tôi trình bày cách mã hóa các dòng mã cụ thể trong tập lệnh PowerShell để bảo vệ thông tin nhạy cảm.
Mục lục
Các bước thủ công để mã hóa PowerShell
Dưới đây tôi sẽ hướng dẫn bạn cách mã hoá PowerShell một cách đơn giản nhất
Tôi sẽ mở File Explorer. Bạn có thể nhìn thấy nó. Tôi đã tạo một số tệp tin. Tệp tin đầu tiên tôi có ở đây là một tệp tin gọi là HelloWorld.ps1. Đây chỉ là một đoạn mã đơn giản để hiển thị từ “Hello World” trên màn hình. Tôi sẽ thực thi nó. Đó là tất cả những gì tệp tin này làm.
Vậy nên, hãy để tôi chuyển lại File Explorer. Tôi sẽ mở tệp tin Hello World của mình. Bạn có thể thấy rằng tệp tin này chỉ gồm một dòng mã duy nhất. Vì vậy, để cho đơn giản, hãy giả định trong mục đích của bài thuyết trình này rằng đây là một dòng mã đặc biệt nhạy cảm chứa thông tin về cơ sở hạ tầng của tổ chức của bạn. Vì vậy, chúng ta sẽ mã hóa nó.
Bước 1
Điều đầu tiên tôi làm là sao chép nó và lưu thành một tệp tin .txt. Bạn có thể thấy tệp tin này ngay đây. Nó được gọi là HelloWorld.txt. Nếu tôi mở nó lên, bạn có thể thấy nó giống hệt tệp tin mà tôi vừa cho bạn thấy, chỉ khác là nó được lưu dưới định dạng .txt. Vậy hãy để tôi đóng tệp tin đó lại.
Và bây giờ tôi đã tạo một script mã hoá PowerShell được gọi là EncryptCode.ps1. Bạn có thể thấy script này ngay đây. Tôi sẽ mở nó lên. Đây là một đoạn mã đơn giản gồm bốn dòng. Dòng mã đầu tiên tạo một biến được gọi là $Code, bạn có thể thấy nó ngay đây. Và biến này được gán bằng Get-Content. Sau đó, chúng ta đang đọc vào tệp tin .txt mà tôi vừa cho bạn thấy một lát trước, tệp tin HelloWorld.txt.
$CodeSecureString = ConvertTo-SecureString $Code -AsPlainText -Force
Bước 2
Hãy tiếp tục chạy lệnh đó thủ công.
Một lần nữa, hãy xem nội dung của biến này. Vậy biến là $CodeSecureString. Bạn có thể thấy rằng biến đơn giản chỉ chứa System.Security.SecureString. Vì vậy, nội dung của secure string đó được ẩn khỏi chúng ta.
Vậy giờ hãy xem lại script của chúng ta. Dòng thứ ba tạo một biến được gọi là $Encrypted. Và chúng ta đang gán biến đó bằng ConvertFrom-SecureString -SecureString $CodeSecureString.
$Encrypted = ConvertFrom-SecureString -SecureString $CodeSecureString
Những gì chúng ta đang làm là lấy secure string mà chúng ta vừa tạo và chuyển đổi nó từ một secure string, khôi phục nội dung vào một biến được gọi là $Encrypted.
Bước 3
Hãy tiếp tục chạy dòng mã đó. Hãy xem nội dung của biến $Encrypted. Bạn có thể thấy rằng giờ đây chúng ta có một chuỗi đã được mã hóa.
Việc cuối cùng chúng ta cần làm là ghi chuỗi đó ra một tệp tin. Và cách làm đó là bằng cách gõ $Encrypted, sau đó gõ Out-File, sau đó là đường dẫn tới tệp tin và sau đó là tên của tệp tin mà chúng ta muốn tạo.
$Encrypted | Out-File -FilePath C:\Scripts\Encrypted.txt
Hãy tiến hành thực hiện điều đó ngay bây giờ.
Vậy nên chúng ta sẽ có một tệp tin gọi là Encrypted.txt. Và nếu tôi mở nó lên, bạn có thể thấy rằng nó chứa chuỗi đã được mã hóa.
Xem thêm: Top 10 Ngôn Ngữ Lập Trình Backend 2023
Chạy mã hóa dưới dạng Tập lệnh PowerShell
Bây giờ, tôi đã thực hiện tất cả các bước này thủ công, nhưng thay vào đó, chúng ta có thể chạy chúng như là một script. Vì vậy, hãy để tôi đóng điều này lại. Và tôi sẽ xóa tệp tin .txt đó. Hãy chạy EncryptCode.ps1. Và bạn có thể thấy rằng tệp tin Encrypted.txt đã được tạo lại. Nội dung của tệp tin này nên giống như trước đó.
Trong khi tôi đang mở tệp tin Encrypted.txt, tôi sẽ sao chép chuỗi đã được mã hóa. Vậy nên, tôi đã sao chép chuỗi đã được mã hóa vào clipboard. Hãy để tôi đóng điều này lại.
Bước 1
Vậy giờ điều cuối cùng chúng ta cần làm là sử dụng chuỗi đã được mã hóa đó. Hãy nhớ rằng mục tiêu chung mà chúng ta đang cố gắng đạt được là ẩn một dòng mã đặc biệt nhạy cảm trong một script PowerShell.
Vậy nên, tôi có một script khác ở đây được gọi là RunCode.ps1, và chúng ta sẽ giả định rằng đây là script PowerShell của chúng ta chứa dòng mã mà chúng ta muốn ẩn. Hãy để tôi mở nó lên. Và dòng mã đầu tiên là $Instructions =, và bạn có thể thấy rằng nó được đặt là “”.
$Instructions = “”
Những gì tôi muốn làm là dán chuỗi đã được mã hóa vào giữa những dấu ngoặc kép này. Vì vậy, chúng ta đang tạo một biến được gọi là $Instructions, và chúng ta đang gán nó bằng chuỗi đã được mã hóa đó.
Bước 2
Vậy giờ chúng ta đã dán lệnh đã được mã hóa vào script PowerShell của chúng ta, nhưng PowerShell không thể sử dụng lệnh trong dạng đã được mã hóa, vì vậy chúng ta phải có một ít mã để giải mã lệnh đó để có thể sử dụng nó.
Vì vậy, điều tôi đã làm là tạo một biến được gọi là $Decrypt, và tôi đã đặt nó bằng $Instructions. Hãy nhớ, $Instructions là lệnh đã được mã hóa của chúng ta ở đây. Sau đó, tôi đang chuyển tiếp nó đến ConvertTo-SecureString. Vì vậy, tôi đang lấy giá trị đã được mã hóa đó và chuyển nó trở lại thành một secure string.
$Decrypt = $Instructions | ConvertTo-SecureString
Sau đó, dòng mã cuối cùng của chúng ta tạo một biến được gọi là $Code, bạn có thể thấy nó ngay đây. Và sau đó gán nó bằng [Runtime.InteropServices.Marshal]. Bây giờ, bạn sẽ nhận thấy rằng chúng ta có một dấu hai chấm kép ở đây. Mỗi khi bạn nhìn thấy một dấu hai chấm kép trong PowerShell, điều đó có nghĩa là bạn đang gọi một phương thức .NET. Vậy chính xác là điều chúng ta đang làm ở đây. Chúng ta đang gọi framework .NET và sử dụng một số chức năng từ .NET để giải mã chuỗi này.
$Code =[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($Decrypt))
Và chúng ta lấy nội dung đã được giải mã đó và gán nó bằng $Code. Vậy giờ $Code sẽ chứa lệnh trước đây đã được mã hóa, nhưng giờ đã được giải mã.
Bước 3
Vậy giờ chúng ta chỉ cần chạy dòng mã đó. Chúng ta có thể làm điều đó bằng cách sử dụng lệnh Invoke-Expression $Code.
Hãy xem cái này trông như thế nào. Tôi sẽ tiếp tục lưu điều này. Và một trong những điều về việc sử dụng Notepad cho PowerShell là nó mặc định lưu tệp tin ở định dạng UTF-8, nhưng nếu bạn cố gắng sử dụng PowerShell trong định dạng UTF-8, bạn có thể gặp lỗi. Bạn cần đặt nó bằng ANSI. Vậy nên, tôi sẽ lưu nó dưới định dạng ANSI.
Sau đó, chúng ta chỉ cần thực thi RunCode.ps1. Và bạn có thể thấy rằng RunCode.ps1 tạo ra cùng kết quả như script Hello World của chúng ta, chỉ khác là giờ đây lệnh gây ra việc hiển thị từ “Hello World” trên màn hình đã được mã hóa và hoàn toàn được ẩn đi. Vậy nên, bất kỳ ai xem nội dung của script PowerShell cụ thể này cũng sẽ không thể nhìn thấy lệnh cụ thể đó.
Xem thêm: Học ngôn ngữ lập trình nào để có mức lương 10000$/tháng?
Kết luận
Hiển nhiên, Write-Host ‘Hello World’ không phải là nội dung nhạy cảm theo bất kỳ cách nào, nhưng bạn có thể tưởng tượng những gì sẽ xảy ra nếu bạn có một dòng mã lưu trữ mật khẩu, cung cấp đường dẫn đến một máy chủ mà bạn không muốn thế giới biết đến, hoặc một cái gì đó tương tự. Đây là một cách tuyệt vời để ẩn mã trong script PowerShell của bạn.
Vậy là đó là cách bạn mã hóa và giải mã một lệnh trong script PowerShell.
Nếu bạn đang tìm kiếm một đối tác triển khai các giải pháp công nghệ cho doanh nghiệp của bạn, hãy đến với IDC Online. IDC Online cung cấp các giải pháp công nghệ thông tin và đám mây cho doanh nghiệp. Bao gồm cả các giải pháp trực quan hóa dữ liệu và các giải pháp khác. Với đội ngũ chuyên gia giàu kinh nghiệm, IDC Online đem lại cho bạn những trải nghiệm tuyệt vời.
Hãy truy cập vào trang web https://idconline.vn/ của IDC Online để biết thêm thông tin chi tiết. Hoặc nếu bạn có vấn đề gì cần giải đáp hãy liên hệ với chúng tôi qua hotline: 19006452. IDC Online luôn ở đây để được đồng hành cùng bạn