כל בקשה ל-Multi-party Compute API עוברת שתי בדיקות נפרדות: בדיקה של ניהול זהויות והרשאות גישה (IAM) ב-method של ה-API, ובדיקה של המשתמש ב-Multi-party Compute שמבצע את הקריאה והתפקידים שלו. בדף הזה מתוארות שתי הבדיקות, הרשאות ה-IAM ואיך אדמינים מאשרים שינויים בתפקידי המשתמשים.
איך בקשה מקבלת הרשאה
- בדיקת IAM. לפני שהבקשה מגיעה למכונה, IAM בודק אם לחשבון המשתמש ששלח את הבקשה יש את ההרשאה שהשיטה דורשת במשאב שבבקשה. אם הוא לא תואם, הבקשה תיכשל עם השגיאה
403 PERMISSION_DENIEDולא תגיע למכונה. הבקשה מתועדת ביומני הביקורת של Cloud. במאמר הרשאות IAM מפורטות ההרשאות שנדרשות לכל שיטה. - בדיקת משתמשים ותפקידים. בשיטות שפועלות בשם משתמש, המכונה מחפשת את המשתמש שה-
principalשלו תואם לזהות המאומתת של מבצע הקריאה, ובודקת את התפקידים של המשתמש הזה. לדוגמה, הגורם שמפעיל אתCreateTransactionצריך להיות משתמש עם התפקידSIGNER. בקטע תפקידי משתמשים מפורטות הבדיקות שכל שיטה מבצעת.
שתי הבדיקות צריכות לעבור. תפקידי IAM ותפקידי משתמשים משלימים זה את זה, לדוגמה:
- חשבון משתמש עם
roles/mpc.editorאבל בלי התפקידPOLICY_AUTHORיכול לקרוא ל-CreateTransactionPolicy, אבל המכונה דוחה את הבקשה. - משתמש עם התפקיד
SIGNER, שלחשבון המשתמש שלו אין את ההרשאהmpc.googleapis.com/transactions.create, לא יכול ליצור טרנזקציות כי IAM דוחה את הבקשה קודם.
האישורים כוללים גם חתימה. בעלי הרשאת חתימה, כותבי מדיניות ואדמינים חותמים על כל אישור באמצעות מפתח ההרשאה שרשום במשתמש שלהם. כך אפשר לוודא שלא ניתן לשנות את כללי המדיניות והעסקאות, ושהם משאירים נתיבי ביקורת עמידים.
סביבות המחשוב האמינות (TEE) של המשתתפים מאמתות את החתימות האלה לפני שהן חותמות על עסקה או מאשרות מדיניות עסקאות, כך שבקשה שעוברת את שתי הבדיקות עדיין לא יכולה ליצור חתימה בלי אישורים תקפים. מידע נוסף זמין במודל האבטחה.
תפקידי משתמשים
לכל משתמש יש אחד מהתפקידים הבאים, שמוגדרים ב-User.roles. התפקיד הזה הוא תפקיד במכונה שלכם, ולא תפקיד IAM.
| תפקיד המשתמש | מה המשתמש יכול לעשות | מתי מתבצעת הבדיקה |
|---|---|---|
SIGNER |
מחזיק בחלקים של המפתח ומאשר עסקאות. שייך לצוות אחד בלבד. | CreateTransaction: למשתמש של מבצע הקריאה החוזרת צריך להיות התפקיד SIGNER.RecordSignerDecision: המשתמש של מבצע הקריאה החוזרת צריך להחזיק בחלק מהמפתח של העסקה.ListTransactions: אם למשתמש של מבצע הקריאה החוזרת יש רק את התפקיד SIGNER, יוחזרו רק עסקאות במפתחות שבהם המשתמש מחזיק בחלק מהמפתח. |
POLICY_AUTHOR |
הצעת כללי מדיניות לעסקאות, אישור שלהם והשבתה שלהם. | CreateTransactionPolicy, ApproveTransactionPolicy, DisableTransactionPolicy: המשתמש של מבצע הקריאה החוזרת חייב להיות מחבר מדיניות פעיל עם מפתח הרשאה רשום. |
ADMIN |
ניהול משתמשים, צוותים, אוספי מפתחות, מפתחות ורשימות מפתחות. מאשר שינויים בתפקידים ADMIN ו-POLICY_AUTHOR. |
EnableUserRole, DisableUserRole, DisableUser, ApproveUser לשינויים ב-ADMIN וב-POLICY_AUTHOR: הבקשה חייבת לכלול את החתימה של האדמין ששולח את הבקשה. אישור אדמין לשינויים בתפקידים |
הכללים הבאים חלים על משתמשים:
- חשבון משתמש אחד לכל משתמש. השדה
User.principalמוגדר כשיוצרים את המשתמש ואי אפשר לשנות אותו. חשבון Google או חשבון משתמש באיחוד שירותי אימות הזהות של כוח עבודה. כדי לשנות את חשבון המשתמש, צריך להשבית את המשתמש וליצור משתמש חדש. - צוות אחד לכל חותם. למשתמש עם התפקיד
SIGNERצריך להיות מוגדרTeam. רק משתמשים עם התפקידSIGNERיכולים להחזיק בחלקים של מפתחות, ולכן רק חותמים שייכים לצוות. כדי להעביר חותם לצוות אחר, צריך להשתמש ב-UpdateTeamAssignment, וזה דורש שיתוף מחדש. אנחנו מתכננים להוסיף את האפשרות הזו בגרסה עתידית. - מפתחות הרשאה. חותמים ויוצרי מדיניות צריכים מפתח הרשאה כדי לחתום על אישורים. אדמינים צריכים חתימה כדי לבקש או לאשר שינויים בתפקידים
ADMINו-POLICY_AUTHOR. כדי לנהל את החותמים והצוותים לא נדרשת חתימה של אדמין.
הסטטוס של כל תפקיד
| סטטוס | משמעות | האם המשתמש יכול להשתמש בתפקיד? |
|---|---|---|
PENDING_ACTIVE |
התפקיד הוקצה והוא ממתין לאישור של האדמין. | לא |
ACTIVE |
התפקיד נכנס לתוקף. | כן |
PENDING_DISABLED |
התפקיד בתהליך הסרה וממתין לאישור של אדמין. | כן, עד שההסרה תאושר |
DISABLED |
התפקיד הוסר. הוא יישאר רשום כדי שהאישורים שלו יישארו גלויים. | לא |
אישור אדמין לשינויים בתפקידים
אדמינים מנהלים את כל תפקידי המשתמשים. כדי להקצות או להסיר את התפקיד ADMIN או POLICY_AUTHOR, צריך לקבל אישור מכמה אדמינים. הענקה או הסרה של התפקיד SIGNER נכנסת לתוקף באופן מיידי על ידי אדמין אחד, ללא חתימת אדמין. התפקיד SIGNER לבדו לא מעניק גישה למפתחות. חותם מקבל שיתופי מפתחות רק כשאדמין כולל את החותם או את הצוות שלו במדיניות המפתחות של KeyRing ויוצר מפתח.
| Method | ההשפעה על תפקידי המשתמשים |
|---|---|
CreateUser |
כל תפקיד של ADMIN או POLICY_AUTHOR שביקשתם מתחיל בסטטוס PENDING_ACTIVE. SIGNER ACTIVE באופן מיידי. |
EnableUserRole |
מקצה תפקיד אחד. ההנחות ADMIN ו-POLICY_AUTHOR מתחילות ב-PENDING_ACTIVE, וההנחה SIGNER היא ACTIVE באופן מיידי. |
DisableUserRole |
הסרת תפקיד אחד. ב-ADMIN וב-POLICY_AUTHOR, תפקיד ACTIVE הופך ל-PENDING_DISABLED, ותפקיד PENDING_ACTIVE מבוטל באופן מיידי, ללא אישור. SIGNER הופך ל-DISABLED באופן מיידי. |
DisableUser |
הסרה של כל התפקידים של המשתמש בבקשה אחת, עם חתימה אחת לכל השינויים ב-ADMIN וב-POLICY_AUTHOR. |
ApproveUser |
מתעד אישור של אדמין אחד לשינוי בהמתנה של המשתמש. |
EnableUser |
הגדרה מחדש של משתמש מושבת כ-ACTIVE. הוא לא משחזר תפקידים ולא נדרש אישור. |
תהליך האישור פועל כך:
- אדמין מבקש את השינוי וכולל את
authorizationInfo: החתימה שלו, שנוצרה באמצעות מפתח ההרשאה שלו, על שינוי התפקיד. הבקשה הזו נחשבת לאישור הראשון. - אדמינים אחרים קוראים ל-
ApproveUserבמשתמש, כל אחד עם החתימה שלו. אישור אחד מכסה את כל השינויים בתפקידים של המשתמש הזה שממתינים לאישור. - כשהמספר של האישורים מגיע לסף האישורים של האדמינים במופע, כל השינויים הממתינים בתפקיד של המשתמש נכנסים לתוקף ביחד. האישורים מאוחסנים במכשיר של המשתמש ב-
role_statuses.approval_info, וסביבות ה-TEE של המשתתפים מאמתות אותם.
הכללים הבאים חלים על כל שינוי ב-ADMIN וב-POLICY_AUTHOR:
- לפחות שני אדמינים פעילים. שינוי שישאיר את המכונה עם פחות אדמינים פעילים מסף האישור של האדמינים ייכשל עם השגיאה
FAILED_PRECONDITION. בכל מקרה, תמיד יהיו לפחות שני אדמינים פעילים. אדמינים שהתפקיד שלהם הואPENDING_DISABLEDלא נחשבים כפעילים. - אין אישור עצמי. המשתמש שההרשאות שלו משתנות לא יכול לבקש או לאשר את השינוי בעצמו. בקשה כזו תיכשל עם
PERMISSION_DENIED. - כל אדמין יכול לאשר פעם אחת. אם אדמין מאשר את אותו שינוי פעמיים, הבקשה השנייה נכשלת עם
ALREADY_EXISTS. - שינוי אחד בהמתנה לכל משתמש. בזמן שהשינוי בהמתנה, בקשות להפעלת תפקיד נכשלות עם השגיאה
FAILED_PRECONDITION. בקשות להשבתת תפקיד אף פעם לא נחסמות: השבתה מבטלת בקשות הפעלה בהמתנה, ומשולבת עם כל בקשות ההשבתה בהמתנה לשינוי חדש אחד שהאישורים שלו מתחילים מחדש. - תפוגה. שינוי שלא יקבל מספיק אישורים עד
approval_info.expire_timeיפוג, והתפקידים שלו יחזרו לסטטוס הקודם שלהם.
ב-v1beta API, אי אפשר להשבית את התפקיד SIGNER או את המשתמש, כל עוד המשתמש מחזיק בחלקים של המפתח. כדי להחליף את החלקים של מפתח החתימה, צריך לשתף אותם מחדש. האפשרות הזו תהיה זמינה בגרסה עתידית.
הרשאות IAM
בטבלה הבאה מפורטים כל ה-methods של v1beta, הרשאת ה-IAM שנדרשת להם והתפקיד המוגדר מראש עם מספר ההרשאות הקטן ביותר שכולל את ההרשאה הזו. כל תפקיד מוגדר מראש כולל גם את כל ההרשאות של התפקידים שלפניו: roles/mpc.editor כולל את roles/mpc.viewer, ו-roles/mpc.admin כולל את roles/mpc.editor.
| משאב | Method | הרשאה | תפקיד מוגדר מראש |
|---|---|---|---|
| ChromeOS | CreateTeam |
mpc.googleapis.com/teams.create |
roles/mpc.admin |
DeleteTeam |
mpc.googleapis.com/teams.delete |
roles/mpc.admin |
|
GetTeam |
mpc.googleapis.com/teams.get |
roles/mpc.viewer |
|
ListTeams |
mpc.googleapis.com/teams.list |
roles/mpc.viewer |
|
| משתמש | CreateUser |
mpc.googleapis.com/users.create |
roles/mpc.admin |
UpdateUser |
mpc.googleapis.com/users.update |
roles/mpc.admin |
|
EnableUserRole |
mpc.googleapis.com/users.enableRole |
roles/mpc.admin |
|
DisableUserRole |
mpc.googleapis.com/users.disableRole |
roles/mpc.admin |
|
ApproveUser |
mpc.googleapis.com/users.approve |
roles/mpc.admin |
|
DisableUser |
mpc.googleapis.com/users.disable |
roles/mpc.admin |
|
EnableUser |
mpc.googleapis.com/users.enable |
roles/mpc.admin |
|
UpdateTeamAssignment |
mpc.googleapis.com/users.updateTeamAssignment |
roles/mpc.admin |
|
GetUser |
mpc.googleapis.com/users.get |
roles/mpc.viewer |
|
ListUsers |
mpc.googleapis.com/users.list |
roles/mpc.viewer |
|
| KeyRing | CreateKeyRing |
mpc.googleapis.com/keyRings.create |
roles/mpc.admin |
DeleteKeyRing |
mpc.googleapis.com/keyRings.delete |
roles/mpc.admin |
|
GetKeyRing |
mpc.googleapis.com/keyRings.get |
roles/mpc.viewer |
|
ListKeyRings |
mpc.googleapis.com/keyRings.list |
roles/mpc.viewer |
|
| מפתח | CreateKey |
mpc.googleapis.com/keys.create |
roles/mpc.admin |
DisableKey |
mpc.googleapis.com/keys.update |
roles/mpc.editor |
|
GetKey |
mpc.googleapis.com/keys.get |
roles/mpc.viewer |
|
ListKeys |
mpc.googleapis.com/keys.list |
roles/mpc.viewer |
|
| KeyList | CreateKeyList |
mpc.googleapis.com/keyLists.create |
roles/mpc.admin |
DeleteKeyList |
mpc.googleapis.com/keyLists.delete |
roles/mpc.admin |
|
AddKeyListEntries |
mpc.googleapis.com/keyLists.addEntries |
roles/mpc.admin |
|
RemoveKeyListEntries |
mpc.googleapis.com/keyLists.removeEntries |
roles/mpc.admin |
|
GetKeyList |
mpc.googleapis.com/keyLists.get |
roles/mpc.viewer |
|
ListKeyLists |
mpc.googleapis.com/keyLists.list |
roles/mpc.viewer |
|
| TransactionPolicy | CreateTransactionPolicy |
mpc.googleapis.com/transactionPolicies.create |
roles/mpc.editor |
ApproveTransactionPolicy |
mpc.googleapis.com/transactionPolicies.approve |
roles/mpc.editor |
|
DisableTransactionPolicy |
mpc.googleapis.com/transactionPolicies.disable |
roles/mpc.editor |
|
GetTransactionPolicy |
mpc.googleapis.com/transactionPolicies.get |
roles/mpc.viewer |
|
ListTransactionPolicies |
mpc.googleapis.com/transactionPolicies.list |
roles/mpc.viewer |
|
| עסקה | CreateTransaction |
mpc.googleapis.com/transactions.create |
roles/mpc.editor |
RecordSignerDecision |
mpc.googleapis.com/transactions.recordSignerDecision |
roles/mpc.editor |
|
GetTransaction |
mpc.googleapis.com/transactions.get |
roles/mpc.viewer |
|
ListTransactions |
mpc.googleapis.com/transactions.list |
roles/mpc.viewer |
לפרטים על הבקשות והתגובות, קראו את המסמך Multi-party Compute API REST reference.
תפקידים מוגדרים מראש
| תפקיד | כולל | מיועד ל: |
|---|---|---|
צפייה בחישוב רב-משתתפיםroles/mpc.viewer |
ההרשאות של roles/mpc.viewer בטבלה שלמעלה: get ו-list בכל משאב. |
גורמי ביקורת וכלי מעקב. |
עריכת חישוב רב-משתתפיםroles/mpc.editor |
כל ההרשאות של roles/mpc.viewer, וגם ההרשאות של roles/mpc.editor בטבלה שלמעלה. |
חשבונות משתמשים של חותמים ושל מחברי מדיניות. תפקידי המשתמשים שלהם קובעים אילו מהשיטות האלה המכונה מקבלת מהם. |
אדמין של חישוב רב-משתתפיםroles/mpc.admin |
כל ההרשאות של roles/mpc.editor, וגם ההרשאות של roles/mpc.admin בטבלה שלמעלה. |
חשבונות משתמשים של אדמינים. |
למשאבים מסוג v1beta אין מדיניות IAM משלהם. מקצים תפקידים בפרויקט שמכיל את המכונה, ומשתמשים בתנאי IAM כדי לצמצם את התפקיד ל-KeyRing.
תפקידים מומלצים לכל פרסונה
צריך לתת לכל אדם חשבון משתמש נפרד, משתמש עם התפקידים שהוא צריך בלבד ותפקיד IAM תואם:
| פרסונה | תפקידי משתמשים | תפקיד IAM |
|---|---|---|
| אדמין | ADMIN |
roles/mpc.admin |
| מחבר המדיניות | POLICY_AUTHOR |
roles/mpc.editor, או תפקיד בהתאמה אישית עם ההרשאות של transactionPolicies.* |
| בעל החתימה | SIGNER |
roles/mpc.editor, או תפקיד בהתאמה אישית עם ההרשאות של transactions.* |
| Auditor | ללא | roles/mpc.viewer |
ישויות מורשות מאוחדות צריכות גם את התפקיד 'Service Usage Consumer' (roles/serviceusage.serviceUsageConsumer) בפרויקט הצרכן. מידע נוסף זמין במאמר הגדרת איחוד שירותי אימות הזהות של כוח עבודה (BYOID).
תפקידים בהתאמה אישית
כדי לתת לחשבון משתמש רק את ההרשאות שהוא צריך, יוצרים תפקיד IAM בהתאמה אישית. לדוגמה, התפקיד הבא מאפשר למשתמש עם הרשאת חתימה לראות עסקאות ולאשר או לדחות אותן, אבל לא ליצור אותן:
gcloud iam roles create mpcTransactionApprover \
--project=PROJECT_ID \
--title="MPC transaction approver" \
--description="View MPC transactions and record signer decisions" \
--permissions="mpc.googleapis.com/transactions.get,mpc.googleapis.com/transactions.list,mpc.googleapis.com/transactions.recordSignerDecision"
מחליפים את PROJECT_ID במזהה הפרויקט שמכיל את המכונה.
המכונה עדיין בודקת את המשתמש של מבצע הקריאה: המשתמש חייב להחזיק במפתח משותף של מפתח העסקה כדי לתעד החלטה.
תנאי IAM
אתם יכולים לצמצם את קישור התפקיד למשאבים באוסף מפתחות אחד באמצעות תנאי IAM בשם המשאב. לדוגמה, אם שתי יחידות עסקיות משתפות מכונה ולכל אחת מהן יש אוסף מפתחות משלה, אתם יכולים להעניק לכל אחת מהיחידות את התפקיד roles/mpc.editor רק באוסף המפתחות שלה:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
--role="roles/mpc.editor" \
--condition="expression=resource.name.startsWith('projects/PROJECT_ID/locations/LOCATION/instances/INSTANCE_ID/keyRings/KEYRING_ID'),title=keyring-scoped-editor"
מחליפים את מה שכתוב בשדות הבאים:
-
PROJECT_ID: מזהה הפרויקט שמכיל את המכונה. -
SA_NAME: השם של חשבון השירות. -
LOCATION: האזור של המכונה. -
INSTANCE_ID: מזהה המכונה. -
KEYRING_ID: המזהה של אוסף המפתחות.
שמות המשאבים של v1beta לא מכילים את /mpc/. תנאי שהועתק מהמסמכים של גרסת טרום-השקה (Preview) פרטית (v1alpha1), כמו .../instances/INSTANCE_ID/mpc/keyRings/KEYRING_ID, לא תואם לאף משאב של v1beta.
משתמשים, צוותים, רשימות מפתחות ומדיניות טרנזקציות שייכים למכונה ולא לאוסף מפתחות, ולכן קישור ברמת אוסף המפתחות לא מעניק גישה אליהם.