Xem mẫu

  1. Chương V: XÂY DỰNG RADIUS PROXY I. Giới thiệu: Thoâng thöôøng, khi Radius Server nhaän moät yeâu caàu xaùc nhaän quyeàn töø RAS, noù seõ xöû lyù vaø göûi traû keát quaû traû lôøi tröïc tieáp veà RAS ñoù. Tuy nhieân, mo ãi Radius Server chæ coù theå xaùc nhaän quyeàn cho moät soá users haïn ñònh. Neáu soá löôïng user cuûa RAS taêng leân nhieàu, ta caàn phaûi xaây döïng moät Radius Server môùi. Ñeå cho caùc Radius Server coù theå xaùc nhaän quyeàn cho RAS, yeâu caàu xaây döïng Radius Proxy ñöôïc ñaët ra. Radius Proxy seõ nhaän caùc yeâu caàu töø RAS göûi ñeán, thieát laäp yeâu caàu môùi, sau ñoù gôûi ñeán Radius Server töông öùng, chôø nhaän keát quaû traû lôøi töø Radius Server ñeå göûi traû laïi RAS. 58
  2. Ñeà xuaát phöông phaùp xaây döïng Radius Proxy. II. Phương pháp 1: Client seõ gôûi Access-Request tôùi Radius Proxy. Radius Proxy vöøa coù traùch nhieäm cuûa moät Radius server, vöøa coù traùch nhieäm cuûa Radius Proxy. Nghóa laø noù seõ giaûi maõ yeâu caàu gôûi tôùi töø client ñeå laáy ra ñöôïc nhöõng thoâng tin ñaëc tröng cho yeâu caàu ñoù, tra khaûo nhöõng thoâng tin naøy trong cô sôû döõ lieäu noäi boä vaø xaùc nhaän xem caùc thoâng tin naøy coù hôïp leä hay 59
  3. khoâng (authenticating). Neáu söï xaùc nhaän laø thaønh coâng thì Access-Accept, chöùa ñöïng caùc thoâng tin veà quyeàn vaø caùch thöùc truy xuaát cho pheùp vaøo caùc dòch vuï maïng (network services) cuûa user, seõ ñöôïc gôûi traû veà Client. Neáu söï xaùc nhaän laø thaát baïi taïi baát cö ù ñieàu kieän naøo, Radius Proxy seõ löu laïi nhöõng thoâng tin caàn thieát cuûa yeâu caàu naøy, ñoàng thôøi xaây döïng moät yeâu caàu môùi vaø gôûi yeâu caàu naøy tôùi Radius server ñöôïc chæ ñònh ñeå xaùc nhaän v aø chôø traû lôøi. Sau khi nhaän ñöôïc traû lôøi, Radius Proxy seõ xaây döïng moät traû lôøi môùi theo nhöõng thoâng tin ñaõ ñöôïc löu laïi vaø gôûi noù cho Client döôùi daïng Access-Accept hay Access- Reject. Trong phöông phaùp naøy, ta duøng laïi quaù trình nhaän yeâu caàu töø Client cuûa Radius Proxy vaø quaù trình gôûi traû keát quaû xaùc nhaän veà cho Client, chæ boå sung phaàn gôûi yeâu caàu /nhaän traû lôøi giöõa Proxy vaø Server. Ôû ñaây ta duøng cheá ñoä gôûi vaø chôø (poolling) ôû phaàn maõ th eâm vaøo, naèm ôû ñaàu quaù trình gôûi keát quaû xaùc nhaän veà cho Client, do ñoù seõ gaây ra thôøi gian treã. Chöông trình seõ khoâng ôû cheá ñoä thôøi gian thöïc (real -time), maëc duø ñaõ duøng timer ñeå traùnh laëp voâ haïn. 60
  4. Phaàn Radius Proxy ñöôïc xaây döïng nhö sau:  Dùng lại: +Nhaän goùi UDP töø Client: recvfrom (sockfd,recv_buffer,…) +Phaân tích goùi UDP thaønh goùi Radius vaø taïo ra caáu truùc Auth-Request: aatv->recv(&authreq,…) +Authenticate vaø gôûi traû goùi keát quaû veà Client: rad_reply() Vieát môùi: cheøn vaøo rad_reply()  if ((result == EV_ACK) /* result laø keát quaû cuûa quaù trình authentication*/ { /* Laøm bình thuôøng: traû veà goùi Access-Accept*/ } …. Send_reply(authreq,…) else if (result == EV_NAK) { /* Thay vì traû veà goùi Access-Reject ta seõ laøm nhö sau*/ /* Xaây döïng caáu truùc SendData töø caáu truùc Auth-Request*/ if (construct_request ( authreq, data ) != 0) { /* Neáu xaây döïng khoâng ñöôïc thì traû veà goùi Access-Reject*/ 61
  5. result = EV_NAK; goto failed_label; } else { /* Gôûi SendData tôùi Radius Server, chôø nhaän goùi traû veà (pooling), Khoâi phuïc laïi caáu truùc Auth-Request vôùi nhöõng thoâng soá ñöôïc Caäp nhaät*/ if (send_to_server ( data, sockfd, authreq, msg) == 0) { result == EV_ACK; } else { /* Neáu khoâng gôûi ñöôïc hoaëc khoâng nhaän ñöôïc goùi traû lôøi hoaëc goùi traû veà khoâng hôïp leä thì traû veà goùi Access-Reject*/ result == EV_NAK; goto failed_label; } 62
  6. } goto passed_label; } failed_lable: Send_reply(authreq,…) Passed_label: /* Tieáp tuïc bình thöôøng*/ Caùch naøy duøng cheá ñoä pooling neân seõ khoâng öu vieät khi user mong muoán laøm vieäc ôû cheá real-time (login trong moät khoaûng thôøi gian raát ngaén, neáu khoâng ñöôïc seõ baùo ngay – message seõ ñöôïc truyeàn ñi ngay khi tôùi Proxy vaø quay veà ngay maø khoâng caàn chôø hoà i ñaùp töø server (NON_BLOCK)). Thöïc teá khi chaïy chöông trình, neáu chaát löôïng maïng keùm hay tình traïng taûi cao, pooling seõ laøm cho process chieám CPU trong toaøn boä khung thôøi gian maø heä ñieàu haønh daønh cho noù maø khoâng laøm gì caû ngoaøi vieäc ñôïi goùi traû veà töø server. Neáu soá löôïng yeâu caàu töø proxy khoâng ñöôïc server traû lôøi laø cao thì heä thoáng seõ chaïy raát c haäm vaø haàu nhö bò timeout. III. Phương pháp 2: Radius Proxy ñöôïc xaây döïng taùch bieät Radius Server. Nghóa laø noù chæ coù traùch nhieäm nhaän yeâu caàu töø Client gôûi tôùi, giaûi maõ yeâu caàu naøy ñeå nhaän bieát caùc thoâng tin caàn thieát nhö Request ID, Client-ID, User-Name, Password, Shared Secret… ; Sau ñoù löu laïi caùc thoâng tin cuûa yeâu caàu vaø xaây döïng moät yeâu caàu môùi (sinh ra Request-ID, Client-ID môùi), gôûi yeâu caàu môùi naøy tôùi Radius Server. Radius Server seõ xaùc nhaän caùc thoâng tin cuûa yeâu caàu 63
  7. vaø traû lôøi keát quaû cho Radius Proxy maø tôùi phieân noù seõ caäp nhaät laï i moät soá thoâng tin cuûa yeâu caàu ban ñaàu cho goùi traû lôøi vaø gôûi noù veà cho Client töông öùng. Trong phöông phaùp naøy khoâng duøng laïi maõ nguoàn cuûa Radius Server maø xaây döïng moät chöông trình coù khaû naêng giaûi maõ moät phaàn caùc goùi vaø trung chuyeån caùc goùi naøy ñeán Radius Server vaø Client chæ ñònh. Chöông trình naøy khoâng hoaït ñoäng ôû cheá ñoä goïi/chôø (poolling) maø ôû cheá ñoä thôøi gian thöïc (Real Time). Ñoàng thôøi ta cuõng duøng Timer cho caùc yeâu caàu töø Client tôùi ñeå traùnh cho Client phaûi chôø voâ haïn. Moãi yeâu caàu töø Client tôùi seõ ñöôïc Timer cuûa Radius Proxy ñaùnh daáu laïi thôøi ñieåm naøy (Time -stamp). Neáu sau moät khoaûng thôøi gian nhaát ñònh maø Proxy khoâng nhaän ñöôïc goùi traû lôøi töông öùng cho yeâu caàu naøy töø Radius Server thì Timer seõ yeâu caàu Proxy gôûi Access-Reject thoâng baùo cho Client bieát raèng yeâu caàu xaùc nhaän quyeàn (Authentication Request) ñaõ quaù thôøi gian haïn ñònh (timeout), ñoàng thôøi xoùa thoâng tin goùi yeâu caàu trong boä ñeäm cuûa Proxy. Ta coù theå xaây döïng giaûi thuaät chöông trình nhö sau: /* ñònh nghóa hai queue gôûi/nhaän tónh, toaøn cuïc ñeå caùc process ñeàu coù theå tham khaûo hoaëc caäp nhaät*/ Static AUTH_REQ SendQueue[MAX_QUEUE]; Static AUTH_REQ RecvQueue[MAX_QUEUE]; 64
  8. Static TIMER Timer[MAX_TIMER]; Static PENDING_REQUESTS pendingReq[MAX_REQ]; Static int send_sockfd, recv_sockfd; Static int numPending = 0; Main() { /* taïo process TimerThread*/ if fork() { /* process TimerThread*/ Timerthread (); } /* Taïo process Receiver*/ if fork() { /* process Receiver*/ Receiver(); 65
  9. } /* Taïo process Sender*/ if fork() { /* Process Sender*/ Sender(); } if error exit(1); /* Chôø caùc process con keát thöùc*/ wait on childred-processes exit(0); } Receiver() { if fork() /* taïo receive-part*/ { Taïo listener treân Radius-UDP-Port (&recv_sockfd); 66
  10. While (1) { if (coù döõ lieäu treân recv_sockfd) recvfrom(recv_sockfd, ANY_ADDR, buffer,…); authReq = makeAuthReq(TO_SERVER, buffer); pendingReq[numPending++] = authReq->id; if (semaphore-enable-to-write-in-SendQueue) { seton(sendqueueSemaphore); writeQueue(authReq,SendQueue); setoff(sendqueueSemaphore); timerID = setTimer(authReq->id); } } } if fork() /* taïo send-part*/ { 67
  11. while (1) { if (ReceiveQueue NULL) { if (semaphore-enable-to-write-in-ReceiveQueue) { seton(recvqueueSemaphore); idQ = readQueue(&authReq, ReceiveQueue); freeQueue (idQ, ReceiveQueue); setoff(recvqueueSemaphore); sendto(recv_sockfd, authReq, authReq->clientId …); } } } } 68
  12. if error exit(-1); wait on children-processes } Sender() { if fork() /* taïo receive-part*/ { Taïo listener treân Radius-UDP-Port (&send_sockfd); While (1) { if (coù döõ lieäu treân send_sockfd) recvfrom(send_sockfd, ANY_ADDR, buffer,…); authReq = makeAuthReq(TO_CLIENT, buffer); if authReq->id NOT IN pendingReq[] continue; if (semaphore-enable-to-write-in-ReceiveQueue) { 69
  13. seton(recvqueueSemaphore); writeQueue(authReq,ReceiveQueue); setoff(recvqueueSemaphore); freeTimer(Timer[authReq->id].timeId); } } } if fork() /* taïo send-part*/ { while (1) { if (SendQueue NULL) { if (semaphore-enable-to-write-in-SendQueue) { seton(sendqueueSemaphore); idQ = readQueue(&authReq,SendQueue); freeQueue (idQ, SendQueue); 70
  14. setoff(sendqueueSemaphore); sendto(send_sockfd, authReq,…); } } } } if error exit(-1); wait on children-processes } TimerThread () { while (1) { for ( n = 0; n < MAX_TIMER;n++) { if Timer[n].timeId < 0 continue; 71
  15. if Timer[n].numClock == 0 freeTimer(Timer[n].timeId); else Timer[n].numClock--; } } } Khi thöïc hieän phöông phaùp naøy, ta traùnh ñöôïc pooling nhöng phaûi traû giaù thöïc hieän khoù Timer vaø sempahore. Vieäc coding seõ phöùc taïp vaø deã sinh loãi nhöng keát quaû neáu thu ñöôïc seõ toát hôn phöông phaùp moät. Chöông trình seõ chaïy caøng toát ôû traïng thaùi taûi maïng cao khi Semaphore vaø Timer ñöôïc thöïc hieän chính xaùc vaø toái öu. IV. Phương Pháp 3: Phöông phaùp naøy gioáng phöông phaùp hai ôû choã xaây döïng moät Radius Proxy Server ñoäc laäp vôùi source code cuûa Radius Server. Tuy nhieân trong phöông phaùp naøy, ta khoâng xaây döïng 2 process chính laø Receiver vaø Sender cuøng caùc queues cuûa chuùng, maø chæ xaây döïng moät process chính receiver coù nhieäm vuï nhaän caùc requests gôûi ñeán vaø xöû lyù caùc requests naøy. Moãi laàn nhaän ñöôïc request töø client, receiver seõ taïo ra moät process môùi chòu traùch nhieäm rieâng cho request ñoù. Caùc requests töø client do ñoù khoâng phaûi chôø ñôïi tôùi phieân mình ñöôïc xöû lyù t reân queue. Soá requests bò timeout töông öùng cuõng giaûm ñi. 72
  16. Caùc process con töông öùng vôùi moãi request seõ phaân tích daïng request; kieåm tra xem thoâng tin cuûa request ñaõ coù trong cache chöa, neáu coù thì seõ taïo goùi traû lôøi cho client ma ø khoâng caàn phaûi xaùc nhaän vôùi Radius Server, neáu khoâng coù thì seõ tieán haønh xaùc nhaän vôùi Radius Server, chôø nhaän traû lôøi traû veà vaø taïo goùi traû lôøi cho client. Moãi luùc Radius Proxy gôûi request tôùi Radius Server, timer seõ ñöôïc taïo ra. Trong moät thôøi gian nhaát ñònh, request naøo khoâng theå gôûi ñöôïc seõ bò timeout. Do söï ñôn giaûn vaø hieäu quaû cuûa noù, phöông phaùp naøy ñöôïc choïn ñeå phaùt trieån thaønh maõ nguoàn. 73
  17. Chương VI: WEBADMIN và GIAO DIỆN QUẢN LÝ I. Giới thiệu về Webadmin Caùc maïng thoâng tin hieän nay khoâng coøn giôùi haïn ôû maïng cuïc boä (Local) nhö tröôùc maø ñaõ phaùt trieån thaønh maïng dieän roäng (WAN) lôùn hôn vaø phöùc taïp hôn tröôùc raát nhieàu. Do ñoù yeâu ca àu veà quaûn trò caùc maïng naøy vôùi gaùnh naëng chi phí toái thieåu, thôøi gian vaø ñoä phöùc taïp thaáp nhöng vôùi ñoä tin caäy cao vaø hieäu quaû ñaõ ñöôïc ñaët ra nhaèm hoã trôï cho caùc nhaø quaûn trò heä thoáng. Chöông trình Webadmin cho pheùp caùc nhaø quaûn trò heä thoáng coù theå quaûn trò maïng töø xa (remote administration) thoâng qua caùc trình duyeät web (Web browser) trong vieäc quaûn lyù heä thoáng maïng cuûa mình. 1. Webdmin –0.64: Chöông trình Webadmin ñöôïc vieát treân ngoân ngöõ Perl5 vaø CGI. Ñaây laø chöông trình cho pheùp quaûn trò caùc dòch vuï treân heä thoáng nhö account, Internet Service, DNS, file sharing treân moâi tröôøng UNIX. a. Cấu trúc chương trình: Caùc module chính cuûa chöông trình nhö sau: 74
  18. 1. Account: duøng cho vieäc quaûn lyù user, password, vaø phaân quyeàn cho user webmin. Duøng thö vieän acl.pl. 2. DNS: duøng cho vieäc quaûn lyù DNS. Duøng thö vieän dns-lib.pl 3. Export: duøng cho vieäc export caùc nfs (network file system). Duøng thö vieän export-lib.pl 4. Fdisk: dstatus-pl duøng ñeå hieån thò trình traïng, kieåu vaø mount cuûa caùc thieát bò.  Fdisk-lib.pl: duøng ñeå quaûn lyù ñóa mhö taïo, xoaù partition..  Keát hôïp caùc caùc CGI nhö fsck.cgi , mkfs.cgi 1. File: duøng ñeå quaûn lyù file treân linux. Duøng thö vieän file -lib.pl keát hôïp vôùi caùc CGI cho pheùp taïo, sao cheùp, xoaù, phaân quyeàn, hieån thò caáu truùc thö muïc… 2. Format: cho pheùp quaûn lyù ñóa treân solaris 3. Inetd: cho pheùp quaûn lyù file inet.conf vaø file services 4. Init: duøng cho vieäc boot vaø shutdown.. 5. Lpadmin: duøng cho vieäc quaûn lyù maùy in. Duøng thö vieän linux-lib.pl (cho Linux) hoaëc solaris-lib.pl (cho solaris) 6. Mount: duøng ñeå hieån thò, taïo caùc mount point. 7. Proc: duøng cho vieäc xuaát ps. Duøng thö vieän freebsd-lib.pl 8. Sendmail: duøng cho vieäc göûi vaø nhaän mail. 9. Useradmin: duøng cho vieäc quaûn lyù user. 75
  19. 10. Webmin: duøng cho vieäc quaûn lyù webserver nhö thay ñoåi thoâng tin caáu hình web. Caùc thö vieän treân söû duïng thö vieän web-lib.pl laø thö vieän chöùa caùc leänh chuaån nhö ñoïc fiel ,vieát file, thay ñoåi ñòa chæ ip, sao cheùp döõ lieäu. b. Caøi ñaët: chaïy setup.sh trong thö muïc Webmin. Phaàn setup naøy seõ chæ ra caùc thoâng tin caáu hình caàn caøi ñaët nhö: /etc/webmin : thö muïc chöùa taäp tin config.  /usr/sbin/perl: ñöôøng daãn cuûa ngoân ngöõ Perl.  hostname: teân Webserver.  Port: ta coù theå duøng port maëc ñònh.  c. Khôûi ñoäng Webadmin: /etc/webmin/start II. Xây dựng module quản lý Radius Proxy Chöông trình Webmin duøng thuaän tieän cho vieäc quaûn trò heä thoáng. Module quaûn lyù Radius Proxy ñöôïc tích hôïp vaøo chöông trình Webmin cho pheùp khôûi ñoäng (start) vaø keát thuùc (stop) Radius Proxy. 76
  20. P HỤ L Ụ C 1. Các tài liệu tham khảo [1] Security in Computing; Charles P. Pfleeger; AT&T Bell Laboratories; Prentice Hall International Editions. [2] UNIX Sytem V Release 4 – Programmer’s Guide: Networking Interface ; AT&T Bell Laboratories; Prentice Hall International Editions. [3] Advanced Unix Programming; Marc J. Rochkind; Prentice Hall International Editions. [4] The KornShell – Command and Programming Language; Mrris I. Bolsky – David G. Korn; AT&T Bell Laboratories; Prentice Hall International Editions. [5] Unix System V/386 – Programmer’s Guide; AT&T Bell Laboratories; Prentice Hall International Editions. [6] Data Networks – Concepts, Theory, and Practice; Uyless D. Black; Prentice Hall International Editions. 1. Caùc ñòa chæ taøi lieäu tham khaûo: http://www.ascend.com http://www.livingston.com 77
nguon tai.lieu . vn