การติดตั้ง Shibboleth Single Sign-On
ตอนที่ 11 - สลับแอพพลิเคชันโดยไม่ล็อกอินใหม่

16. ทดสอบกระโดดข้ามแอพพลิเคชัน

สิ่งที่เราต้องการที่สุดของ Single Sign-On คือคุณสมบัติที่ทำให้ผู้ใช้ล็อกอินเข้ามาผ่านทางระบบใดระบบหนึ่งแล้วสามารถกระโดดไปใช้งานในอีกระบบหนึ่งได้โดยไม่จำเป็นต้องล็อกอินซ้ำ
ในขั้นตอนนี้จะสร้างแอพพลิเคชันขึ้น 3 ตัว โดย app1 กับ app2 จะเป็น PHP ส่วน app3 จะเป็น Java โดยไฟล์ที่ใช้ทดสอบจะอยู่ที่โฟลเดอร์ setup/samples เรียบร้อยแล้ว เพียงแต่ก็อปปีมาวางไว้ที่ c:\sso และกำหนดค่าคอนฟิกของ httpd.conf กับ shibboleth2.xml ให้ถูกต้อง

16.1 สร้างแอพพลิเคชัน app1 และ app2 และแก้ไขไฟล์ httpd.conf

ก็อปปีโฟลเดอร์ app1 และ app2 จาก c:\sso\setup\samples วางไว้ที่ c:\sso แล้วเปิดไฟล์ httpd.conf จากโฟลเดอร์ c:\sso\Apache2.2\conf ขึ้นมาแก้ไขดังนี้

รูปภาพ 91 เพิ่ม Alias, Directory และ Location เข้าไปเพื่อกำหนดตำแหน่ง app1 และ app2
ให้เพิ่ม index.php ให้กับ dir module ดังนี้

รูปภาพ 92 เพิ่ม index.php เพื่อให้มองเห็นไฟล์ index.php เวลาที่เบราซ์เข้ามาด้วยชื่อไดเร็คทอรีได้
บันทึกไฟล์ httpd.conf ไว้แล้วไปที่ขั้นต่อไป

16.2 แก้ไขไฟล์ shibboleth2.xml

เปิดไฟล์ shibboleth2.xml จากโฟลเดอร์ c:\sso\shibboleth-sp\etc\shibboleth ขึ้นมาแก้ไขดังนี้

รูปภาพ 93 เปลี่ยนชื่อโฮสต์และพาธที่จะให้ Shibboleth SP สามารถควบคุมได้
สังเกตว่าเราจะแก้ Host name ให้เป็น 127.0.0.1 และเพิ่มพาธเข้าไปอีก 3 พาธคือ app1, app2 และ app3 แล้วบันทึกไฟล์ shibboleth2.xml ไว้

16.3 กำหนดค่า REMOTE_USER

เราจำเป็นต้องบอกให้ SP รู้ด้วยว่าจะนำเอาแอททริบิวท์ไหนมาทำเป็นค่า Remote User สำหรับให้แอพพลิเคชันดึงไปใช้งาน ให้เปิดไฟล์ shibboleth2.xml ขึ้นมาแก้ไขดังนี้

รูปภาพ 94 ที่ REMOTE_USER เปลี่ยนจาก eppn เป็น cn แทน
ขั้นตอนนี้สำคัญมากเนื่องจาก user ที่เราใช้ที่ Apache DS ไม่ได้ส่งแอททริบิวท์ eduPrincipalName มาเป็นแอททริบิวท์ eppn ดังนั้นหากใช้ eppn จะไม่มีชื่อผู้ใช้ติดอยู่ที่ Remote User

16.4 ทดสอบ app1 กับ app2

ให้รีสตาทร์ Apache Web Server และ Shibboleth 2.0 Daemon และ Tomcat ใหม่อีกครั้งแล้วเบราซ์ไปที่ http://127.0.0.1/app1 เมื่อทดลองล็อกอินเข้าระบบแล้วจะได้หน้าแรกเป็นดังนี้

รูปภาพ 95 ปรากฏชื่อ Remote User ติดอยู่หลังจากล็อกอินเข้าระบบแล้ว
หลังจากนั้นให้คีย์เข้าไปที่แอดเดรส สลับไปที่ app2 โดยไม่ต้องปิดหน้าต่าง จะต้องไม่ปรากฏหน้าต่างล็อกอินเข้าระบบอีก และสามารถกระโดดเข้าไปที่ http://127.0.0.1/app2 ได้ทันที ดังนี้

รูปภาพ 96 กระโดดต่อเข้าไปที่ app2 ได้โดยใช้ผู้ใช้คนเดิม
เมื่อมาถึงขั้นตอนนี้เราถือว่าการคอนฟิกเพื่อใช้ Single Sign-On กับ PHP มากกว่า 1 โปรแกรมขึ้นไปประสบผลสำเร็จแล้ว แต่เรายังจำเป็นต้องคอนฟิกต่อเพื่อให้สามารถกระโดดข้ามจากแอพพลิเคชันที่เป็น PHP ไปที่แอพพลิเคชันที่เป็น Java ได้ด้วย

17. ทำให้กระโดดข้ามจาก PHP มาที่ Java

ก็อปปีโฟลเดอร์ app3 ที่เป็นแอพพลิเคชัน Java จากโฟลเดอร์ c:\sso\setup\samples ไปวางไว้ที่ c:\sso\apache-tomcat-6.0.18\webapps เพื่อรันเป็นเว็บแอพพลิเคชัน หลังจากนั้นให้รีสตาทร์ Tomcat ขึ้นมาใหม่
ทดสอบเข้าถึงหน้าเว็บใน app3 โดยเบราซ์ไปที่ http://127.0.0.1:8080/app3 ซึ่งควรจะปรากฏดังนี้

รูปภาพ 97 เข้า app3 ได้ แต่ Remote User มีค่าเป็น null

17.1 เปิดการใช้งาน AJP และ Proxy Pass

เพื่อให้ส่งต่อการทำงานจาก Apache Web Server ไปที่โปรแกรม Java ที่รันอยู่ที่ Tomcat ได้เราจำเป็นต้องใช้โมดูล AJP เป็นตัวช่วยเหลือ โดยเปิดไฟล์ httpd.conf ขึ้นมาแก้ไขดังนี้

รูปภาพ 98 ให้เอาคอมเมนต์ที่ mod_proxy.so และ mod_proxy_ajp.so ออก

รูปภาพ 99 เพิ่ม ProxyPass และ Location /app3 เข้าไป
บันทึกไฟล์ httpd.conf ไว้แล้วไปที่ขั้นต่อไป

17.2 แก้ไขไฟล์ server.xml เพิ่ม tomcatAuthentication="false"

เปิดไฟล์ server.xml จากโฟลเดอร์ c:\sso\apache-tomcat-6.0.18\conf ขึ้นมาแก้ไขดังนี้

รูปภาพ 100 เพิ่ม tomcatAuthentication=”false” เข้าไปที่ Connector port=”8009”
บันทึกไฟล์ server.xml ไว้แล้วไปที่ขั้นต่อไป

17.3 ทดสอบ app3

ให้รีสตาทร์ Shibboleth 2.0 Daemon, Apache Web Server และ Tomcat ใหม่อีกครั้ง แล้วเบราซ์ไปที่ http://127.0.0.1/app3 หลังจากล็อกอินผ่านไปแล้ว IdP จะส่งการทำงานต่อไปที่แอพพลิเคชัน และปรากฏหน้าเว็บดังนี้

รูปภาพ 101 โปรแกรม Java ที่รันบน Tomcat จะได้รับ Remote User มาด้วยเช่นกัน
ให้ทดลองรันหน้าเว็บ shibenv.jsp ต่อจาก /app3 จะได้ผลลัพธ์ดังนี้

รูปภาพ 102 รันไฟล์ shibenv.jsp เพื่อทดสอบดึงค่าเอ็นวิรอนเมนต์ออกมาดู
ให้ทดลองกระโดดข้ามจาก Java ไปที่ PHP โดยพิมพ์ URL เปลี่ยนจาก app3 เป็น app2 จะได้ผลลัพธ์ดังนี้

รูปภาพ 103 สามารถกระโดดข้ามจาก Java มาที่ PHP ได้โดยที่ผู้ใช้ไม่ต้องล็อกอินใหม่

17.4 กระโดดจาก PHP ไปที่ Java

ทดสอบใหม่โดยล็อกอินเข้ามาจาก app1 เป็น user2 และลองสลับไปที่ app3 เพื่อตรวจดูว่าสามารถสลับจาก PHP มาที่ Java ได้โดยที่ไม่ต้องล็อกอินเข้าใหม่ และ Remote User ยังคงสามารถดึงออกมาตรวจสอบได้ตามปกติ

18. คำแนะนำสำหรับการติดตั้งบนเครื่องเซิร์ฟเวอร์มากกว่า 1 ตัว

ในกรณีที่ท่านนำไปใช้งานจริงและแยกการติดตั้ง Service Provider และ Identity Provider ออกเป็นเครื่องเซิร์ฟเวอร์ 2 เครื่อง (หรือมากกว่านั้น)

รูปภาพ 104 ตัวอย่างการติดตั้งลงบนเครื่องเซิร์ฟเวอร์ 2 ตัว แยกระหว่าง SP และ IdP
ท่านสามารถใช้วิธีการดังกล่าวข้างต้นที่ได้ทดลองมาแล้ว กับการติดตั้งแบบแยกเครื่องเซิร์ฟเวอร์ได้เช่นกัน เพียงแต่จำเป็นต้องระบุเป็นชื่อเครื่องหรือ IP Address ให้แยกกันออกไป โดยจะมีส่วนประกอบที่แตกต่างกันดังนี้

รูปภาพ 105 โฟลเดอร์ c:\sso ที่มีส่วนประกอบแตกต่างกันออกไปเมื่อติดตั้งแยก 2 เครื่อง
สังเกตจากภาพข้างบน จะพบว่าที่เครื่อง SP เราจะใช้ IP Address เป็นหมายเลข 192.168.0.10 และมีโปรแกรมติดตั้งไว้คือ
·      Apache 2.2
·      PHP
·      shibboleth-sp (Service Provider)
ส่วนที่เครื่องที่มี IP Address เป็น 192.168.0.20 จะทำหน้าที่เป็น IdP และมีโปรแกรมติดตั้งไว้คือ
·      Apache Tomcat 6.0.18
·      shibboleth-idp (Identity Provider)
·      apacheds (Apache Directory Service – LDAP)

18.1 ตัวอย่างการกำหนดค่าคอนฟิกที่เครื่อง Service Provider

ที่เครื่อง 192.168.0.10 ที่ทำหน้าที่เป็น Service Provider จะมีจุดที่ต้องใช้ IP Address ดังต่อไปนี้

รูปภาพ 106 ไฟล์ httpd.conf ต้องเปลี่ยน ProxyPass ให้เป็น IP Address ของเครื่อง IdP
ที่ไฟล์ idp-metadata.xml ของทั้ง SP และ IdP มีจุดที่ต้องใช้ IP Address ดังต่อไปนี้

รูปภาพ 107 ที่แท็ก <ArtifactResolutionService> และ <SingleSignOnService> ของ IDPSSODescriptor ต้องชี้ไปที่ IdP
ที่ไฟล์ idp-metadata.xml ก่อนปิดแท็ก AttributeAuthorityDescriptor ของตัว EntityDescriptor ของ IdP

รูปภาพ 108 ไฟล์ idp-metadata.xml ที่แท็ก AttributeService ของตัว IdP ต้องใส่ IP Address ของ IdP
ที่ไฟล์ idp-metadata.xml บริเวณด้านล่าง ภายในแท็ก <SPSSODescriptor> ที่แท็ก AssertionConsumerService

รูปภาพ 109 ไฟล์ idp-metadata.xml ในแท็ก SPSSODescriptor แต่ละแท็ก AssertionConsumerService ต้องเป็น IP Address ของ SP
ที่ไฟล์ shibboleth2.xml ของตัว SP ที่แท็ก Host ด้านบน

รูปภาพ 110 ไฟล์ shibboleth2.xml ที่แท็ก Host ต้องใส่ IP Address ของเครื่อง SP
ไฟล์ shibboleth2.xml ที่เปิดแท็ก ApplicationDefaults

รูปภาพ 111 ไฟล์ shibboleth2.xml ที่แท็กเปิด ApplicationDefaults ให้ใส่ homeURL ตรงกับ IP Address ของ SP
สรุปว่าไฟล์ที่จำเป็นต้องแก้ไข IP Address ที่ทางฝั่ง SP มีเพียง 3 ไฟล์คือ
·      httpd.conf
·      idp-metadata.xml และ
·      shibboleth2.xml
ส่วนไฟล์อื่นๆไม่จำเป็นต้องแก้ไข IP Address และการกำหนดค่าคอนฟิกจะเป็นเช่มเดิม ตามที่ได้ทดลองไว้

18.2 ตัวอย่างการกำหนดค่าคอนฟิกที่เครื่อง Identity Provider (IdP)

สำหรับเครื่อง Identity Provider จำเป็นต้องกำหนดค่า IP Address เข้าไปให้ถูกต้อง
·      เฉพาะไฟล์ idp-metadata.xml
โดยต้องเหมือนกับที่ Service Provider ส่วนไฟล์อื่นๆใช้วิธีการคอนฟิกแบบเดิมได้เลย ส่วนการเชื่อมต่อกับ LDAP เราสามารถใช้ IP Address เป็น 127.0.0.1 ได้เพราะเราติดตั้ง Apache Directory Service ไว้ที่เครื่องเดียวกันกับ Identity Provider

18.3 ตัวอย่างการติดตั้งแบบแยกเครื่อง

จากการทดลองในเอกสารฉบับนี้ หากทดลองกับเครื่องคอมพิวเตอร์ 2 เครื่องที่มี IP Address เป็น 192.168.0.10 และ 192.168.0.20 จะได้ผลลัพธ์ดังนี้

รูปภาพ 112 หลังจากติดตั้งเสร็จเบราซ์ไปที่ SP สมมุติว่าจะเข้าใช้งาน app1 จึงไปที่ https://192.168.0.10/app1
หาก Shibboleth ที่ SP และ IdP เชื่อมต่อกันอย่างสมบูรณ์ จะปรากฏหน้าล็อกอินดังนี้

รูปภาพ 113 สลับไปที่ IdP ที่เครื่อง 192.168.0.20 และปรากฏหน้าล็อกอินโดยอัตโนมัติ
หลังจากล็อกอินเป็น user1 แล้วจะสลับกลับมาที่ SP ที่แอดเดรส 192.168.0.10 ดังนี้

รูปภาพ 114 หลังจากล็อกอินผ่านแล้วจะสลับกลับมาที่ SP ที่เครื่อง 192.168.0.10 โดยอัตโนมัติ
และหากเปลี่ยนพาธจาก /app1 เป็น /app3 จะสามารถเข้าใช้งานแอพพลิเคชันที่เป็น Java ได้ด้วย

รูปภาพ 115 สามารถกระโดดข้ามจาก app1 ไป app3 ได้โดยไม่ต้องล็อกอินใหม่ และ app3 รันอยู่ที่เครื่อง 192.168.0.20

18.4 ทำไมถึงติดตั้งด้วยวิธีการก็อปปีมาจากอีกเครื่องหนึ่งไม่ได้

หากต้องการติดตั้งโดยใช้วิธีการก็อปปีมาจากเครื่องที่เคยติดตั้งสำเร็จแล้ว จะพบว่ามีปัญหาสำคัญที่ทำให้ไม่สามารถก็อปปีมาใช้ได้คือ
·      ชื่อ Alias ของ Private/Public Key ที่อยู่ในไฟล์ Keystore จะตรงกับชื่อเครื่องหรือ IP Address
ขณะที่ติดตั้ง Identity Provider จะมีการสอบถามชื่อเครื่องหรือ IP Address ซึ่งตัวติดตั้งจะเอาแอดเดรสนี้ไปตั้งชื่อคีย์ใน Keystore ให้อัตโนมัติ รวมทั้งเอาแอดเดรสนี้ไปกำหนดใส่ในไฟล์ idp-metadata.xml และไฟล์ relying-party.xml ด้วย
สำหรับการติดตั้ง Service Provider ปัญหาที่ทำให้เราไม่สามารถก็อปปีไปใช้ที่อีกเครื่องได้ เนื่องจาก
·      ขณะติดตั้งจะนำชื่อเครื่องไปทำเป็นชื่อ issuer ในไฟล์ Certificate X509 (ไฟล์ sp-cert.pem)
เพราะฉะนั้นหลังจากติดตั้ง Service Provider เสร็จ ชื่อเครื่องจะไปติดอยู่ในไฟล์ sp-cert.pem ทำให้เราไม่สามารถนำไปใช้ที่เครื่องคอมพิวเตอร์เครื่องอื่นได้
ดังนั้นข้อแนะนำที่สำคัญก็คือ

ขณะติดตั้ง ควรใช้ชื่อเครื่อง (Hostname) และชื่อโดเมน (Domain) แทนการใช้ IP Address เพราะ IP Address อาจจะถูกเปลี่ยนแปลงได้ในอนาคต

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การติดตั้ง Shibboleth Single Sign-On
ตอนที่ 12 - การทำ SLO (Single Log-out)

ตัวอย่างการเข้ารหัส AES ด้วย Java และถอดรหัสด้วย C#.NET

การติดตั้ง CAS เพื่อทำ Single Sign-on