פריסת AD FS בדומיין של שירות מנוהל ל-Microsoft AD

במדריך הזה מוסבר איך אפשר לפרוס את 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 של פדרציה.

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

הכנת הפרויקט והרשת

צריך להכין את Google Cloud הפרויקט ואת רשת ה-VPC לפריסה של AD FS.

יצירת מופע של VM

יוצרים חשבון שירות ומופע של מכונה וירטואלית להרצת AD FS:

  1. בGoogle Cloud מסוף, פותחים את Cloud Shell.

    הפעלת Cloud Shell

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

    gcloud config set project PROJECT_ID
    

    מחליפים את PROJECT_ID במזהה הפרויקט. Google Cloud

  3. מגדירים את האזור ואת האזור שמוגדר כברירת מחדל:

    gcloud config set compute/region REGION
    gcloud config set compute/zone ZONE
    

    מחליפים את מה שכתוב בשדות הבאים:

    • REGION: המזהה של האזור שבו רוצים לפרוס.
    • ZONE: המזהה של האזור שבו רוצים לבצע פריסה.
  4. יוצרים חשבון שירות:

    gcloud iam service-accounts create SA_NAME
    

    מחליפים את SA_NAME בשם של חשבון השירות.

  5. יוצרים מכונה וירטואלית שמופעל בה 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, מבצעים את השלבים הבאים:

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

      gcloud compute instances tail-serial-port-output VM_NAME
      

      מחכים כ-3 דקות עד שרואים את הפלט Instance setup finished, ואז מקישים על Ctrl+C. בשלב הזה, מופע המכונה הווירטואלית מוכן לשימוש.

    2. יוצרים שם משתמש וסיסמה למכונה הווירטואלית.

    3. מתחברים למכונה הווירטואלית באמצעות Remote Desktop ומתחברים באמצעות שם המשתמש והסיסמה שנוצרו בשלב הקודם.

    4. לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).

    5. לוחצים על כן כדי לאשר את ההודעה על העלאת הרשאות.

    6. מצטרפים עם המחשב לדומיין Active Directory ומפעילים מחדש:

      Add-Computer -Domain DOMAIN -Restart
      

      מחליפים את DOMAIN בשם ה-DNS של דומיין Active Directory.

      ממתינים כדקה עד שההפעלה מחדש תסתיים.

יצירת מאזן עומסים

צריך ליצור מאזן עומסים שיאפשר למשתמשים לגשת ל-AD FS באמצעות כתובת IP וירטואלית אחת.

כדי לשייך את מופע ה-VM שמריץ את AD FS למאזן העומסים, קודם יוצרים קבוצת מופעים לא מנוהלת, ואז מקצים את קבוצת המופעים הזו למאזן העומסים:

  1. חוזרים לסשן הקיים של Cloud Shell.
  2. יוצרים את קבוצת המכונות הלא מנוהלת:

    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 בשם של הקבוצה שרוצים ליצור.

  3. מוסיפים את מופע המכונה הווירטואלית הקיים לקבוצת המופעים:

    gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP_NAME --instances VM_NAME
    
  4. יוצרים בדיקת תקינות שבודקת את יציאת ה-HTTPS של AD FS:

    gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port 443
    

    מחליפים את HEALTH_CHECK_NAME בשם של בדיקת תקינות.

  5. יוצרים שירות לקצה העורפי של מאזן עומסים שמשתמש בבדיקת תקינות ב-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 בשם של שירות לקצה העורפי.

  6. שומרים כתובת IP חיצונית סטטית למאזן העומסים:

    gcloud compute addresses create ADDRESS_NAME --global
    

    מחליפים את ADDRESS_NAME בשם שרוצים לשייך לכתובת הזו.

  7. יוצרים אישור SSL מנוהל למאזן העומסים:

    gcloud compute ssl-certificates create CERTIFICATE_NAME \
      --domains PUBLIC_FQDN \
      --global
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CERTIFICATE_NAME: השם של אישור ה-SSL המנוהל.
    • PUBLIC_FQDN: שם הדומיין הציבורי שמוגדר במלואו (FQDN) שבו רוצים להשתמש עבור AD FS. לדוגמה, login.example.com.
  8. יוצרים קצה קדמי של מאזן עומסים שמשתמש בכתובת ה-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: השם של כלל ההעברה של מאזן העומסים.
  9. יוצרים כלל חומת אש שמאפשר תעבורת נתונים ממאזן העומסים אל מופע המכונה הווירטואלית שבו פועל 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 של מאזן העומסים הפנימי. למידע נוסף: הגדרת כלל חומת אש.

  10. מחפשים את כתובת ה-IP של מאזן העומסים:

    gcloud compute addresses describe ADDRESS_NAME \
       --global \
       --format=value\(address\)
    
  11. יוצרים רשומת DNS A בתחום ה-DNS הציבורי שמפנה לכתובת ה-IP של מאזן העומסים. השם המלא של רשומת ה-DNS חייב להיות זהה לשם שבו השתמשתם לאישור ה-SSL.

פריסת AD FS

צריך לפרוס את תפקיד השרת AD FS במכונה הווירטואלית. מכיוון שאין לכם הרשאות Domain Admins בדומיין של שירות מנוהל ל-Microsoft AD, אתם לא יכולים להשתמש ב-Server Manager כדי לבצע את ההתקנה, ותצטרכו להשתמש ב-PowerShell במקום זאת.

יצירת משתמש שירות

צריך ליצור חשבון משתמש ב-Active Directory עבור שירות AD FS:

  1. מתחברים למופע של המכונה הווירטואלית באמצעות שולחן עבודה מרוחק ונכנסים באמצעות פרטי הכניסה של האדמין עם הרשאות הגישה שהוקצו לו.
  2. לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell (Admin).
  3. מגדירים סיסמה אקראית לחשבון השירות של AD FS:

    $AdfsCredential = Get-Credential -UserName USER -Message 'PASSWORD'
    

    מחליפים את מה שכתוב בשדות הבאים:

    • USER: השם של משתמש ב-Active Directory.
    • PASSWORD: הסיסמה של המשתמש ב-Active Directory.
  4. יוצרים משתמש 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
    
  5. מוסיפים את המשתמש לקבוצה המקומית של אדמינים:

    Add-LocalGroupMember `
     -Group "Administrators" `
     -Member "$env:userdomain\USER"
    
  6. הקצאת שם ראשי של שירות:

    setspn -a http/PUBLIC_FQDN USER
    

    מחליפים את PUBLIC_FQDN בשם הדומיין הציבורי שמוגדר במלואו של AD FS.

  7. יוצרים קונטיינר ריק ב-Active Directory. תצטרכו להשתמש במאגר הזה בהמשך, כשמתקינים את AD FS:

    New-ADObject `
      -Type Container `
      -Name "ADFS Data" `
      -Path $CloudOuPath
    
  8. נותנים למשתמש AD FS שליטה מלאה בקונטיינר:

    dsacls.exe "CN=ADFS Data,$CloudOuPath" /G $env:userdomain\USER:GA /I:T
    

התקנה של AD FS

אפשר להתקין את AD FS במופע של מכונה וירטואלית:

  1. מתחילים סשן PowerShell בתור משתמש ADFS:

    runas /u:$env:userdomain\USER powershell
    

    סשן PowerShell החדש פועל כמשתמש AD FS, אבל ללא הרשאות מורחבות.

  2. בסשן החדש של PowerShell, מתחילים סשן שני של PowerShell עם הרשאות ניהול:

    Start-Process PowerShell -Verb RunAs
    

    צריך להריץ את כל השלבים הבאים בסשן החדש של PowerShell עם הרשאות אדמין.

  3. יוצרים אישור 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.

  4. יוצרים עוד אישור 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'
    
  5. יוצרים מאגר מפתחות מבוזר (DKM):

    $CloudOuPath = "OU=Cloud," + (Get-ADDomain).DistinguishedName
    $DkmContainer = New-ADObject `
      -Name ((New-Guid).Guid) `
      -Type Container `
      -Path "CN=ADFS Data,$CloudOuPath" `
      -PassThru
    
  6. מזינים מחדש את פרטי הכניסה של המשתמש ב-AD FS שהגדרתם קודם:

    $AdfsCredential = Get-Credential -UserName "$env:userdomain\USER" -Message 'PASSWORD'
    
  7. מתקינים את 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 ואתם לא משתמשים באימות מבוסס-אישורים.

  8. אם אתם מתכננים להשתמש באימות 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, צריך להגדיר חזרה לאחור של אישור:

  1. ב-PowerShell, מציגים את הקישורים של אישור שרת ה-SSL ל-AD FS:

    netsh http show sslcert hostnameport=PUBLIC_FQDN:443
    

    מחליפים את PUBLIC_FQDN בשם הדומיין הציבורי המלא של AD FS.

  2. מגדירים אישור חלופי לקישור:

    netsh http add sslcert ipport=0.0.0.0:443 certhash=CERTIFICATE_HASH "appid=APP_ID" "certstorename=MY"
    

    מחליפים את מה שכתוב בשדות הבאים:

    • CERTIFICATE_HASH: הגיבוב של האישור שמופיע בפקודה הקודמת.
    • APP_ID: מזהה האפליקציה שמוצג בפקודה הקודמת, כולל הסוגריים המסולסלים.
  3. מפעילים מחדש את המחשב כדי להשלים את ההתקנה:

    Restart-Computer
    

    ממתינים כדקה עד שההפעלה מחדש תסתיים.

בדיקת AD FS

שירות AD FS נפרס, אבל עדיין צריך לוודא שאפשר לגשת לשירות באמצעות מאזן העומסים של HTTPS:

  1. חוזרים לסשן Cloud Shell.
  2. מוודאים שאישור ה-SSL נמצא במצב ACTIVE:

    gcloud compute ssl-certificates describe CERTIFICATE_NAME \
        --global \
        --format="get(managed.status)"
    

    אם האישור במצב PROVISIONING, יכול להיות שיידרש זמן נוסף להפצה של רשומת ה-DNS שיצרתם עבור AD FS. פרטים נוספים זמינים במאמר פתרון בעיות באישורים שמנוהלים על ידי Google.

  3. במחשב המקומי, פותחים דפדפן ועוברים לכתובת ה-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:

  1. מתחברים למופע של מכונה וירטואלית או למכונה וירטואלית אחרת שמצורפת לדומיין באמצעות Remote Desktop ונכנסים באמצעות פרטי הכניסה לדומיין.
  2. לוחצים לחיצה ימנית על Start (או מקישים על Win+X) ואז לוחצים על Windows PowerShell.
  3. משתמשים בפקודה 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.