הפעלת הצפנת נתונים שקופה (TDE) ב-AlloyDB Omni RPM

1. מבוא

ב-Codelab הזה נדגים איך מגדירים ומפעילים הצפנת נתונים שקופה (TDE) ב-AlloyDB Omni באמצעות חבילות RPM. הצפנת TDE מצפינה קובצי נתונים, יומני WAL וקובצי נתונים זמניים במצב מנוחה, ומספקת הגנה על הנתונים מפני גישה לא מורשית למדיה פיזית בסיסית לאחסון.

ב-Codelab הזה תלמדו איך להקצות נפחי אחסון, לאתחל ולהפעיל אשכול AlloyDB Omni עם TDE באמצעות File KMS, ואיך לוודא שהנתונים במנוחה מוצפנים בקבצים בדיסק.

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

  • גישה לפרויקט ב-Google Cloud ול-Cloud Shell ממסוף Google Cloud.
  • ה-SDK של Google Cloud‏ (gcloud) מותקן ומוגדר. פרטים על התקנת gcloud זמינים במאמר gcloud-install.

מה תלמדו

  • איך יוצרים מכונה וירטואלית ב-Compute Engine עם מסד נתונים ייעודי, גיבוי ודיסקים להחלפה.
  • איך מעצבים נפחי אחסון (XFS), מגדירים את /etc/fstab ומכינים נתיבי נתונים.
  • איך ליצור ולנהל מפתחות להצפנת מפתחות (KEK) באמצעות File KMS.
  • איך להתקין חבילות AlloyDB Omni RPM וכלי לקוח של PostgreSQL.
  • איך להפעיל אשכול AlloyDB Omni עם TDE באמצעות כלי ההגדרה של RPM ‏ (alloydbomni18-setup) ו---tde-kek-url.
  • איך מאמתים הצפנה בדיסק באמצעות בדיקת קובץ גולמי (grep).

מה תצטרכו

2. הגדרה ודרישות

הגדרת פרויקט

יצירת פרויקט ב-Google Cloud

  1. במסוף Google Cloud, בדף לבחירת הפרויקט, בוחרים פרויקט ב-Google Cloud או יוצרים פרויקט.
  2. הקפידו לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud. כך בודקים אם החיוב מופעל בפרויקט

מפעילים את Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל בשיעור Codelab הזה משתמשים ב-Google Cloud Shell, סביבת שורת פקודה שפועלת בענן.

סמל להפעלת Cloud Shell

  1. פותחים את מסוף Google Cloud ולוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה. אפשר גם לפתוח את Cloud Shell על ידי הקשה על G ואז על S במסוף, או על ידי מעבר לכתובת shell.cloud.google.com.
  2. בדרך כלל חולפות כמה שניות עד שההקצאה והחיבור לסביבת העבודה יושלמו. בסיום התהליך, תוצג שורת פקודה במסוף שמוכנה לקלט.

טרמינל Google Cloud Shell שמציג סביבה מחוברת

3. איך יוצרים מכונה וירטואלית ב-Compute Engine?

בקטע הזה, יוצרים מכונה וירטואלית (VM) ב-Compute Engine‏ (GCE) עם Rocky Linux 9, עם דיסקים לאחסון מתמיד (persistent disk) ייעודיים לנתוני מסד הנתונים (/data1), לגיבויים ולניטור (/obs) ולמרחב החלפה.

  1. מגדירים משתני סביבה למזהה הפרויקט, לשם המכונה הווירטואלית, לאזור ולמיקום.
    export PROJECT="your-project-id"
    export INSTANCE_NAME="alloydb-omni-tde-vm"
    export ZONE="us-central1-c"
    export REGION="us-central1"
    
  2. מגדירים את פרויקט ברירת המחדל.
    gcloud config set project $PROJECT
    
  3. יוצרים כללים של חומת אש ברשת לתעבורת SSH.
    gcloud compute firewall-rules create allow-ssh-alloydb-omni-tde \
        --project=$PROJECT \
        --direction=INGRESS \
        --action=allow \
        --rules=tcp:22 \
        --source-ranges="0.0.0.0/0"
    
  4. מכיוון שהמכונה הווירטואלית נוצרת ללא כתובת IP ציבורית, צריך להגדיר Cloud Router ושער Cloud NAT כדי לספק גישה לאינטרנט לצורך הורדת חבילות RPM. אם כבר קיים Cloud NAT באזור הפרויקט, אפשר להמשיך.
    gcloud compute routers create alloydb-omni-tde-router \
        --project=$PROJECT \
        --network=default \
        --region=$REGION 2>/dev/null || true
    
    gcloud compute routers nats create alloydb-omni-tde-nat \
        --project=$PROJECT \
        --router=alloydb-omni-tde-router \
        --region=$REGION \
        --nat-all-subnet-ip-ranges \
        --auto-allocate-nat-external-ips 2>/dev/null || true
    
    הערה: אם כבר קיים שער Cloud NAT באזור שלכם, GCP יחזיר הודעה שמציינת ש-NAT כבר מוגדר לכל רשתות המשנה. אפשר להתעלם מהשגיאה הזו ולהמשיך.
  5. יצירת דיסקים נוספים של אחסון מתמיד (persistent disks) לנתוני מסד הנתונים, לגיבויים ולמרחב החלפה.
    gcloud compute disks create $INSTANCE_NAME-data \
        --project=$PROJECT --zone=$ZONE --size=50GB --type=pd-balanced
    
    gcloud compute disks create $INSTANCE_NAME-obs \
        --project=$PROJECT --zone=$ZONE --size=50GB --type=pd-balanced
    
    gcloud compute disks create $INSTANCE_NAME-swap \
        --project=$PROJECT --zone=$ZONE --size=10GB --type=pd-balanced
    
  6. מקצים את מכונת ה-VM של Rocky Linux 9 עם אמצעי האחסון המצורפים.
    gcloud compute instances create $INSTANCE_NAME \
        --project=$PROJECT \
        --zone=$ZONE \
        --machine-type=n2-highmem-16 \
        --image-family=rocky-linux-9 \
        --image-project=rocky-linux-cloud \
        --boot-disk-size=30GB \
        --boot-disk-type=pd-balanced \
        --disk=name=$INSTANCE_NAME-data,device-name=db-data,mode=rw \
        --disk=name=$INSTANCE_NAME-obs,device-name=obs,mode=rw \
        --disk=name=$INSTANCE_NAME-swap,device-name=swap,mode=rw \
        --no-address
    

4. הכנת דיסקים, כוונון מערכת ומפתח KMS של קובץ

בקטע הזה מתחברים למכונה הווירטואלית, מפרמטים את אמצעי האחסון הקבועים ומטמיעים אותם, מגדירים את קובץ ההחלפה, מבצעים אופטימיזציה של SELinux ויוצרים את המפתח להצפנת מפתחות הצפנה (KEK) של TDE באמצעות File KMS.

  1. מתחברים ל-VM באמצעות SSH דרך שרת proxy לאימות זהויות (IAP).
    gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --tunnel-through-iap
    
  2. מפרמטים את נפח הנתונים (/data1) ואת נפח הגיבוי והניטור (/obs) ומעלים אותם.
    sudo mkdir -p /data1 /obs
    
    sudo parted /dev/disk/by-id/google-db-data mklabel gpt
    sudo parted /dev/disk/by-id/google-db-data mkpart primary 0% 100%
    
    sudo parted /dev/disk/by-id/google-obs mklabel gpt
    sudo parted /dev/disk/by-id/google-obs mkpart primary 0% 100%
    
    sleep 3
    sudo mkfs.xfs -L data /dev/disk/by-id/google-db-data-part1
    sudo mkfs.xfs -L obs /dev/disk/by-id/google-obs-part1
    
    echo -e "LABEL=data\t/data1\txfs\tdefaults\t0 0" | sudo tee -a /etc/fstab
    echo -e "LABEL=obs\t/obs\txfs\tdefaults\t0 0" | sudo tee -a /etc/fstab
    
    sudo systemctl daemon-reload
    sudo mount /data1
    sudo mount /obs
    
  3. יוצרים ומפעילים את אזור ההחלפה בדיסק ההחלפה הייעודי.
    SWAP_UUID=$(sudo mkswap /dev/disk/by-id/google-swap 2>/dev/null | awk '$0 ~ "UUID" {print $NF}')
    echo -e "${SWAP_UUID}\tswap\tswap\tdefaults\t0 0" | sudo tee -a /etc/fstab
    sudo swapon -a
    
  4. מגדירים משתני סביבה לספריית מסד הנתונים ולקובץ מפתח KMS של הקובץ.
    export PGDATA="/data1/18"
    export KMS_DIR="/data1/kms"
    export KEK_FILE="$KMS_DIR/tde_key"
    export ALLOYDB_OMNI_REPOSITORY_URL="<your-repository-url>"
    
  5. יוצרים ספריות אחסון למסד הנתונים ולאחסון מפתחות File KMS.
    sudo mkdir -p $PGDATA
    sudo mkdir -p $KMS_DIR
    
  6. יוצרים מפתח להצפנת מפתחות הצפנה (KEK) מאובטח מבחינה קריפטוגרפית בגודל 32 בייט באמצעות OpenSSL עבור File KMS.
    sudo openssl rand -base64 32 | sudo tee $KEK_FILE
    sudo chmod 700 $KMS_DIR
    sudo chmod 600 $KEK_FILE
    
  7. מתקינים את כלי השירות הנדרשים לניהול SELinux.
    sudo dnf install -y policycoreutils-python-utils
    

5. התקנת חבילות RPM של AlloyDB Omni

מגדירים מאגרי חבילות ומתקינים את שרת מסד הנתונים AlloyDB Omni לצד כלי PostgreSQL 18 רגילים.

הערה: מחליפים את $ALLOYDB_OMNI_REPOSITORY_URL בכתובת ה-URL של המאגר שמתקבלת באימייל אחרי שממלאים את טופס ההרשמה ל-AlloyDB Omni RPM. מידע נוסף מופיע במאמר סקירה כללית על AlloyDB Omni ב-Linux.

  1. יוצרים את קובץ התצורה של מאגר YUM עבור AlloyDB Omni.
    sudo tee /etc/yum.repos.d/alloydbomni.repo << EOF
    [alloydbomni]
    name=alloydbomni
    baseurl=$ALLOYDB_OMNI_REPOSITORY_URL
    enabled=1
    repo_gpgcheck=0
    gpgcheck=1
    gpgkey=https://dl.google.com/linux/linux_signing_key.pub
    EOF
    
  2. מעדכנים את מטמון מאגר YUM ומתקינים חבילות RPM של שרת AlloyDB Omni 18.
    sudo yum makecache
    sudo dnf install -y alloydbomni18
    
  3. מתקינים את מאגר ה-RPM הרשמי של PostgreSQL PGDG ומתקינים את חבילת הלקוח הרגילה של PostgreSQL 18 ‏ (psql).
    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm
    sudo dnf install -y postgresql18
    
  4. מקצים את הבעלות על /data1 ועל ספריית מפתחות ה-KMS למשתמש postgres.
    sudo chown -R postgres:postgres /data1 $KMS_DIR
    sudo chmod 755 /data1 $PGDATA
    

6. אתחול של אשכול עם TDE

מגדירים מכסות משאבים, פותחים יציאות בחומת האש של המארח ומפעילים את אשכול AlloyDB Omni עם הצפנת נתונים שקופה באמצעות מפתח KMS של קובץ (POSTGRES_INITDB_ARGS="--tde-kek-url=file://$KEK_FILE").

  1. מגדירים את SELinux למצב מתירני ומגדירים כללי חומת אש למארח עבור PostgreSQL.
    sudo setenforce 0
    sudo firewall-cmd --add-port=5432/tcp --permanent
    sudo firewall-cmd --reload
    
  2. מגדירים פרמטרים של החלפת שירות systemd כדי להקצות מגבלות של זיכרון ומשאבי CPU.
    sudo mkdir -p /etc/systemd/system/alloydbomni18.service.d
    sudo tee /etc/systemd/system/alloydbomni18.service.d/override.conf << EOF
    [Service]
    CPUQuota=90%
    MemoryMax=80%
    EOF
    sudo chown root:root /etc/systemd/system/alloydbomni18.service.d/override.conf
    sudo chmod 644 /etc/systemd/system/alloydbomni18.service.d/override.conf
    sudo systemctl daemon-reload
    
  3. מגדירים משתני סביבה של אדמין ומפעילים את אשכול מסד הנתונים של TDE באמצעות alloydbomni18-setup initdb.
    export PGPASSWORD="YourStrongPassword123!"
    export POSTGRES_INITDB_ARGS="--tde-kek-url=file://$KEK_FILE"
    
    sudo POSTGRES_INITDB_ARGS="$POSTGRES_INITDB_ARGS" PGPASSWORD="$PGPASSWORD" PGDATA="$PGDATA" \
        /usr/lib/postgresql/18/bin/alloydbomni18-setup initdb
    
  4. מגדירים את יציאת השרת 5432 ב-postgresql.conf.
    sudo sed -i "s/^#*[[:space:]]*port[[:space:]]*=[[:space:]]*[0-9]*/port = 5432/" $PGDATA/postgresql.conf
    
  5. הכנת קטלוגים ותוספים למערכת באמצעות alloydbomni18-setup preparedb.
    sudo PGPORT=5432 PGPASSWORD="$PGPASSWORD" PGDATA="$PGDATA" \
        /usr/lib/postgresql/18/bin/alloydbomni18-setup preparedb
    
  6. מפעילים ומריצים את שירות alloydbomni18 systemd.
    sudo systemctl enable alloydbomni18
    sudo systemctl start alloydbomni18
    sudo systemctl status alloydbomni18
    
    מוודאים שהפלט מציג Active: active (running).

7. פעולות במסד נתונים ואימות הצפנת דיסק שקופה (TDE)

מתחברים למסד הנתונים של TDE, מוסיפים רשומות לדוגמה, מריצים CHECKPOINT כדי לכפות כתיבת נתונים לדיסק ומריצים סריקות ישירות של הדיסק (grep) כדי להוכיח הצפנה במנוחה.

  1. מתחברים למסד הנתונים של alloydbadmin באמצעות psql.
    PGPASSWORD="YourStrongPassword123!" /usr/lib/postgresql/18/bin/psql -h localhost -p 5432 -U postgres -d alloydbadmin
    
  2. יוצרים טבלת בדיקה, מוסיפים מחרוזת סודית ומפעילים נקודת ביקורת כדי לכתוב מאגרי נתונים זמניים לאחסון.
    CREATE TABLE customer_credentials (
        id SERIAL PRIMARY KEY,
        username TEXT,
        secret_passcode TEXT
    );
    
    INSERT INTO customer_credentials (username, secret_passcode)
    VALUES ('alice_user', 'UNENCRYPTED_DEMO_SECRET_98765');
    
    CHECKPOINT;
    
  3. מריצים שאילתה בתצוגת הנתונים הסטטיסטיים הפנימית של TDE ב-AlloyDB‏ pgsnap.g$tde_stats כדי לאמת את סטטוס ההצפנה הפעיל, את המיקום של KEK ואת מדדי הבלוקים.
    SELECT is_tde_enabled, tde_kek_url, tde_data_blocks_encrypted, tde_wal_blocks_encrypted
    FROM pgsnap.g$tde_stats;
    
    דוגמה לפלט שמאשר TDE פעיל (is_tde_enabled = t), נתיב קובץ KEK ומונים של בלוקים מוצפנים:
     is_tde_enabled |        tde_kek_url        | tde_data_blocks_encrypted | tde_wal_blocks_encrypted 
    ----------------+---------------------------+---------------------------+--------------------------
     t              | file:///data1/kms/tde_key |                      2023 |                     2717
    (1 row)
    
  4. יציאה מ-psql.
    \q
    
  5. מחפשים קבצים של אחסון מסדי נתונים גולמיים בקטע /data1/18/base/ כדי למצוא את מחרוזת קוד הגישה ולאמת את ההגנה על הדיסק באמצעות TDE.
    sudo grep -a -rn "UNENCRYPTED_DEMO_SECRET_98765" /data1/18/base/
    

מה חשוב לדעת על אימות מפתחות:

  • במופע של מסד נתונים שלא מוגדר בו TDE, הפעלת הפקודה grep מול קבצים של קשרי גומלין בין טבלאות מציגה את מחרוזת הטקסט הפשוט בדיסק.
  • במופע של מסד נתונים עם TDE, הפונקציה grep מחזירה אפס התאמות כי כל קובצי הנתונים, האינדקסים, יומני הרישום של פעולות הכתיבה (WAL) והנתונים הזמניים מוצפנים באופן מלא באמצעות צפנים של בלוקים מסוג AES במצב מנוחה.

8. הסרת המשאבים

אחרי שמסיימים את התרגילים, מוחקים את המשאבים כדי למנוע חיובים לא רצויים על מחשוב.

  1. מתנתקים מהסשן של SSH במכונה הווירטואלית.
    exit
    
  2. הסרה של מכונה וירטואלית ב-GCE ושל דיסקים של אחסון מתמיד (persistent disks) שמצורפים אליה.
    gcloud compute instances delete $INSTANCE_NAME --zone=$ZONE --project=$PROJECT --quiet
    gcloud compute disks delete $INSTANCE_NAME-data $INSTANCE_NAME-obs $INSTANCE_NAME-swap --zone=$ZONE --project=$PROJECT --quiet
    
  3. מוחקים את הכללים של חומת האש ואת משאבי שער Cloud NAT.
    gcloud compute firewall-rules delete allow-ssh-alloydb-omni-tde --project=$PROJECT --quiet
    gcloud compute routers nats delete alloydb-omni-tde-nat --router=alloydb-omni-tde-router --region=$REGION --project=$PROJECT --quiet
    gcloud compute routers delete alloydb-omni-tde-router --region=$REGION --project=$PROJECT --quiet
    

9. מזל טוב

מעולה! סיימתם בהצלחה את ה-codelab בנושא TDE ב-AlloyDB Omni RPM.

מה נכלל

  • איך מקצים דיסקים לאחסון (/data1, /obs), מגדירים החלפה ומפרמטים מערכות קבצים מסוג XFS.
  • איך ליצור ולנהל מפתחות להצפנת מפתחות הצפנה באמצעות File KMS.
  • איך מאתחלים ומפעילים אשכול AlloyDB Omni עם TDE באמצעות כלי RPM.
  • איך מאמתים הצפנה של נתונים במנוחה באמצעות בדיקה ישירה של דיסק גולמי (grep).

מידע נוסף זמין במאמרי העזרה בנושא AlloyDB Omni.

10. סקר

איך תשתמשו במדריך הזה?

רק קוראים את הטקסט קוראים את הטקסט ומבצעים את התרגילים