Windows dan PowerShell memiliki fitur keamanan bawaan dan konfigurasi standar yang dimaksudkan untuk mencegah pengguna akhir meluncurkan skrip secara tidak sengaja dalam kegiatan sehari-hari mereka. Namun, jika aktivitas harian Anda secara rutin melibatkan penulisan dan menjalankan skrip PowerShell Anda sendiri, ini bisa lebih merepotkan daripada bermanfaat. Di sini, kami akan menunjukkan cara bekerja di sekitar fitur ini tanpa mengorbankan keamanan sepenuhnya.
PowerShell secara efektif adalah shell perintah dan bahasa scripting yang dimaksudkan untuk menggantikan skrip CMD dan batch pada sistem Windows. Dengan demikian, skrip PowerShell dapat dikonfigurasi untuk melakukan apa pun yang dapat Anda lakukan secara manual dari baris perintah. Itu sama dengan membuat hampir semua perubahan yang mungkin terjadi pada sistem Anda, hingga batasan yang ada di akun pengguna Anda. Jadi, jika Anda hanya dapat mengklik dua kali skrip PowerShell dan menjalankannya dengan hak istimewa Administrator penuh, liner satu sederhana seperti ini dapat benar-benar menghancurkan hari Anda:
Get-ChildItem "$ env: SystemDrive \" -Recurse -ErrorAction Diam-diamContinue | Hapus-Item -Force -Recurse -ErrorAction Diam-diam Lanjutkan
JANGAN jalankan perintah di atas!
Itu hanya melalui sistem file dan menghapus apa pun yang bisa. Menariknya, ini mungkin tidak membuat sistem tidak dapat beroperasi secepat yang Anda kira - bahkan ketika dijalankan dari sesi yang ditinggikan. Tetapi jika seseorang menelepon Anda setelah menjalankan skrip ini, karena mereka tiba-tiba tidak dapat menemukan file mereka atau menjalankan beberapa program, "mematikannya dan menghidupkan kembali" mungkin akan mengarahkan mereka ke dalam Windows Startup Repair di mana mereka akan diberi tahu ada tidak ada yang bisa dilakukan untuk memperbaiki masalah. Yang lebih buruk adalah, daripada mendapatkan skrip yang hanya merusak sistem file mereka, teman Anda mungkin tertipu untuk menjalankan salah satu yang mengunduh dan menginstal keylogger atau layanan akses jarak jauh. Kemudian, alih-alih menanyakan pertanyaan tentang Perbaikan Startup, mereka mungkin akan mengajukan pertanyaan kepada polisi tentang penipuan bank!
Sekarang ini harus jelas mengapa hal-hal tertentu diperlukan untuk melindungi pengguna akhir dari diri mereka sendiri, sehingga untuk berbicara. Tetapi pengguna daya, administrator sistem, dan geek lainnya umumnya (meskipun ada pengecualian) sedikit lebih waspada terhadap ancaman ini, mengetahui cara mengenali dan dengan mudah menghindarinya, dan hanya ingin menyelesaikan pekerjaan mereka. Untuk melakukan ini, mereka harus menonaktifkan atau bekerja di sekitar beberapa blok jalan:
Masalah-masalah yang sama ini muncul dalam Cara Menggunakan File Batch untuk Membuat Script PowerShell Lebih Mudah Dijalankan, di mana kami memandu Anda menulis file batch untuk sementara waktu mengelilinginya. Sekarang, kami akan menunjukkan kepada Anda bagaimana mengatur sistem Anda dengan solusi jangka panjang. Ingatlah bahwa Anda tidak harus secara umum membuat perubahan ini pada sistem yang tidak secara eksklusif digunakan oleh Anda - jika tidak, Anda menempatkan pengguna lain pada risiko yang lebih tinggi mengalami masalah yang sama dengan yang ditakdirkan untuk mencegah fitur ini.
Yang pertama, dan mungkin yang terpenting, gangguan untuk berkeliling adalah asosiasi default untuk file .PS1. Mengaitkan file-file ini dengan apa pun selain PowerShell.exe masuk akal untuk mencegah eksekusi skrip yang tidak diinginkan secara tidak disengaja. Tapi, mengingat PowerShell dilengkapi dengan Integrated Scripting Environment (ISE) yang dirancang khusus untuk mengedit skrip PowerShell, mengapa kita ingin membuka file .PS1 di Notepad secara default? Bahkan jika Anda tidak siap untuk sepenuhnya beralih ke fungsi double-click-to-run yang memungkinkan, Anda mungkin ingin mengubah pengaturan ini.
Anda dapat mengubah asosiasi file .PS1 ke program apa pun yang Anda inginkan dengan panel kontrol Program Default, tetapi menggali langsung ke Registry akan memberi Anda sedikit lebih banyak kontrol atas persis bagaimana file akan dibuka. Ini juga memungkinkan Anda mengatur atau mengubah opsi tambahan yang tersedia di menu konteks untuk file .PS1. Jangan lupa untuk membuat cadangan registri sebelum Anda melakukan ini!
Pengaturan registri yang mengontrol bagaimana skrip PowerShell dibuka disimpan di lokasi berikut:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
Untuk menjelajahi pengaturan ini sebelum kita mengubahnya, lihat kunci itu dan sub-kunci dengan Regedit. Kunci Shell hanya memiliki satu nilai, "(Default)", yang diatur ke "Buka".Ini adalah pointer ke aksi default untuk mengklik dua kali file, yang akan kita lihat di sub-kunci.
Perluas kunci Shell, dan Anda akan melihat tiga sub-kunci. Masing-masing mewakili tindakan yang dapat Anda lakukan yang khusus untuk skrip PowerShell.
Anda dapat memperluas setiap kunci untuk mengeksplorasi nilai-nilai di dalam, tetapi pada dasarnya mereka menyamakan ke default berikut:
Jika Anda ingin tetap dengan string perintah pre-built yang sudah tersedia, Anda bisa mengubah nilai "(Default)" di kunci Shell untuk mencocokkan nama kunci yang sesuai dengan apa yang Anda inginkan klik-ganda untuk dilakukan. Ini dapat dengan mudah dilakukan dari dalam Regedit, atau Anda dapat menggunakan pelajaran yang diambil dari tutorial kami untuk menjelajahi registri dengan PowerShell (plus tweak PSDrive kecil) untuk mulai membuat skrip yang dapat digunakan kembali yang dapat mengkonfigurasi sistem Anda untuk Anda. Perintah di bawah ini harus dijalankan dari sesi PowerShell yang ditinggikan, mirip dengan menjalankan CMD sebagai Administrator.
Pertama, Anda harus mengonfigurasi PSDrive untuk HKEY_CLASSES_ROOT karena ini tidak diatur secara default. Perintah untuk ini adalah:
Register HKCR Baru-PSDrive HKEY_CLASSES_ROOT
Sekarang Anda dapat menavigasi dan mengedit kunci dan nilai registri di HKEY_CLASSES_ROOT seperti yang Anda lakukan di HKCU biasa dan HKLM PSDrives.
Untuk mengkonfigurasi klik ganda untuk meluncurkan skrip PowerShell secara langsung:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Default)' 0
Untuk mengkonfigurasi klik ganda untuk membuka skrip PowerShell di PowerShell ISE:
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Default) "Edit'
Untuk mengembalikan nilai default (set klik dua kali untuk membuka skrip PowerShell di Notepad):
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell '(Default) "Buka'
Itu hanya dasar-dasar mengubah tindakan klik-ganda default. Kami akan membahas lebih detail tentang menyesuaikan cara menangani skrip PowerShell saat dibuka di PowerShell dari Explorer di bagian selanjutnya. Perlu diingat bahwa pelingkupan mencegah PSDrive dari bertahan di seluruh sesi. Jadi, Anda mungkin ingin memasukkan baris New-PSDrive di awal skrip konfigurasi yang Anda buat untuk tujuan ini, atau menambahkannya ke profil PowerShell Anda. Jika tidak, Anda harus menjalankannya secara manual sebelum mencoba melakukan perubahan dengan cara ini.
ExecutionPolicy PowerShell adalah lapisan perlindungan lain terhadap eksekusi skrip jahat. Ada beberapa pilihan untuk ini, dan beberapa cara berbeda dapat diatur. Dari yang paling tidak aman, opsi yang tersedia adalah:
Seperti yang disarankan oleh uraian tentang Undefined, kebijakan di atas dapat disetel dalam satu atau lebih dari beberapa cakupan. Anda bisa menggunakan Get-ExecutionPolicy, dengan parameter -List, untuk melihat semua cakupan dan konfigurasi saat ini.
Cakupan dicantumkan dalam urutan prioritas, dengan cakupan terdefinisi yang paling atas menimpa yang lain. Jika tidak ada kebijakan yang ditentukan, sistem akan kembali ke pengaturan default-nya (dalam banyak hal, ini Dibatasi).
Karena artikel ini terutama membahas tentang keamanan untuk memfasilitasi kegunaan, kami hanya peduli tentang tiga lingkup bawah. Pengaturan MachinePolicy dan UserPolicy benar-benar berguna hanya jika Anda ingin menerapkan kebijakan restriktif yang tidak begitu saja dilewati. Dengan menjaga perubahan kami pada level Proses atau di bawah, kami dapat dengan mudah menggunakan pengaturan kebijakan apa pun yang kami anggap tepat untuk situasi tertentu kapan saja.
Untuk mempertahankan keseimbangan antara keamanan dan kegunaan, kebijakan yang ditampilkan di layar mungkin paling baik. Menetapkan kebijakan LocalMachine ke Dibatasi umumnya mencegah skrip yang dijalankan oleh orang lain selain Anda. Tentu saja, ini dapat dilewati oleh pengguna yang tahu apa yang mereka lakukan tanpa banyak usaha. Tetapi harus menjaga pengguna yang tidak mengerti teknologi dari tidak sengaja memicu bencana besar di PowerShell. Memiliki CurrentUser (yaitu: Anda) disetel sebagai Tidak Terbatas memungkinkan Anda untuk menjalankan skrip secara manual dari baris perintah sesuka Anda, tetapi tetap mempertahankan pengingat untuk skrip yang diunduh dari Internet. Pengaturan RemoteSigned di tingkat Proses perlu dilakukan dengan cara pintas ke PowerShell.exe atau (seperti yang akan kita lakukan di bawah) dalam nilai-nilai Registry yang mengontrol perilaku skrip PowerShell. Ini akan memungkinkan fungsionalitas klik-untuk-menjalankan yang mudah untuk skrip apa pun yang Anda tulis, sembari memasang penghalang yang lebih kuat terhadap eksekusi skrip yang tidak disengaja (berpotensi berbahaya) dari sumber eksternal. Kami ingin melakukan ini di sini karena jauh lebih mudah secara tidak sengaja mengklik dua kali skrip daripada secara umum untuk menyebutnya secara manual dari sesi interaktif.
Untuk menetapkan kebijakan CurrentUser dan LocalMachine seperti pada gambar di atas, jalankan perintah berikut dari sesi PowerShell yang ditinggikan:
Set-ExecutionPolicy Restricted Set-ExecutionPolicy Tanpa Batas -Scope CurrentUser
Untuk menerapkan kebijakan RemoteSigned pada skrip yang dijalankan dari Explorer, kita harus mengubah nilai di dalam salah satu kunci registri yang kita cari sebelumnya. Ini sangat penting karena, tergantung pada versi PowerShell atau Windows Anda, konfigurasi default mungkin untuk mengabaikan semua pengaturan ExecutionPolicy kecuali AllSigned. Untuk melihat apa konfigurasi saat ini untuk komputer Anda, Anda dapat menjalankan perintah ini (memastikan HKCR PSDrive dipetakan terlebih dahulu):
Get-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command | Select-Object '(Default)'
Konfigurasi default Anda mungkin akan menjadi salah satu dari dua string berikut, atau sesuatu yang cukup mirip:
(Terlihat pada Windows 7 SP1 x64, dengan PowerShell 2.0)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-file" "% 1"
(Terlihat pada Windows 8.1 x64, dengan PowerShell 4.0)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "if ((Get-ExecutionPolicy) -ne 'AllSigned') Set-ExecutionPolicy -Scope Process Bypass; & '% 1 '"
Yang pertama tidak terlalu buruk, karena semua yang dilakukannya adalah menjalankan skrip di bawah pengaturan ExecutionPolicy yang ada. Ini bisa dibuat lebih baik, dengan memberlakukan pembatasan yang lebih ketat untuk tindakan yang lebih rentan kecelakaan, tetapi ini awalnya tidak dimaksudkan untuk dipicu oleh klik ganda, dan kebijakan default biasanya Dibatasi setelah semua. Pilihan kedua, bagaimanapun, adalah bypass penuh dari ExecutionPolicy apa pun yang mungkin Anda miliki - bahkan Dibatasi. Karena bypass akan diterapkan dalam lingkup Proses, itu hanya mempengaruhi sesi yang diluncurkan ketika skrip dijalankan dari Explorer. Namun, ini berarti Anda bisa mengakhiri meluncurkan skrip yang mungkin Anda harapkan (dan inginkan) kebijakan Anda untuk dilarang.
Untuk mengatur ExecutionPolicy Tingkat Proses untuk skrip yang diluncurkan dari Explorer, sesuai dengan screenshot di atas, Anda harus mengubah nilai registri yang sama yang baru saja kami tanyakan. Anda dapat melakukannya secara manual di Regedit, dengan mengubahnya menjadi ini:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-ExecutionPolicy" "RemoteSigned" "-file" "% 1"
Anda juga dapat mengubah pengaturan dari dalam PowerShell jika Anda mau. Ingat untuk melakukan ini dari sesi yang ditinggikan, dengan HKCR PSDrive yang dipetakan.
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command '(Default) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -ExecutionPolicy "" RemoteSigned "" -file "" % 1 "'
Sama seperti itu adalah ide yang buruk untuk menonaktifkan UAC sepenuhnya, itu juga praktik keamanan yang buruk untuk menjalankan skrip atau program dengan hak tinggi kecuali Anda benar-benar membutuhkannya untuk melakukan operasi yang memerlukan akses Administrator. Jadi, membuat perintah UAC ke dalam tindakan default untuk skrip PowerShell tidak disarankan. Namun, kami dapat menambahkan opsi menu konteks baru untuk memungkinkan kami menjalankan skrip dengan mudah di sesi yang lebih tinggi saat diperlukan. Ini mirip dengan metode yang digunakan untuk menambahkan "Buka dengan Notepad" ke menu konteks dari semua file - tetapi di sini kita hanya akan menargetkan skrip PowerShell.Kami juga akan membawa beberapa teknik yang digunakan dalam artikel sebelumnya, di mana kami menggunakan file batch alih-alih peretasan registri untuk meluncurkan skrip PowerShell kami.
Untuk melakukan ini di Regedit, kembali ke kunci Shell, di:
HKEY_CLASSES_ROOT \ Microsoft.PowerShellScript.1 \ Shell
Di sana, buat sub-kunci baru. Sebut saja "Jalankan dengan PowerShell (Admin)". Di bawahnya, buat sub-kunci lain yang disebut "Command". Kemudian, tetapkan nilai “(Default)” di bawah Command untuk ini:
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Memulai-Proses PowerShell.exe -ArgumentList '-ExecutionPolicy RemoteSigned -File \ "% 1 \"' -Gerangan Perayap "
Melakukan hal yang sama di PowerShell sebenarnya akan membutuhkan tiga jalur saat ini. Satu untuk setiap kunci baru, dan satu untuk mengatur nilai "(Default)" untuk Command. Jangan lupa ketinggian dan pemetaan HKCR.
Item Baru 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run dengan PowerShell (Admin)' Barang Baru 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run dengan PowerShell (Admin) \ Command' Set-ItemProperty ' HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run dengan PowerShell (Admin) \ Perintah "(Default)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Mulai-Proses PowerShell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -File \"% 1 \ "" - Verb RunAs "'
Juga, perhatikan baik-baik perbedaan antara string yang dimasukkan melalui PowerShell dan nilai aktual yang masuk ke Registry. Khususnya, kita harus membungkus semuanya dalam tanda kutip tunggal, dan double-up pada tanda kutip tunggal internal, untuk menghindari kesalahan dalam penguraian perintah.
Sekarang Anda harus memiliki entri konteks-menu baru untuk skrip PowerShell, yang disebut "Jalankan dengan PowerShell (Admin)".
Opsi baru akan menelurkan dua instance PowerShell berturut-turut. Yang pertama hanya peluncur untuk yang kedua, yang menggunakan Start-Process dengan parameter “-Verb RunAs” untuk meminta elevasi untuk sesi baru. Dari sana, skrip Anda harus dapat dijalankan dengan hak istimewa Administrator setelah Anda mengklik melalui permintaan UAC.
Hanya ada beberapa perubahan pada hal ini yang dapat membantu membuat hidup lebih mudah. Untuk satu, bagaimana menyingkirkan fungsi Notepad sepenuhnya? Cukup salin "(Default)" nilai dari tombol Command di bawah Edit (bawah), ke dalam lokasi yang sama di bawah Buka.
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe" "% 1"
Atau, Anda dapat menggunakan sedikit PowerShell ini (dengan Admin & HKCR tentu saja):
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Open \ Command '(Default) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell_ise.exe ""% 1 "'
Satu lagi gangguan kecil adalah kebiasaan konsol menghilang begitu skrip selesai. Ketika itu terjadi, kami tidak memiliki kesempatan untuk meninjau hasil skrip untuk kesalahan atau informasi berguna lainnya. Ini bisa diselesaikan dengan meletakkan jeda di akhir setiap skrip Anda, tentu saja. Sebagai alternatif, kita dapat memodifikasi nilai “(Default)” untuk tombol Command kita untuk memasukkan parameter “-NoExit”. Di bawah ini adalah nilai yang dimodifikasi.
(Tanpa akses Admin)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-NoExit" "-ExecutionPolicy" "RemoteSigned" "-file" "% 1"
(Dengan akses Admin)
"C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Start-Process PowerShell.exe -ArgumentList '-NoExit -ExecutionPolicy RemoteSigned -File \ "% 1 \"' - Verb RunAs "
Dan tentu saja, kami juga akan memberi Anda perintah PowerShell. Pengingat terakhir: Ketinggian & HKCR!
(Non-Admin)
Set-ItemProperty HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Command '(Default) "" C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe "" -NoExit "" -ExecutionPolicy "" RemoteSigned "" -file ""% 1 "'
(Admin)
Set-ItemProperty 'HKCR: \ Microsoft.PowerShellScript.1 \ Shell \ Run dengan PowerShell (Admin) \ Perintah "(Default)" "C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-Command" "" & Start-Process PowerShell.exe -ArgumentList "-NoExit -ExecutionPolicy RemoteSigned -File \"% 1 \ "" - Verb RunAs "'
Untuk menguji ini, kita akan menggunakan skrip yang dapat menunjukkan kepada kita pengaturan ExecutionPolicy di tempat dan apakah script diluncurkan dengan izin Administrator. Skrip akan disebut "MyScript.ps1" dan disimpan dalam "D: \ Script Lab" pada sistem contoh kami. Kode di bawah ini, untuk referensi.
if (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity] :: GetCurrent ()). IsInRole ([Security.Principal.WindowsBuiltInRole] "Administrator")) Tulis-Output 'Running as Administrator!' else Menulis-Output 'Menjalankan Terbatas!' Get-ExecutionPolicy -List
Menggunakan aksi "Jalankan dengan PowerShell":
Menggunakan "Jalankan dengan PowerShell (Admin)" tindakan, setelah mengklik melalui UAC:
Untuk mendemonstrasikan ExecutionPolicy dalam aksi di lingkup Proses, kita dapat membuat Windows berpikir file tersebut berasal dari Internet dengan kode PowerShell ini:
Add-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Nilai "[ZoneTransfer] 'nZoneId = 3" -Stream' Zone.Identifier '
Untungnya, kami telah mengaktifkan -NoExit. Jika tidak, kesalahan itu hanya akan berkedip, dan kita tidak akan tahu!
Zone.Identifier dapat dihapus dengan ini:
Clear-Content -Path 'D: \ Script Lab \ MyScript.ps1' -Stream 'Zone.Identifier'
Referensi Berguna: