تفويض البرامج النصية PowerShell مع الإدارة الكافية (JEA)

هل سبق لك أن أردت تفويض مهمة ما، ولكن وجدت أن الأذونات المطلوبة يمكن أن تكون محفوفة بالمخاطر للغاية بحيث لا يمكن تسليمها؟ أو هل أردت تأمين أشياء مثل إنشاء المجموعة في AD لفرض اصطلاحات تسمية المجموعات؟




يمكن لـ JEA مساعدتك في هذا الأمر وغير ذلك الكثير. في هذه المقالة، سنتعرف على كيفية تفويض البرامج النصية التي تم إنشاؤها بالفعل باستخدام PowerShell 5.1.


ما هو JEA؟

JEA هو أحد حلول PowerShell من Microsoft والذي يمكنه تقييد المستخدمين (والمسؤولين) ليتمكنوا فقط من أداء مهام محددة في جلسة PowerShell محددة، حتى لو كانوا يحتاجون إلى مسؤول محلي على المورد المذكور. بالإضافة إلى ذلك، يمكنك أن تكون محددًا للغاية. يمكن تنفيذ الأوامر التي تحددها فقط، ويمكنك فقط تمكين قيم المعلمات المحددة وقيم المعلمات التي تتطابق مع نمط معين.

على سبيل المثال، يمكنك تمكين Servicedesk لإعادة تشغيل خدمة معينة فقط باستخدام

Restart-Service 

أو أضف مجموعات إلى AD فقط وفقًا لاصطلاح تسمية محدد. يمكنك القيام بكل هذا دون منحهم أذونات صريحة على الخادم أو في AD. إنها أداة يمكنها توفير قدر هائل من الوقت وتأمين بيئتك. لنبدأ بتغليف البرنامج النصي الخاص بنا في دالة.


الخطوة 1: إنشاء وظيفة من البرنامج النصي الخاص بك

الخطوة الأولى، إذا لم تكن قد قمت بذلك بالفعل، هي إنشاء وظيفة من البرنامج النصي الخاص بك. هذا أمر سهل للغاية، على افتراض أن لديك بالفعل

parameters 

يثبت. أدناه، قمت بتضمين البرنامج النصي البسيط “New-FolderAndShare” في وظيفة:

Function New-FolderAndShare {
    (cmdletbinding())
    param(
        
        (parameter(Mandatory))
        (ValidatePattern("^(Project d{5}|Team (Finance|HR|IT|Multi) (a-z )+)$"))
        (string)$ShareName,

        
        (parameter(Mandatory))
        (ValidatePattern("^(D|E|F):\Shares\$"))
        (string)$Path,

        
        (parameter(Mandatory))
        (ValidateSet("^CONTOSO\"))
        (string)$FullAccess

    )

        $FullPath = Join-Path $Path $ShareName
    New-Item -ItemType Directory -Path $FullPath
    New-SmbShare -Path $FullPath -Name $ShareName -FullAccess $FullAccess

}

يمكنك التحقق من صحة المعلمات باستخدام ValidatePattern في الوظيفة، ولكن إذا كان هذا جزءًا من وحدة نمطية، فيمكنك ذلك في ملف RoleCapabilities بدلاً من ذلك باستخدام VisibleFunctions.

إن جعل البرنامج النصي وظيفة يمنحنا تحكمًا أكبر في المعلمات المسموح بها في JEA، ويجعل عملية التصدير أسهل.

الخطوة 2: إنشاء قدرات الدور

يقرر ملف RoleCapabilities ما هو الدور المحدد (المحدد في الخطوة التالية) المسموح له بالقيام به. يتضمن ذلك الأوامر المسموح لهم بتشغيلها، والمعلمات التي يمكنهم استخدامها، والوحدات النمطية التي سيتم استيرادها.

على الرغم من أنه يمكن إنشاء رول كابابيليتيز يدويًا، فمن المستحسن استخدام التابع New-PSRoleCapabilityFile الأمر المدمج في PowerShell 5.1. سيتم أيضًا تحميل هذا الملف في الوظيفة التي أنشأناها في الخطوة السابقة.


يقوم البرنامج النصي التالي بإنشاء ملف يسمى FileShareCreator.psrc ويضيف الملف New-FolderAndShare الوظيفة (التي يجب تحميلها في الجلسة الحالية):

$RoleCapabilitiesParam = @{
    
    FunctionDefinitions = @{
        Name = 'New-FolderAndShare'
                
        ScriptBlock = (ScriptBlock)::Create(
            (Get-Command New-FolderAndShare).Definition
        )
    }

    
    ModulesToImport = @(
        "SmbShare",
        "Microsoft.PowerShell.Management"
    )
    Path = ".FileShareCreator.psrc"
}

New-PSRoleCapabilityFile @RoleCapabilitiesParam

يستخدم Get-Command لجلب الوظيفة في FunctionDefinitions-المعلمة. يمكنك أيضًا إضافة البرنامج النصي الأولي مع المعلمات.

يمكنك أيضًا تحديد كيفية السماح لك باستخدام الوظيفة في VisibleCmdlet المعلمة. يمكنك القيام بذلك عن طريق تحديد اسم الوظيفة ومعلماتها مع التعبير العادي.

باستخدام هذا، يمكنك إنشاء تحكم دقيق للغاية فيما يمكن للمستخدم فعله وما لا يمكنه فعله. ولكن هناك تحذير واحد لإنجاز هذا العمل — تحتاج إلى إضافة ملف psrc إلى الوحدة النمطية.

الخطوة 3: إنشاء وحدة نمطية لملف روليكابابيليتي

لقد حان الوقت لإنشاء وحدة نمطية يمكنك وضع قدرات دورك فيها. تعثر JEA على رول كابابيليتيز من خلال اسم ملفات psrc دون امتدادها، لذا تجنب التكرارات إذا كنت تريد إنشاء المزيد من إمكانيات الدور لاحقًا.


البرنامج النصي التالي هو نسخة معدلة مما تجده في ملف وثائق JEA الرسمية. يقوم بإنشاء وحدة نمطية جديدة في دليل الوحدة النمطية، وإنشاء الملفات والمجلدات الضرورية المطلوبة، ونسخ ملف psrc الذي قمت بإنشائه في الخطوة 2 إليه:


$modulePath = Join-Path $env:ProgramFiles "WindowsPowerShellModulesFileShareJEA"
New-Item -ItemType Directory -Path $modulePath


New-Item -ItemType File -Path (Join-Path $modulePath "FileShareJEA.psm1")
New-ModuleManifest -Path (Join-Path $modulePath "FileShareJEA.psd1") -RootModule "FileShareJEA.psm1"


$rcFolder = Join-Path $modulePath "RoleCapabilities"
New-Item -ItemType Directory $rcFolder
Copy-Item -Path .FileShareCreator.psrc -Destination $rcFolder

لقد قمت الآن بإنشاء قدرة الدور والوظيفة بحيث يمكنك استخدامها في JEA. ما تبقى عليك فعله الآن هو إنشاء تكوين جلسة PowerShell لتعيين المجموعات الإعلانية للأدوار التي أنشأتها للتو.

الخطوة 4: تحديد الأدوار

في هذه الخطوة، ستقوم بإنشاء ملف PowerShell Session Configuration الذي يحدد الأدوار التي سيتم تعيينها والقدرات (من ملف .psrc الذي أنشأناه في الخطوة 2).

ستقوم بإنشاء المجموعة الإعلانية ودليل النص هنا أيضًا.


New-Item -ItemType Directory -Path 'C:ProgramDataJEAConfigurationTranscripts' -Force


New-ADGroup -Path "OU=Groups,DC=contoso,DC=com" -Name 'JEA_FILESHARE_CREATOR' -GroupScope DomainLocal


$PSSessionConfigurationParams = @{
    
    RunAsVirtualAccount = $True

    
    RunAsVirtualAccountGroups = @(
        "administrators"
    )

    
    TranscriptDirectory = 'C:ProgramDataJEAConfigurationTranscripts'

    
    RoleDefinitions = @{
        'CONTOSOJEA_FILESHARE_CREATOR' = @{
            RoleCapabilities = 'FileShareCreator'
        }
    }
        
        
    Path = ".SessionConfiguration.pssc"

}
New-PSSessionConfigurationFile @PSSessionConfigurationParams

الخطوة 5: إنشاء جلسة PowerShell

في هذه الخطوة، ستقرأ ملف SessionConfiguration.pssc الذي قمت بإنشائه في الخطوة السابقة. يتيح ذلك لأعضاء JEA_FILESHARE_CREATOR الاتصال عبر PowerShell بالخادم:


PS51> Register-PSSessionConfiguration -Path .SessionConfiguration.pssc -Name 'JEAFileShare' -Force

PSPath : Microsoft.WSMan.ManagementWSMan::localhostPluginJEAFileShare
PSParentPath : Microsoft.WSMan.ManagementWSMan::localhostPlugin
PSChildName : JEAFileShare
PSDrive : WSMan
PSProvider : Microsoft.WSMan.ManagementWSMan
PSIsContainer : True
Keys : {Name=JEAFileShare}
Name : JEAFileShare
TypeNameOfElement : Container
Type : Container

لقد انتهيت! أضف مستخدمًا إلى JEA_FILESHARE_CREATOR ليس لديه حق الوصول إلى الخادم من خلال الوسائل العادية وجربه كمستخدم عن طريق كتابة:

PS51> Enter-PSSession -ComputerName fs02.contoso.com -ConfigurationName JEAFileShare
PS51> New-FolderAndShare -ShareName "Project 12345" -Path D:Share

يمكنك الآن تشغيل الأمر كمسؤول محلي مؤقت تم تأمينه وتمكينه فقط لتشغيل بعض الأوامر الافتراضية (المرئية باستخدام Get-Command أثناء الجلسة) و New-FolderAndShare الوظيفة التي تمت إضافتها في ملف قدرات الدور.

إذا كنت تريد رؤية الحساب الذي تم إنشاؤه مؤقتًا، أضف VisibleExternalCommands @('c:windowssystem32whoami.exe') إلى معلمات RoleCapabilities الخاصة بك في الخطوة 2. يمكنك تشغيل whoami ورؤية اسم المسؤول المحلي:

PS51 >whoami
winrm virtual userswinrm va_1_contoso_joe_helpdesk

ملخص

يمكن أن يكون استخدام JEA طريقة رائعة وسهلة لتفويض المهام وتأمين بيئتك. لا يشمل هذا البرامج النصية الخاصة بك فحسب، بل يشمل أيضًا الوحدات المضمنة والوحدات المثبتة. على الرغم من أن JEA يمكن أن تكون ذات قيمة مضافة كبيرة، كن حذرًا! يمكنك إنشاء خطر كبير على بيئتك إذا قمت بتفويض الأوامر الخاطئة أو تحديد المعلمات الخاطئة لأفراد غير متوقعين.


هل تريد معرفة المزيد؟

(العلامات للترجمة)مايكروسوفت

أضف تعليق