Edge for Private Cloud גרסה 4.17.05
בעזרת מיפוי תפקידים חיצוני תוכלו למפות קבוצות או תפקידים שלכם לתפקידים ולקבוצות של בקרת גישה מבוססת-תפקידים (RBAC) שנוצרו ב-Apigee Edge.
דרישות מוקדמות
- כדי לבצע את ההגדרה הזו, צריך להיות מנהלי מערכת בענן הפרטי של Apigee עם פרטי כניסה גלובליים של אדמין.
- אתם צריכים לדעת מהי ספריית השורש של התקנת הענן הפרטי של Apigee Edge. תיקיית השורש המוגדרת כברירת מחדל היא /opt. אם בחרתם ספריית שורש אחרת במהלך התקנת הענן הפרטי של Apigee Edge, השתמשו בה במקום ב-/opt כדי לפעול לפי ההוראות הבאות.
- להשיג את קובצי ה-JAR הנדרשים מ-Apigee.
צריך לוודא שהמשתמשים רשומים ב-Edge ובשירות הספרייה
כשמשתמשים במיפוי תפקידים, כל המשתמשים שניגשים ל-Edge צריכים להיות קיימים גם בשירות הספריות החיצוני וגם במאגר המשתמשים של Edge. כלומר, כשמוסיפים משתמש לשירות הספרייה החיצוני, צריך להוסיף את אותו המשתמש גם למאגר המשתמשים של Apigee.
לדוגמה, המשתמש a01@company.com קיים בקבוצת הספריות החיצוניות 'apiadmin'. לאחר מכן תוכלו למפות את המשתמש a01@company.com לתפקיד orgadmin ב-Edge. לכן, קודם צריך להוסיף את המשתמש a01@company.com לקבוצה orgadmin ב-Edge.
לקבלת מידע נוסף על יצירת משתמשי Edge והקצאתם לתפקידים, ראו יצירת משתמשים גלובליים.
הגדרות ברירת מחדל
מיפוי תפקידים חיצוני מושבת כברירת מחדל.
הפעלת מיפוי תפקידים חיצוני
- לפני שמשלימים את ההגדרות הבאות, צריך ליצור מחלקה Java שמממשת את הממשק ExternalRoleMapperService. לקבלת פרטים על היישום הזה, ראו את ההטמעה לדוגמה שבהמשך.
- מתחברים לשרת הניהול של Apigee Edge ומפסיקים את שרת הניהול:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server stop - בודקים את הסטטוס של השרתים. יש לוודא ששרת הניהול מופסק או לא פועל:
> /opt/apigee/apigee-service/bin/apigee-all status - פותחים את /opt/apigee/customer/application/management-server.properties בכלי לעריכת טקסט.
- עורכים את הקובץ management-server.properties עם ההגדרות הבאות:
conf_security_authentication.user.store=externalized.authentication
conf_security_externalized.authentication.role.mapper.enabled=true
conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.ExternalRoleMapperImpl
חשוב: מחלקת ההטמעה ושם החבילה שצוינו למעלה, ExternalRoleMapperImpl, הם דוגמה בלבד. מדובר במחלקה שצריך להטמיע, ושאפשר לתת למחלקה ולחבילה כל שם שרוצים. לפרטים על הטמעת הסיווג הזה, ראו הטמעה לדוגמה בהמשך. - שומרים את הקובץ management-server.properties.
- הפעלה של שרת הניהול:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server start - יש לוודא שהשרת פועל:
> /opt/apigee/apigee-service/bin/apigee-all status
השבתה של הרשאה חיצונית
כדי להשבית הרשאה חיצונית:
- פותחים את /opt/apigee/customer/application/management-server.properties בכלי לעריכת טקסט.
- שינוי מאגר המשתמשים לאימות ל-ldap:
conf_security_authentication.user.store=ldap - מגדירים את המאפיין הבא כ-False:
conf_security_externalized.authentication.role.mapper.enabled=false - הפעלה מחדש של שרת הניהול:
> /opt/apigee/apigee-service/bin/apigee-service edge-management-server מחדש
מידע על ההטמעה לדוגמה של ExternalRoleMapperImpl
בקובץ התצורה management-server.properties שמתואר למעלה, שימו לב לשורה הבאה:
conf_security_externalized.authentication.role.mapper.implementation.class=com.customer.authorization.impl.ExternalRoleMapperImpl
מחלקה זו מטמיעה את הממשק ExternalRoleMapperService, והוא נדרש. עליכם ליצור הטמעה משלכם לכיתה הזו, שתשקף את הקבוצות המתאימות. כשמסיימים, צריך למקם את המחלקה שעברה הידור ב-JAR ולשים את ה-JAR הזה ב-/<install_dir>/apigee/edge-gateway/lib/infra/libraries.
אתם יכולים לתת למחלקה ולחבילה כל שם שתרצו כל עוד הטמעת את ExternalRoleMapperService, היא נגישה ב-classpath ומופיעה הפניה נכונה בקובץ התצורה management-server.properties.
בהמשך תוכלו לראות הטמעה לדוגמה של מחלקה ExternalRoleMapperImpl שקיבלה תגובה טובה. כדי להדר את הכיתה הזו, צריך להפנות לקובץ ה-JAR הבא שכלול ב-Edge:
/<install_dir>/apigee/edge-gateway/lib/infra/libraries/authentication-1.0.0.jar
package com.apigee.authenticate; import com.apigee.authentication.ConfigBean; import com.apigee.authentication.ConnectionException; import com.apigee.authentication.ExternalRoleMapperService; import com.apigee.authentication.NameSpace; import com.apigee.authentication.NameSpacedRole; import com.apigee.authorization.namespace.OrganizationNamespace; import com.apigee.authorization.namespace.SystemNamespace; import java.util.Collection; import java.util.HashSet; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; /** * * Sample Implementation constructed with dummy roles with required namespaces. * * Created by GopiAlagar on 6/12/15. */ public class ExternalRoleMapperImpl implements ExternalRoleMapperService { InitialDirContext dirContext = null; @Override public void stop() throws Exception { } /** * * This method would be implemented by the customer, Below is the basic * example. * * If User has sysadmin role then it's expected to set SystemNameSpace * along with the * res\quested NameSpace. Otherwise role's requestedNameSpace to be set * for the NameSpacedRole. * * Collection<NameSpacedRole> results = new HashSet<NameSpacedRole>(); * * NameSpacedRole sysNameSpace = new NameSpacedRole("sysadmin", * SystemNamespace.get()); * * String orgName = * ((OrganizationNamespace)requestedNameSpace).getOrganization(); * * NameSpacedRole orgNameSpace = new NameSpacedRole ("orgadmin", * requestedNameSpace); * * results.add(sysNameSpace); * * results.add(orgNameSpace); */ public Collection<NameSpacedRole> getUserRoles(String userName, String password, NameSpace requestedNameSpace) { /* * There are 3 actions performed in the below implementation * 1. Authenticate Given User against ADS * 2. Fetch the internal groups from the ADS * 3. Map the internal group into the apigee-edge roles */ /*************************************************************/ /******************* Authenticate Given User *******************/ /*************************************************************/ // Customer Specific Implementation will override this method // implementation. // Obtain dnName for given username or email address. String dnName = ImplementDnameLookupLogic(); if (dnName == null) { System.out.println("Error "); } DirContext dirContext = null; Collection<NameSpacedRole> results = new HashSet<NameSpacedRole>(); try { // Verify the credentials for a given username or dnName // and password in order to create a directory context. dirContext = ImplementDirectoryContextCreationLogic(); /****************************************************/ /********** Fetch internal groups *******************/ /****************************************************/ String groupDN = "OU=Groups,DC=corp,DC=wacapps,DC=net"; SearchControls controls = new SearchControls(); controls.setSearchScope(SearchControls.ONELEVEL_SCOPE); NamingEnumeration<SearchResult> groups = dirContext.search(groupDN,"(objectClass=*)", new Object[] { "", "" }, controls); if (groups.hasMoreElements()) { while (groups.hasMoreElements()) { SearchResult searchResult = groups.nextElement(); Attributes attributes = searchResult.getAttributes(); String groupName = attributes.get("name").get().toString(); /**************************************/ /** Map the internal group into the ***/ /** apigee-edge roles ***/ /**************************************/ if (groupName.equals("BusDev")) { results.add(new NameSpacedRole("businessAdmin",SystemNamespace.get())); } else if (groupName.equals("DevSupport")) { results.add(new NameSpacedRole("devOpsAdmin",SystemNamespace.get())); } else if (groupName.equals("Engineering")) { if (requestedNameSpace instanceof OrganizationNamespace) { String orgName = ((OrganizationNamespace) requestedNameSpace).getOrganization(); results.add(new NameSpacedRole("orgadmin", new OrganizationNamespace(orgName))); } } else if (groupName.equals("Operations") || groupName.equals("IT")) { results.add(new NameSpacedRole("sysadmin",SystemNamespace.get())); } else if (groupName.equals("Marketing")) { results.add(new NameSpacedRole("marketAdmin",SystemNamespace.get())); } else { results.add(new NameSpacedRole("readOnly",SystemNamespace.get())); } } } else { /** * In case of no group found or exception found we throw empty * roles. */ System.out.println(" !!!!! NO GROUPS FOUND !!!!!"); } } catch (Exception ex) { ex.printStackTrace(); System.out.println("Error in authenticating User: {}" + new Object[] { userName }); } finally { // Customer implementation to close // ActiveDirectory/LDAP context. } return results; } @Override public void start(ConfigBean arg0) throws ConnectionException { try { // Create InitialDirContext. // Create a directory context based on the // system admin user credentials. dirContext = ImplementDirContextCreationLogicForSysAdmin(); } catch (NamingException e) { // TODO Auto-generated catch block throw new ConnectionException(e); } } }