הפקודה gcloud compute reset-windows-password מאפשרת למשתמש עם גישת כתיבה לפרויקט Compute Engine לאחזר בצורה מאובטחת סיסמאות לחשבונות במכונות Windows.
הפקודה עושה זאת על ידי שליחת שם משתמש ומפתח ציבורי של RSA למופע. הסוכן שפועל במופע מבצע אחת מהפעולות הבאות:
- המערכת יוצרת חשבון במכונה עבור שם המשתמש הזה ומפיקה סיסמה אקראית.
- מאפס את הסיסמה לערך אקראי אם החשבון כבר קיים.
הסוכן שפועל במופע מצפין את הסיסמה באמצעות המפתח הציבורי שסופק ושולח אותה בחזרה ללקוח כדי לפענח אותה באמצעות המפתח הפרטי המתאים.
בקטע הזה מוסבר איך התהליך הזה עובד, ומוצגות כמה דוגמאות לסקריפטים שמשכפלים את השלבים האלה באופן פרוגרמטי. אם רוצים לבצע את השלבים האלה באופן ידני, אפשר לקרוא את הקטע הוראות ידניות.
לפני שמתחילים
- יוצרים מופע של Windows.
-
אם עדיין לא עשיתם את זה, תצטרכו להגדיר אימות.
אימות הוא תהליך שבו מאמתים את הזהות שלכם כדי לקבל גישה לממשקי API ולשירותים של Cloud de Confiance by S3NS . כדי להריץ קוד או דוגמאות מסביבת פיתוח מקומית, אפשר לבצע אימות ל-Compute Engine באחת מהדרכים הבאות:
צריך לבחור את הכרטיסייה הרלוונטית לאופן שבו תכננתם להשתמש בדוגמאות בדף הזה:
המסוף
כשמשתמשים במסוף Cloud de Confiance כדי לגשת לשירותים ולממשקי ה-API, לא צריך להגדיר אימות. Cloud de Confiance by S3NS
gcloud
-
התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם. אחרי שנכנסתם לחשבון, אתחלו את ה-CLI של Google Cloud באמצעות הפקודה הבאה:
gcloud init
-
- הגדרת אזור ותחום כברירת מחדל
REST
כדי להשתמש בסביבת פיתוח מקומית בדוגמאות של API בארכיטקטורת REST שבדף הזה, צריך להשתמש בפרטי הכניסה שאתם נותנים ל-CLI של gcloud.
התקינו את ה-CLI של Google Cloud ואז היכנסו ל-CLI של gcloud באמצעות הזהות המאוחדת שלכם.
מידע נוסף מופיע במאמר אימות לשימוש ב-REST במסמכי האימות של Cloud de Confiance .
יצירת סיסמאות באופן אוטומטי
המשך
Python
Java
הוראות ידניות
השלבים במדריך הזה משתמשים ב-OpenSSL לפונקציות ההצפנה ובכלי Bash shell/Linux לפונקציות אחרות, אבל אפשר להשתמש בהטמעות רבות אחרות.
יוצרים זוג מפתחות RSA של 2048 ביט. ב-OpenSSL, מריצים את הפקודה הבאה כדי ליצור את צמד המפתחות הזה:
$ openssl genrsa -out private_key 2048כך נוצר קובץ מפתח פרטי בשם private_key עם תוכן שנראה כך:
$ cat private_key -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAwgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1vCQVQAkBwnWigcC qOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPqnDIM2qiK36up3SKkYwFjff6F2ni/ ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naOvJXfY5v0hGPWqCADao +xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDRnmJ GQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystu FsJnrrhbNXJbpSjM6sjo/aduAkZJl4FmOt0R7QIDAQABAoIBAQCsT6hHc/tg9iIC H5pUiRI55Uj+R5JwVGKkXwl8Qdy8V1MpTOJivpuLsiMGf+sL51xO/CzRsiBOfdYz bgaTW9vZimR5w5NW3iTAV2Ps+y2zk9KfV/y3/0nzvUSG70OXgBGj+7GhaBQZwS5Z 5HZOsOYMAV1QSIv8Uu2FQAK1xuOA4seJ/NK42iXgVB1XvYe2AxCWNqCBJylk9F5N 8a213oJWw2mwQWCSfZhuvwYRO7w/V+mInKPkKlWvf3SLuMCWeDI8s0jLsJMQ0rbp jYXRzc2G+LF1aLxjatiGeLsqfVYerNohufGAajpNkSvcMciDXvD9aJhZqior+x2Q rCnMuNRNAoGBAPI6r32wIf8H9GmcvGrXk9OYLq0uJGqAtJDgGmJM5BSX4mlSz+Ni SYlQOfi24ykQDo3XbA59Lb6H0L64czi2a3OmpG8s6h4ymp+3cSd1k1AER1oZudwH 9UScGfSgT/nMgufBwEGlQkCMp5x4Sl20clCHZ49p9eNiXML3wxpCZPIjAoGBAM0T NKt/rjqMs0qOWAJKemSPk0zV+1RSjCoOdKC6jmHRGr/MIoKiJLIkywV2m53yv8Wu BF3gVUDlwojoOKcVR8588tek5L0j9RshGovKj4Uxz9uPPhzeNnlSA+5PS284VtKz LX8xZ/b+MNCyor9jT0qoWylqym0w+M4aFL2tUQSvAoGABJvnQO38B51AIk5QK3xE nM8VfEgXe0tNpEAPYHV0FYw6S6S+veXd3lX/dGMOeXaLwFkr/i6Vkz2EVEywLJEU BFRUZqUlI0P1OzrDVWvgTLJ4JRe+OJiSKycJO2VdgDRK/Vvra5RYaWADxG9pgtTv I+cfqlPq0NPLTg5m0PYYc58CgYBpGt/SygTNA1Hc82mN+wgRxDhVmBJRHGG0KGaD /jl9TsOr638AfwPZvdvD+A83+7NoKJEaYCCxu1BiBMsMb263GPkJpvyJKAW2mtfV L8MxG9+Rgy/tccJvmaZkHIXoAfMV2DmISBUl1Q/F1thsyQRZmkHmz1Hidsf+MgXR VSQCBwKBgQCxwJtGZGPdQbDXcZZtL0yJJIbdt5Q/TrW0es17IPAoze+E6zFg9mo7 ea9AuGxOGDQwO9n5DBn/3XcSjRnhvXaW60Taz6ZC60Zh/s6IilCmav+n9ewFHJ3o AglSJZRJ1Eer0m5m6s2FW5U0Yjthxwkm3WCWS61cOOTvb6xhQ5+WSw== -----END RSA PRIVATE KEY-----
יוצרים מפתח ציבורי. כדי ליצור את המפתח הציבורי, מריצים את הפקודה:
$ openssl rsa -pubout -in private_key -out public_keyכך נוצר קובץ public_key שנראה כך:
$ cat public_key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwgsquN4IBNPqIUnu+h/5 Za1kujb2YRhX1vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPq nDIM2qiK36up3SKkYwFjff6F2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswV ZmX2X67naOvJXfY5v0hGPWqCADao+xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHw x1EZ/MSgsEki6tujcZfN+GUDRnmJGQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3 DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJbpSjM6sjo/aduAkZJl4FmOt0R 7QIDAQAB -----END PUBLIC KEY-----
מחפשים את המודולוס ואת המעריך. מודולוס ומעריך יוצרים את המפתחות הציבורי והפרטי. מהמפתח הציבורי, מחלצים את המודולוס ואת האקספוננט:
$ openssl rsa -in public_key -pubin -text -noout Public-Key: (2048 bit) Modulus: 00:c2:0b:2a:b8:de:08:04:d3:ea:21:49:ee:fa:1f: f9:65:ad:64:ba:36:f6:61:18:57:d6:f0:90:55:00: 24:07:09:d6:8a:07:02:a8:e0:55:7d:16:b9:26:86: 5f:c7:a2:88:bc:45:e3:5a:a6:bb:ee:33:ef:96:cc: 4c:e1:63:ea:9c:32:0c:da:a8:8a:df:ab:a9:dd:22: a4:63:01:63:7d:fe:85:da:78:bf:af:2f:2f:af:05: c2:5f:7b:06:67:58:5b:20:79:4a:d0:ed:35:d8:7a: 40:dc:84:9e:12:cc:15:66:65:f6:5f:ae:e7:68:eb: c9:5d:f6:39:bf:48:46:3d:6a:82:00:36:a8:fb:15: 71:ae:6c:6c:64:3e:08:5a:72:a5:d5:46:99:cc:8e: 65:84:0c:eb:f1:fc:3a:ba:d1:f0:c7:51:19:fc:c4: a0:b0:49:22:ea:db:a3:71:97:cd:f8:65:03:46:79: 89:19:04:a7:3d:35:e6:b1:fe:d0:e0:32:ab:79:36: 64:e3:d7:2e:c8:1d:e9:ad:5f:75:4b:4c:77:0d:88: c2:52:94:97:ae:45:72:d4:76:b9:5e:27:06:0f:fa: be:ca:cb:6e:16:c2:67:ae:b8:5b:35:72:5b:a5:28: cc:ea:c8:e8:fd:a7:6e:02:46:49:97:81:66:3a:dd: 11:ed Exponent: 65537 (0x10001)
מקודדים את המודולוס ואת המעריך. צריך לחלץ את המודולוס ואת האקספוננט ולבצע קידוד base64 שלהם. לפני שמקודדים את המודולוס, מסירים ממנו את בייט האפס המוביל. כברירת מחדל, הקובץ public_key הוא כבר מחרוזת בקידוד base64 של בייטים שמכילה את המידע הבא:
- 32 בייט של פרטי כותרת
- בייט אחד עם האפס המוביל של המודולוס
- 256 בייטים של מודולוס
- 2 בייטים של כותרת מעריך
- 3 בייטים של מעריך
צריך לחלץ את המודולוס ואת האקספוננט ולקודד אותם בנפרד משאר התוכן של הקובץ. מחלצים ומקודדים את המודולוס ואת האקספוננט באמצעות הפקודות הבאות:
$ cat public_key | grep -v -- ----- | base64 -d | dd bs=1 skip=33 count=256 2>/dev/null | base64 -w 0; echo wgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsx M4WPqnDIM2qiK36up3SKkYwFjff6F2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naO vJXfY5v0hGPWqCADao+xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDR nmJGQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJb pSjM6sjo/aduAkZJl4FmOt0R7Q==
$ cat public_key | grep -v -- ----- | base64 -d | dd bs=1 skip=291 count=3 2>/dev/null | base64 AQAB
אם נתקלתם בבעיות בקידוד המודולוס, הקפידו להסיר את בייט האפס המוביל מהמודולוס לפני שתנסו לקודד אותו.
יוצרים אובייקט JSON עם שם משתמש ופרטים של מפתח ציבורי. יוצרים אובייקט JSON עם הנתונים הבאים:
-
userName: שם המשתמש להתחברות למכונה. -
modulus: המודולוס של המפתח הציבורי בקידוד Base64. -
exponent: המעריך של המפתח הציבורי בקידוד base64 email: כתובת האימייל של המשתמש שמבקש את הסיסמה. זו צריכה להיות כתובת האימייל של חשבון Google שעובר אימות ל-API.-
expireOn: חותמת זמן מקודדת בפורמט RFC 3399 של מועד התפוגה של המפתח. הערך צריך להיות בשעון UTC, שמוגדר בערך חמש דקות קדימה. המפתחות האלה משמשים רק ליצירת שם המשתמש והסיסמה, ולכן הם לא נחוצים יותר אחרי שהסיסמה נוצרת. אם למפתח אין תאריך תפוגה או שתאריך התפוגה כבר עבר, הסוכן לא ישתמש בו וידלג עליו לחלוטין.
לדוגמה:
{\"userName\": \"example-user\", \"modulus\": \"wgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1 vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPqnDIM2qiK36up3SKkYwFjff6F 2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naOvJXfY5v0hGPWqCADao+xVxrmx sZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDRnmJGQSnPTXmsf7Q4DKreT Zk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJbpSjM6sjo/aduAkZJl 4FmOt0R7Q==\", \"exponent\": \"AQAB\", \"email\": \"example.user@example.com\", \"expireOn\": \"2015-04-14T01:37:19Z\"}שימו לב: מחרוזת ה-JSON לא יכולה לכלול מעברים לשורה חדשה.
-
מוסיפים את אובייקט ה-JSON למטא-נתונים של המופע. מגדירים את מטא-הנתונים של המופע באמצעות מפתח המטא-נתונים
windows-keysואובייקט ה-JSON כערך המפתח.כדי לעדכן את המטא-נתונים של מופע ב-API, צריך לספק טביעת אצבע עם הבקשה. כדי לקבל את טביעת האצבע הנוכחית של המכונה, שולחים בקשת GET למכונה:
GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/test-windows-auth [..snip..] "metadata": { "kind": "compute#metadata", "fingerprint": "5sFotm8Ee0I=", "items": [ { … } [..snip]..לאחר מכן, שולחים בקשת
POSTלמתודהsetMetadata, ומספקים את טביעת האצבע ואת אובייקט ה-JSON שיצרתם:POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/test-windows-auth/setMetadata { "fingerprint": "5sFotm8Ee0I=", "items": [ { "value": "{\"userName\": \"example-user\", \"modulus\": \"wgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPqnDIM2qiK36up3SKkYwFjff6F2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naOvJXfY5v0hGPWqCADao+xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDRnmJGQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJbpSjM6sjo/aduAkZJl4FmOt0R7Q==\", \"exponent\": \"AQAB\", \"email\": \"user@example.com\", \"expireOn': '2015\"04-14T01:37:19Z\"}\n", "key": "windows-keys" } ] }השם של המפתח צריך להיות
windows-keysוהערך צריך להיות מוגדר למחרוזת JSON אחת או יותר כמו זו שלמעלה. אם יש כמה מחרוזות, צריך להפריד ביניהן באמצעות שורות חדשות. כשמוסיפים כמה רשומות, צריך לוודא שערך המטא-נתונים לא עולה על 32KB.קוראים את הפלט מתוך serial port number four. הסוכן במופע יקבל באופן אוטומטי את הערך של
windows-keysוייצור סיסמה מוצפנת. קריאת הסיסמה המוצפנת על ידי שליחת שאילתה ליציאה הטורית מספר ארבע. ב-API, שולחים בקשתGETל-methodgetSerialPortOutputומעבירים אתport=4כפרמטר של שאילתה:GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/test-windows-auth/serialPort?port=4 { "kind": "compute#serialPortOutput", "selfLink": "https://www.googleapis.com/compute/v1/projects/myproject/zones/_/instances/test-api-auth/serialPort", "contents": "{\"ready\":true,\"version\":\"Microsoft Windows NT 6.1.7601 Service Pack 1\"}\n{\"encryptedPassword\":\"uiHDEhxyvj6lF5GalH h9TsMZb4bG6Y9qGmFb9S3XI29yvVsDCLdp4IbUg21MncHcaxP0rFu0kyjxlEXDs8y4L1KOhy6iyB42Lh+vZ4XIMjmvU4rZrjsBZ5TxQo9hL0lBW7o3FRM\\/UIXCeRk39ObUl2A jDmQ0mcw1byJI5v9KVJnNMaHdRCy\\/kvN6bx3qqjIhIMu0JExp4UVkAX2Mxb9b+c4o2DiZF5pY6ZfbuEmjSbvGRJXyswkOJ4jTZl+7e6+SZfEal8HJyRfZKiqTjrz+DLjYSlXr fIRqlvKeAFGOJq6IRojNWiTOOh8Zorc0iHDTIkf+MY0scfbBUo5m30Bf4w==\",\"exponent\":\"AQAB\",\"modulus\":\"0tiKdO2JmBHss26jnrSAwb583KG\\/ZIw5Jw wMPXrCVsFAPwY1OV3RlT1Hp4Xvpibr7rvJbOC+f\\/Gd0cBrK5pccQfccB+OHKpbBof473zEfRbdtFwPn10RfAFj\\/xikW0r\\/XxgG\\/c8tz9bmALBStGqmwOVOLRHxjwgtG u4poeuwmFfG6TuwgCadxpllW74mviFd4LZVSuCSni5YJnBM2HSJ8NP6g1fqI17KDXt2XO\\/7kSItubmMk+HGEXdH4qiugHYewaIf1o4XSQROC8xlRl7t\\/RaD4U58hKYkVwg0 Ir7WzYzAVpG2UR4Co\\/GDG9Hct7HOYekDqVQ+sSZbwzajnVunkw==\",\"passwordFound\":true,\"userName\":\"example-user\"}\n" }יכול להיות שהפלט של היציאה הטורית יכיל כמה תשובות, שמופרדות על ידי שורות חדשות. כדי למצוא את התגובה הנכונה, צריך להתאים את המודולוס שהועבר לפלט של היציאה הטורית. כל תגובה היא מחרוזת בקידוד JSON עם השדות הבאים:
-
userName: שם המשתמש שהועבר למכונה. -
passwordFound: ערך בוליאני שמציין אם יצירת הסיסמה הצליחה. -
encryptedPassword: סיסמה מוצפנת בקידוד Base64. -
modulus: המודולוס שהועבר קודם. -
exponent: המעריך שהועבר קודם.
מידע על שמירת הפלט של יציאה טורית מופיע במאמר בנושא צפייה בפלט של יציאה טורית.
-
מפענחים את הסיסמה. כדי לקבל את הסיסמה, משתמשים במפתח הפרטי שנוצר קודם כדי לפענח את הסיסמה המוצפנת. צריך לפענח את הסיסמה באמצעות ריפוד אופטימלי להצפנה אסימטרית (OAEP). ב-OpenSSL, הפקודה לפענוח נתוני קלט היא:
$ openssl rsautl -decrypt -inkey private_key -oaepכדי לפענח את הסיסמה שלמעלה, צריך לציין את הערך
encryptedPassword. חשוב לזכור להסיר מראש את\\תווי ה-escape מהמחרוזת, אחרת פענוח ההצפנה ייכשל:$ echo 'uiHDEhxyvj6lF5GalHh9TsMZb4bG6Y9qGmFb9S3XI291MncHcaxP0rFu0kyjxlEXDs8y4L1KOhy6iyB42Lh+vZ4XIMjmvU4rZrjsBZ5Tx Qo9hL0lBW7o3FRM/UIXCeRk39ObUl2AjDmQ0mcw1byJI5v9KVJnNMaHdRCy/kvN6bx3qqjIhIMu0JExp4UVkAX2Mxb9b+c4o2DiZF5pY6ZfbuEmjS bvGRJXyswkOJ4jTZl+7e6+SZfEal8HJyRfZKiqTjrz+DLjYSlXrfIRqlvKeAFGOJq6IRojNWiTOOh8Zorc0iHDTIkf+MY0scfbBUo5m30Bf4w==' | base64 -d | openssl rsautl -decrypt -inkey private_key -oaepהסיסמה מפוענחת ומוצגת בפלט של הפקודה:
dDkJ_3]*QYS-#>Xשם המשתמש והסיסמה של החשבון הזה יהיו:
username: example-user password: dDkJ_3]*QYS-#>Xזורקים את המפתחות. בניגוד למפתחות SSH, המפתחות שמשמשים לאחזור או לאיפוס סיסמאות של Windows אמורים להיות זמניים. שימוש חוזר בזוגות של מפתחות פרטיים/ציבוריים לא מומלץ, ויכול להיות שהוא לא יפעל כמצופה. אם המפתח נשמר בדיסק, הקבצים יימחקו בסוף התהליך. עוד יותר טוב, אם אפשר, כדאי לשמור את המפתח בזיכרון ולמחוק אותו אחרי שהתהליך מסתיים.