كيفية التعامل مع إهمال apt-key و add-apt-repository باستخدام gpg لإضافة مستودعات خارجية على Ubuntu 22.04

المقدمة

apt-key هو أداة تُستخدم لإدارة المفاتيح التي يستخدمها APT لمصادقة الحزم. إنها مرتبطة بشكل وثيق بأداة add-apt-repository، التي تقوم بإضافة مستودعات خارجية باستخدام خوادم المفاتيح إلى قائمة مصادر APT الموثوق بها. ومع ذلك، تعتبر المفاتيح التي تمت إضافتها باستخدام apt-key و add-apt-repository موثوقة على مستوى عالمي من قبل apt. هذه المفاتيح ليست مقيدة بترخيص المستودع الوحيد الذي كانت مخصصة له. يمكن استخدام أي مفتاح تمت إضافته بهذه الطريقة لترخيص إضافة أي مستودع خارجي آخر، مما يشكل مصدر قلق أمان هام.

ابتداءً من Ubuntu 20.10، يظهر تحذير عند استخدام apt-key يفيد بأن الأداة ستتم إهمالها في المستقبل القريب؛ بالمثل، سيتم إهمال add-apt-repository قريبًا أيضًا. بينما لا تمنع تحذيرات الإهمال هذه بشكل صارم استخدام apt-key و add-apt-repository مع Ubuntu 22.04، إلا أنه غير مستحسن تجاهلها.

أفضل الممارسات الحالية هي استخدام gpg بدلاً من apt-key و add-apt-repository، وفي الإصدارات المستقبلية من أوبونتو سيكون هذا الخيار الوحيد. apt-key و add-apt-repository دائمًا ما كانتا تعملان كأغلفة، تستدعيان gpg في الخلفية. باستخدام gpg مباشرةً، يتم الاستغناء عن الوسيط. لهذا السبب، تعتبر طريقة gpg متوافقة مع الإصدارات القديمة من أوبونتو ويمكن استخدامها كبديل فوري لـ apt-key.

هذا البرنامج التعليمي سيوضح إجراءين يستخدمان بدائل لـ apt-key و add-apt-repository على التوالي. الأول سيكون إضافة مستودع خارجي باستخدام مفتاح عام مع gpg بدلاً من استخدام apt-key. الثاني، كملحق، سيغطي هذا البرنامج التعليمي إضافة مستودع خارجي باستخدام خادم مفاتيح مع gpg كبديل لاستخدام add-apt-repository.

المتطلبات المسبقة

لإكمال هذا البرنامج التعليمي، ستحتاج إلى خادم أوبونتو 22.04. تأكد من إعداد هذا وفقًا لدليلنا إعداد الخادم الأولي لأوبونتو 22.04، مع وجود مستخدم غير root بامتيازات sudo وتمكين جدار حماية.

الخطوة 1 — تحديد المكونات والتنسيق الأساسي

PGP، أو الخصوصية جيدة جدًا، هو برنامج تشفير مملوك يستخدم لتوقيع وتشفير وفك تشفير الملفات والدلائل. تعتبر ملفات PGP ملفات مفتاح عامة، والتي تُستخدم في هذه العملية للتحقق من صحة المستودعات كمصادر صالحة ضمن apt. أما GPG، أو حارس الخصوصية جنو، فهو بديل مفتوح المصدر لـ PGP. وتعتبر ملفات GPG عادةً حلقات المفاتيح، وهي ملفات تحمل مفاتيح متعددة. وتُستخدم كل من هذين النوعين من الملفات بشكل شائع لتوقيع وتشفير الملفات.

gpg هو أداة سطر أوامر GPG التي يمكن استخدامها لتفويض المستودعات الخارجية للاستخدام مع apt. ومع ذلك، يقبل gpg فقط ملفات GPG. ومن أجل استخدام هذه الأداة سطر الأوامر مع ملفات PGP، يجب تحويلها.

تقدم Elasticsearch سيناريو شائع لتحويل المفاتيح، وسيُستخدم كمثال لهذا القسم. ستقوم بتنزيل مفتاح مهيأ لـ PGP وتحويله إلى تنسيق متوافق مع apt بامتداد ملف .gpg. ستفعل ذلك عن طريق تشغيل أمر gpg مع العلم --dearmor. بعد ذلك، ستضيف رابط المستودع إلى قائمة مصادر الحزم، مع إرفاق إشارة مباشرة إلى المفتاح الخاص بك المحول. وأخيرًا، ستتحقق من هذه العملية عن طريق تثبيت حزمة Elasticsearch.

المشاريع التي تتطلب إضافة مستودعات مع التحقق من المفتاح ستوفر لك دائمًا مفتاحًا عامًا وعنوان URI للمستودع الذي يمثل موقعه بالضبط. بالنسبة لمثالنا على Elasticsearch، تقدم الوثائق هذه المكونات على صفحة التثبيت الخاصة بها.

وهذه هي المكونات المعطاة لـ Elasticsearch:

  • المفتاح: https://artifacts.elastic.co/GPG-KEY-elasticsearch
  • المستودع: https://artifacts.elastic.co/packages/7.x/apt stable main

بعد ذلك، يتعين عليك تحديد ما إذا كنت قد تلقيت ملف PGP أو GPG للعمل معه. يمكنك فحص ملف المفتاح عن طريق فتح عنوان URL باستخدام curl:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch

سيقوم هذا بطباعة محتويات ملف المفتاح، الذي يبدأ بالتالي:

Output
-----BEGIN PGP PUBLIC KEY BLOCK----- . . .

على الرغم من وجود GPG في عنوان URL، إلا أن السطر الأول يشير إلى أن هذا في الواقع ملف مفتاح PGP. خذ هذا في الاعتبار، لأن apt يقبل فقط تنسيق GPG. في الأصل، كان apt-key يكتشف ملفات PGP ويحولها تلقائيًا إلى GPG بواسطة استدعاء gpg في الخلفية. سيغطي الخطوة 2 كل من التحويل اليدوي من PGP إلى GPG، وأيضًا ما يجب فعله عندما لا يكون التحويل مطلوبًا.

الخطوة 2 — تحميل المفتاح وتحويله إلى نوع ملف apt متوافق

باستخدام طريقة gpg، يجب عليك دائمًا تنزيل المفتاح قبل إضافته إلى قائمة مصادر الحزم. في السابق مع apt-key، لم يتم فرض هذا الترتيب دائمًا. الآن، يتعين عليك الرجوع إلى مسار المفتاح المحمل في قائمة المصادر الخاصة بك. إذا لم تكن قد قمت بتنزيل المفتاح، فمن الواضح أنك لا تستطيع الرجوع إلى مسار موجود.

مع Elasticsearch، تعمل مع ملف PGP، لذلك ستقوم بتحويله إلى تنسيق ملف GPG بعد التنزيل. يستخدم المثال التالي curl لتحميل المفتاح، حيث يتم توجيه التنزيل إلى أمر gpg. يتم استدعاء gpg باستخدام العلامة --dearmor لتحويل مفتاح PGP إلى تنسيق ملف GPG، ويتم استخدام -o للإشارة إلى مخرج الملف.

في أوبونتو، يعتبر الدليل /usr/share/keyrings هو الموقع الموصى به لملفات GPG المحولة الخاصة بك، حيث يعد الموقع الافتراضي الذي تخزن فيه أوبونتو ملفات مفاتيحها. يكون اسم الملف elastic-7.x.gpg في هذا المثال، ولكن أي اسم يعمل:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elastic-7.x.gpg

يقوم هذا بتحويل ملف PGP إلى تنسيق GPG الصحيح، مما يجعله جاهزًا ليتم إضافته إلى قائمة المصادر لـ apt.

ملاحظة: إذا كان الملف المحمل بالفعل بتنسيق GPG، يمكنك بدلاً من ذلك تنزيل الملف مباشرة إلى /usr/share/keyrings دون تحويله باستخدام أمر مثل المثال التالي:

  1. curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo tee /usr/share/keyrings/elastic-7.x.gpg

في هذه الحالة، سيتم توجيه إخراج أمر curl إلى tee لحفظ الملف في المكان الصحيح.

الخطوة 3 — إضافة المستودع إلى قائمة مصادر الحزم الخاصة بك

بعد تنزيل المفتاح وتنسيقه بشكل صحيح كملف GPG، يمكنك إضافة المستودع إلى مصادر الحزم apt مع ربطه بشكل صريح بالمفتاح الذي حصلت عليه. هناك ثلاث طرق لتحقيق هذا، جميعها متعلقة بكيفية apt يجد المصادر. يستخرج apt المصادر من ملف sources.list المركزي، ملفات .list في دليل sources.list.d، وملفات .source في دليل sources.list.d. على الرغم من عدم وجود فارق وظيفي بين الخيارات الثلاث، يُوصى بالنظر في الخيارات الثلاث واختيار الطريقة التي تناسب احتياجاتك أفضل.

الخيار 1 — إضافة مباشرة إلى sources.list

الطريقة الأولى تتضمن إدراج سطر يمثل المصدر مباشرة في /etc/apt/sources.list، الملف الرئيسي الذي يحتوي على مصادر apt. هناك مصادر متعددة في هذا الملف، بما في ذلك المصادر الافتراضية التي تأتي مع أوبونتو. من المقبول تمامًا تحرير هذا الملف مباشرة، على الرغم من أن الخيار 2 والخيار 3 سيقدمان حلاً أكثر تجانسًا يمكن تحريره وصيانته بشكل أسهل.

افتح /etc/apt/sources.list باستخدام nano أو محرر النص الذي تفضله:

  1. sudo nano /etc/apt/sources.list

ثم أضف المستودع الخارجي في نهاية الملف:

/etc/apt/sources.list
. . .
deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main

يحتوي هذا السطر على المعلومات التالية حول المصدر:

  • deb: يحدد أن المصدر يستخدم هندسة Debian العادية.
  • arch=amd64,arm64: يحدد الهندسات التي سيتم تنزيل بيانات APT إليها. هنا يكون amd64 و arm64.
  • signed-by=/usr/share/keyrings/elastic-7.x.gpg: يحدد المفتاح المستخدم لتخويل هذا المصدر، وهنا يشير إلى ملف .gpg الخاص بك المخزن في /usr/share/keyrings. يجب تضمين هذا الجزء من السطر، في حين أنه لم يكن مطلوبًا في وقت سابق في طريقة apt-key. هذه الإضافة هي التغيير الأكثر حيوية في التحول بعيدًا عن apt-key، حيث تربط المفتاح بمستودع فردي يُسمح له بالتخويل وتصحيح الثغرة الأمنية الأصلية في apt-key.
  • https://artifacts.elastic.co/packages/7.x/apt stable main: هذا هو عنوان URI الذي يُمثل الموقع الدقيق الذي يمكن العثور فيه على البيانات داخل المستودع.
  • /etc/apt/sources.list.d/elastic-7.x.list: هذا هو المكان واسم الملف الجديد الذي سيتم إنشاؤه.
  • /dev/null: يُستخدم هذا عندما لا يكون إخراج الأمر ضروريًا. يتم تجاهل إخراج الأمر عند توجيه tee إلى هذا الموقع.

احفظ واخرج عن طريق الضغط على CTRL+O ثم CTRL+X.

الخيار 2 — إنشاء ملف .list جديد في sources.list.d

مع هذا الخيار ، ستقوم بإنشاء ملف جديد في دليل sources.list.d. يقوم apt بتحليل هذا الدليل و sources.list لإضافة المستودعات. تتيح لك هذه الطريقة عزل إضافات المستودع بشكل فيزيائي داخل ملفات منفصلة. إذا كنت بحاجة في وقت لاحق إلى إزالة هذا الإضافة أو إجراء تعديلات ، يمكنك حذف هذا الملف بدلاً من تحرير ملف sources.list المركزي. يجعل الاحتفاظ بالإضافات بشكل منفصل أمرًا أسهل في الصيانة ، ويمكن أن يكون تحرير sources.list أكثر عرضة للأخطاء بطريقة تؤثر على مستودعات أخرى في الملف.

للقيام بذلك ، قم بتوجيه أمر echo إلى أمر tee لإنشاء هذا الملف الجديد وإدراج السطر المناسب. يتم تسمية الملف elastic-7.x.list في المثال التالي ، ولكن يعمل أي اسم طالما كان اسمًا فريدًا في الدليل:

  1. echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/elastic-7.x.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-7.x.list > /dev/null

هذا الأمر متطابق تمامًا مع إنشاء الملف يدويًا وإدراج السطر المناسب.

الخيار 3 — إنشاء ملف .sources في sources.list.d

الطريقة الثالثة تكتب في ملف .sources بدلاً من ملف .list. هذه الطريقة حديثة نسبيًا وتستخدم تنسيق deb822 لعدة أسطر، وهو أقل غموضًا مقارنةً بالإعلان deb . . .، على الرغم من أنها متطابقة وظيفيًا. قم بإنشاء ملف جديد:

  1. sudo nano /etc/apt/sources.list.d/elastic-7.x.sources

ثم أضف المستودع الخارجي باستخدام تنسيق deb822:

/etc/apt/sources.list.d/elastic-7.x.sources
Types: deb
Architectures: amd64 arm64
Signed-By: /usr/share/keyrings/elastic-7.x.gpg
URIs: https://artifacts.elastic.co/packages/7.x/apt
Suites: stable
Components: main

احفظ واخرج بعد إدراج النص.

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

بعد ذلك، ستتحقق من هذه العملية من خلال إجراء تثبيت اختباري.

الخطوة 4 — تثبيت الحزمة من المستودع الخارجي

يجب عليك استدعاء apt update لتحفيز apt على البحث في ملف sources.list الرئيسي، وجميع ملفات .list و .sources في sources.list.d. استدعاء apt install دون تحديث أولاً سيؤدي إلى فشل التثبيت، أو تثبيت حزمة افتراضية قديمة من apt.

قم بتحديث مستودعاتك:

  1. sudo apt update

ثم قم بتثبيت الحزمة:

  1. sudo apt install elasticsearch

لا يتغير شيء في هذه الخطوة مقارنةً بطريقة apt-key. بمجرد اكتمال هذا الأمر، ستكون قد أكملت التثبيت.

إضافة – إضافة مستودع خارجي باستخدام خادم مفاتيح

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

add-apt-repository هو نظير قائم على خادم المفاتيح لـ apt-key، وكلاهما مرشح للتقادم. يستخدم هذا السيناريو مكونات مختلفة. بدلاً من مفتاح ومستودع، يتم توفير عنوان URL لخادم المفاتيح ومعرف المفتاح. في هذه الحالة، يمكنك التنزيل مباشرةً من خادم المفاتيح إلى تنسيق .gpg المناسب دون الحاجة إلى تحويل أي شيء. لأن add-apt-repository سيتم تقادمه قريبًا، ستقوم بدلاً من ذلك باستخدام gpg للتنزيل إلى ملف مع تجاوز السلوك الافتراضي لـ gpg للاستيراد إلى سلسلة مفاتيح موجودة.

باستخدام لغة البرمجة مفتوحة المصدر R كمثال، هذه هي المكونات المعطاة، التي يمكن العثور عليها أيضًا في تعليمات التثبيت على موقع المشروع الرسمي:

  • خادم المفاتيح: keyserver.ubuntu.com
  • معرف المفتاح: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • المستودع: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

أولاً، قم بالتنزيل مباشرةً من خادم المفاتيح باستخدام gpg. تنبيه، أنه قد يستغرق هذا الأمر بعض الوقت للانتهاء اعتمادًا على حركة التنزيل:

  1. sudo gpg --homedir /tmp --no-default-keyring --keyring /usr/share/keyrings/R.gpg --keyserver keyserver.ubuntu.com --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9

يتضمن هذا الأمر العلامات التالية، والتي تختلف عن استخدام gpg مع مفتاح عام:

  • --no-default-keyring مقترنة بـ --keyring تسمح بإخراج إلى ملف جديد بدلاً من الاستيراد إلى سلسلة مفاتيح موجودة، وهو السلوك الافتراضي لـ gpg في هذا السيناريو.
  • --keyserver مع --recv-keys يوفر المفتاح المحدد والموقع الذي تقوم بتنزيله من.
  • --homedir يُستخدم لإعادة كتابة موقع gpg الافتراضي لإنشاء ملفات مؤقتة. يحتاج gpg إلى إنشاء هذه الملفات لإكمال الأمر، وإلا فسيحاول gpg الكتابة إلى /root مما يتسبب في خطأ في الإذن. بدلاً من ذلك، يضع هذا الأمر الملفات المؤقتة في الدليل المناسب /tmp.

بعد ذلك، قم بإضافة المستودع إلى ملف .list. يتم ذلك بنفس الطريقة بالضبط كإضافة مستودع خارجي باستخدام مفتاح عام من خلال توصيل أمر echo بأمر tee:

  1. echo "deb [arch=amd64 signed-by=/usr/share/keyrings/R.gpg] https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/" | sudo tee /etc/apt/sources.list.d/R.list > /dev/null

بعد ذلك، قم بتحديث قائمة المستودعات الخاصة بك:

  1. sudo apt update

ثم يمكنك تثبيت الحزمة:

  1. sudo apt install r-base

استخدام gpg لإضافة مستودعات خارجية متشابه بين المفاتيح العامة وخوادم المفاتيح، مع الفرق في كيفية استدعاء gpg.

الاستنتاج

إضافة مستودع خارجي باستخدام مفتاح عام أو خادم مفاتيح يمكن القيام به من خلال gpg، دون استخدام apt-key أو add-apt-repository كوسيط. استخدم هذا الأسلوب للتأكد من أن عملية الخاصية الخاصة بك لا تصبح قديمة في إصدارات Ubuntu المستقبلية، حيث أن apt-key و add-apt-repository قد تم تجاهلها وستتم إزالتها في إصدار مستقبل. إضافة مستودعات خارجية باستخدام gpg يضمن أن يتم استخدام المفتاح لتخويل مستودع واحد فقط كما تنوي.

Source:
https://www.digitalocean.com/community/tutorials/how-to-handle-apt-key-and-add-apt-repository-deprecation-using-gpg-to-add-external-repositories-on-ubuntu-22-04