כיצד לטפל בהפסקת השימוש ב-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, ובגרסאות העתידיות של Ubuntu זו תהיה האפשרות היחידה. apt-key ו־add-apt-repository עצמם תמיד פעלו כמעטיים, קוראים ל־gpg ברקע. בשימוש ישיר ב־gpg ניתן לחתוך את האמצעי. משום כך, שיטת gpg מתאימה לאחור וניתנת לשימוש כתחליף ישיר ל־apt-key.

המדריך יציין שתי פרוצדורות המשתמשות באלטרנטיבות ל־apt-key ו־add-apt-repository, בהתאמה. הראשון יהיה הוספת מאגר חיצוני באמצעות מפתח ציבורי עם gpg במקום להשתמש ב־apt-key. השני, כתוספת, המדריך יכסה הוספת מאגר חיצוני באמצעות keyserver עם gpg כאלטרנטיבה לשימוש ב־add-apt-repository.

דרישות מוקדמות

כדי להשלים את המדריך, תצטרך שרת Ubuntu 22.04. ודא שהגדרת את זה על פי המדריך הראשוני שלנו להגדרת שרת עבור Ubuntu 22.04, עם משתמש לא ראשי עם הרשאות sudo וגישה חומת אש מאופשרת.

שלב 1 — זיהוי הרכיבים והתבנית המרכזית

PGP, או Pretty Good Privacy, הוא תוכנת הצפנה בבעלות פטנט, המשמשת לחתימה, הצפנה ופענוח של קבצים וספריות. קבצי PGP הם קבצי מפתח ציבוריים, המשמשים בתהליך זה לאימות תיקיות כמקורות חוקיים בתוך apt. GPG, או GNU Privacy Guard, הוא אלטרנטיבה פתוחה ל־PGP. קבצי GPG בדרך כלל הם מחזיקי מפתחות, הם קבצים שמחזיקים בתוכם מספר מפתחות. שני סוגי הקבצים הללו נהוגים לחתימה והצפנה של קבצים.

gpg הוא הכלי לשורת הפקודה של GPG שיכול לשמש לאימות תיקיות חיצוניות לשימוש עם apt. עם זאת, gpg מקבל רק קבצי GPG. כדי להשתמש בכלי זה בקבצי PGP, יש להמיר אותם.

אלסטיקסרץ' מציגה תרחיש נפוץ להמרת מפתחות, ותשמש כדוגמה למקטע זה. תוריד מפתח המותאם ל־PGP ותמיר אותו לתבנית המתאימה ל־apt עם סיומת של קובץ .gpg. תבצע זאת על ידי הפעלת פקודת gpg עם הדגל --dearmor. לאחר מכן, תוסיף את קישור המאגר לרשימת מקורות החבילות, ותחבר הפניה ישירה למפתח שלך שהומר. לבסוף, תאמת את התהליך על ידי התקנת החבילה של Elasticsearch.

פרויקטים שדורשים הוספת מאגרים עם אימות מפתח תמיד יספקו לך מפתח ציבורי ו-URI של המאגר המייצג את המיקום המדויק שלו. לדוגמה, באלסטיקסרץ הוסבר בעמוד ההתקנה את רכיביו הבאים:

אלה הרכיבים הניתנים ל-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----- . . .

למרות שיש ב-URL את GPG, השורה הראשונה מציינת שזה בעצם קובץ מפתח 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 משמש לציון פלט הקובץ.

ב־Ubuntu, התיקייה /usr/share/keyrings היא המיקום המומלץ לקבצי GPG שהומרו, מכיוון שזו המיקום ברירת המחדל שבו Ubuntu שומרת את טבלאות המפתחות שלה. בדוגמה זו, הקובץ נקרא 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. בקובץ זה ישנם מקורות מרובים, כולל המקורות הברירת מחדל שבהם Ubuntu. ניתן לערוך את הקובץ ישירות, אף שאפשרויות 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 הוא הפעלת מפתחות מבוססת keyserver, הנגדירה את apt-key, ושתיים מהן על פי תכנון לביטול. בסיטואציה זו משתמשים ברכיבים שונים. במקום מפתח ומאגר, מקבלים כתובת URL של keyserver וזיהוי מפתח. במקרה זה, אפשר להוריד ישירות מה keyserver לתקיית פורמט .gpg המתאימה, ללא צורך להמיר דבר. מאחר ש־add-apt-repository עשוי להיות מופסק בקרוב, יש להשתמש במפתח gpg כדי להוריד אל קובץ ובו לדרוס את ההתנהגות המוגדרת כברירת מחדל של gpg לייבוא אל keyring קיים.

בשימוש בשפת התכנות קוד פתוח R כדוגמה, הנה הרכיבים הנתונים, שניתן למצוא גם בהוראות ההתקנה באתר הפרויקט הרשמי:

  • Keyserver: keyserver.ubuntu.com
  • זיהוי מפתח: E298A3A825C0D65DFD57CBB651716619E084DAB9
  • מאגר: https://cloud.r-project.org/bin/linux/ubuntu jammy-cran40/

ראשית, יש להוריד ישירות מה keyserver באמצעות 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 מאפשר פלט לקובץ חדש במקום לייבא אל 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 להוספת מאגרי חיצוניים דומה בין לבין מפתחות ציבוריים ו־keyserver, ההבחנה היא באופן שבו אתה קורא ל־gpg.

סיכום

הוספת תוסף חיצוני באמצעות מפתח ציבורי או מספק מפתחות יכולה להתבצע דרך gpg, מבלי להשתמש ב־apt-key או ב־add-apt-repository כתיווך. השתמש בשיטה זו כדי לוודא שהתהליך שלך לא יהיה מיושן בגרסאות הבאות של אובונטו, מאחר ו־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