2016-01-08 16 views
7

Tôi đang làm việc trên một dự án mà chúng tôi đang triển khai phần mềm từ xa bằng quản lý cấu hình, một phần trong đó cung cấp các kịch bản PowerShell cho các máy chủ Windows, sau đó được thực thi để thực hiện các phần thiết lập và/hoặc cấu hình của chúng tôi.Đăng ký tập lệnh PowerShell trên nền tảng không phải Windows?

Phương pháp triển khai hiện tại ghi các tập lệnh vào đĩa, nhưng không đóng trình xử lý tệp. Điều này đã được thực hiện để làm cho kịch bản "an toàn" hơn bằng cách ngăn chặn bất kỳ quá trình nào khác làm giả mạo tệp trước khi nó được thực thi. Để chạy tập lệnh, PowerShell phải đọc nó từ stdin, vì nó không chạy tập lệnh nếu nó không thể truy cập độc quyền. Invocation trông giống như sau:

powershell.exe -Command - < C:\temp\some_name.ps1 

này có một số hạn chế, chủ yếu là tôi không thể truyền tham số cho kịch bản. Ngoài ra, đọc các tập lệnh lớn từ stdin trở nên sôi nổi với các ký tự xấu, trả về dòng, v.v.

Tôi muốn gọi các tập lệnh theo một phương thức truyền thống hơn, ví dụ:

powershell.exe -File C:\temp\some_name.ps1 -Param value ... 

nhưng cũng giữ tinh thần đảm bảo không có gì có thể giả mạo tập lệnh trước khi thực thi. Để kết thúc, tôi muốn ký kịch bản PowerShell và chạy PowerShell với chính sách thực hiện "AllSigned".

Vấn đề nằm ở chỗ tôi không thể ký tập lệnh trên máy chủ đích, vì nó có cùng vấn đề với PowerShell đang chạy tập lệnh ... Tôi phải nhả khóa độc quyền để PowerShell ký tệp, nhưng nó có thể bị giả mạo.

Sau đó, tôi quyết định rằng nếu tôi có thể ký tập lệnh trên máy chủ đang phân phối tập lệnh đến máy đích sẽ hoạt động tốt hơn nhiều. Tuy nhiên, các máy chủ phần mềm quản lý cấu hình của chúng tôi là tất cả Linux, và tôi đã từng bối rối khi cố gắng tìm cách ký các kịch bản PowerShell trên Linux. Mono có hỗ trợ cho Authenticode, nhưng ra khỏi hộp nó chỉ dành cho exes và dlls. Tôi đã cố gắng đào vào các chức năng .Net PowerShell nhưng thấy rằng họ sử dụng Cryptui.dll, đó là Windows cụ thể.

Tại thời điểm này tôi đang nắm bắt cho dù sao tôi có thể nhận được chữ ký được thêm vào các tập lệnh, nếu không tôi sẽ phải dự phòng một số cách khác để chạy tập lệnh không thực sự có nguồn gốc. Nếu có thể tôi muốn để có thể tính chữ ký trong bộ nhớ trên một chuỗi đại diện của kịch bản, nhưng tôi sẽ có một phương pháp dựa trên tập tin nếu đó là tất cả tôi có thể nhận được.

+0

Chúng tôi đã ký các tệp văn bản khi xuất bản và sử dụng VM Windows VBox (với khối lượng tệp được băm SHA được sao chép khi khởi động), quay lên máy xây dựng và sử dụng WinRb để thực thi 'Set-AuthenticodeSignature' các tập tin, tắt nó và ném đi các tập tin dựa trên khối lượng sao chép ... thực sự xấu xí nhưng nó hoạt động thực sự tốt ... cuối cùng nó đã được thay thế bằng một phiên bản tùy chỉnh của 'osslsigncode' – SushiHangover

+0

Tôi đã lặn vào mono Authenticode các lớp học và tôi nghĩ rằng tôi đã có đủ để tìm ra một phiên bản sửa đổi hoạt động trên một dữ liệu từ stdin. Tôi figured tôi đã có phần mềm quản lý cấu hình của tôi gọi exe mono, vượt qua chuỗi trong, và sau đó đọc stdout cho phiên bản đã ký kết. Phần mềm quản lý cấu hình của chúng tôi chạy nguyên bản trong ruby, vì vậy tôi bị cám dỗ thử và xây dựng một lớp ruby ​​bằng cách sử dụng thư viện openssl để sao chép mã mono. – AresonDeladious

+0

Bạn có thể không ngăn chặn giả mạo bằng cách sử dụng bảo mật thư mục để chặn các tài khoản khác có quyền ghi hoặc lưu trữ tập lệnh trên máy chủ web sau đó thực hiện với 'iex ((New-Object System.Net.WebClient).DownloadString ('https: //myServer/myScript.ps1')) '? Bạn chỉ cần điều đó trong tập lệnh ký tên của mình, sau đó có thể rút lại tập lệnh và ký tên theo yêu cầu; sau đó bạn có thể sử dụng cho mỗi mô tả của bạn. – JohnLBevan

Trả lời

0

Điều gì về việc biên dịch tập lệnh của bạn thành .exe?

ps2exe hoặc thậm chí một số cuộc gọi nội mạng có thể thực hiện điều đó cho bạn.

Các vấn đề liên quan