האביב של שילוב קרברוס עם MiniKdc

למעלה אבטחה

הרגע הכרזתי על הקורס החדש ללמוד Spring Spring Security, כולל החומר המלא שהתמקד בערמת OAuth2 החדשה ב- Spring Security 5:

>> בדוק את הקורס

1. סקירה כללית

במדריך זה נספק סקירה כללית של Spring Security Kerberos.

נכתוב לקוח Kerberos בג'אווה שמסמיך את עצמו לגשת לשירות Kerberized שלנו. ואנחנו נפעיל את מרכז הפצת המפתחות המשובץ שלנו בכדי לבצע אימות קרברוס מלא מקצה לקצה. כל זאת, ללא כל תשתית חיצונית הנדרשת בזכות Spring Security Kerberos.

2. קרברוס ויתרונותיה

Kerberos הוא פרוטוקול אימות רשת שיצר MIT בשנות השמונים, שימושי במיוחד לריכוז האימות ברשת.

בשנת 1987, MIT שחררה אותו לקהילת הקוד הפתוח והיא עדיין בפיתוח פעיל. בשנת 2005 הוא הועלה כקודש כסטנדרט IETF תחתRFC 4120.

בדרך כלל, קרברוס כן משמש בסביבות ארגוניות. שם, זה מאבטח את הסביבה בצורה כזו המשתמש לא צריך לבצע אימות לכל שירות בנפרד. פתרון אדריכלי זה מכונהכניסה יחידה.

במילים פשוטות, Kerberos היא מערכת כרטיסים. משתמש מאמת פעם אחת ו מקבל כרטיס הענקת כרטיסים (TGT). לאחר מכן, תשתית הרשת מחליפה את ה- TGT בכרטיסי שירות. כרטיסי שירות אלה מאפשרים למשתמש לקיים אינטראקציה עם שירותי תשתית, כל עוד ה- TGT תקף, וזה בדרך כלל למשך כמה שעות.

אז נהדר שהמשתמש יחתום רק בפעם אחת. אבל יש גם יתרון ביטחוני: בסביבה כזו, ה סיסמת המשתמש לעולם לא נשלחת דרך הרשת. במקום זאת, Kerberos משתמש בו כגורם ליצירת מפתח סודי אחר שישמש להצפנת הודעות ופענוח.

יתרון נוסף הוא בכך אנו יכולים לנהל משתמשים ממקום מרכזי, תגיד אחד שמגובה ב- LDAP. לכן, אם אנו משביתים חשבון במסד הנתונים המרכזי שלנו עבור משתמש נתון, אנו נבטל את גישתו בתשתית שלנו. לפיכך, המנהלים אינם צריכים לבטל את הגישה בנפרד בכל שירות.

מבוא לאימות SPNEGO / Kerberos באביב מספק סקירה מעמיקה של הטכנולוגיה.

3. סביבה קרבריזית

אז בואו ניצור סביבה לאימות באמצעות פרוטוקול Kerberos. הסביבה תורכב משלושה יישומים נפרדים שיפעלו במקביל.

ראשון, יהיה לנו מרכז להפצת מפתח שישמש כנקודת האימות. לאחר מכן, נכתוב לקוח ויישום שירות אשר נקבע לשימוש בפרוטוקול Kerberos.

כעת, הפעלת Kerberos דורשת מעט התקנה ותצורה. עם זאת, ננצל את Kerberos של Spring Security, ולכן נפעיל את מרכז ההפצה המרכזי באופן פרוגרמטי, במצב מוטבע. וגם ה MiniKdc המוצג להלן שימושי במקרה של בדיקות אינטגרציה עם תשתית Kerberized.

3.1. הפעלת מרכז הפצה מפתח

ראשית, נשיק את מרכז הפצת המפתח שלנו, שינפיק עבורנו את ה- TGT:

מחרוזת [] config = MiniKdcConfigBuilder.builder () .workDir (preparWorkDir ()) .principals ("client / localhost", "HTTP / localhost") .confDir ("minikdc-krb5.conf"). KeytabName ("example.keytab ") .build (); MiniKdc.main (config);

בעיקרון, נתנו MiniKdc קבוצה של מנהלים וקובץ תצורה; בנוסף, אמרנו MiniKdc איך קוראים מקש מקשים זה מייצר.

MiniKdc תייצר krb5.conf קובץ שאנו מספקים ליישומי הלקוחות והשירותים שלנו. קובץ זה מכיל את המידע היכן ניתן למצוא את ה- KDC שלנו - המארח והיציאה לתחום נתון.

MiniKdc.main מפעיל את KDC ואמור להפיק משהו כמו:

MiniKdc עצמאי פועל ----------------------------------------------- ---- תחום: EXAMPLE.COM פועל ב: localhost: localhost krb5conf:. \ Spring-security-sso \ spring-security-sso-kerberos \ krb-test-workdir \ krb5.conf נוצר לוח מקשים:. \ Spring-security -sso \ spring-security-sso-kerberos \ krb-test-workdir \ example.keytab עם מנהלים: [client / localhost, HTTP / localhost]

3.2. יישום לקוח

הלקוח שלנו יהיה יישום Spring Boot שמשתמש ב- RestTemplate לבצע שיחות חיצוניות ל- REST API.

אבל, אנחנו הולכים להשתמש KerberosRestTemplate במקום זאת. זה יצטרך את מקש המקשים ואת מנהל הלקוח:

@Configuration מחלקה ציבורית KerberosConfig {@Value ("$ {app.user-principal: client / localhost}") מנהל מחרוזות פרטי; @Value ("$ {app.keytab-location}") מחרוזת פרטית keytabLocation; @Bean ציבורי RestTemplate restTemplate () {להחזיר KerberosRestTemplate חדש (keytabLocation, מנהל); }}

וזה הכל! KerberosRestTemplate מנהל משא ומתן לצד הלקוח בפרוטוקול Kerberos עבורנו.

אז בואו ליצור מחלקה מהירה שתשאיל נתונים על שירות משירות Kerberized, המתארח בנקודת הקצה app.access-url:

@Service class SampleClient {@Value ("$ {app.access-url}") נקודת קצה מחרוזת פרטית; פרטי RestTemplate restTemplate; // constructor, getter, setter String getData () {return restTemplate.getForObject (endpoint, String.class); }}

אז בואו ניצור את אפליקציית השירות שלנו עכשיו כדי שלמחלקה הזו יהיה למה להתקשר!

3.3. יישום שירות

נשתמש באביב אבטחה ונתגדיר אותה עם השעועית המתאימה לקרברוס.

כמו כן, שים לב שהשירות יהיה הראשי שלו וישתמש גם במקש המקשים:

@Configuration @EnableWebSecurity המחלקה הציבורית WebSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Value ("$ {app.service-principal: HTTP / localhost}") פרטי מחרוזת שירות Principal; @Value ("$ {app.keytab-location}") מחרוזת פרטית keytabLocation; התצורה הריקה מוגנת של @Override (HttpSecurity http) זורקת חריגה {http .authorizeRequests () .antMatchers ("/", "/ home"). PermitAll () .anyRequest (). מאומת () .and () .exceptionHandling (). authenticationEntryPoint (spnegoEntryPoint ()) .and () .formLogin () .loginPage ("/ login"). permitAll () .and () .logout (). permitAll () .and () .addFilterBefore (spnegoAuthenticationProcessingFilter (authenticationManagerBean) ), BasicAuthenticationFilter.class); } תצורת הריק המוגנת על ידי @Override (AuthenticationManagerBuilder auth) זורקת Exception {auth .authenticationProvider (kerberosAuthenticationProvider ()) .authenticationProvider (kerberosServiceAuthenticationProvider ()); } @Bean ציבורי KerberosAuthenticationProvider kerberosAuthenticationProvider () {KerberosAuthenticationProvider ספק = KerberosAuthenticationProvider חדש (); // ספק החזרת תצורת ספק; } @Bean ציבורי SpnegoEntryPoint spnegoEntryPoint () {החזר SpnegoEntryPoint חדש ("/ login"); } @Bean ציבורי SpnegoAuthenticationProcessingFilter spnegoAuthenticationProcessingFilter (AuthenticationManager authenticationManager) {SpnegoAuthenticationProcessingFilter filter = new SpnegoAuthenticationProcessingFilter (); // מסנן החזרת תצורת המסנן; } @Bean ציבורי KerberosServiceAuthenticationProvider kerberosServiceAuthenticationProvider () {KerberosServiceAuthenticationProvider provider = new KerberosServiceAuthenticationProvider (); // ספק החזרת תצורת ספק האימות; } @ שעועית ציבורית SunJaasKerberosTicketValidator sunJaasKerberosTicketValidator () {SunJaasKerberosTicketValidator ticketValidator = SunJaasKerberosTicketValidator חדש (); // כרטיס חזרה לתצורת מאמת Validator; }}

שים לב שהגדרנו את Spring Security לאימות SPNEGO. בדרך זו נוכל לאמת באמצעות פרוטוקול HTTP, אם כי אנו יכולים גם להשיג אימות SPNEGO באמצעות Java הליבה.

4. בדיקות

כעת נפעיל בדיקת שילוב כדי להראות זאת הלקוח שלנו מאחזר בהצלחה נתונים משרת חיצוני באמצעות פרוטוקול Kerberos. כדי להריץ את הבדיקה הזו, עלינו להפעיל את התשתית שלנו MiniKdc ויש להפעיל את יישום השירות שלנו.

בעיקרון, נשתמש ב SampleClient מיישום הלקוח להגיש בקשה ליישום השירות שלנו. בואו נבדוק את זה:

@ SampleClient פרטי מדגם אוטומטי @Client; @Test הציבור בטל givenKerberizedRestTemplate_whenServiceCall_thenSuccess () {assertEquals ("נתונים משרת kerberized", sampleClient.getData ()); }

שים לב שנוכל להוכיח כי ה- KerberizedRestTemplate חשוב על ידי פגיעה בשירות בלעדיו:

@Test ציבורי בטל givenRestTemplate_whenServiceCall_thenFail () {sampleClient.setRestTemplate (RestTemplate חדש ()); assertThrows (RestClientException.class, sampleClient :: getData); }

כהערה צדדית, יש סיכוי המבחן השני שלנו יכול להשתמש מחדש בכרטיס שכבר נשמר במטמון האישורים. זה יקרה בגלל המשא ומתן האוטומטי של SPNEGO ששימש ב HttpUrlConnection.

כתוצאה, ייתכן שהנתונים יחזרו בפועל ויבטל את בדיקתנו בהתאם לצרכים שלנו, אם כן, אנו יכולים להשבית את השימוש במטמון הכרטיסים באמצעות מאפיין המערכת http.use.global.creds = שקר.

5. מסקנה

במדריך זה, חקרנו את Kerberos לניהול משתמשים מרכזי וכיצד Spring Security תומך בפרוטוקול Kerberos ובמנגנון האימות של SPNEGO.

השתמשנו MiniKdc לעמוד KDC מוטבע ויצר גם לקוח ושרת Kerberized פשוטים מאוד. התקנה זו הייתה שימושית לחקירה ובעיקר שימושית כאשר יצרנו מבחן אינטגרציה לבדיקת העניינים.

עכשיו פשוט גירדנו את פני השטח. כדי לצלול עמוק יותר, עיין בדף הוויקי של Kerberos או ב- RFC שלו. כמו כן, דף התיעוד הרשמי יהיה שימושי. מלבד זאת, כדי לראות כיצד הדברים יכולים להיעשות בג'אבה הליבה, המדריך הבא של אורקל מראה זאת בפרטים.

כרגיל, ניתן למצוא את הקוד בדף GitHub שלנו.

תחתית אבטחה

הרגע הכרזתי על הקורס החדש ללמוד Spring Spring Security, כולל החומר המלא שהתמקד בערמת OAuth2 החדשה ב- Spring Security 5:

>> בדוק את הקורס

$config[zx-auto] not found$config[zx-overlay] not found