على المسرح مرة أخرى الفائزين في المسابقات الدولية SSH و sudo. بتوجيه من دليل النشط دليل الشرف

تاريخياً ، تم تنظيم حقوق sudo من خلال محتويات الملفات من /etc/sudoers.d و visudo ، وتم إجراء تفويض رئيسي باستخدام ~ / .ssh / Author_keys . ومع ذلك ، مع نمو البنية التحتية ، هناك رغبة في إدارة هذه الحقوق بشكل مركزي. حتى الآن ، قد يكون هناك العديد من الحلول:

  • نظام إدارة التكوين - الشيف ، الدمية ، Ansible ، الملح
  • الدليل النشط + sssd
  • تشوهات مختلفة في شكل نصوص وتحرير يدوي للملفات

في رأيي الشخصي ، فإن أفضل خيار للإدارة المركزية لا يزال مجموعة من Active Directory + sssd . مزايا هذا النهج هي:

  • حقا دليل مستخدم مركزي واحد.
  • توزيع حقوق sudo يتعلق بإضافة مستخدم إلى مجموعة أمان محددة.
  • في حالة أنظمة Linux المختلفة ، هناك حاجة لإدخال اختبارات إضافية لتحديد نظام التشغيل عند استخدام أنظمة التكوين.

سيتم تخصيص مجموعة اليوم لحزمة Active Directory + sssd لإدارة حقوق sudo وتخزين مفاتيح ssh في مستودع واحد.
لذا ، تجمد الجمهور بصمت متوتر ، رفع الموصل عصاه ، أعدت الأوركسترا.
دعنا نذهب.

معين:

  • المجال النشط testopf.local على نظام التشغيل Windows Server 2012 R2.
  • مضيف Linux يقوم بتشغيل Centos 7
  • إذن تكوين باستخدام sssd

يقوم كلا الحلين بإجراء تغييرات على مخطط Active Directory ، لذلك نحن نتحقق من كل شيء في بيئة اختبار وبعد ذلك فقط نقوم بإجراء تغييرات على البنية التحتية للعمل. أريد أن أشير - كل التغييرات تستند إلى نقاط ، وفي الواقع ، تضيف فقط السمات والفئات اللازمة.

الخطوة 1: إدارة أدوار sudo من خلال Active Directory .


لتوسيع مخطط Active Directory ، تحتاج إلى تنزيل أحدث إصدار sudo - 1.8.27 اليوم. قم بفك ضغط ، انسخ ملف schema.ActiveDirectory من الدليل ./doc إلى وحدة تحكم المجال. من سطر الأوامر مع حقوق المسؤول من الدليل حيث قمت بنسخ الملف ، قم بتشغيل:

ldifde -i -f schema.ActiveDirectory -c dc=X dc=testopf,dc=local
(لا تنسى أن تحل محل القيم الخاصة بك)

افتح adsiedit.msc واتصل بالسياق الافتراضي:

في جذر المجال ، قم بإنشاء وحدة sudoers . (يجادل البرجوازيون بعناد أنه في هذا القسم الفرعي يبحث الشيطان sssd عن كائنات sudoRole . ومع ذلك ، بعد تشغيل التصحيح التفصيلي وفحص السجلات ، تم الكشف عن إجراء البحث في شجرة الكتالوج.)

قم بإنشاء الكائن الأول في الوحدة التي تنتمي إلى فئة sudoRole . يمكن اختيار الاسم بشكل تعسفي للغاية ، لأنه يخدم فقط في تحديد الهوية بسهولة.

من بين السمات المتاحة المحتملة من امتداد المخطط ، أهمها:

  • sudoCommand - لتحديد الأوامر المسموح لها بالعمل على المضيف.
  • sudoHost - يحدد المضيفين الذي ينطبق عليه هذا الدور. يمكن تعيينها على أنها ALL ، أو لمضيف فردي بالاسم. من الممكن أيضًا استخدام قناع.
  • sudoUser - يشير إلى المستخدمين المسموح لهم بتنفيذ sudo .
    إذا تم تحديد مجموعة أمان ، فأضف علامة "٪" في بداية الاسم. إذا كانت هناك مسافات في اسم المجموعة ، فلا يوجد ما يدعو للقلق. اذا حكمنا من خلال السجلات ، تأخذ آلية sssd مهمة الهروب من المساحات.


الشكل 1. كائنات sudoRole في وحدة sudoers في جذر الدليل


الشكل 2. العضوية في مجموعات الأمان المحددة في كائنات sudoRole.

يتم التكوين التالي على جانب Linux.

في الملف /etc/nsswitch.conf ، أضف السطر إلى نهاية الملف:

 sudoers: files sss 

في ملف /etc/sssd/sssd.conf في المقطع [sssd] ، أضف sudo إلى الخدمات

 cat /etc/sssd/sssd.conf | grep services services = nss, pam, sudo 

بعد كل العمليات ، تحتاج إلى مسح ذاكرة التخزين المؤقت الخفي sssd. يتم إجراء التحديثات التلقائية كل 6 ساعات ، ولكن لماذا يتعين علينا الانتظار كثيرًا عندما نريد الآن.

 sss_cache -E 

يحدث غالبًا أن مسح ذاكرة التخزين المؤقت لا يساعد. ثم نوقف الخدمة وننظف القاعدة ونبدأ الخدمة.

 service sssd stop rm -rf /var/lib/sss/db/* service sssd start 

نتصل تحت المستخدم الأول ونتحقق من أنه يمكن الوصول إليه من تحت sudo:

 su user1 [user1@testsshad log]$ id uid=1109801141(user1) gid=1109800513(domain users) groups=1109800513(domain users),1109801132(admins_) [user1@testsshad log]$ sudo -l [sudo] password for user1: Matching Defaults entries for user1 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user1 may run the following commands on testsshad: (root) /usr/bin/ls, /usr/bin/cat 

نحن نفعل نفس الشيء مع مستخدمنا الثاني:

 su user2 [user2@testsshad log]$ id uid=1109801142(user2) gid=1109800513(domain users) groups=1109800513(domain users),1109801138(sudo_root) [user2@testsshad log]$ sudo -l Matching Defaults entries for user2 on testsshad: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin User user2 may run the following commands on testsshad: (root) ALL 

يتيح لك هذا النهج تحديد أدوار sudo مركزيًا لمجموعات المستخدمين المختلفة.

تخزين واستخدام مفاتيح ssh في Active Directory


مع امتداد صغير للمخطط ، من الممكن تخزين مفاتيح ssh في سمات مستخدم Active Directory واستخدامها للترخيص على مضيفي Linux.

يجب تكوين التفويض عبر sssd.

أضف السمة المطلوبة باستخدام البرنامج النصي PowerShell.

AddsshPublicKeyAttribute.ps1
وظيفة جديدة AttributeID {
بادئة $ = "1.2.840.113556.1.8000.2554"
GUID = [System.Guid] :: NewGuid (). ToString ()
أجزاء $ = @ ()
$ Parts + = [UInt64] :: تحليل ($ guid.SubString (0.4) ، "AllowHexSpecifier")
$ Parts + = [UInt64] :: تحليل ($ guid.SubString (4،4) ، "AllowHexSpecifier")
$ Parts + = [UInt64] :: تحليل ($ guid.SubString (9،4) ، "AllowHexSpecifier")
$ Parts + = [UInt64] :: تحليل ($ guid.SubString (14،4) ، "AllowHexSpecifier")
$ Parts + = [UInt64] :: تحليل ($ guid.SubString (19،4) ، "AllowHexSpecifier")
$ Parts + = [UInt64] :: تحليل ($ guid.SubString (24.6) ، "AllowHexSpecifier")
$ Parts + = [UInt64] :: تحليل ($ guid.SubString (30.6) ، "AllowHexSpecifier")
$ oid = [String] :: Format ("{0}. {1}. {2}. {3}. {4}. {5}. {6}. {6}. {7}" ، بادئة $ ، $ Parts [ 0]
$ Parts [1]، $ Parts [2]، $ Parts [3]، $ Parts [4]، $ Parts [5]، $ Parts [6])
OID
}
$ schemaPath = (Get-ADRootDSE) .schemaNamingContext
$ oid = New-AttributeID
سمات $ = @ {
lDAPDisplayName = 'sshPublicKey'؛
attributeId = $ oid؛
oMSyntax = 22 ؛
attributeSyntax = "2.5.5.5"؛
isSingleValued = $ true ؛
adminDescription = 'مفتاح المستخدم العمومي لتسجيل الدخول إلى SSH' ؛
}

New-ADObject -Name sshPublicKey -Type attributeSchema -Path $ schemapath -OtherAttributes سمات $
userSchema $ = get-adobject -SearchBase $ schemapath -فلتر 'name -eq "user"'
userSchema $ Set-ADObject -Add @ {mayContain = 'sshPublicKey'}

بعد إضافة السمة ، أعد تشغيل خدمات مجال Active Directory.
نمرر لمستخدمي Active Directory. بأي طريقة مناسبة لك ، فإننا نقوم بإنشاء زوج مفاتيح للاتصال ssh.

قم بتشغيل PuttyGen ، وانقر فوق الزر "إنشاء" وانقر بشكل محموم على الماوس داخل منطقة خالية.

عند الانتهاء من العملية ، يمكننا حفظ المفاتيح العامة والخاصة ، وملء المفتاح العام في سمة مستخدم Active Directory والاستمتاع بهذه العملية. ومع ذلك ، يجب استخدام المفتاح العمومي من نافذة " المفتاح العام للصقه في ملف OpenSSH Author_keys: ".



أضف المفتاح إلى سمة المستخدم.

الخيار 1 - واجهة المستخدم الرسومية:



الخيار 2 - PowerShell:

get-aduser user1 | set-aduser -add @{sshPublicKey = 'AAAAB...XAVnX9ZRJJ0p/Q=='}

لذلك ، لدينا في الوقت الحالي: مستخدم بسمة sshPublicKey مملوء ، عميل معجون مكون لتخويل المفتاح. لا تزال هناك نقطة واحدة صغيرة ، وهي كيفية جعل البرنامج الخفي sshd يسحب المفتاح العام الذي نحتاجه من سمات المستخدم. هناك نص صغير موجود على المساحات المفتوحة للإنترنت البورجوازي يتكيف مع هذا بنجاح.

 cat /usr/local/bin/fetchSSHKeysFromLDAP #!/bin/sh ldapsearch -h testmdt.testopf.local -xb "dc=testopf,dc=local" '(sAMAccountName='"${1%@*}"')' -D Administrator@testopf.local -w superSecretPassword 'sshPublicKey' | sed -n '/^ /{H;d};/sshPublicKey:/x;$g;s/\n *//g;s/sshPublicKey: //gp' 

وضعنا 0500 أذونات للجذر على ذلك.

 chmod 0500 /usr/local/bin/fetchSSHKeysFromLDAP 

في هذا المثال ، يتم استخدام حساب المسؤول لربط الدليل. في ظروف القتال يجب أن يكون هناك حساب منفصل مع مجموعة الحد الأدنى من الحقوق.

أنا شخصياً كنت مرتبكًا جدًا من لحظة كلمة المرور بشكلها النقي في البرنامج النصي ، على الرغم من الحقوق المنصوص عليها.

خيار الحل:

  • أحفظ كلمة المرور في ملف منفصل:

     echo -n Supersecretpassword > /usr/local/etc/secretpass 
  • قمت بتعيين الأذونات على ملف 0500 للجذر

     chmod 0500 /usr/local/etc/secretpass 
  • أقوم بتغيير معلمات بدء التشغيل من ldapsearch: يتم تغيير المعلمة superSecretPassword -w إلى -y / usr / local / etc / secretpass

الدردشة الجماعية النهائية في مجموعة اليوم هي تحرير sshd_config

 cat /etc/ssh/sshd_config | egrep -v -E "#|^$" | grep -E "AuthorizedKeysCommand|PubkeyAuthe" PubkeyAuthentication yes AuthorizedKeysCommand /usr/local/bin/fetchSSHKeysFromLDAP AuthorizedKeysCommandUser root 

نتيجة لذلك ، حصلنا على التسلسل التالي من خلال مصادقة المفتاح التي تم تكوينها في عميل ssh:

  1. يتصل المستخدم بالخادم ، مبينا اسم المستخدم الخاص به.
  2. يسحب البرنامج الخفي sshd ، من خلال برنامج نصي ، قيمة المفتاح العمومي من سمة المستخدم في Active Directory ويخوّل المفاتيح.
  3. يصادق البرنامج الخفي sssd المستخدم على أساس عضوية المجموعة. تحذير! إذا لم يتم تكوين هذا ، فسيتمكن أي مستخدم مجال من الوصول إلى المضيف.
  4. عندما يحاول sudo ، يبحث البرنامج الخفي sssd في دليل Active Directory عن الأدوار. في حالة وجود أدوار ، يتم التحقق من السمات وعضوية المستخدم في المجموعة (إذا تم تكوين sudoRoles لاستخدام مجموعات المستخدمين)

يؤدي


وبالتالي ، يتم تخزين المفاتيح في سمات مستخدم Active Directory ، أذونات sudo - وبالمثل ، يتم الوصول إلى مضيفي Linux عن طريق حسابات المجال عن طريق التحقق من العضوية في مجموعة Active Directory.

الموجة الأخيرة من عصا الموصل - والقاعة تتجمد في صمت مروع.

الموارد المستخدمة في الكتابة:

Source: https://habr.com/ru/post/ar449702/


All Articles