Prywatna piaskownica, czyli Windows Sandbox #praktycznie

Zapraszam do części praktycznej artykułu poświęconemu funkcji Windows Sandbox.

W ramach sekcji #merytorycznie wyjaśniłem czym jest piaskownica Windows, w jakim celu można ją wykorzystać oraz na jakie aspekty bezpieczeństwa należy zwrócić uwagę rozpoczynając pracę z tym produktem. W sekcji #praktycznie postaram się przedstawić przykłady zastosowania, a także wykorzystać Windows Sandbox do stworzenia narzędzia rozszerzającego możliwości codziennej pracy.

Gdzie mój zamek, gdzie moje zabawki?

Systemy typu Sandbox charakteryzują się swego rodzaju ulotnością, która powoduje, że wszystko co na nich robimy znika wraz z zamknięciem procesu. Czy to wada? To na pewno cecha, którą można przekuć w sporą korzyść. Do tego wystarczy chwila czasu oraz określenie oczekiwań względem wyposażenia naszej piaskownicy. Tu zaczyna się największa zabawa.

Zacznę od instalacji funkcji w systemie Windows. Najłatwiej jest to zrobić za pomocą polecenia Powershell:

Enable-WindowsOptionalFeature -FeatureName "Containers-DisposableClientVM" -All -Online

Wymagane jest ponowne uruchomienie systemu i od tej chwili możliwe jest uruchamianie systemu Sandbox na hoście za pomocą narzędzia Windows Sandbox dostępnego z poziomu menu start.

Jak wcześniej wspomniałem, podstawowa konfiguracja wymaga dodatkowych aktywności, aby spełniała oczekiwania osób używających tej funkcji systemu do zastosowań profesjonalnych.
W tym celu należy wygenerować własny plik konfiguracyjny o rozszerzeniu *.wsb, który służył będzie do personalizacji i uruchamiania piaskownicy. Taki plik można przechowywać w dowolnym miejscu na dysku.

W pierwszej kolejności spróbuję stworzyć bazową konfigurację i pomyślnie ją uruchomić.
W tym celu stworzę poniższą sekcję w pliku o rozszerzeniu .wsb. Plik nazwałem First.wsb.

<Configuration>
</Configuration>

Po jego zapisaniu jestem w stanie uruchomić bazową maszynę. Świetnie – pierwszy krok za mną. W następnym kroku spróbuję zamapować folder oraz nadać do niego prawo zapisu, zatem uzupełnię sekcję Configuration dodatkowymi parametrami i nazwę plik, jako MappedFolder.wsb:

<Configuration>
	<MappedFolders>
		<MappedFolder>
			<HostFolder>C:\Sandbox\DevOps</HostFolder>
			<ReadOnly>false</ReadOnly>
		</MappedFolder>
	</MappedFolders> 
</Configuration>

Po uruchomieniu piaskownicy widać mapowany folder oraz możliwość zapisu:

Na wstępie chciałbym zwrócić szczególną uwagę na ścieżkę mapowanego folderu z poziomu piaskownicy:
C:\Users\WDAGUtilityAccount\Desktop\(Nazwa_Folderu)
W moim przypadku: C:\Users\WDAGUtilityAccount\Desktop\DevOps

Jest to istotne w przypadku budowy narzędzi obsługujących pliki znajdujące się w tej lokalizacji.
Od teraz w łatwy sposób mogę wymieniać pliki między hostem, a maszyną Sandbox, dzięki czemu jestem w stanie uruchamiać potencjalnie niebezpieczne pliki na odizolowanym środowisku bez ryzyka uszkodzenia systemu hosta. Mogę też używać tego systemu do innych zastosowań, jak uruchamianie niewygodnych skryptów, aplikacji czy do debugowania kodu.

Właściwie na tym można by zakończyć artykuł, ponieważ do odpowiednio uzupełnionego katalogu mógłbym wrzucić instalki potrzebnych narzędzi, a następnie instalować je na piaskownicy… czy jednak o to nam chodzi? Każde zbędne kliknięcie myszką to strata czasu, a z pewnością nie jest to moment, w którym kończą się możliwości.

Sprawdźmy to…

Posiadam już przestrzeń, w której mogę wymieniać się plikami. Wykorzystam ją do stworzenia skryptu, który będzie uruchamiany każdorazowo przy uruchomieniu Windows Sandbox. Dzięki temu zaoszczędzę czas wymagany na ręczne dostosowanie maszyny do własnych potrzeb. W tym celu wykorzystam element LogonCommand, za pomocą którego spróbuję uruchomić wiersz poleceń. Plik zapisuję pod nazwą RunCMD.wsb.

<Configuration>
	<MappedFolders>
		<MappedFolder>
			<HostFolder>C:\Sandbox\DevOps</HostFolder>
			<ReadOnly>false</ReadOnly>
		</MappedFolder>
	</MappedFolders>
	<LogonCommand>
		<Command>cmd.exe</Command>
	</LogonCommand>
</Configuration>

Po zapisaniu i uruchomieniu piaskownicy z pliku RunCMD.wsb ukazuje się poniższe okno:

To oznacza, że mogę zacząć myśleć o bardziej złożonych operacjach, jak na przykład zmiana tapety 😊

Do tego potrzebuję czterech rzeczy:

  1. Oczywiście tapety! Plik zapisuję do katalogu, który będzie mapowany na maszynie typu Sandbox.
  2. Skryptu, który użyje pliku *.jpg do stworzenia nowej tapety. W tym celu zastosuję prostą funkcję w Powershell, którą w postaci pliku o nazwie Set-Background.ps1 zachowam w tym samym katalogu:
Function Set-Background { param($File) Set-ItemProperty -path 'HKCU:\Control Panel\Desktop\' -name WallPaper -value $File rundll32.exe user32.dll, UpdatePerUserSystemParameters 1, True } Set-Background -File "C:\Users\WDAGUtilityAccount\Desktop\DevOps\background.jpg" ​
  1. Pliku Background.cmd, który będzie w stanie wywołać funkcję Powershell i w efekcie ustawić pożądaną tapetę.
Powershell Set-ExecutionPolicy unrestricted Powershell -file C:\Users\WDAGUtilityAccount\Desktop\DevOps\Set-Background.ps1 RUNDLL32.EXE USER32.DLL,UpdatePerUserSystemParameters 1, True ​
  1. Wskazania pliku cmd w pliku *.wsb.
<Configuration> 
	<MappedFolders> 
		<MappedFolder> 
			<HostFolder>C:\Sandbox\DevOps</HostFolder> 
			<ReadOnly>false</ReadOnly> 
		</MappedFolder> 
	</MappedFolders> 
	<LogonCommand> 
		<Command>explorer.exe C:\Users\WDAGUtilityAccount\Desktop\DevOps\Trigger-Prerequisites.cmd</Command> 
	</LogonCommand> 
</Configuration>

Po włączeniu maszyny uruchamia się okno cmd:

Po jego zamknięciu widoczny jest efekt zmian:

Po tym ćwiczeniu mam już solidne fundamenty do dalszej personalizacji. W tym miejscu należy zadać sobie pytanie, jakie narzędzia niezbędne są w profesjonalnej pracy?

Zapnij pasy!

Na warsztat wziąłem przykład DevOps i podstawowe narzędzia pozwalające na pisanie kodu, edycję plików konfiguracyjnych i debugowanie, czyli: FirefoxNotepad++Visual Studio CodeGit. Z takim zestawem aplikacji można myśleć o pracy w obrębie wytwarzania oprogramowania. Zaczynamy!

  1. Do instalacji wyżej wymienionych narzędzi użyję repozytorium choco, zatem w pierwszej kolejności stworzę plik Powershell, który zainstaluje niezbędne narzędzia. Nazwę go Install-Prerequisites.ps1 i zapiszę w mapowanym folderze:
Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) choco install firefox notepadplusplus vscode git -y
  1. Plik ten wyzwalany będzie z poziomu cmd, zatem tworzę plik Trigger-Prerequisutes.cmd i zapisuję w tym samym katalogu:
Powershell Set-ExecutionPolicy unrestricted Timeout 5 Powershell "C:\Users\WDAGUtilityAccount\Desktop\DevOps\Install-Prerequisires.ps1" Pause
  1. Wskazuję plik cmd w konfiguracji, a plik zapisuję jako Sandbox-DevOps.wsb.

Po uruchomieniu maszyny i odczekaniu około trzech minut widzę efekt finalny dotychczasowej pracy:

Maszyna działa, narzędzia są dostępne. Można zaczynać pracę…

…albo i nie.

Jeśli dobrnąłeś do tego miejsca, jest mi niezmiernie miło. Jeśli czytałeś uważnie, pewnie zauważysz, że zapomniałem o tapecie. Jednak nie zrobiłem tego celowo. Chciałbym, abyś w ramach pracy domowej utrwalił to ćwiczenie i stworzył spójny „obraz” piaskownicy, ze swoim zamkiem i własnymi zabawkami!

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *