Just Enough Administration-II

قسمت دوم Just Enough Administration

0 27

در قسمت اول در مورد Just Enough Administration توضیح دادیم که چیست و چگونه کار می کند و همچنان پیش نیازهای آن را مرور کردیم. در این قسمت قصد دارین یک سناریو تعریف کنیم و  JEA را پیاده سازی کنیم تا شما با تنظیمات آن آشنا شوید.

به دلیل توضیح و انجام تمامی پیش نیازهای JEA در قسمت اول دیگر نیازی نیست توضیحات اضافه تری داده شود و مستقیما به طرح و انجام سناریو می پردازیم.

طرح یک سناریو ساده :

در حال پیاده سازی سرویس اکتیو دایرکتوری برای یک سازمان خیلی بزرگ هستیم  که هر روز  شعبه های این سازمان به این سرویس اضافه می شوند و قصد داریم یک نفر را مسئول مدیریت  Subnetها در کنسول Active Directory site and service کنیم که در مواقع مورد نیاز بتواند:

  • Subnet جدیدی را ایجاد کند.
  • Subnet مورد نظر را پاک کنید.
  •  Subnetهای موجود را بررسی نماید.

بدیهی هستش که تمام مراحل بالا با یک یوزر  Non-Administrator انجام می شود. برای انجام این سناریو و مراحل پیاده سازی  JEA با ما همراه باشید.

Identify Non-Admin user and group:

اساس کار  JEA بر اساس یوزرهای  Non-Administrator می باشد بدین معنی که برای انجام تسکهای مدیریتی نیازی به یک حساب کاربری در سطح آدمین نیست در نتیجه تمام دستورات توسط یک کاربر کاملا عادی اجرا می شود. پس در مرحله اول یک گروه ایجاد می شود  و کاربری که مدیریت  Subnet ها را بر عهده میگیرد عضو این گروه می گردد.

JEA Role Capabilities:

در مرحله دوم و مهمترین مرحله ایجاد Capabilities file می باشد. این فایل تعیین می کند اعضای گروه  Active Directory site and service Admins (در مثال بالا) بعد از اتصال به سیستم مقصد مجاز به اجرای چه دستوراتی می باشند.

در نسخه های قبل از  Powershell 6 برای اینکه سیستم عامل بتواند Capabilities فایلها را تشخیص دهد دنبال فولدری می گردد به نام RoleCapabilities در مسیر $env:PSModulePath و اگر چنین پوشه ای را پیدا نکند پروسه  JEA به درستی اجرا نمی شود. ولی از نسخه ی  Powershell 6 به بالا ما می توانیم مسیر  Capabilities file را درخود فایل Capabilities file ذکر کنیم.

برای اینکه تمامی سیستم عاملهای موجود از نسخه  Powershell 5.1 استفاده می کنند ناچار هستیم روند زیر را طی کنیم.

STEP 1: Create a “Contoso_AD_Module” folder the modules directory:

New-Item -Path “C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module” -ItemType Directory

STEP 2: Create a blank module manifest.  This module manifest will contain metadata about the module you are creating.

New-ModuleManifest -Path ‘C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\Contoso_AD_Module.psd1’ -RootModule Contoso_AD_Module.psm1

STEP 3: Create a blank script module. 

New-Item -Path “C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\Contoso_AD_Module.psm1” -ItemType File

STEP 4: Create a RoleCapabilities folder in the AD_Module folder.  PowerShell can only automatically discover Role Capabilities that are located in a “RoleCapabilities” folder within a module.

New-Item -Path “C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\RoleCapabilities” -ItemType Directory

قدم بعدی ایجاد Capabilities file فایل می باشد برای اینکار دستور زیر را اجرا کنید:

New-PSRoleCapabilityFile -Path `C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\RoleCapabilities\ AD-ManageSubnet.psrc’ -Author “Ahmad Jahloli” -CompanyName Contoso -Description “Used for manage Active Directory Subnet” -Verbose

فایل در پوشه مورد نظر ایجاد شد ولی به خاطر داشته باشید که دسترسی به این فولدر را فقط به مدیران و افراد واجد شرایط واگذار کنید چون اگر فردی مجوز  Write بر روی این فولدر و محتویات آن داشته باشد می تواند تنظیمات Capabilities files ها را تغییر دهد و دستورات غیر مجاز به آن اضافه کند که در نتیجه می توان از این دستورات در  JEA Session استفاده کرد.

بعد از ایجاد فایل آن را با  ISE اجرا کنید تا دستورات مورد نیاز را به آن اضافه کنیم

اولین چیزی که در ایجاد Capabilities files باید در نظر گرفت تعیین محدوده کاری یوزر می باشد. شما در این فایل باید تعیین کنید کاربر مجاز است از چه  Cmdlet, Module, Function and scriptهای استفاده کند؟ مهمترین قسمت تنظیم پارامتراهای زیر هستش:

VisibleCmdlets.

External Commands.

PowerShell providers.

VisibleFunctions.

FunctionDefinitions.

Etc.

در قسمت VisibleCmdlets تعیین می کنیم چه دستوراتی کاربر میتواند اجرا کند که به چهار روش می توان آنها را تنظیم نمود:

روش اول:

VisibleCmdlets = ‘Restart-Service’, ‘Get-NetIPAddress’

روش دوم:

VisibleCmdlets = @{ Name = ‘Restart-Service’; Parameters = @{ Name = ‘Name’ }}

روش سوم:

VisibleCmdlets = @{ Name = ‘Restart-Service’; Parameters = @{ Name = ‘Name’; ValidateSet = ‘Dns’, ‘Spooler’ }},

روش چهارم:

 @{ Name = ‘Start-Website’; Parameters = @{ Name = ‘Name’; ValidatePattern = ‘HR_*’ }}

در روش اول شما می توانید از تمام پارامترهای دستور  Restart-service and get-netipaddress استفاده کنید. (محدودیتی در فراخوانی پارامتر ندارید)

در روش دوم برای دستور  Restart-service فقط مجاز هستید از پارامتر –Name استفاده کنید و بقیه پارامترا مجاز به استفاده آنها نمی باشید.

در روش سوم برای دستور  Restart-Service فقط مجاز هستید از پارامتر –Name استفاده کنید و مقدار  Name فقط  DNS و  Spooler می باشد. (به عبارت دیگر در روش سوم فقط مجاز هستید سرویس های  DNS و  Spooler را ریستارت کنید.)

در روش چهار فقط می توانید سایتهای که با  HR شروع می شوند را استارت کنید.

قبل از اضافه کردن دستوری باید   Type آن دستور را مشخص کنید که  Cmdlet هستش یا  Function. برای اینکار از دستور زیر استفاده کنید:

Get-command –name xxx

 به این نکته توجه داشته باشید که بعضی از دستوراتی که شما درون  Capabilities files قرار می دهید می تواند کل پروسه  JEA را  Bypassکند بعنوان مثال:

Risk

Example Related commands
Granting the connecting user admin privileges to bypass JEA Add-LocalGroupMember -Member ‘CONTOSO\jdoe’ -Group ‘Administrators’ Add-ADGroupMember, Add-LocalGroupMember, net.exe, dsadd.exe
Running arbitrary code, such as malware, exploits, or custom scripts to bypass protections Start-Process -FilePath ‘\\san\share\malware.exe’

Start-Process, New-Service, Invoke-Item, Invoke-WmiMethod, Invoke-CimMethod, Invoke-Expression, Invoke-Command, New-ScheduledTask, Register-ScheduledJob

 

نکته:

دستوراتی هستن با نام common PowerShell parameters که در هر حالتی این دستورات در  JEA Session قابل اجرا هستند حتی اگر آنها را در فایل Capabilities files فراخوانی نکرده باشید. لیست این دستورات را می توانید در لینک زیر پیدا کنید.

About Common Parameters

فعال سازی External Commands در Capabilities files:

قبل از شروع باید بگم  External Commands برنامه ها  و دستوراتی هستند که بصورت کاملا مستقل و بدون وابستگی به  Command promote یا  Powershell اجرا می شوند مانند:

PktMon.exe

Whoami.exe

Expand.exe

Wusa.exe

Etc.

همچنین می توانید اسکریپت (.ps1)  را نیز در این قسمت اضافه کنید. برای ادغام چنین دستوراتی در Capabilities files از فرمت زیر استفاده کنید:

VisibleExternalCommands = ‘C:\Windows\System32\whoami.exe’, ‘C:\Program Files\Contoso\Scripts\UpdateITSoftware.ps1’

فعال سازی PowerShell providers در Capabilities files:

همچنان شما می توانید  Providers ها موجود در  Powershell را در Capabilities files قرار دهید.

فرمت آنها به این صورت می باشد:

VisibleProviders = ‘Registry’

فعال سازی Function در Capabilities files:

بهترین قسمت تنظیمات Capabilities files می باشد. به جای اینکه شما تک تک Cmdlet ها را به همراه پارامترها اضافه کنید، می توایند تمامی دستورات خود در یک Function جای دهید و فقط آن  Function را در Capabilities files قرار دهید.

فرمت آن بدین شکل می باشد:

اسم Function را در قسمت  VisibleFunctions می نویسید ودستورات آن را در قسمت  FunctionDefinitions.

مفهومی وجود دارد به نام Role Capabilities Merged که اگر کاربری عضو چندین Capabilities files باشد و در هر Capabilities file تنظیمات مشابهی برای دستوری وجود داشته باشد، تنظیمات نهایی آن کاربر چه خواهد بود؟

برای تسلط و درک این موضوع لینکی در ادامه معرفی خواهم نمود که حتما آن را مطالعه کنید.

برای اطلاع بیشتر از فرمت دستورها و بقیه تنظیمات  Capabilities files توصیه می کنم حتما لینک زیر را مطالعه کنید. (با مطالعه لینک زیر درک شما از این قسمت کامل می شود)

JEA Role Capabilities

تنظیمات Capabilities files برای سناریوی که اول مقاله توضیح داده شد بدین صورت می باشد:

JEA Session Configurations:

بعد از ایجاد و تنظیم Capabilities files باید مشخص کنیم چه گروه های یا چه یوزرهای به Capabilities files می توانند متصل و از رل های تعریف شده بر روی آن استفاده کنند، که برای اینکار از Session Configuration File استفاده می کنیم.

مهمترین تنظیمات این فایل شامل قسمت های زیر میباشد:

SessionType.

RunAsVirtualAccount.

RoleDefinitions.

gMSA.

Etc.

 برای ایجاد Session Configuration File بصورت خام و با تمام تنظیمات آن، از دستور زیر استفاده کنید:

New-PSSessionConfigurationFile -SessionType RestrictedRemoteServer -Path ‘C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\AD-ManageSubnet.pssc’ -Full -Author “Ahmad Jahloli” -CompanyName Contoso

پارامتر SessionType نوع و محدودیت  JEA Session File را مشخص می کند که در مد RestrictedRemoteServer فایل بصورت کامل محدوده شده ایجاد می شود و فقط دستوراتی که در فایل  Capabilities files ایجاد شده اند و همچنین یکسری  Cmdlet های عمومی که عبارتند از:

Clear-Host (cls, clear)

Exit-PSSession (exsn, exit)

Get-Command (gcm)

Get-FormatData

Get-Help

Measure-Object (measure)

Out-Default

Select-Object (select)

میتوانند در  JEA Session اجرا شوند. همچنین پارامتر –Full تمامی تنظیمات  Session File را در این فایل می گنجاند. برای تغییر تنظیمات  Session File آن را با یک  Text Editor اجرا کنید:

مرحله بعد تعیین  Identity (Account) می باشد. در این قسمت باید مشخص کنیم دستورات یوزر با چه مجوزی بر روی سیستم مقصد اجرا شود؟ که در پست قبلی کامل توضیح دادم. در این سناریو چون تمامی دستورات من بر روی یک سیستم اجرا می شوند پس  Virtual Account را فعال می کنم. گذینه  Run as virtual account group در مواقعی که می خواهید  Virtual account عضو گروه خاصی غیر از  Local Administrator باشد. (فقط گروه های  Local را می توانیم اضافه کنیم)

همچنین ویژگی  Transcript Directory را من بوسیله  GPO بر روی سرورها فعال کردم و لزومی نمی بینم آن را در این قسمت فعال کنم. همچنین به جای استفاده از  Virtual Account می توانید از gMSA استفاده کنید. برای تنظیم آن

درباره gMSA مایکروسافت می فرماید:

The rights that a GMSA provides are determined by the resources you’re accessing. You do not have admin rights on any machines or services unless the machine or service administrator has explicitly granted those rights to the GMSA. Group managed service accounts are only available on domain-joined machines using PowerShell 5.1 or newer.

همچنین می توانید یک  Map Drive ایجاد کنید که در هنگام  JEA Session برای کاربر  Mount شود و اطلاعات را بوسیله آن رد و بدل نمائید.

مهمترین قسمت لینک کردن گروه مورد نظر به Capabilities file هستش. که به صورت زیر تنظیم می شود.

RoleDefinitions = @{ ‘CONTOSO\Active Directory site and service’ = @{ RoleCapabilities = ‘AD-ManageSubnet’ }}

نکته:

Capabilities file را بدون پسوند دورن Session File قرار دهید.

نکته دوم:

می توان چندین Capabilities file به گروه یا یوزر لینک کنید. همچنین می توان از یک یوزر یا گروه بر روی سیستم لوکالی قرار دارد استفاده کرد. که فرمت آن بدین شکل است:

RoleDefinitions = @{

    ‘MyComputerName\MyLocalGroup’ = @{ RoleCapabilities = ‘DnsAuditor’ }}

When specifying local users or groups in the role definitions field, be sure to use the computer name, not localhost or wildcards. You can check the computer name by inspecting the $env:COMPUTERNAME variable.

تنظیمی وجود دارد به نام Conditional access rules که برای اتصال، یکسری شرایط ایجاد می کند. مثلا برای اتصال، کاربرعلاوه بر گروه های عضو شده باید عضو گروه elevated-jea (در مثال پایین)باشد یا کاربر برای احراز هویت از  Two Factor Authentication استفاده کند.

تنظیمات دیگری در Session file وجود دارد که می توانید در لینک زیر آن را مطالعه کنید.

JEA Session Configurations

روش دیگری برای ایجاد  Session Configuration File وجود دارد که خیلی آسان و بدون دردسر می باشد که در لینک بالا در قسمت Sample session configuration file می توانید آن را مطالعه کنید. بعد از اعمال تغییرات فایل را ذخیره می کنیم و با دستور زیر از صحت  syntax آن مطمئن می شویم.

Test-PSSessionConfigurationFile -Path ‘C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\AD-ManageSubnet.pssc’ -Verbos

مرحله بعدی  Register کردن Capabilities file بر روی سیستم مقصد می باشد که برای اینکار دستور زیر را اجرا کنید:

Register-PSSessionConfiguration -Name ADManageSubnetJEA -Path ‘C:\Program Files\WindowsPowerShell\Modules\Contoso_AD_Module\AD-ManageSubnet.pssc’ -Force

توجه داشته باشید که من نام  Session File برای اتصال کاربران را به اسم ADManageSubnetJEA تغییرنام داده ام.

برای دیدن Session Configuration File های اعمال شده بر روی سیستم مقصد از دستورزیر استفاده کنید:

Get-PSSessionConfiguration

مرحله آخر تست تنظیمات  Just Enough Administration می باشد. برای اینکار کاربر مورد نظر از سیستم خود به یکی از Domain Controller ها  JEA Session میزند:

Enter-PSSession -ComputerName DC_name -ConfigurationName ADManageSubnetJEA -Credential (Get-Credential)

در این  Session چه تعداد دستوراتی وجود دارد که مجاز به استفاده آن هستیم

چک کنیم می توانیم از سه دستوری که اضافه کردیم استفاده کنیم یا خیر

الان برای تست یک دستور خارج از این محدوده اجرا کنیم چک کنیم چه اخطاری میگیریم

به این نکته اشاره کنم شما همچنین می توانید از Invoke-Command نیز استفاده کنید.

در انتها برای خارج شدن از  JEA Session از دستور  Exit-PSSession استفاده کنید. و همچنین برای دیدن Transcription file های مربوط به JEA Session ها:

برای اطلاع بیشتر از JEA Session لینک زیر را مطالعه کنید.

Using JEA interactively

نکته:

در مواقعی که مجبور به تغییر تنظیمات session configuration file شدید در وهله اول باید session configuration file را از سیستم مورد نظر Unregister کنید و بعد از اعمال تغییرات آن را دوباره  Register کنید. برای Unregister کردن session configuration file دستور زیر را اجرا کنید:

Unregister-PSSessionConfiguration -Name ‘ContosoMaintenance’ -Force

در انتهای این مقاله شاید سوالی ذهن شما را درگیر کنه، که اگر بخواهیم در سطح  Enterprise از این قابلیت استفاده کنیم چگونه فایلها و تنظیمات را بین سروهای خود  Deploy کنیم؟

جواب:

با استفاده از قابلیت Desired State Configuration (DSC) و JEA DSC resource.

اگر عمری باقی ماند حتما این مورد را بررسی می کنیم و نتایج آن را در این سایت به اشتراک می گذاریم.

شاید بعضی از دوستان خرده بگیرن که مرد حسابی این همه دستور برای ایجاد چندتا  Subnet؟!! به راحتی با  Delegation و…

دوستان عزیز چنین تنظیماتی بر ما پوشیده نیست هدف از طرح چنین سناریوی نحوه راه اندازی  JEA به سادگی هر چی تمامتر هستش وگرنه شما درست می فرمائید. 🙂

در آخر اگر نکته ای، پیشنهادی، تلنگری باشد حتما آن را در قسمت نظرات اعلام کنید با تشکر از تمامی دوستان.

موفق و پیروز باشید.

نویسنده: احمد جهلولی

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.