ThaiCERT: Thai Computer Emergency Response Team
ศูนย์ประสานงานการรักษาความปลอดภัยคอมพิวเตอร์ ประเทศไทย 
 
 
 

ชื่อเรื่อง: การติดตั้งและใช้งาน Kerberos
เรียบเรียงโดย: สิริพร จิตต์เจริญธรรม และ เลอศักดิ์ ลิ้มวิวัฒน์กุล
เรียบเรียงเมื่อ:
28 มิถุนายน 2547

กล่าวนำ

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

เอกสารฉบับนี้อธิบายถึงการติดตั้ง Kerberos เวอร์ชัน 5 (Version 5 Release1.2.7) บนระบบปฏิบัติการ Linux Red Hat 9.0 จุดประสงค์ของเอกสารฉบับนี้คือการศึกษาระบบการทำงานของ Kerberos เพื่อนำไปประยุกต์ใช้กับระบบจริงและปรับใช้ตามความเหมาะสมขององค์กร

เอกสารฉบับนี้กล่าวถึงการพิสูจน์ตัวตนแบบ Kerberos ซึ่งในการพิสูจน์ตัวตนแบบ Kerberos นั้นผู้ใช้ควรมีความรู้เกี่ยวกับ คำศัพท์เฉพาะ และ ความสัมพันธ์ระหว่างโดเมนเนมและ REALM ของ Kerberos เพื่อให้ง่ายต่อการทำความเข้าใจระบบการทำงานของ Kerberos มากยิ่งขึ้น ในขั้นตอนก่อนการติดตั้ง Kerberos ต้องทำ การตั้งเวลาของเซิร์ฟเวอร์ภายใน REALM เพื่อให้สามารถตรวจสอบได้ภายหลังว่าการล็อกอินเข้าใช้งานของผู้ใช้เกิดขึ้นตามเวลาใดบ้าง จากนั้นจะกล่าวถึง กระบวนการทำงานของ Kerberos ขั้นตอนการติดตั้ง Kerberos 5 ของ Kerberos Server (KDC) Application Server และ Client รวมทั้ง ตัวอย่างการใช้งาน และตารางเปรียบเทียบข้อดีและข้อเสียของ Kerberos

สำหรับรายละเอียดของการพิสูจน์ตัวตนโดยละเอียดสามารถหาอ่านเพิ่มเติมได้ในเอกสารเผยแพร่เรื่องความรู้เบื้องต้นเกี่ยวกับการพิสูจน์ตัวตน


Kerberos คืออะไร

Kerberos คือ โพรโตคอลการพิสูจน์ตัวตนบนระบบเครือข่าย Kerberos พัฒนาโดย Massachusetts Institute of Technology หรือ MIT เพื่อใช้ในการแก้ปัญหาความไม่ปลอดภัยของการพิสูจน์ตัวตนแบบเดิมที่มีการส่งรหัสผ่านบนเครือข่ายโดยที่ไม่มีการเข้ารหัสข้อมูล ซึ่งทำให้ข้อมูลรหัสผ่านอาจถูกดักจับได้


คำศัพท์ที่เกี่ยวข้องกับการใช้งาน Kerberos (Kerberos Terminology)

ciphertext ข้อมูลที่ผ่านการเข้ารหัส
Client ผู้ใช้ โฮสต์ หรือ โปรแกรมประยุกต์ ที่สามารถขอ Kerberos ticket จาก Kerberos Server ได้
REALM คือชื่อกลุ่มระบบเครือข่ายที่ใช้การพิสูจน์ตัวตนแบบ Kerberos ประกอบด้วย Kerberos server (KDCs) และ client
principal

ชื่อบัญชีผู้ใช้หรือชื่อบริการสำหรับใช้ในการพิสูจน์ตัวตนบนระบบ Kerberos ได้

รูปแบบของ principal จะประกอบด้วย primary/instance@REALM

  • primary คือชื่อบัญชีผู้ใช้หรือชื่อของบริการ
  • instance คือข้อมูลที่ใช้บอกคุณสมบัติของ primary อาจเป็น null ได้ (ใส่ / เพื่อแยกออกจาก primary) ในกรณีของผู้ใช้ instance ใช้เพื่อบ่งบอกขอบเขตความสามารถของผู้ใช้ แต่ในกรณีของโฮสต์ instance คือ hostname
  • REALM รูปแบบโดยทั่วไปของ REALM ควรเป็นตัวพิมพ์ใหญ่

ชนิดของ principal อาจแบ่งออกได้เป็น 3 แบบด้วยกันคือ

  1. principal ที่ไม่มี instance ใช้สำหรับบัญชีผู้ใช้ โดยจะใช้ primary แทนชื่อบัญชีผู้ใช้ได้ ตัวอย่างเช่น

    tytso@ATHENA.MIT.EDU
    kenh@CMF.NRL.NAVY.MIL


  2. principal ที่มี hostname เป็น instance ใช้เพื่อแยกความแตกต่างระหว่างบริการเดียวกันแต่อยู่ต่างเครื่อง ตัวอย่างเช่น

    host/foo.bar.org@BAR.ORG
    ftp/blah.bar.org@BAR.ORG


  3. principle ที่มี instance ที่ไม่ใช่ hostname จะถือว่ามีความหมายพิเศษแล้วแต่ข้อกำหนดของ REALM นั้นๆ (ขึ้นอยู่กับผู้ออกแบบระบบ) ตัวอย่างเช่น

    krbtgt/BAR.ORG@BAR.ORG
    krbtgt/FOO.ORG@BAR.ORG

Kerberos ticket หรือ ticket

คือหลักฐานทางอิเล็กทรอนิกส์ที่ใช้ในการพิสูจน์ตัวตนตามที่ได้มีการกล่าวอ้างจริงบนระบบ Kerberos

ticket จะได้รับมาจาก Kerberos server ก็ต่อเมื่อผู้ใช้มี principal และรหัสผ่านที่ถูกต้องตาม Kerberos database บน Kerberos server

key กุญแจลับ สำหรับใช้ในการเข้ารหัสและถอดรหัสข้อมูล
Kerberos server หรือ Key Distribution Center (KDC)

เซิร์ฟเวอร์ที่ทำหน้าที่ในการจำหน่าย Kerberos ticket ภายในประกอบด้วย

Authentication Service (AS) ส่วนประกอบภายในของ Kerberos server ทำหน้าที่ในการพิสูจน์ตัวตนของผู้ใช้ก่อนการเข้าใช้บริการ
Ticket Granting Service (TGS) ส่วนประกอบภายในของ Kerberos server ที่ทำหน้าที่ในการจำหน่าย Kerberos ticket เพื่อให้ผู้ใช้นำไปใช้กับบริการที่ต้องการ
Kerberos database คือฐานข้อมูลของ Kerberos ที่อยู่บน KDC ทำหน้าที่ในการเก็บ principal รหัสผ่าน และข้อมูลที่เกี่ยวกับควบคุมดูแลของ principal ทั้งหมดบน REALM
Ticket Granting Ticket (TGT) คือ ticket ที่ผู้ใช้ได้รับในการพิสูจน์ตัวตนกับระบบ Kerberos เพื่อนำไปใช้ในการขอ Service ticket กับ KDC เพื่อขอใช้บริการอื่นๆ
Service ticket

คือ ticket สำหรับการขอเข้าใช้บริการบน Application server โดยจะได้มาจากการนำ TGT ที่ได้จากขั้นตอนการพิสูจน์ตัวตนผู้ใช้งานมาเข้ารหัสด้วยรหัสผ่านของบริการบน Application server ที่ต้องการเข้าใช้บริการและเข้ารหัสอีกครั้งด้วยรหัสผ่านของผู้ใช้

ก่อนที่ผู้ใช้จะนำไปใช้จะต้องถอดรหัสด้วยรหัสผ่านของผู้ใช้ออกมาก่อน เพื่อให้ได้ Service ticket ที่เข้ารหัสด้วยรหัสผ่านของบริการของบริการบน Application server ซึ่งจะถูกถอดรหัสโดยบริการบน Application server อีกครั้งก่อนที่การใช้งานบริการจะสามารถเกิดขึ้นได้ตามรูปที่ 2

Application server

เซิร์ฟเวอร์ที่ให้บริการในระบบเครือข่ายเช่น telnet หรือ ftp โดยสนับสนุนการพิสูจน์ตัวตนผ่าน Kerberos หรือใช้ Kerberos ticket ในการพิสูจน์ตัวตนได้ หรือเรียกว่าเป็น Kerberized program หรือ Kerberized service แทนได้เช่นเดียวกัน

Key tables หรือ Keytabs

การที่ Application server สามารถใช้การพิสูจน์ตัวตนผ่านระบบ Kerberos ได้อย่างปลอดภัยนั้นจะใช้การเข้ารหัสในการติดต่อระหว่าง Application server และ Kerberos server และทุกๆ บริการบน Application server จะมีรหัสผ่านที่สร้างและจัดการโดยระบบ Kerberos เองเพื่อให้บริการบน Application server ทำการพิสูจน์ตัวตนเหมือนเป็นผู้ใช้บนระบบคนหนึ่งโดยข้อมูลของรหัสผ่านจะจัดเก็บใน Key tables

รหัสผ่านของบริการใช้ในการเข้ารหัส Service ticket และเก็บไว้ในไฟล์ Key tables บนระบบโดย

  • บน Application server จะอยู่ที่ /etc/krb5.keytab
  • บน Kerberos server จะอยู่ที่ /var/kerberos/krb5kdc/kadm5.keytab

โดยปกติจะทำการสร้างไฟล์ Key tables บน KDC จากนั้นจะทำการสำเนาไปไว้บน Application server ทุกเครื่องเพื่อให้มีรหัสผ่านของบริการเดียวกันทั้งระบบ

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


ความสัมพันธ์ระหว่างโดเมนเนมและ REALM ของ Kerberos

REALM คือกลุ่มของเครือข่ายที่ให้บริการภายใต้ Key Distribution Centers หรือ KDC เดียวกัน เพื่อให้ง่ายในการนำไปใช้งานมักจะตั้งชื่อเป็นตัวอักษรใหญ่ทั้งหมด เพื่อให้แตกต่างกับโดเมนเนมของเครื่องภายในเครือข่าย

โดยปกติเซิร์ฟเวอร์จะมีโดเมนเนมที่สัมพันธ์กับหมายเลขไอพีแอดเดรสเพื่อช่วยในการระบุชื่อของเครื่องภายในเครือข่าย เมื่อนำมาใช้งานภายใต้ Kerberos การแทนกลุ่มของเครื่องภายในเครือข่ายที่ดูแลโดยฐานข้อมูล Kerberos เดียวกันหรือ REALM เดียวกันนั้นมักจะตั้งชื่อ REALM ให้สอดคล้องกับโดเมนเนมเดิมที่ใช้งานอยู่แล้วเช่น เครื่องภายในโดเมนเนม example.com จะอยู่ภายใน Kerberos Realm เป็น EXAMPLE.COM หรือกล่าวในอีกนัยหนึ่งว่า REALM ชื่อ EXAMPLE.COM จัดเป็นกลุ่มของเซิร์ฟเวอร์ที่สามารถใช้การพิสูจน์ตัวตนผ่าน Kerberos ซึ่งโดยปกติมักจะประกอบไปด้วยเครื่องไคลเอ็นต์ (Client) ทำการพิสูจน์ตัวตนกับ Kerberos Server ก่อนจะนำ Ticket ไปยื่นใช้กับ Application Server ซึ่งเครื่องทั้งสามเครื่องดังกล่าวจัดว่าอยู่ใน Realm เดียวกัน

ยกตัวอย่างเช่นใน Kerberos REALM ที่มีชื่อเป็น EXAMPLE.COM อยู่ภายใต้โดเมนเนมเป็น example.com และแต่ละเครื่องภายในโดเมนประกอบไปด้วย เครื่องไคลเอ็นต์มีชื่อเป็น client.example.com ส่วนเครื่อง Kerberos Server ชื่อว่า kerberos.example.com ส่วนเครื่อง Application Server มีชื่อเป็น server.example.com เป็นต้น

เพื่อให้สามารถแยกความแตกต่างระหว่างโดเมนเนมและ REALM การตั้งชื่อของ REALM มักจะตั้งเป็นตัวอักษรใหญ่เช่น EXAMPLE.COM ข้อพึงระวังคือการตั้งชื่อ REALM บน Kerberos แยกความแตกต่างระหว่างตัวอักษรใหญ่และเล็ก (Case sensitive) คือ EXAMPLE.COM จะแตกต่างกับ example.com ถึงแม้ว่าจะไม่มีข้อกำหนดในการตั้งชื่อ REALM ให้เป็นตัวอักษรใหญ่หรือเล็ก แต่ MIT ผู้พัฒนา Kerberos ได้แนะนำว่าควรเป็นตัวอักษรใหญ่ทั้งหมดเพื่อป้องกันความสับสนในการใช้งาน


การตั้งเวลาของเซิร์ฟเวอร์ภายใน REALM

เนื่องจากการพิสูจน์ตัวตนของ Kerberos ประกอบไปด้วยเครื่องมากกว่าหนึ่งเครื่อง การตั้งเวลาบนเครื่องจัดเป็นภาระของผู้ดูแลระบบ อย่างน้อย Kerberos Server และ Application Server ควรจะมีเวลาภายในเครื่องเท่ากัน เพื่อให้สามารถตรวจสอบได้ภายหลังว่าการล็อกอินเข้าใช้งานของผู้ใช้เกิดขึ้นตามเวลาใดบ้าง

การตั้งเวลาให้ตรงกันนั้น สามารถทำได้ผ่าน Network Time Protocol หรือ NTP โดยทำการรับข้อมูลค่าเวลาจากเซิร์ฟเวอร์ให้บริการเวลาที่มีอยู่ทั่วโลก บนระบบยูนิกซ์สามารถใช้งานผ่านโปรแกรม ntp

ในประเทศไทยเองมีเซิร์ฟเวอร์ให้บริการเวลาโดยรับค่าจากดาวเทียมที่โคจรรอบโลกคือ clock.nectec.or.th และหารายละเอียดเพิ่มเติมได้ที่ http://www.ntp.org



กระบวนการทำงานของ Kerberos
  1. ในการเข้าใช้ Kerberos ครั้งแรกผู้ใช้ต้องทำการร้องขอ ticket ผ่านโปรแกรม kinit โดย principal ของผู้ใช้จะถูกส่งไปยัง Kerberos server ซึ่งภายในประกอบด้วย Authentication Service (AS) และ Ticket Granting Service (TGS)


    รูปที่ 1 กระบวนการการพิสูจน์ตัวตนต่อระบบ (กดที่รูปเพื่อดูรูปขยายใหญ่)

  2. AS จะทำการตรวจสอบว่า principal นี้มีอยู่ใน Kerberos database หรือไม่ ถ้ามี Kerberos server จะทำการสร้าง Ticket Granting Ticket (TGT) จาก TGS โดยใช้รหัสผ่านของผู้ใช้ ในการเข้ารหัส TGT แล้วส่งกลับมาให้ผู้ใช้
  3. ผู้ใช้ใส่รหัสผ่านของผู้ตนในการถอดรหัส TGT และจะถูกเก็บไว้เพื่อแสดงว่าหลักฐานของผู้ใช้ได้รับการพิสูจน์ตัวตนแล้ว

เมื่อผู้ใช้ต้องการจะเข้าใช้ Application server สามารถทำได้โดย

  1. ผู้ใช้ส่ง TGT ไปยัง KDC
  2. KDC จะทำการตรวจสอบ TGT ถ้าถูกต้องก็จะให้ Service ticket กับผู้ใช้ในการเข้าไปใช้บริการที่ต้องการ ซึ่ง Service ticket นี้จะถูกเข้ารหัสไว้ด้วยรหัสผ่านของบริการบน Application server ที่ต้องการเข้าไปใช้บริการและเข้ารหัสอีกครั้งด้วยรหัสผ่านของผู้ใช้


    รูปที่ 2 กระบวนการขอรับบริการ (กดที่รูปเพื่อดูรูปขยายใหญ่)

  3. เมื่อผู้ใช้ได้รับ Service ticket ก็จะถูกส่งต่อไปให้ Application server ซึ่งจะทำการถอดรหัสด้วยรหัสผ่านของบริการบน Application server โดยเก็บข้อมูลรหัสผ่านของบริการเพื่อใช้ในการถอดรหัส Service ticket ไว้ใน Key tables บน Application server
  4. ถ้าสามารถถอดรหัสได้ผู้ใช้ก็สามารถเข้าใช้บริการได้

ข้อดีของ TGT คือผู้ใช้ไม่จำเป็นต้องกรอกรหัสผ่านทุกครั้งที่ต้องการจะเข้าใช้ Application server และที่สำคัญคือ TGT มีอายุการใช้งาน โดยทั่วไปจะถูกตั้งให้มีอายุ 10 ชั่วโมง เมื่อ TGT หมดอายุผู้ใช้ต้องทำการขอ TGT เพื่อขอเข้าใช้บริการใหม่

การนำระบบ Kerberos มาใช้จะเพิ่มความสะดวกในการพิสูจน์ตัวตนได้มากขึ้น มักเรียกการใช้งาน Kerberos ว่าเป็นระบบ Single Sign-On หรือเป็นการใช้บริการของระบบทั้งหมดได้ด้วยการพิสูจน์ตัวตนเพียงครั้งเดียว


ขั้นตอนการติดตั้ง Kerberos Server (KDC) บนระบบปฏิบัติการ Red Hat Linux 9.0

สามารถสรุปเป็นขั้นตอนย่อยๆได้ดังนี้


  1. ตรวจสอบและติดตั้งแพ็กเกจของ Kerberos
  2. แก้ไขไฟล์ krb5.conf และ kdc.conf
  3. สร้าง Kerberos database
  4. กำหนดสิทธิ์ในการเข้าถึง Kerberos database
  5. สร้าง principal ของผู้ดูแลฐานข้อมูล
  6. สร้าง Key table
  7. เริ่มต้นการทำงานของ Kerberos server และ Admin server
  8. สร้าง principal ของเครื่อง Application server

ก่อนที่จะทำการติดตั้ง Kerberos V5 นั้นต้องให้แน่ใจว่าได้ทำการจัดการ DNS และตั้งเวลาให้กับเครื่องเซิร์ฟเวอร์ภายใน REALM เรียบร้อยแล้ว จากนั้นปฏิบัติตามขั้นตอนโดยละเอียดดังนี้

  1. ตรวจสอบว่าได้ทำการติดตั้งแพ็กเกจ krb5-libs krb5-server krb5-workstation

    kdc# rpm -q krb5-libs
    kdc# rpm -q krb5-server
    kdc# rpm -q krb5-workstation


  2. ปรับปรุงไฟล์คอนฟิกของ Kerberos คือ krb5.conf (/etc/krb5.conf) และ kdc.conf (/var/kerberos/krb5kdc/kdc.conf) โดยเปลี่ยน EXAMPLE.COM ด้วย REALM name (ต้องเป็นตัวพิมพ์ใหญ่) และ example.com ด้วยโดเมนเนม (ต้องเป็นตัวพิมพ์เล็ก)

    ภายในไฟล์ krb5.conf ประกอบด้วยข้อมูลต่างๆของ Kerberos เช่นค่าดีฟอลต์ของ REALM เซิร์ฟเวอร์ KDC ของ Kerberos ภายในระบบเครือข่าย และข้อกำหนดความสัมพันธ์ระหว่างชื่อเครื่องและ REALM โดยแบ่งเป็น 4 หมวดที่สำคัญดังนี้

  3. [libdefaults]

    ประกอบด้วยค่าพารามิเตอร์ภายใน Kerberos server ค่าพารามิเตอร์ที่มีความจำเป็นมีดังต่อไปนี้

    • default_realm คือการระบุชื่อของ REALM
    ticket_lifetime = 600
    default_realm = DELUFE.TEST
    default_tkt_enctypes = des3-hman-sha1 des-cbc-crc
    default_tgs_enctypes = des3-hmac-sha1 des-cbc-crc
    dns_lookup_realm = false
    dns_lookup_kdc = false
    [realms]

    ประกอบด้วยรายชื่อของ REALM จะประกอบด้วยตัวแปรที่ใช้อธิบายคุณสมบัติเฉพาะของ REALM ที่สำคัญมีดังนี้

    • kdc คือเซิร์ฟเวอร์ที่ทำหน้าที่เป็น Kerberos server ของ REALM และพอร์ตที่ใช้ในการเชื่อมต่อ โดยดีฟอลต์จะเป็นพอร์ต 88/TCP
    • admin_server คือเซิร์ฟเวอร์ที่ใช้ในดูแลระบบ Kerberos มักเป็นเครื่องเดียวกับ Kerberos server หรือ KDC และพอร์ตที่ใช้ในการเชื่อมต่อ โดยดีฟอลต์จะเป็นพอร์ต 749/TCP
    • default_domain คือชื่อของโดเมนเนม ใช้สำหรับ Kerberos version 4 (Kerberos V4) สำหรับแปลง principal ของ Kerberos V4 ให้เป็น principal ของ Kerberos V5
    [realms]
    DELUFE.TEST = {
    kdc = kdc:88
    admin_server = kdc:749
    default_domain = thaicert.nectec.or.th
    }
    [domain_realm]

    กำหนดความสัมพันธ์ระหว่างโดเมนเนมและ Kerberos REALM เพราะว่าในการพิสูจน์ตัวตนแบบ Keberos นั้น Client จำเป็นต้องรู้ว่า Kerberos realm ที่ให้บริการนั้นอยู่ที่ไหน เพื่อที่จะได้ติดต่อกับ KDC ได้

    ในการกำหนดสามารถทำได้ดังใน ตัวอย่างไฟล์ krb5.conf ในส่วนของ [domain_realm] ซึ่งรูปแบบในการทำมีดังนี้

    1. .thaicert.nectec.or.th = DELUFE.TEST
      นำหน้าโดเมนเนมด้วยเครื่องหมาย "." หมายถึง ทุกโฮสต์ที่อยู่ภายใต้โดเมนเนม thaicert.nectec.or.th จะถูก mapping กับ Kerberos realm (ในที่นี้คือ DELUFE.TEST) ยกเว้น host ที่มีชื่อเดียวกับโดเมนเนม
    2. thaicert.nectec.or.th = DELUFE.TEST
      โดเมนเนมที่ไม่มีเครื่องหมาย "." นำหน้า หมายถึงเฉพาะ host ที่ชื่อ thaicert.nectec.or.th เท่านั้นที่ถูก mapping กับ Kerberos realm

    เช่น

    [domain_realm]
    .thaicert.nectec.or.th = DELUFE.TEST
    thaicert.nectec.or.th = DELUFE.TEST
    [logging]

    ในหมวดนี้จะระบุที่เก็บไฟล์ที่บันทึกหรือล็อกของ Kerberos server และ Admin server

    [logging]
    kdc = FILE:/var/log/krb5kdc.log
    admin_sever = FILE:/var/log/kadmind.log
    default = FILE:/var/log/krb5lib.log

    ภายในไฟล์ kdc.conf ประกอบด้วยข้อมูลข้อกำหนดของ ของ Kerberos server เช่นค่าดีฟอลต์ที่ใช้ในการจำหน่าย ticket

    [kdcdefaults]

    ประกอบด้วยค่าการทำงานโดยทั่วไปของ KDC

    [kdcdefaults]
    acl_file = /var/kerberos/krb5kdc/kadmin5.acl
    dict_file = /usr/share/dict/words
    admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
    kdc_ports = 88,750
    [realms]

    ประกอบด้วยไฟล์ต่างๆ ที่เกี่ยวข้องกับข้อมูลเฉพาะของ KDC ของ REALM

    • acl_file ใช้ระบุพาธหรือที่อยู่ของไฟล์ที่กำหนดสิทธิ์ในการเข้าถึง Kerberos database
    • admin_keytab ใช้ระบุพาธหรือที่อยู่ของไฟล์ที่เก็บ Key tables
    • database_name ใช้ระบุพาธหรือที่อยู่ของ Kerberos database
    • key_stash_file ใช้ระบุพาธหรือที่อยู่ของรหัสผ่านหลักของ Kerberos database
    • max_life ใช้ตั้งอายุการใช้งานสูงสุดของ ticket ที่จำหน่ายโดย KDC โดยค่าดีฟอลต์คือ 10 ชั่วโมง
    DELUFE.TEST = {
    database_name = /var/kerberos/krb5kdc/principal
    admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
    acl_file = /var/kerberos/krb5kdc/kadm5.acl
    dict_file = /var/kerberos/krb5kdc/kadm5.dict
    key_stash_file = /var/kerberos/krb5kdc/.k5.DELUFE.TEST
    kadmind_port = 749
    max_life = 10h 0m 0s
    max_renewable_life = 7d 0h 0m 0s
    master_key_type = des3-hmac-sha1
    supported_enctypes = des3-hmac-sha1:normal des-cbc-crc:normal
    }
    [logging] ในหมวดนี้จะระบุที่เก็บไฟล์ที่บันทึกหรือล็อกของ Kerberos server และ Admin server
  1. สร้าง Kerberos database โดยใช้โปรแกรม kdb5_util ซึ่งใช้ในการจัดการดูแล Kerberos database (สร้าง ลบทิ้ง ถ่ายโอน หรือคัดลอก)

    พารามิเตอร์ ความหมาย
    -s

    ใช้สำหรับสร้าง stash ไฟล์ ขึ้นมา

    stash ไฟล์ คือไฟล์ที่กำหนดรหัสผ่านหลักหรือ master key ของ Kerberos database และได้ทำการเข้ารหัสและเก็บไว้บน Kerberos server ไฟล์ใช้ในการพิสูจน์ตัวตนของ KDC โดยอัตโนมัติก่อนเริ่มรัน kadmind และ krb5kdc daemons


    เมื่อรันคำสั่ง kdb5_util จะให้ตั้งรหัสผ่านหลักของ Kerberos database ซึ่งรหัสผ่านนี้ควรเป็นรหัสผ่านที่เฉพาะผู้ดูแลระบบเท่านั้นที่ทราบและต้องเป็นรหัสผ่านที่ยากต่อการเดา

    kdc# /usr/kerberos/sbin/kdb5_util create -s
    Initializing database '/var/kerberos/krb5kdc/principal' for realm 'DELUFE.TEST',
    master key name 'K/M@DELUFE.TEST'
    You will be prompted for the database Master Password.
    It is important that you NOT FORGET this password.
    Enter KDC database master key: ThCEiyFut!
    Re-enter KDC database master key to verify: ThCEiyFut!
    kdc#

    จากคำสั่งนี้จะทำการสร้างไฟล์ 5 ไฟล์ไว้ที่ไดเรกทอรี /var/kerberos/krb5kdc/ ตามที่ได้กำหนดไว้ในไฟล์ kdc.conf

    การใช้งาน
    ไฟล์
    ไฟล์ฐานข้อมูลของ Kerberos database
    principal.db และ principal.ok
    ไฟล์ฐานข้อมูลของผู้ดูแลระบบ Kerberos principal.kadm5
    lock ไฟล์ของฐานข้อมูลผู้ดูแลระบบ principal.kadm5.lock
    stash ไฟล์ .k5stash
  1. กำหนดสิทธิ์ในการเข้าถึง Kerberos database (Access Control List หรือ acl) ในไฟล์ /etc/kadm5.acl ซึ่งมีการใช้พารามิเตอร์ต่างๆ ดังนี้
    ACL Description
    a สามารถเพิ่ม principals หรือ policies
    A ไม่สามารถเพิ่ม principals หรือ policies
    d สามารถลบ principals หรือ policies
    D ไม่สามารถลบ principals หรือ policies
    m สามารถเปลี่ยนแปลง principals หรือ policies
    M ไม่สามารถเปลี่ยนแปลง principals หรือ policies
    c สามารถเปลี่ยนรหัสผ่านของ principals
    C ไม่สามารถเปลี่ยนรหัสผ่านของ principals
    i สามารถเข้าไปดูข้อมูลในฐานข้อมูล
    I ไม่สามารถเข้าไปดูข้อมูลในฐานข้อมูล
    l สามารถดูบัญชีรายชื่อของ principals หรือ policies
    L ไม่สามารถดูบัญชีรายชื่อของ principals หรือ policies
    * สามารถกระทำการใดๆ ก๊ได้
    x สามารถกระทำการใดๆ ก๊ได้ เช่นเดียวกับ *

โดยมีรูปแบบดังนี้

    Kerberos principal         ACL       optional target principal

ตัวอย่างเช่น การอนุญาตให้ principal "joeadmin@DELUFE.TEST" สามารถ เพิ่ม ดูบัญชีรายชื่อของ principal หรือเข้าไปดูข้อมูลในฐานข้อมูลของทุก principal ที่มี instance เป็น root ต้องเพิ่มข้อมูลในไฟล์ kadm5.acl ดังต่อไปนี้

    joeadmin@DELUFE.TEST       ali       */root@DELUFE.TEST

การให้ principal ที่มี instance เป็น admin ได้รับอนุญาตให้สามารถจัดการทุกอย่างให้ฐานข้อมูลได้ ทำได้โดยใส่เครื่องหมาย ดอกจันทร์ (*) (*/admin@REALM) ตัวอย่างเช่น

    */admin@DELUFE.TEST        *

  1. สร้าง principal ของผู้ดูแลฐานข้อมูล โดยให้เป็น principal ที่มี instance เป็น admin มีรูปแบบดังนี้ username/admin@REALM โดยใช้โปรแกรม kadmin.local (Kerberos database administration program) ซึ่งเป็นโปรแกรมที่ผู้ดูแลระบบใช้เพื่อติดต่อไปยัง Kerberos database

    โดยคำสั่ง kadmin.local จะใช้บนเครื่อง Kerberos server โดยตรงและสามารถติดต่อไปยัง Kerberos database ได้โดยไม่ต้องทำการพิสูจน์ตัวตน ที่นี้จะทำการสร้าง principal admin/admin ด้วยคำสั่ง addprinc และสามารถขอความช่วยเหลือการใช้งานคำสั่งใน kadmin.local โดยพิมพ์เครื่องหมาย ?

    kdc# /usr/kerberos/sbin/kadmin.local
    Authenticating as principal root/admin@DELUFE.TEST with password.
    kadmin.local: addprinc admin/admin
    WARNING: no policy specified for admin/admin@DELUFE.TEST; defaulting to no policy
    Enter password for principal "admin/admin@DELUFE.TEST": ThCEiyFut!
    Re-enter password for principal "admin/admin@DELUFE.TEST": ThCEiyFut!
    Principal "admin/admin@DELUFE.TEST" created.
    kadmin.local: quit
    kdc#

  2. สร้าง Key table โดยใช้คำสั่ง kadmin.local และใช้คำสั่ง ktadd เพื่อสร้าง Key table ให้ principal kadmin/admin และ kadmin/changepw (principal ทั้งสองอันนี้จะถูกสร้างขึ้นและเก็บในฐานข้อมูลโดยอัตโนมัติในขั้นตอนที่ทำการสร้าง Kerberos database) เพื่อใช้ในการถอดรหัส ticket ของ ผู้ดูแลระบบ Kerberos เพื่อพิจารณาว่าได้รับอนุญาตให้เข้าถึงฐานข้อมูลได้หรือไม่

    พารามิเตอร์ ความหมาย
    -k

    ใช้เพื่อกำหนดไดเรกทอรีให้ไฟล์ที่เก็บ Key table ของ admin ตามที่ได้ระบุไว้ในไฟล์ kdc.conf ในที่นี้ ktadd จะทำการจัดเก็บข้อมูลของ Key table ไว้ที่ไดเรกทอรี /var/kerberos/krb5kdc/kadm5.keytab

    ถ้าไม่ได้ใช้พารามิเตอร์นี้คำสั่ง ktadd จะทำการเก็บค่าของ Key table ตามค่าดีฟอลต์คือ /etc/krb5/krb5.keytab


    kdc# /usr/kerberos/sbin/kadmin.local
    kadmin.local: ktadd -k /var/kerberos/krb5kdc/kadm5.keytab
    >> kadmin/admin kadmin/changepw

    Entry for principal kadmin/admin with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
    Entry for principal kadmin/admin with kvno 3, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
    Entry for principal kadmin/changepw with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
    Entry for principal kadmin/changepw with kvno 3, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/var/kerberos/krb5kdc/kadm5.keytab.
    kadmin.local: quit

    หมายเหตุ: บรรทัดที่นำหน้าด้วยเครื่องหมาย >> เป็นบรรทัดที่ต่อเนื่องจากบรรทัดก่อนหน้า

  3. เริ่มต้นการทำงานของ Kerberos server และ Kerberos Admin server

    kdc# /etc/init.d/krb5kdc start
    Starting Kerberos 5 KDC:                                [ OK ]
    kdc# /etc/init.d/kadmin start
    Starting Kerberos 5 Admin Server:                       [ OK ]

  4. ใช้โปรแกรม kadmin (Kerberos V5 database administration program) เพื่อสร้าง principal ของเครื่อง Application server ด้วยคำสั่ง addprinc โดยสามารถใช้โปรแกรมนี้จากเครื่องโฮสต์ใดก็ได้ใน REALM

    kadmin และ kadmin.local เป็นโปรแกรมที่รับคำสั่งจากผู้ดูแลระบบเพื่อติดต่อไปยัง Kerberos Admin server ซึ่งมีรูปแบบการใช้ที่เหมือนกันแต่แตกต่างกันที่ kadmin.local จะทำงานบน Kerberos server และไม่ต้องทำการพิสูจน์ตัวตนแบบ Kerberos แต่ kadmin นั้นผู้ดูแลระบบสามารถติดต่อกับฐานข้อมูลของ Kerberos ผ่านพอร์ต 749/TCP ได้แต่ต้องมีการพิสูจน์ตัวตนอย่างถูกต้องกับ Kerberos server ก่อน

    พารามิเตอร์ ความหมาย
    -randkey

    คือการตั้งค่ารหัสผ่านของ principal นั้นให้เป็นค่า random

    kdc# kadmin
    Authenticating as principal admin/admin@DELUFE.TEST with password.
    Enter password: ThCEiyFut!
    kadmin: addprinc -randkey host/server.thaicert.nectec.or.th
    WARNING: no policy specified for host/server.thaicert.nectec.or.th@DELUFE.TEST; defaulting to no policy
    Principal "host/server.thaicert.nectec.or.th@DELIFE.TEST" created.
    kadmin:

    สร้าง Key table เพื่อใช้ในการถอดรหัสของ host ticket ซึ่งควรทำบน KDC

kadmin: ktadd host/server.thaicert.nectec.or.th
Entry for principal host/server.thaicert.nectec.or.th with kvno 3, encryption type Triple DES cbc mode with HMAC/sha1 added to keytab WRFILE:/etc/krb5.keytab.
Entry for principal host/server.thaicert.nectec.or.th with kvno 3, encryption type DES cbc mode with CRC-32 added to keytab WRFILE:/etc/krb5.keytab.
kadmin: quit


ขั้นตอนการติดตั้ง Application Server บนระบบปฏิบัติการ Red Hat Linux 9.0

  1. ก่อนที่จะทำการติดตั้ง Kerberos V5 นั้นต้องให้แน่ใจว่าได้ทำการจัดการ DNS และตั้งเวลาให้เครื่อง Application server กับเครื่อง Kerberos เซิร์ฟเวอร์ภายใน REALM ให้ตรงกันเรียบร้อยแล้ว

  2. ตรวจสอบว่าได้ทำการติดตั้งแพ็กเกจ krb5-libs krb5-workstation และ xinetd

    kdc# rpm -q krb5-libs
    kdc# rpm -q krb5-workstation
    kdc# rpm -q xinetd


  3. ปรับแต่งไฟล์ /etc/krb5.conf ให้เหมือนกับไฟล์ krb5.conf ที่ใช้ใน Kerberos server

  4. เพิ่มบัญชีชื่อผู้ใช้บนเครื่อง (ไม่ต้องกำหนดรหัสผ่าน โดยจะใช้รหัสผ่านผ่านการพิสูจน์ตัวตนผ่านระบบ Kerberos)

    server# adduser angel

  5. สร้าง principal ให้ผู้ใช้ ด้วยโปรแกรม kadmin และใช้คำสั่ง addprinc

    kadmin: addprinc angel
    WARNING: no policy specified for angel@DELUFE.TEST; defaulting to no policy
    Enter password for principal "angel@DELUFE.TEST": @NGuyco2ME
    Re-enter password for principal "angel@DELUFE.TEST": @NGuyco2ME
    Principal "angel@DELUFE.TEST" created.
    kadmin: quit

  6. แก้ไขไฟล์ /etc/xinetd.d/krb5-telnet โดยให้ disable = no

    kdc# vi /etc/xinetd.d/krb5-telnet

    # default: off
    # description: The kerberized telnet server accepts normal telnet sessions, \
    # but can also use Kerberos 5 authentication.
    service telnet
    {
    disable = no
    flags = REUSE
    socket_type = stream
    wait = no
    user = root
    server = /usr/kerberos/sbin/telnetd
    log_on_failure += USERID
    }
  1. ทำการไฟล์ Key tables หรือไฟล์ /etc/krb5.keytab จาก Kerberos server ไปไว้ที่ไดเรกทอรี /etc/krb5.keytab บน Application server ทุกเครื่อง

  2. เริ่มการทำงานของ xinetd เพื่อให้ผู้ใช้สามารถติดต่อมายัง Application server เช่นบริการ telnet เป็นต้น

kdc# /etc/init.d/xinetd start
Starting xinetd:                                        [ OK ]


ขั้นตอนการติดตั้ง Client บนระบบปฏิบัติการ Red Hat Linux 9.0

  1. ก่อนที่จะทำการติดตั้ง Kerberos V5 นั้นต้องให้แน่ใจว่าได้ทำการจัดการ DNS และตั้งเวลาให้เครื่อง Client กับเครื่อง Kerberos เซิร์ฟเวอร์ภายใน REALM ให้ตรงกันเรียบร้อยแล้ว

  2. ตรวจสอบว่าได้ทำการติดตั้งแพ็กเกจ krb5-libs krb5-workstation

    kdc# rpm -q krb5-libs
    kdc# rpm -q krb5-workstation

  3. ปรับแต่งไฟล์ /etc/krb5.conf ให้เหมือนกับไฟล์ krb5.conf ที่ใช้ใน Kerberos server

ตัวอย่างการใช้งาน

  1. Client ต้องทำการขอ TGT ก่อนด้วยคำสั่ง kinit ตามกระบวนการพิสูจน์ตัวตนกับระบบ

    client# kinit angel
    Password for angel@DELUFE.TEST: @NGuyco2ME
    client#

    สามารถตรวจสอบว่าได้รับ ticket หรือไม่ด้วยคำสั่ง klist

client# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: angel@DELUFE.TEST

Valid starting Expires Service principal
05/26/04 14:32:51 05/27/04 00:32:51 krbtgt/DELUFE.TEST@DELUFE.TEST

Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

หากต้องการลบ ticket ด้วยคำสั่ง kdestroy

client# kdestroy
client# klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)

Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached

  1. Client สามารถเปลี่ยนรหัสผ่านของ principal ได้ด้วยคำสั่ง kpasswd โดยผู้ใช้จะต้องใส่รหัสผ่านเดิมให้ถูกต้องก่อนจึงจะใส่รหัสผ่านใหม่ได้

    client# kpasswd angel
    Old password for angel: @NGuyco2ME
    New Password for angel: HECo4ASK.
    Verifying, please re-enter New Password for angel: HECo4ASK.
    Password changed.

    หากผู้ใช้ใส่รหัสผ่านเดิมไม่ถูกต้องจะเป็นดังนี้

    client# kpasswd
    Old password for angel: 4AMsUJE
    Incorrect old password.

    Kerberos V5 อนุญาตให้ผู้ดูแลระบบสามารถไม่ยอมรับรหัสผ่านที่ไม่เหมาะสม (เสี่ยงต่อการถูกเดา) ได้โดยอัตโนมัติ ตัวอย่างของรหัสผ่านที่ไม่เหมาะสมเช่น คำที่สามารถหาเจอได้ในพจนานุกรม ชื่อของผู้ใช้เอง ชื่อที่เป็นที่นิยมโดยเฉพาะชื่อของบุคคลสำคัญ หรือตัวการ์ตูน เป็นต้น ต่อไปนี้เป็นตัวอย่างเมื่อผู้ใช้เลือกใช้รหัสผ่านที่ไม่ดี

    client# kpasswd
    Old password for angel: @NGuyco2ME
    New Password for angel: meteora
    Verifying, please re-enter New Password for angel: meteora

    kpasswd: Insecure password rejected while attempting to change password.
    Please choose another password.

    New Password for angel: HECo4ASK
    Verifying, please re-enter New Password for angel: HECo4ASK
    Password changed.


  2. เมื่อผู้ใช้ต้องการขอเข้าใช้การบริการจาก Application server เช่น telnet สามารถทำได้โดย

คำสั่ง telnet มีพารามิเตอร์ในการเข้าใช้งานกับ Application server

พารามิเตอร์ ความหมาย
-a

คือ telnet จะล็อกอินโดยอัตโนมัติถ้ามีชื่อผู้ใช้ที่ได้ตรงกับบน ticket

-f หรือ --forward คือการส่งต่อสำเนาของ ticket ของผู้ใช้ไปที่ Application server
-x หรือ --encrypt คือการให้มีการเข้ารหัส
-l ใช้เพื่อระบุชื่อผู้ใช้

เช่นเมื่อต้องการ telnet ไปยังเครื่อง server โดยใช้บัญชีผู้ใช้เป็น angel

client# telnet -a -f -x -l angel server

Trying 192.168.x.x...
Connected to server.thaicert.nectec.or.th (192.168.x.x).
Escape character is '^]'.
Waiting for encryption to be negotiated...
[ Kerberos V5 accepts you as ``angel@DELUFE.TEST'' ]
done.
Last login: Wed May 26 08:47:29 from client
server$


ตารางเปรียบเทียบข้อดีและข้อเสียของ Kerberos

ข้อดี
ข้อเสีย
  • ไม่มีการส่งรหัสผ่านโดยที่ไม่ได้เข้ารหัสข้อมูลบนเครือข่าย
  • เป็นระบบ Single Sign-On
  • Mutual Authentication คือ ทั้งฝั่ง Client และ Server ต้องสามารถตรวจสอบซึ่งกันและกันได้จึงจะมีการติดต่อสื่อสารกันเกิดขึ้น
  • มีความซับซ้อนยุ่งยากในการนำมาใช้งาน
  • Kerberos Server ต้องการความปลอดภัยที่สูงมากเนื่องจากว่าเป็นที่เก็บของฐานข้อมูลของ Kerberos


บทสรุป

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


เอกสารอ้างอิง

[1] The Massachusetts Institute of Technology, Kerberos V5 Installation Guide: http://web.mit.edu/kerberos/www/krb5-1.2/krb5-1.2.6/doc/install.html
[2] The Massachusetts Institute of Technology, Kerberos V5 System Administrator's Guide: http://web.mit.edu/kerberos/www/krb5-1.2/krb5-1.2.6/doc/admin.html
[3] The Massachusetts Institute of Technology, Kerberos V5 UNIX User's Guide: http://web.mit.edu/kerberos/www/krb5-1.2/krb5-1.2.6/doc/user-guide.html
[4] The Massachusetts Institute of Technology, Frequently Asked Questions about Kerberos: http://www.cmf.nrl.navy.mil/CCS/people/kenh/kerberos-faq.html
[5] Red Hat Linux 9: Red Hat Linux Reference Guide: http://www.redhat.com/docs/manuals/linux/RHL-9-Manual/ref-guide/ch-kerberos.html
[6] Pam Todaro, "An Overview of the Kerberos Authentication Protocol", SANS Reading Room, 14 October 2003
[7] Jose L. Marquez, "Kerberos: Secure Authentication", SANS Reading Room 2001
[8] สิริพร จิตต์เจริญธรรม, เสาวภา ปานจันทร์, เลอศักดิ์ ลิ้มวิวัฒน์กุล, "ความรู้เบื้องต้นเกี่ยวกับการพิสูจน์ตัวตน" http://www.thaicert.nectec.or.th/paper/authen/authentication_guide.php



Home || เอกสารเผยแพร่ || Authentication

ThaiCERT Disclaimer | Copyright © 2001 ThaiCERT(NECTEC). All rights reserved.