העברת משאבי Terraform מ-organizationSecurityPolicies ל-firewallPolicies

‫Google ממליצה להשתמש בשיטות firewallPolicies להגדרת כללי מדיניות של Cloud Next Generation Firewall. במאמר הזה מוסבר איך להעביר את ההגדרות של Terraform לשימוש בשיטות firewallPolicies במקום בשיטות organizationSecurityPolicies.

השיטות של firewallPolicies מספקות אפשרויות לניהול הארגון עם אמצעי בקרה פרטניים. אנחנו ממליצים להשתמש בשיטות firewallPoliciesלניהול משאבים באמצעות Terraform. ההנחה במאמר הזה היא שאתם מכירים את השיטות המומלצות לעבודה עם Terraform ואת הפעולות הבסיסיות ב-Terraform.

בעזרת מדיניות חומת האש אפשר לקבץ כמה כללים של חומת האש שיכולים לאסור או להתיר חיבורים באופן מפורש. מידע נוסף על מדיניות וכללים של חומת אש

היתרונות של מעבר לשיטות firewallPolicies

השיטות firewallPolicies מספקות חוויה עקבית של חומת האש בהיררכיית המשאביםGoogle Cloud ומציעות יתרונות תפעוליים רבים.

  • אבטחה משופרת של הארגון: השיטות של firewallPolicies מחילות אבטחה על הארגון באמצעות אמצעי בקרה מתקדמים של הרשאות גישה (IAM).

  • קלות התפעול: השיטות של firewallPolicies תומכות בשימוש בתכונות מתקדמות – כמו אובייקטים של שם דומיין שמוגדר במלואו (FQDN), אובייקטים של מיקום גיאוגרפי, זיהוי איומים, מניעת פריצות וקבוצות של כתובות – כדי להקל על התפעול ולשפר את היעילות.

איך ההעברה פועלת

לפני שמתחילים בתהליך ההעברה, צריך לבצע את השלבים הבאים, שמתוארים בקטע לפני שמתחילים:

  • מוודאים שאתם משתמשים בגרסה 6.16.0 ואילך של ספק Terraform עבור Google Cloud.
  • מוודאים שמצב Terraform תואם להגדרה הנוכחית.
  • זיהוי המשאבים שנכללים בהיקף ההעברה, כולל כללי מדיניות, כללים ושיוכים.
  • מכינים פקודות לייבוא המשאבים החדשים firewallPolicies למצב של Terraform באופן ידני או באמצעות סקריפט אוטומטי.
  • בודקים את הגיבוי המומלץ ואת נהלי השחזור לגרסה של Terraform שבה אתם משתמשים, ויוצרים גיבוי של מצב Terraform הנוכחי.

תהליך ההגדרה מחדש של Terraform להעברת המשאבים organizationSecurityPolicies כולל את השלבים הבאים:

  1. הסרת משאבים קיימים ממצב Terraform. מסירים משאבי organizationSecurityPolicies קיימים ממצב Terraform.

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

  3. ייבוא משאבים חדשים למצב של Terraform. מייבאים את משאבי firewallPolicies החדשים למצב של Terraform.

לפני שמתחילים

בקטע הזה מוסבר על הדרישות המוקדמות לתהליך ההעברה.

מוודאים שספק Terraform נתמך

מומלץ להשתמש בגרסה 6.16.0 ואילך של ספק Terraform עבורGoogle Cloud לצורך ההעברה. יכול להיות שגרסאות קודמות לא יצליחו לייבא בהגדרות מסוימות, כמו הגדרות עם לוכסנים בשמות של שיוכים.

אחרי ההעברה, צריך להשתמש בגרסה 4.0.0 ואילך, שכוללת את המשאבים הבאים ממאגר Terraform:

מוודאים שמצב Terraform עדכני

מריצים את הפקודה הבאה ב-Terraform כדי לוודא שהמצב של Terraform תואם להגדרות הנוכחיות.

terraform plan

כדי למנוע אי-התאמות, מומלץ להחיל את כל השינויים או הפעולות שממתינים לאישור לפני שממשיכים בתהליך ההעברה.

זיהוי המשאבים להעברה

מריצים את פקודת Terraform הבאה כדי ליצור רשימה של משאבים שנכללים בהיקף ההעברה, כולל מדיניות, כללים ושיוכים.

terraform state list | grep ^google_compute_organization_security_policy

הפלט אמור להיראות כך:

google_compute_organization_security_policy.policy
google_compute_organization_security_policy_association.association["folders/45678"]
google_compute_organization_security_policy_rule.rule["allow-inbound-ssh"]
google_compute_organization_security_policy_rule.rule["deny-all-egress"]

כדי לעבור לשיטות של firewallPolicies, צריך להשתמש במשאבים האלה. שומרים אותם למועד מאוחר יותר.

הכנת פקודות ייבוא באמצעות סקריפט אוטומטי

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

מריצים את סקריפט Terraform הבא כדי לבצע את המשימות האלה:

  • יצירת כתובות חדשות למשאבים מכתובות קיימות למשאבים.
  • מקבלים מזהי משאבים מכתובות המשאבים הקיימות.
  • יוצרים מזהים לייבוא (או מזהים לייבוא) ממזהי המשאבים.
  • הצגת פקודות הייבוא של כל משאבי firewallPolicies החדשים.
terraform state list | grep ^google_compute_organization_security_policy | while read -r resource_address; do
# Generate the new resource address for google_compute_firewall_policy
new_address=$(echo "$resource_address" | sed 's/google_compute_organization_security_policy/google_compute_firewall_policy/')

# Get the full resource ID from terraform state and remove quotes
resource_id=$(echo "$resource_address.id" | terraform console | tr -d '"')

# Use awk to parse the resource_id and generate the correct import identifier
import_id=$(echo "$resource_id" | awk -F'/' '
  /association/ {
    split($0, a, "/association/");
    assoc_name = a[2];
    gsub(/\//, "%2F", assoc_name);
    print $4 "/" assoc_name;
    next
  }
  /priority/ {
    print $4 "/" $6;
    next
  }
  {
    print $4
  }
')

# Print the final import command
echo "terraform import '$new_address' '$import_id'"
done

צריך את הפלט מהסקריפט הזה כדי לייבא את המשאבים. שומרים את הפלט למועד מאוחר יותר.

הכנת פקודות ייבוא באופן ידני

אם הגישה האוטומטית לא מתאימה, אפשר ליצור את הפקודות לייבוא של משאבי firewallPolicies באופן ידני. אפשר להשתמש בפקודה terraform console כדי לקבל את המזהים (ID) של המשאבים.

הפקודה הבאה של Terraform מציגה את מזהה המשאב של המשאב google_compute_organization_security_policy.policy:

echo google_compute_organization_security_policy.policy.id | terraform console

הפלט אמור להיראות כך:

"locations/global/securityPolicies/12345"

באופן דומה, מקבלים את מזהי המשאבים של שאר המשאבים שזיהיתם בקטע זיהוי המשאבים להעברה.

לחלופין, אפשר להשתמש בפקודת Terraform הבאה כדי לקבל את מזהי המשאבים של כל המשאבים שזוהו יחד:

terraform state list | grep ^google_compute_organization_security_policy | while read -r line; do echo "$line".id | terraform console; done

הפלט אמור להיראות כך:

"locations/global/securityPolicies/12345"
"locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789"
"locations/global/securityPolicies/12345/priority/1000"
"locations/global/securityPolicies/12345/priority/65535"

כדי לייבא את המשאבים firewallPolicies, צריך את מזהי הייבוא שלהם. מזהי ייבוא מורכבים ממזהה מספרי שנקרא מספר מדיניות, משם שיוך וממספר עדיפות של כלל, כפי שמתואר בסעיף הזה.

  • המזהה המספרי אחרי התו השלישי של קו נטוי (/) הוא מספר הפוליסה, שמייצג את מזהה הייבוא של הפוליסות. בטבלה הבאה מוצגת דוגמה למזהה משאב ולמזהה ייבוא של מדיניות.

    מזהה המשאב מזהה ייבוא
    "locations/global/securityPolicies/12345" 12345
  • מספר המדיניות יחד עם שם השיוך מייצגים את מזהה הייבוא של השיוכים. שם השיוך הוא החלק של מזהה המשאב שמופיע אחרי הרכיב /association/.

    מחליפים כל תו של לוכסן (/) בשם השיוך ב-%2F כדי לאפשר לפקודה terraform import לפרש את שם השיוך כישות אחת. בטבלה הבאה מוצגות דוגמאות למזהה משאב ולמזהה ייבוא של שיוכים.

    מזהה המשאב מזהה ייבוא
    "locations/global/securityPolicies/12345/association/assoc-name" 12345/assoc-name
    "locations/global/securityPolicies/12345/association/locations/global/securityPolicies/23456-folders/56789" 12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789
  • מספר הפוליסה יחד עם מספר העדיפות של הכלל מייצגים את מזהה הייבוא של הכללים. בטבלה הבאה מוצגת דוגמה למזהה משאב ולמזהה ייבוא של כלל.

    מזהה המשאב מזהה ייבוא
    "locations/global/securityPolicies/12345/priority/1000" 12345/1000

כדי לייבא את המשאבים firewallPolicies, צריך את השמות המעודכנים של מופעי המשאבים. כדי ליצור את שמות המכונות של המשאבים, מחליפים את הקידומת google_compute_organization_security_policy ב-google_compute_firewall_policy עבור כל המשאבים שזיהיתם בקטע זיהוי משאבים להעברה. בדוגמה הבאה אפשר לראות את השמות המעודכנים של מופעי המשאבים:

google_compute_firewall_policy.policy
google_compute_firewall_policy_association.association["folders/45678"]
google_compute_firewall_policy_rule.rule["allow-inbound-ssh"]
google_compute_firewall_policy_rule.rule["deny-all-egress"]

משלבים את שמות המופעים של המשאבים עם מזהי הייבוא המשויכים כדי לקבל את הפקודות terraform import. בדוגמה הבאה אפשר לראות את הפקודות terraform import:

terraform import 'google_compute_firewall_policy.policy' '12345'
terraform import 'google_compute_firewall_policy_association.association["folders/23456"]' '12345/locations%2Fglobal%2FsecurityPolicies%2F23456-folders%2F56789'
terraform import 'google_compute_firewall_policy_rule.rule["allow-inbound-ssh"]' '12345/1000'
terraform import 'google_compute_firewall_policy_rule.rule["deny-all-egress"]' '12345/65535'

כדאי לשמור את פקודות הייבוא האלה לעיון בהמשך.

גיבוי של מצב Terraform

לפני שממשיכים בתהליך ההעברה, מומלץ ליצור גיבוי של מצב Terraform. כדי ליצור גיבוי בקובץ terraform.tfstate.backup, משתמשים בפקודת Terraform הבאה.

terraform state pull > terraform.tfstate.backup

אם שיניתם את קובץ המצב של Terraform בדרכים לא מכוונות, אתם יכולים להשתמש בקובץ הגיבוי terraform.tfstate.backup כדי לשחזר את קובץ המצב המקורי של Terraform באמצעות הפקודה הבאה:

terraform state push terraform.tfstate.backup

העברת organizationSecurityPolicies משאבים

בקטע הזה מוסבר איך להעביר את ההגדרות של Terraform משיטות organizationSecurityPolicies לשיטות firewallPolicies.

הסרת משאבים קיימים ממצב Terraform

כדי להסיר את המשאבים organizationSecurityPolicies שנמצאים בקטע זיהוי משאבים להעברה ממצב Terraform, מריצים את פקודת Terraform הבאה.

terraform state list | grep ^google_compute_organization_security_policy | while read -r resource; do
  terraform state rm "$resource"
done

עדכון ההגדרה של Terraform

כדי לעדכן את קובץ התצורה של Terraform, מחפשים את ההגדרות של המשאבים שצוינו בקטע זיהוי משאבים להעברה. משתמשים בפקודה הבאה כדי למצוא את ההגדרות.

grep -r google_compute_organization_security_policy .

לדוגמה, קובץ התצורה של Terraform מגדיר את המדיניות google_compute_organization_security_policy.policy באופן הבא:

resource "google_compute_organization_security_policy" "policy" {
  …
  }

אפשר להשתמש בטבלה הבאה כדי לערוך את ההגדרה של משאב מדיניות אבטחה של הארגון וליצור משאב חדש של מדיניות חומת אש היררכית.

משאב Terraform קיים משאב חדש של Terraform
שם משאב google_compute_organization_security_policy google_compute_firewall_policy
שם השדה במדיניות display_name short_name

אפשר להשתמש בטבלה הבאה כדי לערוך את ההגדרה של משאב שיוך של מדיניות אבטחה בארגון, כדי ליצור משאב שיוך חדש של מדיניות חומת אש היררכית.

משאב Terraform קיים משאב חדש של Terraform
שם משאב google_compute_organization_security_policy_association google_compute_firewall_policy_association
שם השדה באסוציאציה policy_id firewall_policy
שם השדה באסוציאציה attachment_id attachment_target

אפשר להשתמש בטבלה הבאה כדי לערוך את ההגדרה של משאב כלל במדיניות אבטחה של ארגון, וכך ליצור משאב חדש של כלל במדיניות חומת אש היררכית.

משאב Terraform קיים משאב חדש של Terraform
שם משאב google_compute_organization_security_policy_rule google_compute_firewall_policy_rule
שם השדה בכלל policy_id (מזהה מדיניות האבטחה) firewall_policy
שם השדה שהוסר מהכלל versioned_expr ‪— (field does not exist)
הגדרה של אובייקט match: הסרת config והחלפת layer4_config ב-layer4_configs
match {
  config {
    src_ip_ranges = SRC_IP_RANGES
    dest_ip_ranges = DEST_IP_RANGES
    layer4_config {
      ip_protocol = IP_PROTOCOL
      ports = [PORT1, PORT2]
    }
    layer4_config {
      ip_protocol = IP_PROTOCOL
    }
  }
}
  
match {
  src_ip_ranges = SRC_IP_RANGES
  dest_ip_ranges = DEST_IP_RANGES
  layer4_configs {
    ip_protocol = IP_PROTOCOL
    ports = [PORT1, PORT2]
  }
  layer4_configs {
    ip_protocol = IP_PROTOCOL
  }
}
  
שם השדה בכלל layer4_config layer4_configs

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

terraform validate

ייבוא משאבים למצב של Terraform

כדי לייבא משאבי firewallPolicies לקובץ ההגדרות של Terraform, מריצים את פקודות הייבוא של Terraform שנוצרו בקטע הכנת פקודות ייבוא באמצעות סקריפט אוטומטי או בקטע הכנת פקודות ייבוא באופן ידני.

אחרי שמייבאים את משאבי firewallPolicies, ‏ Terraform ניגש אליהם באמצעות השיטות firewallPolicies.

אימות ההגדרות של Terraform ותיקון אי התאמות

מריצים את פקודת Terraform הבאה כדי לבדוק אם יש פעולות כלשהן.

terraform plan

מכיוון שההעברה לא משנה משאבים בסיסיים Google Cloud , התוכנית ש-Terraform יוצרת לא צריכה להכיל פעולות.

לדוגמה, בפלט הבא שמתקבל מהרצת הפקודה terraform plan, פעולות Terraform מציינות שצריך לעדכן את name במשאב google_compute_firewall_policy_association.

Terraform will perform the following actions:

 # google_compute_firewall_policy_association.association["folders/23456"] must be replaced
-/+ resource "google_compute_firewall_policy_association" "association" {
    ~ firewall_policy   = "12345" -> "locations/global/firewallPolicies/12345"
    ~ id                = "locations/global/firewallPolicies/12345/associations/locations%2Fglobal%2FsecurityPolicies%2F12345-folders%2F23456" -> (known after apply)
    ~ name              = "locations/global/securityPolicies/12345-folders/23456" -> "locations/global/firewallPolicies/12345-folders/23456" # forces replacement
    + short_name        = (known after apply)
      # (1 unchanged attribute hidden)
  }

במקרה כזה, צריך לאמת ולעדכן את קובץ ההגדרות של Terraform כך שהמאפיין name יהיה זהה לשם שכבר מותקן.

אפשר להגדיר את Terraform כך שישנה את הערך הצפוי name במשאב google_compute_firewall_policy_association לערך המקורי locations/global/securityPolicies/12345-folders/23456 על ידי החלפת השדה name בהגדרה באופן הבא:

name = "${replace(local.policy_id, "firewallPolicies", "securityPolicies")}-${each.value}"

בשינוי הקודם נעשה שימוש בפונקציית ההחלפה כדי לעדכן את הערך של local.policy_id ל-securityPolicies במקום ל-firewallPolicies. מכיוון ש-Terraform מצפה עכשיו ל-locations/global/securityPolicies/12345-folders/23456 במאפיין name, הפעלת terraform plan לא מציגה יותר פעולת Terraform שקשורה למאפיין name.

אם הפקודה terraform plan לא מציינת שינויים או פעולות של Terraform, המיגרציה הושלמה.

המאמרים הבאים