שילוב של OpenSearch עם Google SecOps

במאמר הזה מוסבר איך לשלב את OpenSearch עם Google Security Operations.

תרחישים לדוגמה

השילוב של OpenSearch נותן מענה לתרחישים הבאים של תזמור אבטחה וחקירה:

  • איתור אוטומטי של איומים: חיפוש תקופתי בכל האינדקסים של OpenSearch לאיתור סימנים מחשידים (IoC) ספציפיים או דפוסים חשודים באמצעות שאילתות Lucene ו-DSL.

  • הטמעת התראות מרוכזת: הטמעת מסמכים מ-OpenSearch כהתראות שניתן לפעול לפיהן ב-Google SecOps, כדי לוודא שאירועי אבטחה ממאגר הנתונים שלכם מקבלים עדיפות ונחקרים.

  • אחזור נתונים לפי הקשר: העשרת אירועי אבטחה קיימים על ידי שליפה אוטומטית של יומנים קשורים או נתונים היסטוריים מ-OpenSearch, כדי לספק למנתחים הקשר מעמיק יותר במהלך חקירה.

  • מיפוי נתונים גמיש: מיפוי דינמי של רמות החומרה ותגי הסביבה ממסמכי OpenSearch לתקנים של Google SecOps כדי לשמור על עקביות בין מקורות שונים של יומנים.

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

לפני שמגדירים את השילוב בפלטפורמת Google SecOps, צריך לוודא שיש לכם את הפרטים הבאים:

  • קובץ אישור CA: קובץ תקין של רשות אישורים לאבטחת החיבור.

  • הגרסה העדכנית של השילוב: ודאו שאתם משתמשים בגרסה העדכנית ביותר של השילוב עם OpenSearch.

  • אישור בקידוד Base64: לפני ההגדרה, צריך להמיר את התוכן של קובץ אישור ה-CA למחרוזת Base64.

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

  1. פותחים את דף הפרמטרים של הגדרות השילוב.
  2. מדביקים את המחרוזת בקידוד Base64 בשדה קובץ אישור CA.
  3. מסמנים את התיבה אימות SSL.
  4. לוחצים על בדיקה כדי לוודא שהשילוב הוגדר בהצלחה.

פרמטרים של שילוב

השילוב של OpenSearch דורש את הפרמטרים הבאים:

פרמטר תיאור
Server Address

חובה.

כתובת ה-URL של נקודת הקצה של המכונה של OpenSearch, כולל הפרוטוקול והיציאה (לדוגמה, https://10.0.0.1:9200).

Username

זה שינוי אופציונלי.

שם המשתמש שמשמש לאימות במכונה של OpenSearch.

Password

זה שינוי אופציונלי.

הסיסמה שמשויכת לשם המשתמש שצוין.

API Token

זה שינוי אופציונלי.

אסימון ה-API שמשמש לאימות כחלופה לשם משתמש וסיסמה.

Authenticate

זה שינוי אופציונלי.

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

Verify SSL

זה שינוי אופציונלי.

אם האפשרות הזו נבחרת, השילוב מאמת את אישור ה-SSL כשמתחברים לשרת OpenSearch.

CA Certificate File

זה שינוי אופציונלי.

התוכן של קובץ האישור של רשות האישורים (CA) בפורמט PEM, שמשמש לאימות אישור ה-SSL של השרת.

איך מגדירים שילובים ב-Google SecOps

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

פעולות

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

משתמשים בפעולה Advanced ES Search כדי להריץ שאילתת חיפוש שהוגדרה מראש בשרת OpenSearch ולאחזר את התוצאות בפורמט של מילון.

הפעולה הזו לא פועלת על ישויות של Google SecOps.

קלט של הפעולה

הפעולה חיפוש מתקדם ב-ES דורשת את הפרמטרים הבאים:

פרמטר תיאור
Index

זה שינוי אופציונלי.

תבנית החיפוש של אינדקס OpenSearch (לדוגמה, smp_playbooks-2019.06.13). אפשר להשתמש בתווים כלליים לחיפוש כדי לחפש בכמה אינדקסים (לדוגמה, smp_playbooks-*).

ערך ברירת המחדל הוא *.

Query

זה שינוי אופציונלי.

שאילתת החיפוש שרוצים לבצע באמצעות תחביר Lucene (לדוגמה, level:error OR level:warning).

ערך ברירת המחדל הוא *.

Limit

זה שינוי אופציונלי.

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

ערך ברירת המחדל הוא 100.

Display Field

זה שינוי אופציונלי.

רשימה מופרדת בפסיקים של שדות ספציפיים שרוצים להחזיר.

ערך ברירת המחדל הוא * והוא מחזיר את כל השדות.

Search Field

זה שינוי אופציונלי.

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

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

Timestamp Field

זה שינוי אופציונלי.

שם השדה שמשמש לסינון לפי זמן.

אם גם Earliest Date וגם Oldest Date ריקים, הפעולה לא מבצעת סינון לפי זמן.

ערך ברירת המחדל הוא @timestamp.

Oldest Date

זה שינוי אופציונלי.

תאריך ההתחלה של החיפוש. הפעולה מחזירה רשומות שהתרחשו בחותמת הזמן הזו או אחריה.

אפשר לציין חותמת זמן מדויקת לפי שעון UTC (YYYY-MM-DDTHH:MM:SSZ) או חישובי תאריכים יחסיים (לדוגמה, now-1d).

ערך ברירת המחדל הוא now-1d.

Earliest Date

זה שינוי אופציונלי.

תאריך הסיום של החיפוש. הפעולה מחזירה רשומות שהתרחשו בחותמת הזמן הזו או לפניה.

אפשר לציין חותמת זמן מדויקת לפי שעון UTC (YYYY-MM-DDTHH:MM:SSZ) או חישובי תאריכים יחסיים (לדוגמה, now).

ערך ברירת המחדל הוא now.

ערכי פלט של פעולות

הפעולה חיפוש מתקדם ב-ES מספקת את הפלטים הבאים:

סוג הפלט של הפעולה זמינות
חיבור לקיר של המארז לא זמין
קישור ללוח הפניות לא זמין
שולחן קונסולה צמוד לקיר לא זמין
טבלת העשרה לא זמין
תוצאת JSON לא זמין
הודעות פלט יש גישה
תוצאת הסקריפט יש גישה
תוצאת הסקריפט

בטבלה הבאה מפורטים הערכים של פלט תוצאות הסקריפט כשמשתמשים בפעולה Advanced ES Search:

שם תוצאת הסקריפט ערך
results RESULTS

משתמשים בפעולה DSL Search כדי לבצע חיפוש מקיף בכל האינדקסים של OpenSearch ולקבל תוצאות בפורמט של מילון.

הפעולה הזו לא פועלת על ישויות של Google SecOps.

קלט של הפעולה

הפעולה DSL Search דורשת את הפרמטרים הבאים:

פרמטר תיאור
Index

זה שינוי אופציונלי.

תבנית החיפוש של אינדקס OpenSearch (לדוגמה, smp_playbooks-2019.06.13). אפשר להשתמש בתווים כלליים לחיפוש כדי לחפש בכמה אינדקסים (לדוגמה, smp_playbooks-*).

ערך ברירת המחדל הוא *.

Query

זה שינוי אופציונלי.

שאילתת החיפוש שרוצים לבצע באמצעות תחביר Lucene (לדוגמה, level:error OR level:warning).

ערך ברירת המחדל הוא *.

Limit

זה שינוי אופציונלי.

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

ערך ברירת המחדל הוא 100.

ערכי פלט של פעולות

הפעולה DSL Search מספקת את הפלטים הבאים:

סוג הפלט של הפעולה זמינות
חיבור לקיר של המארז לא זמין
קישור ללוח הפניות לא זמין
שולחן קונסולה צמוד לקיר לא זמין
טבלת העשרה לא זמין
תוצאת JSON יש גישה
הודעות פלט יש גישה
תוצאת הסקריפט יש גישה
תוצאת JSON

הדוגמה הבאה מראה את פלט התוצאה בפורמט JSON שמתקבל כשמשתמשים בפעולה DSL Search:

[
    {
        "_score": 0.2876821,
        "_type": "person",
        "_id": "2",
        "_source": {
            "lastname": "Smith",
            "name": "John",
            "job_description": "Systems administrator"
        },
        "_index": "accounts"
    }, {
        "_score": 0.28582606,
        "_type": "person",
        "_id": "1",
        "_source":
        {
            "lastname": "Doe",
            "name": "John",
            "job_description": "Systems administrator and Linux specialist"
        },
        "_index": "accounts"
    }
]
תוצאת הסקריפט

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

שם תוצאת הסקריפט ערך
results RESULTS

פינג

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

הפעולה הזו לא פועלת על ישויות של Google SecOps.

קלט של הפעולה

אין.

ערכי פלט של פעולות

הפעולה פינג מספקת את הפלטים הבאים:

סוג הפלט של הפעולה זמינות
חיבור לקיר של המארז לא זמין
קישור ללוח הפניות לא זמין
שולחן קונסולה צמוד לקיר לא זמין
טבלת העשרה לא זמין
תוצאת JSON לא זמין
הודעות פלט יש גישה
תוצאת הסקריפט יש גישה
תוצאת הסקריפט

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

שם תוצאת הסקריפט ערך
is_success true או false

הפעולה Simple ES Search משמשת לביצוע חיפוש בסיסי בכל השדות שנוספו לאינדקס ב-OpenSearch, ולאחזור התוצאות בפורמט של מילון.

הפעולה הזו לא פועלת על ישויות של Google SecOps.

קלט של הפעולה

הפעולה Simple ES Search דורשת את הפרמטרים הבאים:

פרמטר תיאור
Index

זה שינוי אופציונלי.

תבנית החיפוש של אינדקס OpenSearch (לדוגמה, smp_playbooks-2019.06.13). אפשר להשתמש בתווים כלליים לחיפוש כדי לחפש בכמה אינדקסים (לדוגמה, smp_playbooks-*).

ערך ברירת המחדל הוא *.

Query

זה שינוי אופציונלי.

שאילתת החיפוש שרוצים לבצע באמצעות תחביר Lucene (לדוגמה, level:error OR level:warning).

ערך ברירת המחדל הוא *.

Limit

זה שינוי אופציונלי.

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

ערך ברירת המחדל הוא 100.

ערכי פלט של פעולות

הפעולה Simple ES Search מספקת את הפלטים הבאים:

סוג הפלט של הפעולה זמינות
חיבור לקיר של המארז לא זמין
קישור ללוח הפניות לא זמין
שולחן קונסולה צמוד לקיר לא זמין
טבלת העשרה לא זמין
תוצאת JSON יש גישה
הודעות פלט יש גישה
תוצאת הסקריפט יש גישה
תוצאת JSON

בדוגמה הבאה מוצג פלט התוצאה בפורמט JSON שמתקבל כשמשתמשים בפעולה Simple ES Search:

[{
    "_score": 0.2876821,
    "_type": "person",
    "_id": "2",
    "_source":
        {
          "lastname": "Smith",
          "name": "John",
          "job_description": "Systems administrator"
         },
     "_index": "accounts"
 },
 {
     "_score": 0.28582606,
     "_type": "person",
     "_id": "1",
     "_source":
       {
         "lastname": "Doe",
         "name": "John",
         "job_description": "Systems administrator and Linux specialist"
       },
    "_index": "accounts"
  }
 ]
תוצאת הסקריפט

בטבלה הבאה מפורטים הערכים של פלט תוצאות הסקריפט כשמשתמשים בפעולה Simple ES Search:

שם תוצאת הסקריפט ערך
results RESULTS

מחברים

איך מגדירים מחברים ב-Google SecOps?

מחבר OpenSearch

אתם יכולים להשתמש במחבר OpenSearch כדי לחפש באינדקסים ספציפיים של OpenSearch באמצעות שאילתת Lucene שסופקה, ולהטמיע מסמכים כהתראות ב-Google SecOps.

כניסות קלט של מחברים

כדי להשתמש במחבר של OpenSearch, צריך להגדיר את הפרמטרים הבאים:

פרמטר תיאור
Product Field Name

חובה.

שם השדה שבו מאוחסן שם המוצר.

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

ערך ברירת המחדל הוא Product Name.

Event Field Name

חובה.

שם השדה שקובע את שם האירוע (סוג משנה).

ערך ברירת המחדל הוא name.

Script Timeout (Seconds)

חובה.

מגבלת הזמן הקצוב לתפוגה, בשניות, של תהליך Python שמריץ את הסקריפט הנוכחי.

ערך ברירת המחדל הוא 180.

Server Address

חובה.

כתובת ה-URL של נקודת הקצה של המכונה של OpenSearch, כולל הפרוטוקול והיציאה (לדוגמה, https://10.0.0.1:9200).

Username

זה שינוי אופציונלי.

שם המשתמש שמשמש לאימות במכונה של OpenSearch.

Password

זה שינוי אופציונלי.

הסיסמה שמשויכת לשם המשתמש שצוין.

Authenticate

זה שינוי אופציונלי.

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

API Token

זה שינוי אופציונלי.

אסימון ה-API שמשמש לאימות כחלופה לשם משתמש וסיסמה.

Verify SSL

זה שינוי אופציונלי.

אם האפשרות הזו נבחרת, השילוב מאמת את אישור ה-SSL כשמתחברים לשרת OpenSearch.

Alert Name Field

חובה.

שם השדה שמכיל את שם ההתראה (לדוגמה, _source_alert_info_alert).

Timestamp Field

חובה.

שם השדה שמכיל את חותמת הזמן (לדוגמה, _source_@timestamp).

Environment Field Name

זה שינוי אופציונלי.

שם השדה שבו מאוחסן שם הסביבה.

אם שדה הסביבה חסר, המחבר משתמש בערך ברירת המחדל.

ערך ברירת המחדל הוא "".

Indexes

זה שינוי אופציונלי.

תבנית האינדקס לחיפוש. אפשר להשתמש ב-* כדי לחפש בכל האינדקסים.

Query

זה שינוי אופציונלי.

שאילתת החיפוש שצריך לבצע באמצעות תחביר Lucene.

Alerts Count Limit

חובה.

המספר המקסימלי של התראות שאפשר לשלוף במחזור אחד.

ערך ברירת המחדל הוא 20.

Max Days Backwards

חובה.

מספר הימים לפני הזמן הנוכחי שבהם רוצים לאחזר התראות.

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

ערך ברירת המחדל הוא 1.

Severity Field Name

זה שינוי אופציונלי.

שם השדה שמשמש לחילוץ ערך החומרה של ההתראה.

אם השדה מכיל ערכים מספריים (מספרים שלמים או מספרים עם נקודה צפה), המחבר ממפה אותם באופן אוטומטי לרמות החומרה של Google SecOps (לדוגמה, 100 הוא Critical). אם השדה מכיל ערכי מחרוזת, צריך להגדיר את כללי המיפוי בקובץ severity_map_config.json.

Proxy Server Address

זה שינוי אופציונלי.

כתובת שרת ה-Proxy שבו רוצים להשתמש.

Proxy Username

זה שינוי אופציונלי.

שם המשתמש שמשמש לאימות מול שרת ה-proxy.

Proxy Password

זה שינוי אופציונלי.

הסיסמה שמשמשת לאימות בשרת ה-proxy.

Environment Regex Pattern

זה שינוי אופציונלי.

תבנית של ביטוי רגולרי להפעלה על הערך שנמצא בשדה Environment Field Name. הפרמטר הזה מאפשר לכם לשנות את שדה הסביבה באמצעות הלוגיקה של הביטוי הרגולרי.

משתמשים בערך ברירת המחדל .* כדי לאחזר את הערך הגולמי הנדרש של Environment Field Name.

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

מחבר OpenSearch DSL

אתם יכולים להשתמש ב-OpenSearch DSL Connector כדי להטמיע מסמכים כהתראות ב-Google SecOps, על ידי ביצוע קריאות ל-API בארכיטקטורת REST באמצעות שאילתות Domain Specific Language ‏ (DSL).

כניסות קלט של מחברים

כדי להשתמש במחבר OpenSearch DSL, צריך להגדיר את הפרמטרים הבאים:

פרמטר תיאור
Product Field Name

חובה.

שם השדה שבו מאוחסן שם המוצר.

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

ערך ברירת המחדל הוא Product Name.

ערך ברירת המחדל הוא device_product.

Event Field Name

חובה.

שם השדה שקובע את שם האירוע (סוג משנה).

ערך ברירת המחדל הוא name.

Script Timeout (Seconds)

חובה.

מגבלת הזמן הקצוב לתפוגה, בשניות, של תהליך Python שמריץ את הסקריפט הנוכחי.

ערך ברירת המחדל הוא 60.

Server Address

חובה.

כתובת ה-URL של נקודת הקצה של המכונה של OpenSearch, כולל הפרוטוקול (לדוגמה, https://10.0.0.1).

Port

חובה.

היציאה שמשמשת לחיבור לשרת API של OpenSearch.

Query

חובה.

שאילתת ה-DSL ששימשה לחיפוש בפורמט JSON.

כדי לשפר את היציבות של המחבר, מומלץ לכלול בשאילתה מפתח של חותמת זמן למיון בסדר עולה.

Index

חובה.

האינדקס שמשמש לחיפוש. אפשר להשתמש ב-_all כדי לחפש בכל האינדקסים.

Timestamp Field

חובה.

שם השדה שמכיל את חותמת הזמן (לדוגמה, _source_@timestamp).

Alert Field Name

חובה.

שם השדה שמכיל את שם ההתראה (לדוגמה, _source_info_alertname).

Description Field

זה שינוי אופציונלי.

שם השדה שמכיל את תיאור ההתראה (לדוגמה, _source_alert_info_description).

Severity

חובה.

רמת החומרה הסטטית שצריך להקצות לכל ההתראות שנקלטו. הפרמטר הזה משמש אם הפרמטרים Alert Severity ו-Severity Field Name ריקים.

ערך ברירת המחדל הוא Medium.

Alert Severity

זה שינוי אופציונלי.

רמת החומרה שצריך להקצות להתראות. לפרמטר הזה יש עדיפות על פני Severity Field Name.

אם רוצים להשתמש במיפוי דינמי באמצעות Severity Field Name, צריך להשאיר את השדה הזה ריק.

Severity Field Name

זה שינוי אופציונלי.

שם השדה שמשמש לחילוץ ערך החומרה של ההתראה.

אם השדה מכיל ערכים מספריים (מספרים שלמים או מספרים עם נקודה צפה), המחבר ממפה אותם באופן אוטומטי לרמות החומרה של Google SecOps (לדוגמה, 100 הוא Critical). אם השדה מכיל ערכי מחרוזת, צריך להגדיר את כללי המיפוי בקובץ severity_map_config.json.

Alerts Count Limit

זה שינוי אופציונלי.

המספר המקסימלי של התראות שאפשר לשלוף במחזור אחד.

ערך ברירת המחדל הוא 100.

Authenticate

זה שינוי אופציונלי.

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

Username

זה שינוי אופציונלי.

שם המשתמש שמשמש לאימות במכונה של OpenSearch.

Password

זה שינוי אופציונלי.

הסיסמה שמשמשת לאימות מול המכונה של OpenSearch.

Use SSL

זה שינוי אופציונלי.

אם בוחרים באפשרות הזו, המחבר מפעיל חיבור SSL/TLS לשרת.

Proxy Server Address

זה שינוי אופציונלי.

הכתובת של שרת ה-proxy שמשמש לחיבור.

Proxy Username

זה שינוי אופציונלי.

שם המשתמש שמשמש לאימות מול שרת ה-proxy.

Proxy Password

זה שינוי אופציונלי.

הסיסמה שמשמשת לאימות בשרת ה-proxy.

Environment Field Name

זה שינוי אופציונלי.

שם השדה שבו מאוחסן שם הסביבה.

אם שדה הסביבה חסר, המחבר משתמש בערך ברירת המחדל.

ערך ברירת המחדל הוא "".

Environment Regex Pattern

זה שינוי אופציונלי.

תבנית של ביטוי רגולרי להפעלה על הערך שנמצא בשדה Environment Field Name. הפרמטר הזה מאפשר לכם לשנות את שדה הסביבה באמצעות הלוגיקה של הביטוי הרגולרי.

משתמשים בערך ברירת המחדל .* כדי לאחזר את הערך הגולמי הנדרש של Environment Field Name.

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

ערך ברירת המחדל הוא .*.

תמיכה בסימון

המחבר תומך בשלושה סימונים שונים למיפוי שדות. לדוגמה, כדי למפות את event.type, אפשר לספק את _source_event_type, event_type או event.type.

ההגדרה הזו חלה על הפרמטרים הבאים:

  • Product Field Name
  • Event Field Name
  • Severity Field Name
  • Environment Field Name
  • Timestamp Field
  • Alert Field Name
  • ‫Description Field (מחבר DSL בלבד)

איך ממפים את רמת החומרה במחבר

אם Severity Field Name מכיל ערכים מספריים (מספרים שלמים או מספרים עם נקודה צפה), המחבר ממפה אותם באופן הבא:

  • קריטי: 100
  • גבוה: ‎80 ≤ x < 100
  • בינוני: ‎60 ≤ x < 80
  • נמוכה: ‎40 ≤ x < 60
  • מידע: x < 40

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

הגדרה לדוגמה

כדי למפות שדה של event.severity שמכיל את הערכים "Malicious",‏ "Unknown" או "Benign":

  1. מזינים event.severity בפרמטר Severity Field Name.
  2. עדכון של severity_map_config.json:
{
    "event.severity": {
        "Malicious": 100,
        "Unknown": 60,
        "Benign": -1
    },
    "Default": 50
}

הבעיה עדיין לא נפתרה? קבלת תשובות מחברי הקהילה וממומחי Google SecOps.