3.4. ¼ÒÄÏ°ú ³×Æ®¿öÅ© ¿¬°á

¼ÒÄÏÀº ƯÈ÷ ³×Æ®¿öÅ©¸¦ ÅëÇÑ Åë½Å¿¡ »ç¿ëµÈ´Ù. ¼ÒÄÏÀº º»·¡ À¯´Ð½º ½Ã½ºÅÛÀÇ BSD °è¿­¿¡¼­ °³¹ßµÇ¾úÁö¸¸ ÀϹÝÀûÀ¸·Î ´Ù¸¥ À¯´Ð½º °è¿­ ½Ã½ºÅÛÀ¸·Î À̽İ¡´ÉÇÏ´Ù: ¸®´ª½º¿Í System V º¯Çüµéµµ ¶ÇÇÑ ¼ÒÄÏÀ» Áö¿øÇϴµ¥ ¿ÀÇ ±×·ìÀÇ Single Unix Specification [Open Group 1997] Àº ¼ÒÄÏ Áö¿øÀ» ¿ä±¸ÇÏ°í ÀÖ´Ù. System V ´Â ÀüÅëÀûÀ¸·Î ȣȯµÇÁö ¾Ê´Â ´Ù¸¥ ³×Æ®¿öÅ© Åë½Å ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇßÁö¸¸ ¼Ö¶ó¸®½º°°Àº ½Ã½ºÅÛÀÌ ¼ÒÄÏ Áö¿øÀ» Æ÷ÇÔÇÑ´Ù´Â °ÍÀ» ¾ð±ÞÇÏ´Â °ÍÀº °¡Ä¡°¡ ÀÖ´Ù. Socket(2) Àº Åë½ÅÀ» À§ÇÑ ³¡Á¡ (endpoint) ¸¦ »ý¼ºÇÏ¿© ÆÄÀÏ¿¡ ´ëÇÑ open(2) °ú À¯»çÇÑ ¹æ½ÄÀ¸·Î ±â¼úÀÚ (descriptor) ¸¦ ¹ÝȯÇÑ´Ù. ¼ÒÄÏ ¸Å°³º¯¼ö´Â ÀÎÅÍ³Ý µµ¸ÞÀÎ (TCP/IP ¹öÀü 4), Novell ÀÇ IPX ¶Ç´Â ``À¯´Ð½º µµ¸ÞÀÎ" °ú °°Àº ÇÁ·ÎÅäÄÝ °è¿­°ú ŸÀÔÀ» ÁöÁ¤ÇÑ´Ù. ¼­¹ö´Â °ðÀ̾î ÀϹÝÀûÀ¸·Î bind(2), listen(2) °ú accept(2) ¶Ç´Â select(2) ¸¦ È£ÃâÇϸç Ŭ¶óÀ̾ðÆ®´Â ÀϹÝÀûÀ¸·Î bind(2) (»ý·«µÉ ¼öµµ ÀÖ´Ù) ¿Í connect(2) ¸¦ È£ÃâÇÑ´Ù. ´õ¿í ÀÚ¼¼ÇÑ Á¤º¸´Â ÀÌ·¯ÇÑ ·çƾ °¢°¢ÀÇ ¸Ç ÆäÀÌÁö¸¦ º¸¶ó. ¸Ç ÆäÀÌÁö¿¡¼­ ¼ÒÄÏ »ç¿ë¹æ¹ýÀ» ÀÌÇØÇÏ´Â °ÍÀº ¾î·Á¿ï ¼ö Àִµ¥ ÀÌ·¯ÇÑ È£ÃâÀ» ÇÔ²² ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö¸¦ ¹è¿ì·Á¸é Hall "Beej" [1999] ¿Í °°Àº ´Ù¸¥ ³í¹®À» ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.

``À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏ"Àº ½ÇÁ¦ ³×Æ®¿öÅ© ÇÁ·ÎÅäÄÝÀ» ³ªÅ¸³»Áö´Â ¾Ê´Âµ¥ ´Ù¸¸ µ¿ÀÏ ¸Ó½Å»óÀÇ ¼ÒÄÏ¿¡ Á¢¼ÓÇÒ ¼ö ÀÖ´Ù (Ç¥ÁØ ¸®´ª½º Ä¿³Î¿¡ ´ëÇÑ ÀÌ ±ÛÀ» ÀÛ¼ºÇÏ´Â ½ÃÁ¡¿¡´Â). ½ºÆ®¸²À¸·Î »ç¿ëµÉ ¶§ ÀÌ´Â ³×ÀÓµå ÆÄÀÌÇÁ¿Í ¾ÆÁÖ À¯»çÇÏÁö¸¸ »ó´çÇÑ ÀåÁ¡À» °®°í ÀÖ´Ù. ƯÈ÷ À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏÀº Á¢¼Ó ÁöÇâÀ¸·Î ¼ÒÄÏÀ¸·ÎÀÇ »õ·Î¿î °¢ Á¢¼ÓÀº ³×ÀÓµå ÆÄÀÌÇÁ¿Í´Â ¸Å¿ì ´Ù¸£°Ô »õ·Î¿î Åë½Å ä³ÎÀ» »ý¼ºÇÑ´Ù. ÀÌ Æ¯¼º¶§¹®¿¡ À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏÀº ´ë°³ ¸¹Àº Áß¿äÇÑ ¼­ºñ½º¿¡ ´ëÇØ IPC ¸¦ ±¸ÇöÇϱâ À§ÇØ ³×ÀÓµå ÆÄÀÌÇÁ ´ë½Å »ç¿ëµÈ´Ù. ¾ð³×ÀÓµå ÆÄÀÌÇÁ¸¦ °¡Áú ¼ö ÀÖµíÀÌ socketpair(2) ¸¦ »ç¿ëÇÏ¿© ¾ð³×ÀÓµå À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏÀ» °¡Áú ¼ö Àִµ¥ ÀÌ´Â ¾ð³×ÀÓµå ÆÄÀÌÇÁ¿Í À¯»çÇÑ ¹æ½ÄÀ¸·Î IPC ¿¡ ´ëÇØ À¯¿ëÇÏ´Ù.

À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏÀº º¸¾È°ú °ü·ÃÇؼ­ ¸î°¡Áö Àç¹ÌÀÖ´Â ÇÔÃàµÈ Àǹ̸¦ °®°í ÀÖ´Ù. ù° À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏÀÌ ÆÄÀϽýºÅÛ¿¡ ³ªÅ¸³ª¸ç ÀÌ¿¡ Àû¿ëµÇ´Â stat(2) ¸¦ °¡Áú ¼ö ÀÖÀ½¿¡µµ ºÒ±¸ÇÏ°í open(2) À» »ç¿ëÇؼ­ À̸¦ ¿­ ¼ö´Â ¾ø´Ù (socket(2) ¿Í friends ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù). µÎ¹ø° À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏÀº ÇÁ·Î¼¼½º°£ ÆÄÀÏ ±â¼úÀÚ¸¦ Àü´ÞÇϴµ¥ »ç¿ëµÉ ¼ö ÀÖ´Ù (±×Àú ÆÄÀÏ ³»¿ëÀÌ ¾Æ´Ñ). ´Ù¸¥ ¸ðµç IPC ¸ÞÄ«´ÏÁò¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Â ÀÌ·¯ÇÑ »ö´Ù¸¥ ´É·ÂÀº ¸ðµç ŸÀÔÀÇ Ã¼°è (scheme) ¸¦ ÇØÅ·Çϴµ¥ »ç¿ëµÇ¾î ¿Ô´Ù (±â¼úÀÚ´Â ÄÄÇ»ÅÍ °úÇÐ ºÐ¾ß¿¡¼­ ±âº»ÀûÀ¸·Î ``´É·Â"ÀÇ Á¦ÇÑµÈ ¹öÀüÀ¸·Î »ç¿ëµÉ ¼ö ÀÖ´Ù). ÆÄÀÏ ±â¼úÀÚ´Â sendmsg(2) ¸¦ »ç¿ëÇÏ¿© º¸³»Áö´Âµ¥ msg (¸Þ½ÃÁö) ÀÇ msg_control Çʵå´Â Á¦¾î ¸Þ½ÃÁö Çì´õÀÇ ¹è¿­À» °¡¸®Å²´Ù (msg_controllen Çʵ尡 ¹è¿­¿¡ Æ÷ÇÔµÈ ¹ÙÀÌÆ®¼ö¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù). °¢ Á¦¾î ¸Þ½ÃÁö´Â µ¥ÀÌŸ ´ÙÀ½¿¡ ¿À´Â cmsghdr ±¸Á¶Ã¼·Î ÀÌ ¸ñÀûÀ» À§ÇØ cmsg_type À» SCM_RIGHTS ·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù. ÆÄÀϱâ¼úÀÚ´Â recvmsg(2) ¸¦ ÅëÇØ °Ë»öµÇ¸ç À̶§ºÎÅÍ À¯»çÇÑ ¹æ½ÄÀ¸·Î ÃßÀûµÈ´Ù. ¼ÖÁ÷È÷ ÀÌ Æ¯Â¡Àº ¸Å¿ì »ö´Ù¸£Áö¸¸ ¾Ë¸¸ÇÑ °¡Ä¡°¡ ÀÖ´Ù.

¸®´ª½º 2.2 ´Â À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏ¿¡¼­ ºÎ°¡ÀûÀΠƯ¡À» Áö¿øÇϴµ¥ peer ÀÇ "credentials" (pid, uid ¿Í gid) À» ¾òÀ» ¼ö ÀÖ´Ù. ´ÙÀ½Àº ¿¹Á¦ ÄÚµåÀÌ´Ù:

 /* fd= ½Äº°Çϱ⸦ ¿øÇϴ Ŭ¶óÀ̾ðÆ®¿¡ Á¢¼ÓµÈ À¯´Ð½º µµ¸ÞÀÎ ¼ÒÄÏÀÇ ÆÄÀÏ ±â¼úÀÚ */

 struct ucred cr;
 int cl=sizeof(cr);

 if (getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &cr, &cl)==0) {
   printf("Peer's pid=%d, uid=%d, gid=%d\n",
           cr.pid, cr.uid, cr.gid);

Ç¥ÁØ À¯´Ð½º¿¡¼­´Â 1024 ¹Ì¸¸ÀÇ TCP ¿Í UDP Áö¿ª Æ÷Æ® ³Ñ¹ö·ÎÀÇ ¹ÙÀεùÀº ·çÆ® ±ÇÇÑÀ» °¡Á®¾ß ÇÏ¸ç ¸ðµç ÇÁ·Î¼¼½º´Â 1024 ¶Ç´Â ±× ÀÌ»óÀÇ unbound Æ÷Æ® ³Ñ¹ö¿¡ ¹ÙÀεåÇÒ ¼ö ÀÖ´Â °ÍÀÌ °ü·ÊÀÌ´Ù. ¸®´ª½º´Â ÀÌ °ü·Ê¸¦ ´õ¿í ¸íÈ®ÇÏ°Ô µû¸£´Âµ¥, ¸®´ª½º´Â 1024 ¹Ì¸¸ÀÇ Æ÷Æ® ³Ñ¹ö·Î ¹ÙÀεùÇϱâ À§Çؼ­´Â CAP_NET_BIND_SERVICE ´É·ÂÀ» °®´Â ÇÁ·Î¼¼½º¸¦ ÇÊ¿ä·ÎÇÑ´Ù.; ÀÌ ´É·ÂÀº º¸Åë euid °¡ 0 ÀÎ ÇÁ·Î¼¼½º¸¸ÀÌ °®´Â´Ù. °ü½ÉÀÌ ÀÖ´Ù¸é ¸®´ª½º ¼Ò½º¸¦ »ìÆ캽À¸·Î½á À̸¦ È®ÀÎÇÒ ¼ö Àִµ¥ ¸®´ª½º 2.2.12 ÀÇ /usr/src/linux/net/ipv4/af_inet.c ÆÄÀÏ¿¡¼­ inet_bind() ÇÔ¼ö¸¦ º¸¶ó.