הגדרת מדיניות לאתגרים

במאמר הזה מוסבר איך להגדיר כללי מדיניות לאתגרים באמצעות שילוב קיים של Google Cloud Fraud Defense.

מדיניות אתגרים מאפשרת להפעיל אתגרי CAPTCHA באופן סלקטיבי על סמך כללים מותאמים אישית. הכללים האלה קובעים מתי להציג אתגר של Fraud Defense על סמך ציוני סיכון, כתובות IP, סוכני משתמש, מספרי מערכות אוטונומיות או זהויות מאומתות של בוטים (סוכני AI).

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

  • הגדרה של AutoExecute: מפשטת את השילוב של JavaScript באפליקציות לקוח.
  • אתגרים: מפעיל אימות משתמש כשנדרש על ידי כללי האתגר. Fraud Defense תומכת בסוגי האתגרים הבאים:
    • אתגרים ויזואליים: מבקשים מהמשתמשים לבחור תמונות על סמך הנחיה. כברירת מחדל, אתגר ויזואלי נבחר כשמגדירים כלל עם האפשרות 'אתגר' מסומנת.
    • אתגרים של אודיו: מבקשים מהמשתמשים לזהות רמזים קוליים מדוברים כחלופה לנגישות.
    • אתגרים עם קוד QR: מבקשים מהמשתמשים לסרוק קוד QR באמצעות המכשיר הנייד כדי לפתור אתגר. כדי להשתמש בתכונה הזו, המפתח האוניברסלי שלכם צריך להיות ברשימת ההיתרים. כדי להוסיף את המפתח האוניברסלי שלכם לרשימת ההיתרים, צריך לפנות לצוות למניעת הונאות בכתובת fraud-defense@google.com ולספק את המפתח האוניברסלי.

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

  1. הכנת הסביבה ל-Google Cloud Fraud Defense
  2. מוודאים שהחיוב מופעל בפרויקט Google Cloud . כדי להפעיל את החיוב, אפשר להשתמש בכרטיס אשראי או במזהה חיוב של פרויקט קיים Google Cloud . אם אתם צריכים עזרה בנושא חיוב, אתם יכולים לפנות אל התמיכה בנושא חיוב ב-Cloud.
  3. יוצרים מפתח אוניברסלי או מזהים מפתח אוניברסלי לפרויקט. כדי ליצור מפתח, אפשר לעיין במאמר בנושא יצירת מפתח אוניברסלי. אפשרות נוספת היא להעתיק את המזהה של מפתח אוניברסלי קיים. כדי לעשות זאת, מבצעים את אחד מהשלבים הבאים:

    • כדי להעתיק את המזהה של מפתח קיים ממסוף Google Cloud :

      1. נכנסים לדף Google Cloud Fraud Defense במסוף Google Cloud .

        מעבר אל 'הגנה מפני הונאה'

      2. ברשימה reCAPTCHA keys, מוצאים את המפתח שרוצים להעתיק ולוחצים על Copy to clipboard.

    • כדי להעתיק את המזהה של מפתח קיים באמצעות ה-API בארכיטקטורת REST, קוראים ל-method ‏projects.keys.list.

    • כדי להעתיק את המזהה של מפתח קיים באמצעות ה-CLI של gcloud, מריצים את הפקודה gcloud recaptcha keys list.

  4. כדי לתכנן את השילוב של Fraud Defense, צריך לזהות את פעולות המשתמש שרוצים להגן עליהן (למשל login, signup או password_reset) ואת הדפים באתר שבהם הפעולות האלה מופעלות. אם אתם משתמשים בהגדרת AutoExecute, ודאו שהפעולות האלה עקביות עם שמות הפעולות שצוינו ב-protected_endpoint_group.

  5. משלבים את Fraud Defense בדף האינטרנט. מומלץ להשתמש בהגדרה AutoExecute של Fraud Defense. הוראות כלליות להגדרה מפורטות במאמר התקנת מפתחות אוניברסליים באתרים.

סקירה כללית של הגדרת מדיניות להגנה מפני הונאות

ההגדרה של מדיניות Fraud Defense מאפשרת לכם להתאים אישית את ההתנהגות של ההגנה מפני תרמיות. אפשר להגדיר כללי מדיניות לאתגרים באמצעות הקטע challenge_rule_groups.

אפשר לראות ולעדכן את הגדרות המדיניות באמצעות מסוף Google Cloud , ה-CLI של gcloud או reCAPTCHA Enterprise API בארכיטקטורת REST.

המסוף

כדי לראות או לעדכן את הגדרות המדיניות במסוף Google Cloud :

  1. נכנסים לדף Fraud Defense במסוף Google Cloud .

    מעבר אל 'הגנה מפני הונאה'

  2. מוודאים שהפרויקט שלכם נבחר בכלי לבחירת משאבים.

  3. בטבלה reCAPTCHA keys, לוחצים על השם של המפתח שרוצים להגדיר עבורו מדיניות אתגרים.

  4. בדף פרטים חשובים, עוברים לכרטיסייה מדיניות.

  5. בקטע Rule groups (קבוצות כללים), אפשר להציג, להוסיף או לערוך את כללי האתגר ואת ביטויי התנאים.

  6. לוחצים על Save.

gcloud

כדי לעדכן את הגדרת המדיניות של מפתח, מריצים את הפקודה gcloud alpha recaptcha policies update:

gcloud alpha recaptcha policies update --key=KEY_ID --policy=POLICY.yaml

כדי לראות את הגדרת המדיניות הנוכחית של מפתח, מריצים את הפקודה gcloud alpha recaptcha policies describe:

gcloud alpha recaptcha policies describe --key=KEY_ID

‫API בארכיטקטורת REST

כדי לעדכן את הגדרות המדיניות של מפתח, קוראים לשיטה projects.keys.updatePolicy:

PATCH https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys/KEY_ID/policy

{
  "clientSettings": {
    "allowedDomains": [
      "example.com"
    ]
  },
  "challengeRuleGroups": [
    {
      "actions": ["login"],
      "challengeRules": [
        {
          "condition": "score < 0.7",
          "challenge": {}
        }
      ]
    }
  ]
}

כדי להציג את הגדרות המדיניות הנוכחיות של מפתח, מריצים את השיטה projects.keys.getPolicy:

GET https://recaptchaenterprise.googleapis.com/v1/projects/PROJECT_ID/keys/KEY_ID/policy

הגדרת המדיניות היא בפורמט YAML ל-Google Cloud CLI ובפורמט JSON ל-API בארכיטקטורת REST. לסכימה המלאה של הקטע challenge_rule_groups, אפשר לעיין במאמר הגדרת מדיניות של אתגרים.

דוגמאות לתרחישים שונים מופיעות במאמר דוגמאות להגדרות של כללי אתגר.

הגדרת מדיניות לאתגרים

מגדירים מדיניות בנושא אתגרים בקטע challenge_rule_groups בהגדרות המדיניות בנושא Fraud Defense. אם כבר יש לכם מדיניות עם client_settings, כולל פרטי הדומיינים, אתם יכולים לעדכן את המדיניות כך שתכלול את כללי מדיניות האתגרים שלכם.

המבנה של הקטע challenge_rule_groups הוא כזה:

challenge_rule_groups:
  - actions: [string, ...]
    challenge_rules:
      - condition: string
        challenge:
          # difficulty is optional: USABILITY | BALANCE (default) | SECURITY
          difficulty: BALANCE
        # OR no_challenge: {}
      - condition: string
        challenge:
          difficulty: BALANCE
        # OR no_challenge: {}

השדה condition הוא אופציונלי בכל כלל אתגר. אם condition לא מוגדר או ריק, הכלל חל ללא תנאי. בנוסף, השדות challenge ו-no_challenge הם בלעדיים, וצריך להזין בדיוק אחד מהם בכל כלל.

סדר ההערכה של הכללים

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

רמות הקושי של האתגרים

אתם יכולים לציין את רמת הקושי כשמפעילים אתגר. רשימה מלאה של ערכי הקושי התקפים מופיעה במאמר ChallengeSecurityPreference בנושא הפניית API.

תחביר של תנאים

השדה condition הוא מחרוזת אופציונלית שמעוצבת כביטוי Common Expression Language (CEL). אם לא מציינים ערך ל-condition או אם הוא ריק, הכלל חל ללא תנאי. ‫CEL מספקת אופרטורים סטנדרטיים דמויי C, כולל אופרטורים יחסיים (<,‏ <=,‏ >,‏ >=,‏ ==,‏ !=), אריתמטיים (+,‏ -,‏ /,‏ *,‏ %), לוגיים (!,‏ &&,‏ ||) ואופרטורים של מאגרי נתונים ([],‏ in). ‫CEL תומכת בסוגי נתונים פרימיטיביים נפוצים (bool,‏ int,‏ uint,‏ double,‏ string), בסוגי מאגרי נתונים בסיסיים (lists,‏ messages) ובקבועים (כמו true,‏ 1,‏ 0.5,‏ "hello" ו-[1, 2, 3]).

בזמן הריצה, אפשר לגשת למשתנים הבאים של Fraud Defense:

משתנה סוג תיאור
score double הציון של בוט Fraud Defense.
user_ip_address string כתובת ה-IP (מסוג IPv4 או IPv6) של המשתמש ששולח את הבקשה.
user_agent string סוכן המשתמש של המשתמש שמגיש את הבקשה.
user_asn int מספר המערכת האוטונומית (ASN) של המשתמש ששולח את הבקשה. לא לכלול את הקידומת AS (לדוגמה, להשתמש ב-12345 במקום ב-AS12345).
verified_bots list(Bot) רשימה של סורקים או סוכנים אוטומטיים מאומתים (כמו כלי יצירת אינדקס של מנועי חיפוש, עוזרים מבוססי-AI לחיפוש וכלים לשליפת תוכן של שותפים) שזוהו על ידי Fraud Defense.

מוגדרים הסוגים הנוספים הלא פרימיטיביים הבאים. רשימה מלאה של הערכים זמינה במאמר Bot.

message Bot {
  name [string] - the name of the bot
  bot_type [BotType] - the type of automated agent
}

מידע נוסף על ערכי name אפשריים זמין במאמר בנושא Bot הפניית API. מידע נוסף על ערכי enum תקפים של bot_type זמין במאמר BotType הפניית API.

בכללי מדיניות של אתגרים ל-Fraud Defense, אפשר להשתמש בכל אחת מהמשתנים האלה כדי ליצור ביטוי בוליאני. לדוגמה, score > 0.5,‏ user_ip_address == "192.0.2.1" ו-user_asn == 12345 הם ביטויי תנאי תקינים שמוערכים כערך בוליאני. הערה: מכיוון ש-user_asn הוא מספר שלם, צריך להשמיט את הקידומת AS כשבודקים מספרי מערכות אוטונומיות.

אפשר להשתמש בפונקציות הבאות בתנאים של מדיניות אתגרים של Fraud Defense:

שם חתימה תיאור
contains string.contains(string) -> bool הפונקציה בודקת אם אופרנד המחרוזת מכיל את המחרוזת המשנית.
startsWith string.startsWith(string) -> bool הפונקציה בודקת אם האופרנד מסוג מחרוזת מתחיל בקידומת שצוינה.
endsWith string.endsWith(string) -> bool הפונקציה בודקת אם אופרנד המחרוזת מסתיים בסיומת שצוינה.
size size(string) -> int
size(list) -> int
string.size() -> int
list.size() -> int
הפונקציה מחזירה את הגודל של מחרוזת (מספר נקודות הקוד) או של רשימה (מספר הרכיבים).

פונקציות הבנה הן סוג של פקודת מאקרו שמוטמעת ב-CEL. אלה ההבנות שזמינות:

שם חתימה תיאור דוגמה
has has(message.field) -> bool בודקת אם שדה זמין. has(verified_bots[0].name)
all list(A).all(A, predicate(A) -> bool) -> bool בודקת אם כל האלמנטים x ברשימה e תואמים לפרדיקט p. [1, 2, 3].all(x, x > 0)
exists list(A).exists(A, predicate(A) -> bool) -> bool בודקת אם יש רכיב x ברשימה e שתואם לפרדיקט p. [1, 2, 3].exists(i, i % 2 != 0)
exists_one list(A).exists_one(A, predicate(A)) -> bool הפונקציה בודקת אם יש בדיוק רכיב x אחד ברשימה e שתואם לתנאי p. [1, 2, 2].exists_one(i, i < 2)

דוגמאות להגדרות של כללי אתגר

בקטע הזה מופיעות דוגמאות להגדרות תקינות של כללי אתגר.

הצגת אתגר לכל הבקשות עם ציון נמוך

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge: {}

בחירת אתגר עם חיכוך גבוה לכל הבקשות עם ציון נמוך

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge:
          difficulty: 'SECURITY'

ערעור על פעולות ספציפיות שקיבלו ציון נמוך

challenge_rule_groups:
  - actions: ['login', 'signup']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge: {}

הגדרת ערכי סף שונים של כללים לפעולות שונות

challenge_rule_groups:
  - actions: ['login']
    challenge_rules:
      - condition: 'score < 0.5'
        challenge: {}
  - actions: ['signup']
    challenge_rules:
      - condition: 'score < 0.7'
        challenge: {}

לא להציג את האתגר לכתובות IP ברשימת ההיתרים

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'user_ip_address in ["123.255.255.001", "123.255.255.002"]'
        no_challenge: {}

הערה: הכלל הזה שונה מהתכונה רשימות ההיתרים של כתובות IP של Fraud Defense.

לא להציג את האתגר לתת-רשת של כתובות IP

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'user_ip_address.startsWith("123.255.255")'
        no_challenge: {}

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

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      # Note that ASNs must be specified as integers without the AS prefix (e.g., 12345 instead of AS12345)
      - condition: 'user_asn in [12345, 67890]'
        no_challenge: {}

לא להציג את האתגר לסוכן של Google

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: 'verified_bots.exists(e, e.name == "google-agent")'
        no_challenge: {}

הצגת אתגר על סמך תנאים מורכבים

challenge_rule_groups:
  - actions: ['*']
    challenge_rules:
      - condition: '(user_agent.contains("Chrome/143") && score < 0.5) || (user_agent.contains("Chrome/149") && score < 0.7)'
        challenge: {}

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