امن کردن رمزهای عبور در اسکریپت ها و فایلهای PowerShell – بخش اول

مثل تمامی مدیران سیستم، من هم بعضا لازم شده اسکریپت هایی را برای اتوماسیون برخی وظایف پیاده سازی کنم. خودکار سازی وظایف توسط پاورشل بسیار ساده و کارآمد است تا زمانی که بخواهید رمزهای عبور را در آن قرار دهید.

تعداد زیادی اسکریپت و فایل را دیده ام که برخی مدیران سیستم برای راحتی کار، رمز عبور را بصورت کاملا واضح درون فایلها قرار داده اند، بعضا تصور می کنند چون این فایلها در پوشه های تو در تو و بعضا در مسیرهای Group Policy ها قرار دارد، کاملا امن و دور از دسترس هستند، در صورتی که اصلا این چنین نیست و یک کلاه سیاه اولین جایی را که برای یافتن اطلاعات حساس زیر و رو می کند، همین بخش ها می باشد. انجام این عمل به عنوان یک گناه کبیره در صنعت IT و امنیت حساب می شود!

در ابتدا، به شما آموزش می دهیم که چطور رمزهای عبور را بدون اینکه بصورت متن ساده قابل خواندن باشد درون فایلها قرار دهید، حداقل بصورتی که رمز قابل مشاهده برای کاربران و دیگران قابل مشاهده نباشد.

1- استفاده از Get-Credential و Read-Host

شما می توانید یک آبجکت PSCredential را با دستور Get-Credential ایجاد و آن را در یک متغیر ذخیره کنید و سپس آن را در دستوری که از PSCredential پشتیبانی می کند استفاده کنید.

هنگامی که شما متغیر $MyCredential را فراخواهنی میکنید، شما می توانید نام کاربری را مشاهده کنید اما رمز عبور را به شکل “System.Security.SecureString” نشان می دهد، این به این دلیل است که هم اکنون رمز ها به صورت یک “رشته امن” ذخیره شده است.

شما هم اکنون می توانید این متغیر را در هر دستوری (cmdlets) که از مقدار PSCredential پشتیبانی می کند، فراخوانی کنید. حتی اگر دستور از این مقدار پشتیبانی نمی کند و فقط می خواهید نام کاربری و یا فقط رمز عبور را به یک دستور ارسال کنید، می توانید به صورت $MyCredential.UserName و یا $MyCredential.Password از آن استفاده کنید.

همچنین شما می توانید از دستور Read-Host برای ورود اطلاعات در همان لحظه به داخل یک متغیر استفاده کنید. با افزودن گزینه AsSecureString می توانید مقادیر وارد شده را بصورت امن ذخیره کنید:

خروجی این روش همانند قبلی یکسان هست. نام کاربری و رمز عبور به سهولت در دسترس و رمز عبور بصورت یک رشته امن ذخیره شده است.

این دو مورد روش های خوبی برای اجرای یکبار و یا دستی اسکریپت ها هست که رمز عبور را درون فایلها قرار ندهیم اما برای اتوماسیون وظایف اصلا مناسب نیست. ما به دنبال راهکاری هستیم که بدون نیاز به ورود دائم رمزها توسط دستورات فوق و یا رها کردن رمزهای عبوری که برای همه قابل مشاهده باشد؛ بتوانیم وظایف و اسکریپت ها را بصورت خودکار اجرا کنیم.

 

2- رمزنگاری کلمه های عبور و رشته های دیگر توسط ConvertTo-SecureString

با استفاده از ConvertTo-SecureString می توانید یک متن یا رشته ساده را به بصورت یک رشته رمزنگاری شده SecureString تبدیل کنید. این مقدار می تواند برای تمامی دستوراتی که نوع PSCredential را قبول می کنند استفاده شود.

نحوه استفاده:

برای مثال جهت تبدیل کلمه عبور P@ssword1 به یک رشته امن از دستور زیر استفاده می کنیم:

خروجی این نوع یک رشته امن خواهد بود. متاسفانه این امکان وجود ندارد که SecureString را درون یک فایل برای استفاده های آتی قرار دهیم، به همین منظور باید SecureString را به یک رشته رمزنگاری شده تغییر دهیم. برای این کار از دستور ConvertFrom-SecureString استفاده می کنیم.

3- ذخیره کردن یک رشته رمزنگاری شده – ConvertFrom-SecureString

با استفاده از این دستور می توانیم یک رشته امن را به یک رشته ساده رمزنگاری شده تغییر داده و آن را بصورت مستقیم و یا بصورت Pipe درون دستورات خود استفاده کنیم.

نحوه استفاده:

دقیقا مطابق مثالی که در بالا زدیم، ما خروجی دستور فوق را با استفاده از دستور ذکر شده به یک رشته رمزنگاری شده تغییر میدهیم:

نتیجه یک رشته استاندارد رمزنگاری شده است که می توانیم آن را ذخیره کرده و برای استفاده های آتی از آن استفاده کنیم.

جمع بندی

یادگرفتیم که چطور یک رشته امن را به یک رشته رمزنگاری شده تغییر دهیم، یک رشته ساده را به یک رشته امن تغییر میدهیم و سپس آن را رمزنگاری کرده و امکان ذخیره آن را در فایلها داریم.

خروجی گرفتن یک رشته امن از یک متن ساده و ذخیره آن در یک فایل با دستور Out-File

خروجی گرفتن یک رشته امن توسط Get-Credential

خروجی گرفتن یک رشته امن توسط Read-Host

هر یک از دستورات فوق به ما یک فایل با نام Password.txt می دهد که دارای یک رشته رمزنگاری شده است.

هنگامی که نیاز دارید از این رمز استفاده کنید، در اصل باید این مراحل را بصورت برعکس استفاده کنید. اگر شما به SecureString فقط نیاز دارید می توانید تا همین مرحله فقط استفاده کنید.

ایجاد SecureString توسط Get-Content و ConvertTo-SecureString

ایجاد یک نوع PSCredential

نکته آخر:

این کار باعث نمی شود که کسی که میداند شما چطور کار خود را انجا می دهید، نتواند رمز شما را بازگشایی کند و یا از کلمه عبور رمزنگاری شما سوءاستفاده نکند. قصد ما از تبدیل رمزها به یک رشته امن و ذخیره سازی آن در فایل برای این است که رمز عبور به صورت متن ساده در اسکریپت ها نباشد تا به راحتی مورد سوء استفاده قرار نگیرد. هر چند این روش یک روش 100% امن و اصولی نیست اما از امنیت بالایی به نسبت رویه عادی برخوردار است.

همانطور که در بالا گفته شد، ما از یک کلید و یا یک کلید امن برای تهیه این رشته امن استفاده نمی کنیم. این روش فقط برای همان کاربر و بر روی همان سیستم که تهیه شده قابل استفاده است و اگر شما از کلید/کلید امن استفاده نکنید، نمیتوانید آن را بازگشایی کنید. هر پردازشی که در همان سیستم و توسط همان کاربر اجرا شود میتواند رشته رمزنگاری شده را باز کند.

اگر میخواهید بتوانید رمزهای عبور را به اشتراک بگذارید و روی سیستم های دیگر و .. از آن استفاده کنید، باید یک کلید/کلید امن برای این کار استفده کنید. که این مورد را در قسمت دوم این مقاله به شما آموزش خواهم داد.