مثل تمامی مدیران سیستم، من هم بعضا لازم شده اسکریپت هایی را برای اتوماسیون برخی وظایف پیاده سازی کنم. خودکار سازی وظایف توسط فایل PowerShell بسیار ساده و کارآمد است تا زمانی که بخواهید رمزهای عبور را در آن قرار دهید.
ایمن سازی رمز عبور در اسکریپت و فایل PowerShell
تعداد زیادی اسکریپت و فایل را دیده ام که برخی مدیران سیستم برای راحتی کار، رمز عبور را بصورت کاملا واضح درون فایلها قرار دادهاند، بعضا تصور میکنند چون این فایلها در پوشههای تو در تو و بعضا در مسیرهای Group Policy ها قرار دارد، کاملا امن و دور از دسترس هستند، در صورتی که اصلا این چنین نیست و یک کلاه سیاه اولین جایی را که برای یافتن اطلاعات حساس زیر و رو می کند، همین بخش ها می باشد. انجام این عمل به عنوان یک گناه کبیره در صنعت IT و امنیت حساب می شود!
در ابتدا، به شما آموزش می دهیم که چطور رمزهای عبور را بدون اینکه بصورت متن ساده قابل خواندن باشد درون فایلها قرار دهید، حداقل بصورتی که رمز قابل مشاهده برای کاربران و دیگران قابل مشاهده نباشد.
1- استفاده از Get-Credential و Read-Host
شما می توانید یک آبجکت PSCredential را با دستور Get-Credential ایجاد و آن را در یک متغیر ذخیره کنید و سپس آن را در دستوری که از PSCredential پشتیبانی می کند استفاده کنید.
1 |
$MyCredential = Get-Credential |
هنگامی که شما متغیر $MyCredential را فراخواهنی میکنید، شما میتوانید نام کاربری را مشاهده کنید اما رمز عبور را به شکل “System.Security.SecureString” نشان میدهد، این به این دلیل است که هم اکنون رمز ها به صورت یک “رشته امن” ذخیره شده است.
شما هم اکنون می توانید این متغیر را در هر دستوری (cmdlets) که از مقدار PSCredential پشتیبانی می کند، فراخوانی کنید. حتی اگر دستور از این مقدار پشتیبانی نمی کند و فقط می خواهید نام کاربری و یا فقط رمز عبور را به یک دستور ارسال کنید، می توانید به صورت $MyCredential.UserName و یا $MyCredential.Password از آن استفاده کنید.
همچنین شما می توانید از دستور Read-Host برای ورود اطلاعات در همان لحظه به داخل یک متغیر استفاده کنید. با افزودن گزینه AsSecureString می توانید مقادیر وارد شده را بصورت امن ذخیره کنید:
1 2 |
$user = Read-Host "Enter Username" $pass = Read-Host "Enter Password" -AsSecureString |
خروجی این روش همانند قبلی یکسان هست. نام کاربری و رمز عبور به سهولت در دسترس و رمز عبور بصورت یک رشته امن ذخیره شده است.
این دو مورد روش های خوبی برای اجرای یکبار و یا دستی اسکریپت ها هست که رمز عبور را درون فایلها قرار ندهیم اما برای اتوماسیون وظایف اصلا مناسب نیست. ما به دنبال راهکاری هستیم که بدون نیاز به ورود دائم رمزها توسط دستورات فوق و یا رها کردن رمزهای عبوری که برای همه قابل مشاهده باشد؛ بتوانیم وظایف و اسکریپت ها را بصورت خودکار اجرا کنیم.
2- رمزنگاری کلمه های عبور و رشته های دیگر توسط ConvertTo-SecureString
با استفاده از ConvertTo-SecureString می توانید یک متن یا رشته ساده را به بصورت یک رشته رمزنگاری شده SecureString تبدیل کنید. این مقدار میتواند برای تمامی دستوراتی که نوع PSCredential را قبول می کنند استفاده شود.
نحوه استفاده:
1 2 3 4 |
ConvertTo-SecureString [-String] SomeString ConvertTo-SecureString [-String] SomeString [-SecureKey SecureString] ConvertTo-SecureString [-String] SomeString [-Key Byte[]] ConvertTo-SecureString [-String] SomeString [-AsPlainText] [-Force] |
برای مثال جهت تبدیل کلمه عبور P@ssword1 به یک رشته امن از دستور زیر استفاده می کنیم:
1 |
"P@ssword1" | ConvertTo-SecureString -AsPlainText -Force |
خروجی این نوع یک رشته امن خواهد بود. متاسفانه این امکان وجود ندارد که SecureString را درون یک فایل برای استفاده های آتی قرار دهیم، به همین منظور باید SecureString را به یک رشته رمزنگاری شده تغییر دهیم. برای این کار از دستور ConvertFrom-SecureString استفاده می کنیم.
3- ذخیره کردن یک رشته رمزنگاری شده – ConvertFrom-SecureString
با استفاده از این دستور میتوانیم یک رشته امن را به یک رشته ساده رمزنگاری شده تغییر داده و آن را بصورت مستقیم و یا بصورت Pipe درون دستورات خود استفاده کنیم.
نحوه استفاده:
1 2 3 |
ConvertFrom-SecureString [-SecureString] SecureString ConvertFrom-SecureString [-SecureString] SecureString [-SecureKey SecureString] ConvertFrom-SecureString [-SecureString] SecureString [-Key Byte[]] |
دقیقا مطابق مثالی که در بالا زدیم، ما خروجی دستور فوق را با استفاده از دستور ذکر شده به یک رشته رمزنگاری شده تغییر میدهیم:
1 |
"P@ssword1" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString |
نتیجه یک رشته استاندارد رمزنگاری شده است که میتوانیم آن را ذخیره کرده و برای استفادههای آتی از آن استفاده کنیم.
جمع بندی
یادگرفتیم که چطور یک رشته امن را به یک رشته رمزنگاری شده تغییر دهیم، یک رشته ساده را به یک رشته امن تغییر میدهیم و سپس آن را رمزنگاری کرده و امکان ذخیره آن را در فایلها داریم.
خروجی گرفتن یک رشته امن از یک متن ساده و ذخیره آن در یک فایل با دستور Out-File
1 |
"P@ssword1" | ConvertTo-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-File "C:\Users\Zagrio\Password.txt" |
خروجی گرفتن یک رشته امن توسط Get-Credential
1 |
(Get-Credential).Password | ConvertFrom-SecureString | Out-File "C:\Users\Zagrio\Password.txt" |
خروجی گرفتن یک رشته امن توسط Read-Host
1 |
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "C:\Users\Zagrio\Password.txt" |
هر یک از دستورات فوق به ما یک فایل با نام Password.txt می دهد که دارای یک رشته رمزنگاری شده است.
هنگامی که نیاز دارید از این رمز استفاده کنید، در اصل باید این مراحل را بصورت برعکس استفاده کنید. اگر شما به SecureString فقط نیاز دارید می توانید تا همین مرحله فقط استفاده کنید.
ایجاد SecureString توسط Get-Content و ConvertTo-SecureString
1 |
$pass = Get-Content "C:\Users\Zagrio\Password.txt" | ConvertTo-SecureString |
ایجاد یک نوع PSCredential
1 2 3 |
$User = "MyUserName" $File = "C:\Users\Zagrio\Password.txt" $MyCredential=New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, (Get-Content $File | ConvertTo-SecureString) |
نکته آخر:
این کار باعث نمیشود که کسی که میداند شما چطور کار خود را انجا می دهید، نتواند رمز شما را بازگشایی کند و یا از کلمه عبور رمزنگاری شما سوءاستفاده نکند. قصد ما از تبدیل رمزها به یک رشته امن و ذخیره سازی آن در فایل برای این است که رمز عبور به صورت متن ساده در اسکریپت ها نباشد تا به راحتی مورد سوء استفاده قرار نگیرد. هر چند این روش یک روش 100% امن و اصولی نیست اما از امنیت سایت بالایی به نسبت رویه عادی برخوردار است.
همانطور که در بالا گفته شد، ما از یک کلید و یا یک کلید امن برای تهیه این رشته امن استفاده نمیکنیم. این روش فقط برای همان کاربر و بر روی همان سیستم که تهیه شده قابل استفاده است و اگر شما از کلید/کلید امن استفاده نکنید، نمیتوانید آن را بازگشایی کنید. هر پردازشی که در همان سیستم و توسط همان کاربر اجرا شود میتواند رشته رمزنگاری شده را باز کند.
اگر میخواهید بتوانید رمزهای عبور را به اشتراک بگذارید و روی سیستم های دیگر و .. از آن استفاده کنید، باید یک کلید/کلید امن برای این کار استفده کنید.
بدون دیدگاه