במדריך הזה מוסבר איך אפשר לפרוס את Microsoft Active Directory Federation Services (AD FS) ל-Windows Server 2019 בדומיין של שירות מנוהל ל-Microsoft Active Directory.
התרשים הבא מדגים את הפריסה:
המשתמשים מתקשרים עם מאזן עומסים של HTTPS שמשתמש באישור שמנוהל על ידי Google כדי לסיים חיבורי SSL. מאזן העומסים מעביר את החיבורים למופע של מכונה וירטואלית שמופעלת בה Microsoft AD FS ל-Windows Server 2019, ושמצורפת לדומיין שירות מנוהל ל-Microsoft AD. התקשורת בין מאזן העומסים לבין מכונת ה-VM מאובטחת באמצעות אישור SSL בחתימה עצמית.
הפריסה משתמשת במופע יחיד של AD FS ובמסד הנתונים הפנימי של Windows, ולכן היא מתאימה לסביבות קטנות. בסביבות שבהן יש דרישות גבוהות יותר של אמינות או אבטחה, כדאי לפרוס כמה מופעים של AD FS בתצורת חוות ולפרוס שרתי proxy של פדרציה.
לפני שמתחילים
- יצירת דומיין של שירות מנוהל ל-Microsoft AD
- מאחזרים את פרטי הכניסה של חשבון האדמין המואצל של שירות מנוהל ל-Microsoft AD. כברירת מחדל, השם של חשבון האדמין שקיבל הרשאה הוא
setupadmin. - יצירת תחום DNS ציבורי משתמשים באזור הזה כדי ליצור שם DNS ציבורי ל-AD FS.
- חשוב לוודא שאתם מכירים את הדרישות לפריסת AD FS.
הכנת הפרויקט והרשת
צריך להכין את Google Cloud הפרויקט ואת רשת ה-VPC לפריסה של AD FS.
יצירת מופע של VM
יוצרים חשבון שירות ומופע של מכונה וירטואלית להרצת AD FS:
בGoogle Cloud מסוף, פותחים את Cloud Shell.
מגדירים את מזהה הפרויקט שמוגדר כברירת מחדל:
gcloud config set project PROJECT_ID
מחליפים את
PROJECT_IDבמזהה הפרויקט. Google Cloudמגדירים את האזור ואת האזור שמוגדר כברירת מחדל:
gcloud config set compute/region REGION gcloud config set compute/zone ZONE
מחליפים את מה שכתוב בשדות הבאים:
-
REGION: המזהה של האזור שבו רוצים לפרוס. -
ZONE: המזהה של האזור שבו רוצים לבצע פריסה.
-
יוצרים חשבון שירות:
gcloud iam service-accounts create SA_NAME
מחליפים את
SA_NAMEבשם של חשבון השירות.יוצרים מכונה וירטואלית שמופעל בה Windows Server 2019 ומשתמשים בסקריפט מיוחד כדי להתקין באופן אוטומטי את תפקיד השרת AD FS:
gcloud compute instances create VM_NAME \ --machine-type n2-standard-8 \ --image-family windows-2019 \ --image-project windows-cloud \ --boot-disk-size 50 \ --boot-disk-type pd-ssd \ --subnet SUBNET_NAME \ --service-account SA_NAME@$(gcloud config get-value core/project).iam.gserviceaccount.com \ --metadata sysprep-specialize-script-ps1="Add-WindowsFeature ADFS-Federation -IncludeManagementTools;Add-WindowsFeature RSAT-AD-PowerShell;Add-WindowsFeature RSAT-ADDS-Tools"
מחליפים את מה שכתוב בשדות הבאים:
-
VM_NAME: השם של מופע ה-VM. -
SUBNET_NAME: השם של תת-הרשת שבה רוצים לפרוס את AD FS. -
SA_NAME: השם של חשבון השירות.
כדי להגדיר את מכונת ה-VM ולהצטרף לדומיין Active Directory, מבצעים את השלבים הבאים:
כדי לעקוב אחרי תהליך האתחול של המכונה הווירטואלית, אפשר לצפות בפלט של היציאה הטורית שלה:
gcloud compute instances tail-serial-port-output VM_NAME
מחכים כ-3 דקות עד שרואים את הפלט
Instance setup finished, ואז מקישים על Ctrl+C. בשלב הזה, מופע המכונה הווירטואלית מוכן לשימוש.יוצרים שם משתמש וסיסמה למכונה הווירטואלית.
מתחברים למכונה הווירטואלית באמצעות Remote Desktop ומתחברים באמצעות שם המשתמש והסיסמה שנוצרו בשלב הקודם.
לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).
לוחצים על כן כדי לאשר את ההודעה על העלאת הרשאות.
מצטרפים עם המחשב לדומיין Active Directory ומפעילים מחדש:
Add-Computer -Domain DOMAIN -Restart
מחליפים את
DOMAINבשם ה-DNS של דומיין Active Directory.ממתינים כדקה עד שההפעלה מחדש תסתיים.
-
יצירת מאזן עומסים
צריך ליצור מאזן עומסים שיאפשר למשתמשים לגשת ל-AD FS באמצעות כתובת IP וירטואלית אחת.
כדי לשייך את מופע ה-VM שמריץ את AD FS למאזן העומסים, קודם יוצרים קבוצת מופעים לא מנוהלת, ואז מקצים את קבוצת המופעים הזו למאזן העומסים:
- חוזרים לסשן הקיים של Cloud Shell.
יוצרים את קבוצת המכונות הלא מנוהלת:
gcloud compute instance-groups unmanaged create INSTANCE_GROUP_NAME && gcloud compute instance-groups set-named-ports INSTANCE_GROUP_NAME --named-ports=http:443
מחליפים את
INSTANCE_GROUP_NAMEבשם של הקבוצה שרוצים ליצור.מוסיפים את מופע המכונה הווירטואלית הקיים לקבוצת המופעים:
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances VM_NAME
יוצרים בדיקת תקינות שבודקת את יציאת ה-HTTPS של AD FS:
gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port 443
מחליפים את
HEALTH_CHECK_NAMEבשם של בדיקת תקינות.יוצרים שירות לקצה העורפי של מאזן עומסים שמשתמש בבדיקת תקינות ב-HTTPS ובקבוצת המופעים שיצרתם קודם:
gcloud compute backend-services create BACKEND_SERVICE_NAME \ --health-checks HEALTH_CHECK_NAME \ --port-name http \ --protocol HTTPS \ --global && \ gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group INSTANCE_GROUP_NAME \ --global \ --instance-group-zone $(gcloud config get-value compute/zone)
מחליפים את
BACKEND_SERVICE_NAMEבשם של שירות לקצה העורפי.שומרים כתובת IP חיצונית סטטית למאזן העומסים:
gcloud compute addresses create ADDRESS_NAME --global
מחליפים את
ADDRESS_NAMEבשם שרוצים לשייך לכתובת הזו.יוצרים אישור SSL מנוהל למאזן העומסים:
gcloud compute ssl-certificates create CERTIFICATE_NAME \ --domains PUBLIC_FQDN \ --global
מחליפים את מה שכתוב בשדות הבאים:
-
CERTIFICATE_NAME: השם של אישור ה-SSL המנוהל. -
PUBLIC_FQDN: שם הדומיין הציבורי שמוגדר במלואו (FQDN) שבו רוצים להשתמש עבור AD FS. לדוגמה,login.example.com.
-
יוצרים קצה קדמי של מאזן עומסים שמשתמש בכתובת ה-IP החיצונית ומעביר את התנועה לשירות הקצה העורפי:
gcloud compute url-maps create URL_MAP_NAME \ --default-service BACKEND_SERVICE_NAME && \ gcloud compute target-https-proxies create PROXY_NAME \ --ssl-certificates CERTIFICATE_NAME \ --url-map URL_MAP_NAME && \ gcloud compute forwarding-rules create FORWARDING_RULE_NAME \ --global \ --address ADDRESS_NAME \ --target-https-proxy PROXY_NAME \ --ports 443
מחליפים את מה שכתוב בשדות הבאים:
-
URL_MAP_NAME: השם של מפת ה-URL של מאזן העומסים. -
PROXY_NAME: השם של פרוקסי היעד של מאזן העומסים. -
FORWARDING_RULE_NAME: השם של כלל ההעברה של מאזן העומסים.
-
יוצרים כלל חומת אש שמאפשר תעבורת נתונים ממאזן העומסים אל מופע המכונה הווירטואלית שבו פועל AD FS:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \ --allow tcp:443 \ --network VPC_NAME \ --source-ranges 130.211.0.0/22,35.191.0.0/16 \ --target-service-accounts SA_NAME@$(gcloud config get-value core/project).iam.gserviceaccount.com
מחליפים את מה שכתוב בשדות הבאים:
-
FIREWALL_RULE_NAME: השם של כלל חומת האש. -
VPC_NAME: השם של רשת ה-VPC. -
SA_NAME: השם של חשבון השירות.
טווח כתובות המקור הוא טווח כתובות ה-IP של מאזן העומסים הפנימי. למידע נוסף: הגדרת כלל חומת אש.
-
מחפשים את כתובת ה-IP של מאזן העומסים:
gcloud compute addresses describe ADDRESS_NAME \ --global \ --format=value\(address\)
יוצרים רשומת DNS
Aבתחום ה-DNS הציבורי שמפנה לכתובת ה-IP של מאזן העומסים. השם המלא של רשומת ה-DNS חייב להיות זהה לשם שבו השתמשתם לאישור ה-SSL.
פריסת AD FS
צריך לפרוס את תפקיד השרת AD FS במכונה הווירטואלית. מכיוון שאין לכם הרשאות Domain Admins בדומיין של שירות מנוהל ל-Microsoft AD, אתם לא יכולים להשתמש ב-Server Manager כדי לבצע את ההתקנה, ותצטרכו להשתמש ב-PowerShell במקום זאת.
יצירת משתמש שירות
צריך ליצור חשבון משתמש ב-Active Directory עבור שירות AD FS:
- מתחברים למופע של המכונה הווירטואלית באמצעות שולחן עבודה מרוחק ונכנסים באמצעות פרטי הכניסה של האדמין עם הרשאות הגישה שהוקצו לו.
- לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).
מגדירים סיסמה אקראית לחשבון השירות של AD FS:
$AdfsCredential = Get-Credential -UserName USER -Message 'PASSWORD'
מחליפים את מה שכתוב בשדות הבאים:
-
USER: השם של משתמש ב-Active Directory. -
PASSWORD: הסיסמה של המשתמש ב-Active Directory.
-
יוצרים משתמש Active Directory:
$CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName $AdfsUser = New-ADuser ` -Name USER ` -DisplayName 'AD FS service account' ` -AccountPassword $AdfsCredential.Password ` -Path "$CloudOuPath" ` -PasswordNeverExpires $True ` -PassThru | Enable-ADAccount -PassThru
מוסיפים את המשתמש לקבוצה המקומית של אדמינים:
Add-LocalGroupMember ` -Group "Administrators" ` -Member "$env:userdomain\USER"
הקצאת שם ראשי של שירות:
setspn -a http/PUBLIC_FQDN USER
מחליפים את
PUBLIC_FQDNבשם הדומיין הציבורי שמוגדר במלואו של AD FS.יוצרים קונטיינר ריק ב-Active Directory. תצטרכו להשתמש במאגר הזה בהמשך, כשמתקינים את AD FS:
New-ADObject ` -Type Container ` -Name "ADFS Data" ` -Path $CloudOuPath
נותנים למשתמש AD FS שליטה מלאה בקונטיינר:
dsacls.exe "CN=ADFS Data,$CloudOuPath" /G $env:userdomain\USER:GA /I:T
התקנה של AD FS
אפשר להתקין את AD FS במופע של מכונה וירטואלית:
מתחילים סשן PowerShell בתור משתמש ADFS:
runas /u:$env:userdomain\USER powershell
סשן PowerShell החדש פועל כמשתמש AD FS, אבל ללא הרשאות מורחבות.
בסשן החדש של PowerShell, מתחילים סשן שני של PowerShell עם הרשאות ניהול:
Start-Process PowerShell -Verb RunAs
צריך להריץ את כל השלבים הבאים בסשן החדש של PowerShell עם הרשאות אדמין.
יוצרים אישור SSL בחתימה עצמית שמשתמש במפתח RSA של 2048 ביט ומאחסנים אותו במאגר האישורים של המחשב:
$DnsName="PUBLIC_FQDN" $Certificate = New-SelfSignedCertificate ` -Subject $DnsName ` -KeyAlgorithm RSA ` -KeyLength 2048 ` -KeyExportPolicy NonExportable ` -KeyUsage DigitalSignature, KeyEncipherment ` -Provider 'Microsoft Platform Crypto Provider' ` -NotAfter (Get-Date).AddDays(365) ` -Type SSLServerAuthentication ` -CertStoreLocation 'Cert:\LocalMachine\My' ` -DnsName $DnsName
מחליפים את
PUBLIC_FQDNבשם הדומיין הציבורי שמוגדר במלואו של AD FS.יוצרים עוד אישור RSA של 2048 ביט ש-AD FS משתמש בו כאישור לחתימת טוקנים:
$SigningCertificate = New-SelfSignedCertificate ` -Subject "ADFS Signing" ` -KeyAlgorithm RSA ` -KeyLength 2048 ` -KeyExportPolicy NonExportable ` -KeyUsage DigitalSignature, KeyEncipherment ` -Provider 'Microsoft RSA SChannel Cryptographic Provider' ` -NotAfter (Get-Date).AddDays(365) ` -DnsName $DnsName ` -CertStoreLocation 'Cert:\LocalMachine\My'
יוצרים מאגר מפתחות מבוזר (DKM):
$CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName $DkmContainer = New-ADObject ` -Name ((New-Guid).Guid) ` -Type Container ` -Path "CN=ADFS Data,$CloudOuPath" ` -PassThru
מזינים מחדש את פרטי הכניסה של המשתמש ב-AD FS שהגדרתם קודם:
$AdfsCredential = Get-Credential -UserName "$env:userdomain\USER" -Message 'PASSWORD'
מתקינים את AD FS באמצעות האישורים וקונטיינר ה-DKM שיצרתם קודם:
Install-ADFSFarm ` -CertificateThumbprint $Certificate.Thumbprint ` -SigningCertificateThumbprint $SigningCertificate.Thumbprint ` -DecryptionCertificateThumbprint $SigningCertificate.Thumbprint ` -FederationServiceName $DnsName ` -ServiceAccountCredential $AdfsCredential ` -OverwriteConfiguration ` -AdminConfiguration @{"DKMContainerDn"=$DkmContainer.DistinguishedName}יכול להיות שיוצגו הודעות האזהרה הבאות:
WARNING: A machine restart is required to complete ADFS service configuration. For more information, see: https://go.microsoft.com/fwlink/?LinkId=798725 WARNING: The SSL certificate subject alternative names do not support host name 'PUBLIC_FQDN'. Configuring certificate authentication binding on port '49443' and hostname 'PUBLIC_FQDN'. WARNING: An error occurred during an attempt to set the SPN for the specified service account. Set the SPN for the service account manually. For more information about setting the SPN of the service account manually, see the AD FS Deployment Guide. Error message: An error occurred during an attempt to set the SPN for the specified service account. You do not have sufficient privileges in the domain to set the SPN. WARNING: The SSL certificate does not contain all UPN suffix values that exist in the enterprise. Users with UPN suffix values not represented in the certificate will not be able to Workplace-Join their devices. For more information, see http://go.microsoft.com/fwlink/?LinkId=311954.
אפשר להתעלם מהאזהרות האלה כי כבר הגדרתם את ה-SPN ואתם לא משתמשים באימות מבוסס-אישורים.
אם אתם מתכננים להשתמש באימות Windows משולב (IWA) כדי לבצע אימות ל-AD FS, מריצים את הפקודה הבאה כדי להשבית את קישור האסימון:
Set-ADFSProperties -ExtendedProtectionTokenCheck None Restart-Service -Name adfssrv
השבתת שיוך הטוקן נדרשת כי אתם פורסים את AD FS מאחורי מאזן עומסים, ומאזן העומסים מסיים את חיבורי ה-TLS.
אם נתקלתם בבעיות שקשורות להרשאות במהלך ביצוע השלבים האלה, אתם יכולים לפנות Google Cloud לתמיכה.
הגדרת TLS
כשמקימים חיבורים לבק-אנד, מאזן העומסים של HTTPS לא משתמש בתוסף Server Name Indication (SNI). כדי לאפשר ל-AD FS לקבל חיבור ללא SNI, צריך להגדיר חזרה לאחור של אישור:
ב-PowerShell, מציגים את הקישורים של אישור שרת ה-SSL ל-AD FS:
netsh http show sslcert hostnameport=PUBLIC_FQDN:443
מחליפים את
PUBLIC_FQDNבשם הדומיין הציבורי המלא של AD FS.מגדירים אישור חלופי לקישור:
netsh http add sslcert ipport=0.0.0.0:443 certhash=CERTIFICATE_HASH "appid=APP_ID" "certstorename=MY"
מחליפים את מה שכתוב בשדות הבאים:
-
CERTIFICATE_HASH: הגיבוב של האישור שמופיע בפקודה הקודמת. -
APP_ID: מזהה האפליקציה שמוצג בפקודה הקודמת, כולל הסוגריים המסולסלים.
-
מפעילים מחדש את המחשב כדי להשלים את ההתקנה:
Restart-Computer
ממתינים כדקה עד שההפעלה מחדש תסתיים.
בדיקת AD FS
שירות AD FS נפרס, אבל עדיין צריך לוודא שאפשר לגשת לשירות באמצעות מאזן העומסים של HTTPS:
- חוזרים לסשן Cloud Shell.
מוודאים שאישור ה-SSL נמצא במצב
ACTIVE:gcloud compute ssl-certificates describe CERTIFICATE_NAME \ --global \ --format="get(managed.status)"אם האישור במצב
PROVISIONING, יכול להיות שיידרש זמן נוסף להפצה של רשומת ה-DNS שיצרתם עבור AD FS. פרטים נוספים זמינים במאמר פתרון בעיות באישורים שמנוהלים על ידי Google.במחשב המקומי, פותחים דפדפן ועוברים לכתובת ה-URL הבאה:
https://PUBLIC_FQDN/adfs/ls?wa=wsignout1.0
מחליפים את
PUBLIC_FQDNבשם הדומיין הציבורי המלא של AD FSמוודאים שמופיעה ההודעה
You have successfully signed out, שמציינת שהפריסה של AD FS בוצעה בהצלחה.
אם אתם מתכננים להשתמש ב-Integrated Windows Authentication (IWA), ודאו שאתם יכולים לקבל כרטיס Kerberos ל-AD FS:
- מתחברים למופע של מכונה וירטואלית או למכונה וירטואלית אחרת שמצורפת לדומיין באמצעות Remote Desktop ונכנסים באמצעות פרטי הכניסה לדומיין.
- לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell.
משתמשים בפקודה
klistכדי לבקש כרטיס שירות עבור AD FS:klist get http/PUBLIC_FQDN
מוודאים שהפלט כולל כרטיס ל-AD FS:
#1> Client: USER @ DOMAIN Server: http/PUBLIC_FQDN @ DOMAIN KerbTicket Encryption Type: ...
AD FS מוכן לשימוש. פרטים על השימוש בשירות ועל הגדרתו זמינים במאמר AD FS Operations.