25.»ç¿ëÀÚ¿Í ±×·ì
½Ã½ºÅÛ¿¡¼ ·Î±×ÀÎÇϰí ÀÖ´Â ¸ðµç »ç¿ëÀÚ´Â »ç¿ëÀÚ ID(user ID)¶ó°í ºÒ¸®´Â ÇÑ °³ÀÇ ´ÜÀÏÇÑ ¼ýÀÚ¿¡ ÀÇÇØ¼ ±¸ºÐµÈ´Ù. °¢ ÇÁ·Î¼¼½º´Â ±× ÇÁ·Î¼¼½º¸¦ °¡Áø »ç¿ëÀÚÀÇ ¾ï¼¼½º ±ÇÇÑÀ» ¾Ë¸®´Â À¯È¿ »ç¿ëÀÚ ID¸¦ °®´Â´Ù. »ç¿ëÀÚµéÀº ¾ï¼¼½º Á¦¾î¸¦ ¸ñÀûÀ¸·Î ÇÏ¿© ±×·ìÀ¸·Î ºÐ·ùµÈ´Ù. °¢ ÇÁ·Î¼¼½º´Â ±× ÇÁ·Î ¼¼½º°¡ ÆÄÀϵéÀ» ¾ï¼¼½ºÇϱâ À§Çؼ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾î¶² ±×·ìµéÀÌ ÀÖ´ÂÁö¸¦ ¾Ë¸®´Â ÇÑ °³ ÀÌ»óÀÇ ±×·ì ID(group ID)°¡ ÀÖ´Ù. ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID ¿Í À¯È¿ ±×·ì IDµéÀº personaÀÇ ÁýÇÕÀûÀÎ Çü ½ÄÀÌ´Ù. À̰ÍÀº ±× ÇÁ·Î¼¼½º°¡ ¾î¶² ÆÄÀÏÀ» ¾ï¼¼½º ÇÒ ¼ö ÀÖ´ÂÁö¸¦ °áÁ¤ÇÑ´Ù. ÀϹÝÀûÀ¸·Î, ÇÁ·Î¼¼ ½º´Â ºÎ¸ð ÇÁ·Î¼¼½º·ÎºÎÅÍ persona¸¦ »ó¼Ó ¹ÞÁö¸¸, Ưº°ÇÑ »óȲÇÏ¿¡¼´Â ±× persona¸¦ º¯°æÇؼ ¾ï ¼¼½º ±ÇÇÑÀ» º¯°æÇÒ ¼ö ÀÖ´Ù.
½Ã½ºÅÛ¿¡ ÀÖ´Â °¢ ÆÄÀÏÀº ¶ÇÇÑ »ç¿ëÀÚ ID ¿Í ±×·ì ID¸¦ °®´Â´Ù. ¾ï¼¼½ºÁ¦¾î(access control)´Â, ½ÇÇà µÇ°í ÀÖ´Â ÇÁ·Î¼¼½ºÀÇ »ç¿ëÀÚ ID ¿Í ±×·ì ID¸¦ ÆÄÀÏÀÇ »ç¿ëÀÚ ID ¿Í ±×·ì ID¸¦ ºñ±³ÇÔÀ¸·Î½á ¼öÇà µÈ´Ù. ±× ½Ã½ºÅÛÀº µî·ÏµÈ »ç¿ëÀÚµéÀ» ¸ðµÎ µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåÇϰí, ´Ù¸¥ µ¥ÀÌÅͺ£À̽º¿¡ Á¤ÀÇµÈ ¸ðµç ±×·ìµéÀ» ÀúÀåÇÑ´Ù. ±× µ¥ÀÌÅͺ£À̽º¸¦ ½ÃÇèÇϱâ À§ÇØ »ç¿ëÇÒ ¼ö ÀÖ´Â ¶óÀ̺귯¸® ÇÔ¼öµéÀÌ ÀÖ´Ù.
25.1 »ç¿ëÀÚ¿Í ±×·ì IDµé.
ÄÄÇ»ÅÍ ½Ã½ºÅÛ¿¡ µî·ÏµÈ °¢ »ç¿ëÀÚµéÀº »ç¿ëÀÚ À̸§(user name) °ú »ç¿ëÀÚID(user ID) ¿¡ ÀÇÇØ ±¸ ºÐµÈ´Ù. ÀϹÝÀûÀ¸·Î, °¢ »ç¿ëÀÚ À̸§Àº ÇÑ °³ÀÇ ´ÜÀÏÇÑ »ç¿ëÀÚ ID¸¦ °®Áö¸¸, °°Àº »ç¿ëÀÚ ID¿¡ ¿©·¯ °³ÀÇ ·Î±×ÀÎ À̸§µéÀ» °¡Áú ¼ö ÀÖ´Ù. »ç¿ëÀÚ À̸§°ú ±×¿¡ ÇØ´çÇÏ´Â »ç¿ëÀÚ ID´Â 25.12Àý [User Database] 360 ÆäÀÌÁö¿¡ ¼³¸íµÈ, ´ç½ÅÀÌ ¾ï¼¼½º ÇÒ ¼ö ÀÖ´Â µ¥ÀÌÅͺ£À̽º¿¡ ÀúÀåµÇ¾î ÀÖ´Ù.
»ç¿ëÀÚ´Â ±×·ì¾È¿¡ ºÐ·ùµÈ´Ù. °¢»ç¿ëÀÚ À̸§Àº µðÆúÆ®·Î´Â ÇÑ °³ÀÇ ±×·ìÀÌÁö¸¸, ÇÑ °³ ÀÌ»óÀÇ ±×·ì ¿¡ ¼Ò¼ÓµÈ´Ù. °°Àº ±×·ìÀÇ ¸â¹öÀÎ »ç¿ëÀÚµéÀº ±× ±×·ìÀÇ ¸â¹ö°¡ ¾Æ´Ñ »ç¿ëÀÚ°¡ ¾ï¼¼½ºÇÒ ¼ö ¾ø´Â ÀÚ¿øµé(ÆÄÀϰú °°Àº)À» °øÀ¯ÇÑ´Ù. °¢ ±×·ìÀº ÇÑ °³ÀÇ ±×·ì À̸§°ú ±×·ì ID¸¦ °®´Â´Ù. 25.13Àý [Group Database] 362 ÆäÀÌÁö¿¡, ±×·ì ID ¶Ç´Â ±×·ì À̸§¿¡ ´ëÇÑ Á¤º¸¸¦ ¾î¶»°Ô ã´ÂÁö ³ª¿ÍÀÖ´Ù.
25.2 ÇÁ·Î¼¼½ºÀÇ persona
¾î´À ½Ã°£¿¡, °¢ ÇÁ·Î¼¼½º´Â ÇÁ·Î¼¼½ºÀÇ ±ÇÇÑÀ» °áÁ¤ÇÏ´Â ÇÑ °³°¡ ´ÜÀÏÇÑ »ç¿ëÀÚ ID¿Í ÇÑ °³ÀÇ ±× ·ì ID¸¦ °®´Â´Ù. ±×µéÀº ÇÁ·Î¼¼½ºÀÇ ÁýÇÕÀûÀÎ persona¶ó°í ºÒ¸®´Âµ¥, ¿Ö³ÄÇÏ¸é ±×µéÀº ¾ï¼¼½º Á¦¾î ÀÇ ¸ñÀûÀ» À§ÇÏ¿© "±×°ÍÀº ´©±¸ÀÌ´Ù"¸¦ °áÁ¤Çϱ⠶§¹®ÀÌ´Ù. ±× IDµéÀº ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID(effective user ID) ¿Í À¯È¿ ±×·ì ID(effective group ID) ¶ó°í ºÒ¸°´Ù. ´ç½ÅÀÇ ·Î±×ÀÎ ½©Àº ´ç½ÅÀÇ »ç¿ëÀÚ ID ¿Í ´ç½ÅÀÇ µðÆúÆ® ±×·ì ID·Î ±¸¼ºµÇ´Â persona·Î ½ÃÀÛÇÑ´Ù. ÀϹÝÀûÀΠȯ°æ¿¡¼, ¸ðµç ´ç ½ÅÀÇ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀº ±×µéÀÇ °ªµéÀ» »ó¼Ó¹Þ´Â´Ù.
ÇÁ·Î¼¼½º´Â ±× ÇÁ·Î¼¼½º¸¦ ¸¸µé¾ú´ø »ç¿ëÀÚ¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Â ½ÇÁ¦»ç¿ëÀÚ ID(real user ID)¿Í »ç ¿ëÀÚÀÇ µðÆúÆ® ±×·ìÀ» È®ÀÎÇÏ´Â ½ÇÁ¦ ±×·ì ID(real group ID)¸¦ °®´Â´Ù. ±×µéÀÇ °ªµéÀº ¾ï¼¼½º Á¦¾î ÀÇ ¿ªÇÒÀ» ÇÏÁö ¾Ê±â ¶§¹®¿¡, ¿ì¸®´Â ±×µéÀ» personaÀÇ ºÎºÐÀ¸·Î °£ÁÖÇÏÁö ¾Ê´Â´Ù. ÇÏÁö¸¸ ±×µéÀº Áß ¿äÇÏ´Ù. ½ÇÁ¦ ¿Í À¯È¿ »ç¿ëÀÚ ID µÑÀº ¸ðµÎ ÇÁ·Î¼¼½ºÀÇ »ýÁ¸±â°£ µ¿¾È¿¡ º¯°æµÉ ¼ö ÀÖ´Ù. 25.3Àý [Why Change Persona] 354 ÆäÀÌÁö ÂüÁ¶. ºÎ°¡ÀûÀ¸·Î, »ç¿ëÀÚ´Â ¿©·¯°³ÀÇ ±×·ì¿¡ Æ÷Ç﵃ ¼ö Àֱ⠶§ ¹®¿¡, persona¿¡´Â ¾ï¼¼½º ±ÇÇÑ¿¡ ±â¿©ÇÏ´Â ºÎ°¡ÀûÀÎ ±×·ì IDµéÀÌ Æ÷ÇԵȴÙ. ¾î¶»°Ô ÇÁ·Î¼¼½ºÀÇ À¯ È¿ »ç¿ëÀÚ ID¿Í ±×·ì IDµéÀÌ ÆÄÀÏÀ» Á¢±ÙÇÏ´Â ±ÇÇÑ¿¡ ¿µÇâÀ» ¹ÌÄ¡´ÂÁö¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸µéÀº, 9.8.6Àý [Access Permission]137 ÆäÀÌÁö ÂüÁ¶.
ÇÁ·Î¼¼½ºÀÇ »ç¿ëÀÚ ID´Â kill ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ½Ã±×³¯µéÀ» º¸³¾ ¼ö ÀÖ´Â
±ÇÇÑ ¶ÇÇÑ Á¦¾îÇÑ´Ù. 21.6.2Àý [Signaling Another Process] 295 ÆäÀÌÁö ÂüÁ¶.
25.3 ¿Ö ÇÁ·Î¼¼½ºÀÇ persona¸¦ º¯°æÇϴ°¡?
ÇÁ·Î¼¼½º¸¦ À§ÇÏ¿© »ç¿ëÀÚ ±×¸®°í/¶Ç´Â ±×·ì IDµéÀ» º¯°æÇÒ Çʿ䰡 ÀÖ´Â °¡Àå ¸í¹éÇÑ »óȲÀÌ ÀÖ´Â °÷Àº ·Î±×ÀÎ ÇÁ·Î±×·¥ÀÌ´Ù. ·Î±×ÀÎÀÌ ½ÇÇàÀ» ½ÃÀÛÇÒ ¶§, ±× »ç¿ëÀÚ ID´Â ·çÆ®ÀÌ´Ù. ÀÛ¾÷Àº ·Î±×ÀÎÇÏ °í ÀÖ´Â »ç¿ëÀÚÀÇ »ç¿ëÀÚ ID¿Í ±×·ì IDµéÀ» °¡Áø ½©À» ½ÃÀÛÇÏ´Â °ÍÀÌ´Ù. (À̰ÍÀ» ¿ÏÀüÈ÷ ¼öÇàÇϱâ À§Çؼ, ·Î±×ÀÎÀº persona »Ó¸¸ ¾Æ´Ï¶ó ½ÇÁ¦ »ç¿ëÀÚ¿Í ±×·ì IDµéÀ» ¼³Á¤Çؾ߸¸ ÇÑ´Ù. ÇÏÁö¸¸ ÀÌ°Í Àº Ưº°ÇÑ °æ¿ìÀÌ´Ù.) persona¸¦ º¯°æÇÏ´Â ´õ ÀϹÝÀûÀÎ °æ¿ì´Â º¸ÅëÀÇ »ç¿ëÀÚ ÇÁ·Î±×·¥¿¡¼ ½ÇÁ¦·Î ±× ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í Àִ»ç¿ëÀÚ¿¡°Ô´Â ¾ï¼¼½º°¡ °¡´ÉÇÏÁö ¾Ê´Â ÀÚ¿øÀ» »ç¿ëÀÚ°¡ ¾ï¼¼½ºÇÒ ÇÊ ¿ä°¡ ÀÖÀ» ¶§ ÀÌ´Ù.
¿¹¸¦µé¾î, ´ç½ÅÀÌ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡ ÀÇÇØ Á¦¾îµÇÁö¸¸ ´Ù¸¥ »ç¿ëÀÚ¿¡ ÀÇÇØ¼ Á÷Á¢ÀûÀ¸·Î Àаųª °» ½ÅµÉ ¼ö ¾ø´Â ¾î¶² ÆÄÀÏÀÌ ÀÖ´Ù°í ÇßÀ» ¶§, ´Ù¸¥ »ç¿ëÀÚ¿¡°Ô´Â °³¹æµÇÁö ¾ÊÀº ¾î¶² Á¾·ùÀÇ ÇÁ·ÎÅäÄÝ ÀÇ ±â´ÉÀ» ¿øÇϰųª, ¶Ç´Â ±×°ÍÀÌ °¡Áö°í ÀÖ´Â Á¤º¸ÀÇ ºñ¹ÐÀ̳ª ¿ÏÀüÀ» º¸ÀåÇϱ⠿øÇÒ ¶§, persona¸¦ º¯°æÇÏ´Â °ÍÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ Á¦ÇÑµÈ ¾ï¼¼½ºÀÇ Á¾·ù´Â ¿øÇÏ´Â ÀÚ¿ø°ú¸ÅÄ¡µÇµµ·Ï À¯È¿ »ç¿ëÀÚ¿Í ±×·ì ID¸¦ ÇÁ·Î±×·¥ÀÌ º¯°æÇÔÀ¸·Î½á °¡´ÉÇÏ´Ù.
±×·¯¸é, ÆÄÀϾȿ¡ Á¡¼ö¸¦ ÀúÀåÇÏ´Â °ÔÀÓ ÇÁ·Î±×·¥À» »ó»óÇØº¸ÀÚ. °ÔÀÓÇÁ·Î±×·¥ ÀÚü´Â ´©°¡ ±×°ÍÀ» ½ÇÇà½ÃŰ´ÂÁö¿¡ »ó°ü¾øÀÌ ÀÌ ÆÄÀÏÀ» °»½ÅÇÒ ¼ö ÀÖµµ·Ï ÇÒ Çʿ䰡 ÀÖÁö¸¸, ¸¸ÀÏ »ç¿ëÀÚ°¡ ±× °ÔÀÓÀ» ½ÇÇà½ÃŰÁö ¾Ê°íµµ ±× Á¡¼öÆÄÀÏ¿¡ ±â·ÏÀÌ °¡´ÉÇÏ´Ù¸é, ±×µéÀº ±×µéÀÌ ÁÁ¾ÆÇÏ´Â ¾î´À Á¡¼ö·Î ±× Á¡¼ö ÆÄÀÏ¿¡ ±×µé Á¡¼ö¸¦ ±â·ÏÇÒ ¼ö ÀÖ´Ù. ¾î¶² »ç¶÷Àº À̰ÍÀ» »ó»óÇÒ ¼öµµ ¾ø°Å³ª, ¾Æ´Ï¸é ºñ³ÇÒ °ÍÀÌ ´Ù. ÀÌ·¯ÇѰÍÀº Á¡¼ö ÆÄÀÏÀ» ¼ÒÀ¯ÇÏ´Â »õ·Î¿î »ç¿ëÀÚ ID¿Í ·Î±×ÀÎ À̸§À» ¸¸µé°í ÀÌ »ç¿ëÀÚ¿¡ ÀÇÇØ ¼¸¸ ¿ÀÁ÷ ±â·Ï °¡´ÉÇϵµ·Ï ±× ÆÄÀÏÀ» ¸¸µé¸é ¹æÁöÇÒ ¼ö ÀÖ´Ù. ±×·¯¸é, °ÔÀÓ ÇÁ·Î±×·¥ÀÌ ÀÌ ÆÄÀÏÀ» °»½ÅÇϱ⠿øÇÒ ¶§, ±×°ÍÀº ±× °ÔÀÓÀÇ À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù. ½ÇÁ¦·Î, ÇÁ·Î±×·¥Àº Á¡¼öÆÄ ÀÏ¿¡ ±â·ÏÇÒ ¼ö ÀÖ´Â °ÔÀÓÀÇ persona¸¦ ¹Þ¾Æ µé¿©¾ß¸¸ ÇÑ´Ù.
25.4 ¾î¶»°Ô ÀÀ¿ëÇÁ·Î±×·¥ÀÌ persona¸¦ º¯°æÇÒ ¼ö Àִ°¡?
ÇÁ·Î¼¼½ºÀÇ persoan¸¦ º¯°æÇϱâ À§ÇÑ ´É·ÂÀº ¹«½ÉÇÑ ºñ¹ÐÀÇ Ä§ÇØ³ª, ¶Ç´Â °íÀÇÀûÀÎ ³²¿ëÀÇ ¼Ò½º (source)°¡ µÉ ¼ö ÀÖ´Ù. persona¸¦ º¯°æÇÏ´Â, ÇÁ·Î±×·¥¿¡ Æ÷ÇÔµÈ ¹®Á¦´Â Ưº°ÇÑ »óȲµé¿¡ Á¦ÇÑÀÌ ÀÖ ±â ¶§¹®ÀÌ´Ù.
´ç½ÅÀº Á¦¸Ú´ë·Î ´ç½ÅÀÌ ¿øÇÑ´Ù°í ´ç½ÅÀÇ »ç¿ëÀÚ ID ³ª ±×·ì ID¸¦ º¯°æ ÇÒ ¼ö´Â ¾ø´Ù; ¿ÀÁ÷ Ư±ÇÀÌ ºÎ¿©µÈ ÇÁ·Î¼¼½ºµé¸¸ÀÌ ±×°ÍÀ» ÇÒ ¼ö ÀÖ´Ù. ´ë½Å¿¡, ÇÁ·Î±×·¥À» À§ÇÏ¿© persona¸¦ º¯°æÇϱâ À§ÇÑ ÀÏ ¹ÝÀûÀÎ ¹æ¹ýÀº ¹Ì¸® Ưº°ÇÑ »ç¿ëÀÚ³ª ±×·ìÀ¸·Î º¯°æÇÏ¿© ÇÁ·Î±×·¥ÀÌ ½ÃÀ۵Ǵ °ÍÀÌ´Ù. À̰ÍÀº ÆÄÀÏ ÀÇ ¾ï¼¼½º ¸ðµåÀÇ setuid ¿Í setgid ºñÆ®µéÀÇ ÇÔ¼öÀÌ´Ù. 9.8.5Àý [Permission Bits] 136 ÆäÀÌÁö ÂüÁ¶.
¾ï¼¼½º°¡´ÉÇÑ ÆÄÀÏÀÇ setuid ºñÆ®°¡ ¼³Á¤µÉ ¶§, ±× ÆÄÀÏÀº ÀÚµ¿ÀûÀ¸·Î ±× ÆÄÀÏÀ» ¼ÒÀ¯ÇÑ »ç¿ëÀÚ·Î À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇÏ¿© ½ÇÇàµÈ´Ù. ±×¿Í°°ÀÌ, setgid ºñÆ®°¡ ¼³Á¤µÈ ÆÄÀÏÀº ÆÄÀÏÀÇ ±×·ìÀ¸·Î À¯ È¿»ç¿ëÀÚ ID¸¦ º¯°æÇÏ¿© ½ÇÇàµÈ´Ù. 23.5Àý [Executing a File] 327 ÆäÀÌÁö ÂüÁ¶. Ưº°ÇÑ »ç¿ëÀÚ³ª ±× ·ì ID·Î º¯°æÇÏ¿© ¸¸µé¾îÁø ÆÄÀÏÀº »ç¿ëÀÚ³ª ±×·ì ID¿¡°Ô ¿ÏÀüÇÑ ¾ï¼¼½º¸¦ º¸ÀåÇÑ´Ù. ÆÄÀÏ ¸ðµå¿Í ¾ï¼¼½º°¡´É¼º¿¡ ´ëÇÑ ÀϹÝÀûÀÎ ³»¿ëÀº 9.8Àý [File Attributes]131 ÆäÀÌÁö¸¦ ÂüÁ¶Ç϶ó.
ÇÁ·Î¼¼½º´Â À¯È¿ »ç¿ëÀÚ(¶Ç´Â ±×·ì) ID´Â ½ÇÁ¦ ID·Î ¾ðÁ¦µçÁö ´Ù½Ã º¯°æÇÒ ¼ö ÀÖ´Ù. ÇÁ·Î±×·¥À» Á»´õ °ß°íÇÑ ÇÁ·Î±×·¥À¸·Î ¸¸µé±â À§Çؼ, ±×µéÀÌ ÇÊ¿äÄ¡ ¾ÊÀ» ¶§´Â ±×µé¿¡ ´ëÇÑ Æ¯º°ÇÑ ±ÇÇÑÀ» ¾ø ¾Ö¾ß(turn off) ÇÑ´Ù.
25.5 ÇÁ·Î¼¼½ºÀÇ persona Àбâ.
´ÙÀ½Àº ½ÇÁ¦¿Í À¯È¿ »ç¿ëÀÚ¿Í ±×·ì IDµéÀ» ÀбâÀ§ÇÑ ÇÔ¼öµéÀÇ »ó¼¼ÇÑ ¼³¸íÀÌ´Ù. ±× ±â´ÉµéÀ» »ç¿ë Çϱâ À§Çؼ´Â ´ç½ÅÀº Çì´õÆÄÀÏ `sys/types.h'¿Í `unistd.h'¸¦ Æ÷ÇÔ½ÃÄѾ߸¸ ÇÑ´Ù.
µ¥ÀÌÅÍŸÀÔ : uid__t
À̰ÍÀº »ç¿ëÀÚ IDµéÀ» ³ªÅ¸³»´Âµ¥ »ç¿ëµÇ´Â Á¤¼ö µ¥ÀÌÅÍ Å¸ÀÔÀÌ´Ù. GNU ¶óÀ̺귯¸®¿¡¼, À̰ÍÀº unsigned int ¿Í °°´Ù.
µ¥ÀÌÅÍŸÀÔ : gid__t
À̰ÍÀº ±×·ì IDµéÀ» ³ªÅ¸³»±â À§Çؼ »ç¿ëµÇ´Â Á¤¼ö µ¥ÀÌÅÍŸÀÔÀÌ´Ù. GNU ¶óÀ̺귯¸®¿¡¼, À̰ÍÀº unsigned int ¿Í °°´Ù.
ÇÔ¼ö : uid_t getuid (void)
getuid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ¸®ÅÏÇÑ´Ù.
ÇÔ¼ö : gid_t getgid (void)
getgid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ±×·ì IDµéÀ»¸®ÅÏÇÑ´Ù.
ÇÔ¼ö : uid_t geteuid (void)
geteuid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID¸¦ ¸®ÅÏÇÑ´Ù.
ÇÔ¼ö : gid_t getegid (void)
getegid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿ »ç¿ëÀÚ ID ¸¦ ¸®ÅÏÇÑ´Ù.
ÇÔ¼ö : int getgroups (int count, gid_t *groups)
getgroups ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµé¿¡ ´ëÇØ¼ ¹¯´Âµ¥ »ç¿ëµÈ´Ù. ±×µé ±×·ì IDµéÀÇ °³ ¼ö±îÁöµµ ¹è¿ groups¿¡ ÀúÀåµÈ´Ù; ÇÔ¼ö·ÎºÎÅÍÀÇ ¸®ÅϰªÀº ½ÇÁ¦·Î ÀúÀåµÈ ±×·ì IDµéÀÇ °³¼öÀÌ´Ù. ¸¸ ÀÏ count°¡ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀÇ Àüü °³¼öº¸´Ù ÀÛ´Ù¸é, getgroups´Â -1ÀÇ °ªÀ» ¸®ÅÏÇϰí errno¸¦ EINVAL·Î ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ count °¡ 0À̸é, getgroups´Â ´ÜÁö ºÎ°¡ÀûÀÎ(supplementary) ±×·ì IDµéÀÇ Àüü °³¼ö¸¦ ¸®ÅÏÇÑ´Ù. ºÎ°¡ÀûÀÎ ±×·ìµéÀ» Áö¿øÇÏÁö ¾Ê´Â ½Ã½ºÅÛ¿¡¼´Â, À̰ÍÀº Ç×»ó 0ÀÌ µÉ °ÍÀÌ ´Ù. ´ÙÀ½Àº getgroups°¡ ¾î¶»°Ô ¸ðµç ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» ÀÐ¾î¼ »ç¿ëÇÏ´ÂÁö¿¡ ´ëÇÑ °ÍÀÌ´Ù.
gid_t *
read_all_groups (void)
{
int ngroups = getgroups (NULL, 0);
gid_t *groups
= (gid_t *) xmalloc (ngroups * sizeof (gid_t));
int val = getgroups (ngroups, groups);
if (val < 0)
{
free (groups);
return NULL;
}
return groups;
}
25.6 »ç¿ëÀÚ ID ¼³Á¤Çϱâ.
ÀÌÀýÀº ÇÁ·Î¼¼½ºÀÇ »ç¿ëÀÚ ID(½ÇÁ¦ ±×¸®°í/¶Ç´Â À¯È¿)¸¦ º¯°æÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇϰí ÀÖ´Ù. ±× ±â´ÉµéÀ» »ç¿ëÇϱâ À§Çؼ, ´ç½ÅÀº Çì´õÆÄÀÏ `sys/types.h'¿Í `unistd.h'¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.
ÇÔ¼ö : int setuid (uid_t newuid)
ÀÌ ÇÔ¼ö´Â Àû´çÇÑ Æ¯±ÇÀ» °¡Áö°í Á¦°øµÈ ÇÁ·Î¼¼½º¿¡¼,±× ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID ¿Í À¯È¿»ç¿ëÀÚ ID¸¦ newuid·Î ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ ÇÁ·Î¼¼½º°¡ Ư±ÇÀÌ ¾ø´Ù¸é, newuid´Â ½ÇÁ¦ »ç¿ëÀÚ ID¶Ç´Â ÀúÀåµÈ »ç ¿ëÀÚ ID(¸¸ÀÏ ½Ã½ºÅÛÀÌ _POSIX_SAVED_IDS ¸¦ Áö¿øÇÑ´Ù¸é)ÁßÀÇ Çϳª°¡ µÇ¾î¾ß¸¸ ÇÑ´Ù. ÀÌ °æ¿ì, setuid´Â ¿ÀÁ÷ À¯È¿ »ç¿ëÀÚ ID¸¸À» ¼³Á¤ÇÏ°í ½ÇÁ¦ »ç¿ëÀÚ ID´Â ¼³Á¤ÇÏÁö ¾Ê´Â´Ù. setuid ÇÔ¼ö´Â ¼º°ø Çϸé 0ÀÇ °ªÀ» ¸®ÅÏÇÏ°í ¿¡·¯°¡ ¹ß»ýÇϸé -1ÀÇ °ªÀ» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.
EINVAL
newuid ÀμöÀÇ °ªÀÌ À¯¿ëÇÏÁö ¾Ê´Ù.
EPERM
±× ÇÁ·Î¼¼½º°¡ Àû´çÇÑ Æ¯±ÇÀ» °¡ÁöÁö ¾Ê´Â´Ù; ´ç½ÅÀº Á¤ÇØÁø ID·Î º¯°æÇϱâ À§ÇÑ ±ÇÇÑÀ» °¡ÁöÁö ¾Ê ¾Ò´Ù.
ÇÔ¼ö : int setreuid (uid_t ruid, uid_t euid)
ÀÌ ÇÔ¼ö´Â ruid·Î ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ¼³Á¤Çϰí euid·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ ruid°¡ -1À̸é, ±×°ÍÀº ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù; ±×ó·³ ¸¸ÀÏ euid°¡ -1À̸é À¯ È¿»ç¿ëÀÚ ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù.
setreuid ÇÔ¼ö´Â ÀúÀåµÈ ID(saved IDs)µéÀ» Áö¿øÇÏÁö ¾Ê´Â 4.3 BSD À¯´Ð½º¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ Á¸ ÀçÇÑ´Ù. ´ç½ÅÀº ÇÁ·Î¼¼½ºÀÇ À¯È¿¿Í ½ÇÁ¦ »ç¿ëÀÚ IDµéÀ» ±³È¯Çϱâ À§Çؼ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ ´Ù. (Ư±ÇÀ» °¡Áø ÇÁ·Î¼¼½º´Â ÀÌ Æ¯º°ÇÑ »ç¿ë¿¡ ´ëÇØ¼ Á¦ÇÑÀÌ ¾ø´Ù.) ¸¸ÀÏ ÀúÀåµÈ IDµéÀÌ Áö¿øµÈ´Ù ¸é, ´ç½ÅÀº ÀÌ ÇÔ¼ö´ë½Å¿¡ 25.8Àý [Enable/Disable Setuid] 357 ÆäÀÌÁö¿¡ ÀÖ´Â ÇÔ¼öµéÀ» »ç¿ëÇÏ´Â °Í ÀÌ ÁÁ´Ù.
¸®ÅϰªÀº ¼º°øÇϸé 0ÀÌ°í ½ÇÆÐÇϸé -1ÀÌ´Ù. ´ÙÀ½ÀÇ errno´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲÀÌ´Ù.
EPERM
±× ÇÁ·Î¼¼½º°¡ Àû´çÇÑ Æ¯±ÇÀ» °¡ÁöÁö ¾Ê¾Ò´Ù;´ç½ÅÀº Á¤ÇØÁø ID·Î º¯°æÇϱâ À§ÇÑ ±ÇÇÑÀÌ ¾ø´Ù.
25.7 ±×·ì IDµéÀ» ¼³Á¤Çϱâ
ÀÌ ÀýÀº ÇÁ·Î¼¼½ºÀÇ ±×·ì IDµé(½ÇÁ¦ ¿Í À¯È¿)À» º¯°æÇϱâ À§ÇÑ ÇÔ¼öµéÀ» ¼³¸íÇϰí ÀÖ´Ù. ÀÌ ±â´É µéÀ» »ç¿ëÇϱâ À§Çؼ, Çì´õÆÄÀÏ `sys/types.h'¿Í `unistd.h'¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.
ÇÔ¼ö : int setgid (gid_t newgid)
ÀÌ ÇÔ¼ö´Â Àû´çÇÑ Æ¯±ÇÀ» °¡Áö°í Á¦°øµÈ ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦¿Í À¯È¿ ±×·ì ID¸¦ newgid·Î ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ ±× ÇÁ·Î¼¼½º°¡ Ư±ÇÀÌ ¾ø´Ù¸é, newgid´Â ¹Ýµå½Ã ½ÇÁ¦ ±×·ì ID ¶Ç´Â ÀúÀåµÈ ±×·ì IDÁßÀÇ Çϳª ¿Í µ¿ÀÏÇØ¾ß¸¸ ÇÑ´Ù. ÀÌ °æ¿ì, setgid´Â ¿ÀÁ÷ À¯È¿ ±×·ì ID¸¸ ¼³Á¤ÇÏ°í ½ÇÁ¦ ±×·ì ID´Â ¼³Á¤ÇÏÁö ¾Ê ´Â´Ù. setgid¸¦ À§ÇÑ ¸®Åϰª°ú ¿¡·¯ »óȲµéÀº setuid¿Í °°´Ù.
ÇÔ¼ö : int setregid (gid_t rgid, fid_t egid)
ÀÌ ÇÔ¼ö´Â rgid·Î ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ ±×·ì ID ¸¦ ¼³Á¤Çϰí egid·Î À¯È¿ ±×·ì ID¸¦ ¼³Á¤ÇÑ´Ù. ¸¸ÀÏ rgid°¡ -1À̸é, ±×°ÍÀº ½ÇÁ¦ ±×·ì ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù; ±×¿Í°°ÀÌ ¸¸ÀÏ egid°¡ -1À̸é, À¯ È¿ ±×·ì ID¸¦ º¯°æÇÏÁö ¾ÊÀ½À» ÀǹÌÇÑ´Ù.
setregid ÇÔ¼ö´Â ÀúÀåµÈ IDµéÀ» Áö¿øÇÏÁö ¾Ê´Â, 4.3 BSD À¯´Ð½º¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ Á¦°øµÇ¾ú´Ù. ´ç½ÅÀº ÇÁ·Î¼¼½ºÀÇ À¯È¿¿Í ½ÇÁ¦ ±×·ì IDµéÀ» ±³È¯Çϱâ À§Çؼ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù( Ư±ÇÀ» °¡ Áø ÇÁ·Î¼¼½ºµéÀº ÀÌ »ç¿ë¿¡ ´ëÇØ¼ Á¦ÇÑÀÌ ¾ø´Ù.). ¸¸ÀÏ ÀúÀåµÈ IDµéÀÌ Áö¿øµÈ´Ù¸é, ÀÌ ÇÔ¼ö¸¦ »ç¿ë ÇÏ´Â ´ë½Å¿¡ 25.8Àý [Enable/Disable Setuid] 357 ÆäÀÌÁö¿¡ ÀÖ´Â ÇÔ¼öµéÀ» »ç¿ëÇ϶ó. setregid ¸¦ À§ÇÑ ¸®Åϰª°ú ¿¡·¯»óȲµéÀº setreuid¿Í °°´Ù.
GNU ½Ã½ºÅÛÀº Ư±ÇÀ» °¡Áø ÇÁ·Î¼¼½º°¡ ±×µéÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» º¯°æÇÏ´Â °ÍÀ» Çã¿ëÇÑ´Ù. setgroups ³ª initgroups¸¦ »ç¿ëÇϱâ À§Çؼ, ´ç½ÅÀº Çì´õÆÄÀÏ `grp.h'¸¦ Æ÷ÇÔÇØ¾ß¸¸ ÇÑ´Ù.
ÇÔ¼ö : int setgroups (size_t count, gid_t *groups)
ÀÌ ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» ¼³Á¤ÇÑ´Ù. ±×°ÍÀº ¿ÀÁ÷ Ư±ÇÀ» °¡Áø ÇÁ·Î¼¼½º·ÎºÎÅÍ È£ ÃâµÉ ¼ö ÀÖ´Ù. count Àμö´Â ¹è¿ groups¾È¿¡ ÀÖ´Â ±×·ì IDµéÀÇ °³¼ö¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ÇÔ¼ö´Â ¼º°øÇÏ ¸é 0À» ¸®ÅÏÇÏ°í ¿¡·¯°¡ ¹ß»ýÇϸé -1À» ¸®ÅÏÇÑ´Ù. ´ÙÀ½ÀÇ errno ´Â ÀÌ ÇÔ¼ö¸¦ À§ÇØ Á¤ÀÇµÈ ¿¡·¯»óȲ ÀÌ´Ù.
EPERM
È£ÃâÇÑ ÇÁ·Î¼¼½º°¡ Ư±ÇÀÌ ¾ø´Ù.
ÇÔ¼ö : int initgroups (const char *user, gid_t gid)
initgroups ÇÔ¼ö´Â »ç¿ëÀÚ À̸§ user¸¦ À§Çؼ, µðÆúÆ®°¡ µÇµµ·Ï ÇÁ·Î¼¼½ºÀÇ ºÎ°¡ÀûÀÎ ±×·ì IDµéÀ» ¼³Á¤Çϱâ À§Çؼ setgroups¸¦ È£ÃâÇÑ´Ù. ±×·ì ID gid ¶ÇÇÑ Æ÷ÇԵȴÙ.
25.8 Setuid ¾ï¼¼½º¸¦ °¡´ÉÇÏ°Ô Çϰųª ºÒ°¡´ÉÇÏ°Ô Çϱâ.
ÀüÇüÀûÀÎ setuid¸¦ »ç¿ëÇÏ´Â ÇÁ·Î±×·¥¿¡¼ Ç×»ó Æ¯º°ÇÑ ¾ï¼¼½º°¡ ÇÊ¿äÇÑ °ÍÀº ¾Æ´Ï´Ù. ±×·¡¼ ÇÊ¿ä ÇÏÁö ¾ÊÀ» ¶§ ÀÌ ¾ï¼¼½º¸¦ ²¨¹ö¸®¸é, ¹«ÀǽÄÀûÀÎ ¾ï¼¼½º¿¡ ´ëÇÑ ºô¹Ì¸¦ Á¦°øÇÏÁö ¾Ê°Ô µÈ´Ù. ¸¸ÀÏ ½Ã ½ºÅÛÀÌ ÀúÀåµÈ »ç¿ëÀÚ ID ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù¸é, ´ç½ÅÀº setuid·Î À̰ÍÀ» ¼öÇàÇÒ ¼ö ÀÖ´Ù. °ÔÀÓ ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÒ ¶§, ±×°ÍÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID´Â jdoeÀ̰í, À¯È¿ »ç¿ëÀÚ ID´Â gamesÀ̰í, ±×°ÍÀÇ Àú ÀåµÈ »ç¿ëÀÚ ID ¶ÇÇÑ gamesÀÌ´Ù. ±× ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ, ½ÃÀÛÇÒ ¶§ ÀÏ´Ü »ç¿ëÀÚ ID°ªµéÀ» ±â ·ÏÇÏ°Ô µÈ´Ù.
user_user_id = getuid ();
game_user_id = geteuid ();
±×·¯¸é setuid (user_user_id); ·Î °ÔÀÓ ÆÄÀÏ ¾ï¼¼½º¸¦ ²ø ¼ö ÀÖ°í setuid (game_user_id); ·Î ´Ù½Ã ÄÓ ¼ö ÀÖ´Ù. ÀÌ ÇÁ·Î¼¼½º¸¦ ÅëÇØ¼, ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ jdoe·Î ³²°í ÀúÀåµÈ »ç¿ëÀÚ ID´Â games·Î Àú ÀåµÇ±â ¶§¹®¿¡, ÇÁ·Î±×·¥Àº Ç×»ó ´Ù¸¥ °ÍÀ¸·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
ÀúÀåµÈ »ç¿ëÀÚ ID ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â ´Ù¸¥ ½Ã½ºÅÛ¿¡¼, ´ç½ÅÀº ÇÁ·Î¼¼½ºÀÇ ½ÇÁ¦ »ç¿ëÀÚ ID ¿Í À¯ È¿ »ç¿ëÀÚ ID¸¦ ±³È¯Çϱâ À§Çؼ´Â setreuid¸¦ »ç¿ëÇØ¼ setuid ¾ï¼¼½º¸¦ ÄÑ°í ²ø ¼ö ÀÖ´Ù. ´ÙÀ½Ã³ ·³;
setreuid (geteuid (), getuid ());
À̰ÍÀº ½ÇÆÐÇÏÁö ¾Ê°í_Ç×»ó Çã¿ëµÇ´Â Ưº°ÇÑ °æ¿ìÀÌ´Ù.
¿Ö À̰ÍÀº setuid ¾ï¼¼½º¸¦ Åä±Û¸µÇÏ´Â È¿°ú¸¦ °®´Â°¡? °ÔÀÓ ÇÁ·Î±×·¥ÀÌ ´ÜÁö ½ÃÀ۵Ǿî ÀÖ´Ù°í °¡ Á¤Çϰí, À¯È¿ »ç¿ëÀÚ ID°¡ games Àϵ¿¾È ½ÇÁ¦ »ç¿ëÀÚ ID´Â jdoe¶ó°í °¡Á¤ÇÏÀÚ. ÀÌ °æ¿ì, °ÔÀÓÀº Á¡ ¼ö ÆÄÀÏÀ» ±â·ÏÇÒ ¼ö ÀÖ´Ù. ¸¸ÀÏ µÎ °³ÀÇ À¯È¿ »ç¿ëÀÚ ID ¿Í ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ±³È¯ÇÑ´Ù¸é, ½ÇÁ¦ »ç¿ëÀÚ ID´Â games°¡ µÇ°í À¯È¿ »ç¿ëÀÚ ID´Â jdoe°¡ µÈ´Ù; ÀÌÁ¦ ÇÁ·Î±×·¥Àº ¿ÀÁ÷ jdoe¸¸ ¾ï¼¼½º¸¦ °®´Â´Ù. ´Ù¸¥ ±³È¯Àº À¯È¿ »ç¿ëÀÚ ID¸¦ ´Ù½Ã games·Î µÇµ¹¸®°í Á¡¼ö ÆÄÀÏ¿¡ ¾ï¼¼½º¸¦ ÀúÀåÇÑ´Ù.
½Ã½ºÅÛÀÇ µÎ Á¾·ù¸¦ ´Ù·ç±â À§Çؼ´Â, ´ÙÀ½Ã³·³ ÇÁ¸®ÇÁ·Î¼¼½º¸¦ »ç¿ëÇØ¼ ÀúÀåµÈ »ç¿ëÀÚ ID ±â´ÉÀ» Áö¿øÇÏ´ÂÁö Å×½ºÆ®Çغ¸¾Æ¾ßÇÑ´Ù.
#ifdef _POSIX_SAVED_IDS
setuid (user_user_id);
#else
setreuid (geteuid (), getuid ());
#endif
25.9 setuid ÇÁ·Î±×·¥ ¿¹Á¦.
´ÙÀ½Àº À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇÏ´Â ÇÁ·Î±×·¥À» ¾î¶»°Ô ÁغñÇÏ´ÂÁö º¸¿©ÁÖ´Â ¿¹Á¦ÀÌ´Ù. À̰ÍÀº caber-toss¶ó°í ºÒ¸®´Â °ÔÀÓ ÇÁ·Î±×·¥ÀÇ ÀϺκÐÀ¸·Î½á ±× °ÔÀÓ ÇÁ·Î±×·¥Àº ¿ÀÁ÷ °ÔÀÓ ÇÁ·Î±×·¥ ±× ÀÚü¿¡ ÀÇÇØ¼¸¸ Á¡¼ö ÆÄÀÏÀ» ´Ù·ê¼ö ÀÖµµ·Ï µÇ¾îÀÖ´Ù. ±× °ÔÀÓ ÇÁ·Î±×·¥Àº ½ÇÇàÆÄÀÏÀÌ set-user-ID ºñÆ®·Î ÀνºÅçµÉ°ÍÀÌ°í ½ÇÇàÆÄÀÏÀÌ Á¡¼öÆÄÀϰú °°Àº »ç¿ëÀÚ¿¡ ÀÇÇØ ¼ÒÀ¯µÈ´Ù°í °¡Á¤ÇÑ´Ù. ÀüÇüÀûÀ¸ ·Î, ½Ã½ºÅÛ °ü¸®ÀÚ´Â ÀÌ ¸ñÀûÀ» À§Çؼ °ÔÀÓ°ú °°Àº °èÁ¤À» ÁغñÇÒ °ÍÀÌ´Ù.
½ÇÇà°¡´ÉÆÄÀÏÀº ¸ðµå 4755°¡ ÁÖ¾îÁö°í, ±×·¡¼ `ls -l'À» ÇÏ¸é ´ÙÀ½°ú °°Àº Ãâ·ÂÀ» ¾ò°ÔµÈ´Ù.
-rwsr-xr-x 1 games 184422 Jul 30 15:17 caber-toss
set-user-ID ºñÆ®´Â ÆÄÀÏ ¸ðµå¿¡¼ `s'·Î ³ªÅ¸³´Ù. Á¡¼ö ÆÄÀÏÀ» ¸ðµå 644·Î ÁÖ¾îÁö°í, `ls -l'ÇÏ¸é ´ÙÀ½°ú °°Àº °á°ú¸¦ ¾ò´Â´Ù.
´ÙÀ½Àº ¾î¶»°Ô º¯°æµÈ »ç¿ëÀÚ ID¸¦ ÁغñÇÒ°ÍÀÎÁö¸¦ º¸¿©ÁÖ´Â ÇÁ·Î±×·¥ÀÇ ÀϺκÐÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥ Àº ¸¸ÀÏ ½Ã½ºÅÛÀÌ ÀúÀåµÈ ID ±â´ÉÀ» Áö¿øÇÑ´Ù¸é ±×°ÍÀ» »ç¿ëÇϰí, ±×·¸Áö¾Ê´Ù¸é setreuid¸¦ »ç¿ëÇØ¼ À¯È¿ »ç¿ëÀÚ ID¿Í ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ ±³È¯ÇÑ´Ù.
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
/* À¯È¿¿Í ½ÇÁ¦ »ç¿ëÀÚ IDµéÀ» ÀúÀåÇ϶ó. */
static uid_t euid, ruid;
/* ¿ø·¡ÀÇ °ªÀ¸·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¹ÝȯÇ϶ó. */
void
do_setuid (void)
{
int status;
#ifdef _POSIX_SAVED_IDS
status = setuid (euid);
#else
status = setreuid (ruid, euid);
#endif
if (status < 0) {
fprintf (stderr, "Couldn't set uid.\n");
exit (status);
}
}
/* ½ÇÁ¦ »ç¿ëÀÚ ID·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¼³Á¤Ç϶ó. */
void
undo_setuid (void)
{
int status;
#ifdef _POSIX_SAVED_IDS
status = setuid (ruid);
#else
status = setreuid (euid, ruid);
#endif
if (status < 0) {
fprintf (stderr, "Couldn't set uid.\n");
exit (status);
}
}
/* ¸ÞÀÎ ÇÁ·Î±×·¥ */
int
main (void)
{
/* ½ÇÁ¦¿Í À¯È¿ »ç¿ëÀÚ IDµéÀ» ÀúÀåÇ϶ó. */
ruid = getuid ();
euid = geteuid ();
undo_setuid ();
/* °ÔÀÓÀ» Çϰí Á¡¼ö¸¦ ±â·ÏÇ϶ó. */
. . .
}
¸ÞÀÎ ÇÔ¼ö¿¡¼ ù°·Î ¾î¶»°Ô ½ÇÁ¦ »ç¿ëÀÚ ID·Î À¯È¿ »ç¿ëÀÚ ID¸¦ µÇµ¹·Á ¼³Á¤ÇÏ´ÂÁö¿¡ ´ëÇØ¼ ÁÖ ¸ñÇ϶ó. À̰ÍÀº »ç¿ëÀÚ°¡ °ÔÀÓÀ» ½ÇÇàÇϰí ÀÖÀ» µ¿¾È ¼öÇàµÇ´Â ÆÄÀÏ ¾ï¼¼½ºµé·Î½á ±ÇÇÑÀ» °áÁ¤Çϱâ À§Çؼ ½ÇÁ¦ »ç¿ëÀÚ ID¸¦ »ç¿ëÇÑ´Ù. ¿ÀÁ÷ ÇÁ·Î±×·¥ÀÌ Á¡¼ö ÆÄÀÏÀ» °³¹æÇÒ Çʿ丸 ÀÖÀ» ¶§ ´ÙÀ½Ã³ ·³, ¿ø·¡ÀÇ À¯È¿ »ç¿ëÀÚ ID·Î µÇ¹Ù²Û´Ù.
/* Á¡¼ö¸¦ ±â·ÏÇ϶ó. */
int
record_score (int score)
{
FILE *stream;
char *myname;
/* Á¡¼öÆÄÀÏÀ» °³¹æÇ϶ó. */
do_setuid ();
stream = fopen (SCORES_FILE, "a");
undo_setuid ();
/* ÆÄÀÏ¿¡ ±× Á¡¼ö¸¦ ±â·ÏÇ϶ó. */
if (stream)
{
myname = cuserid (NULL);
if (score < 0)
fprintf(stream, "%10s: Couldn't lift the caber.\n", myname);
else
fprintf (stream, "%10s: %d feet.\n", myname, score);
fclose (stream);
return 0;
}
else
return -1;
}
25.10 setuid ÇÁ·Î±×·¥À» ¸¸µé±â À§ÇÑ ÆÁ.
setuid ÇÁ·Î±×·¥Àº ¿ø·¡ ÀǵµÇÏÁö ¾Ê¾Ò´ø »ç¿ëÀÚ ¾ï¼¼½º¸¦ ºÎ¿©ÇÏ´Â ¿À·ù¸¦ ¹üÇϱ⠽±´Ù_½ÇÁ¦·Î, ¸¸ ÀÏ ´ç½ÅÀÌ ÀÌ·¯ÇÑ ¹®Á¦¸¦ ÇÇÇϱ⸦ ¿øÇÑ´Ù¸é, °¢º°ÇÑ ÁÖÀǸ¦ ÇØ¾ß¸¸ ÇÑ´Ù. ´ÙÀ½Àº ÀǵµµÇÁö ¾ÊÀº ¾ï ¼¼½º¸¦ ¸·°í, ¸¸ÀÏ ±×°ÍÀÏ ¹ß»ýÇßÀ» ¶§ ±× ¿µÇâ·ÂÀ» ÃÖ¼ÒÈÇϱâÀ§ÇÑ ¾È³»ÁöħÀÌ´Ù.
둁 Àý´ëÀûÀÎ Çʿ䰡 ¾ø´ÂÇÑ root ¿Í °°Àº Ư±ÇÀ» °¡Áø »ç¿ëÀÚ IDµéÀº setuid ÇÁ·Î±×·¥À» °¡Á®¼´Â ¾È µÈ´Ù. ¸¸ÀÏ ÀÚ¿ø(resource)ÀÌ ´ç½ÅÀÇ Æ¯Á¤ÇÑ ÇÁ·Î±×·¥¿¡°Ô ƯÁ¤ÇÑ °ÍÀ̶ó¸é, Ư±ÇÀ» °¡ÁöÁö ¾ÊÀº »ç ¿ëÀÚ ID ¶Ç´Â ±×·ì ID°¡ ´ÜÁö ±× ÀÚ¿øÀ» ´Ù·ç±â¸¸ Çϵµ·Ï, »õ·Ó°Ô Á¤ÀÇÇÏ´Â °ÍÀÌ ÁÁ´Ù.
둁 À¯È¿ »ç¿ëÀÚ ID¸¦ º¯°æÇϴ°Ͱú ÇÔ²² system ÇÔ¼ö¿Í exec ÇÔ¼ö¸¦ »ç¿ëÇϴ°Ϳ¡ ´ëÇØ¼´Â ÁÖÀǸ¦ ÇØ¾ß¸¸ ÇÑ´Ù. ´ç½Å ÇÁ·Î±×·¥ÀÇ »ç¿ëÀÚ°¡ º¯°æµÈ »ç¿ëÀÚ ID¸¦ »ç¿ëÇÏ¿© ÇÁ·Î±×·¥À» ½ÇÇà½ÃŰ´Â °ÍÀ» Çã°¡ÇÏÁö ¸»¾Æ¶ó. execlp ¿Í execvp ÇÔ¼öµéµµ À§ÇèÀ» ³»Æ÷Çϰí ÀÖ´Ù (±×µéÀº »ç¿ëÀÚÀÇ PATH ȯ°æº¯ ¼ö¿¡ ÀÇÁ¸ÇÏ¿© ½ÇÇàµÇ±â ¶§¹®ÀÌ´Ù.) ¸¸ÀÏ º¯°æµÈ ID·Î ´Ù¸¥ ÇÁ·Î±×·¥À» ½ÇÇàÇØ¾ß¸¸ ÇÑ´Ù¸é, ½ÇÇà°¡´É ÆÄÀÏÀ» Àý´ë ÆÄÀÏ À̸§( 6.2.2Àý [File Name Resolution] 59 ÆäÀÌÁö ÂüÁ¶.) À¸·Î ÁöÁ¤Çϰí, ½ÇÇà°¡´É ÆÄ Àϰú ¿ø·¡ÀÇ users ¿Í °°Àº ¸ðµç Æ÷ÇÔµÈ µð·ºÅ丮µéÀÌ ´Ù¸¥ ÇÁ·Î±×·¥°ú ÇÔ²² ±×°ÍÀÇ À§Ä¡¸¦ º¯°æÇÏ Áö ¸øÇϵµ·Ï º¸È£¸¦ ÇØ¾ß¸¸ ÇÑ´Ù.
둁 ½ÇÁ¦·Î ÀÚ¿øÀ» »ç¿ëÇÏ´Â ÇÁ·Î±×·¥ÀÇ ÀϺκп¡¼ ÀÚ¿øÀ» Á¦¾îÇϰí ÀÖ´Â »ç¿ëÀÚ ID¸¸À» »ç¿ëÇ϶ó. ´ç½ÅÀÌ ±× ÀÛ¾÷À» ¸¶ÃÆÀ» ¶§, ½ÇÁ¦ »ç¿ëÀÚÀÇ »ç¿ëÀÚ ID·Î À¯È¿ »ç¿ëÀÚ ID¸¦ ¹ÝȯÇ϶ó. 25.8Àý [Enable/Disable Setuid] 357 ÆäÀÌÁö ÂüÁ¶.
둁 ¸¸ÀÏ ´ç½ÅÀÇ ÇÁ·Î±×·¥¿¡¼ setuid ºÎºÐÀÌ Á¦¾îÇÒ ¼ö ÀÖ´Â ÀÚ¿øÀ̿ܿ¡ ´Ù¸¥ ÆÄÀÏÀ» ¾ï¼¼½ºÇÒ ÇÊ¿ä °¡ ÀÖ´Ù¸é, ±×¿Í °°Àº ÆÄÀÏÀ» ¾ï¼¼½ºÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀ» °¡Áø ½ÇÁ¦ »ç¿ëÀÚ¸¦ Á¶È¸Çؾ߸¸ ÇÑ´Ù. ´ç½ÅÀº ±×¿Í °°Àº ÀÏÀ» À§Çؼ access ÇÔ¼ö ( 9.8.6Àý [Access Permission] 137 ÆäÀÌÁö ÂüÁ¶.)¸¦ »ç¿ëÇÒ ¼ö ÀÖ ´Ù; ±×°ÍÀº À¯È¿ IDµéº¸´Ù´Â ½ÇÁ¦ »ç¿ëÀÚ¿Í ±×·ì IDµéÀ» »ç¿ëÇÑ´Ù.
25.11 ´©°¡ ·Î±×ÀÎ Çß´ÂÁö È®ÀÎÇϱâ.
ÀÌÀý¿¡ ¼³¸íµÈ ÇÔ¼öµéÀ» »ç¿ëÇØ¼ ÇÁ·Î¼¼½º¸¦ ½ÇÇà½Ã۰í ÀÖ´Â »ç¿ëÀÚÀÇ À̸§°ú ÇöÀç ¼¼¼Ç¿¡ ·Î±× ÀÎµÈ »ç¿ëÀÚÀÇ À̸§À» ¾Ë¾Æ³¾ ¼ö ÀÖ´Ù. getuid¿Í friends ÇÔ¼ö( 25.5Àý [Reading Persona] 354 ÆäÀÌ Áö ÂüÁ¶.)¸¦ ¶ÇÇÑ ÂüÁ¶Ç϶ó. getlogin ÇÔ¼ö´Â `unistd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ°í cuserid ¿Í L_cuserid´Â `stdio.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : char *getlogin (void)
getlogin ÇÔ¼ö´Â ÇÁ·Î¼¼½º°¡ Á¦¾îÇϰí ÀÖ´Â Å͹̳¯¿¡ ·Î±×ÀεǾî ÀÖ´Â »ç¿ëÀÚÀÇ À̸§ÀÌ Æ÷ÇÔµÈ ¹®ÀÚ ¿À» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏ Çϰųª, ¸¸ÀÏ ±× Á¤º¸¸¦ °áÁ¤ÇÒ ¼ö ¾ø´Ù¸é ³Î Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ¹®ÀÚ ¿Àº Á¤ÀûÀ¸·Î ÇÒ´çµÇ°í ÀÌ ÇÔ¼ö³ª cuserid ÇÔ¼öÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼ µ¡¾º¿öÁø´Ù.
ÇÔ¼ö : char * cuserid (char *string)
cuserid ÇÔ¼ö´Â ÇÁ·Î¼¼½ºÀÇ À¯È¿ ID¿Í ¿¬°üµÈ »ç¿ëÀÚ À̸§ÀÌ Æ÷ÇÔµÈ stringÀ» °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸® ÅÏÇÑ´Ù. ¸¸ÀÏ stringÀÌ ³Î Æ÷ÀÎÅͰ¡ ¾Æ´Ï¶ó¸é, ±× stringÀº Àû¾îµµ L_cuserid°³ÀÇ ¹®ÀÚ¸¦ ÀúÀåÇÒ ¼ö ÀÖ´Â ¹è¿ÀÌ µÈ´Ù; »ç¿ëÀÚÀÇ À̸§ÀÌ Æ÷ÇÔµÈ ¹®ÀÚ¿À» ÀÌ string¿¡ ¸®ÅϵȴÙ. ±×·¸Áö¾Ê´Ù¸é, Á¤ÀûÀÎ Áö¿ª¿¡ ÀÖ´Â ¹®ÀÚ¿À» °¡¸®Å°´Â Æ÷ÀÎÅͰ¡ ¸®ÅϵȴÙ. ÀÌ string´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ°í ÀÌ ÇÔ¼ö³ª getlogin ÇÔ¼öÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼ µ¡¾º¿öÁú °ÍÀÌ´Ù.
¸ÅÅ©·Î : int L__cuserid
»ç¿ëÀÚÀÇ À̸§À» ÀúÀåÇϱ⿡ ÇÊ¿äÇÑ ¹è¿ÀÌ ¾ó¸¶³ª ±æ¾î¾ß ÇÏ´ÂÁö¸¦ ÁöÀûÇÏ´Â Á¤¼ö »ó¼öÀÌ´Ù.
±× ÇÔ¼öµéÀº ÀÌ ¼¼¼Ç¿¡ ·Î±×ÀÎµÈ »ç¿ëÀÚ³ª ÇÁ·Î¼¼½º¸¦ ½ÇÇà½Ã۰í ÀÖ´Â »ç¿ëÀÚ¸¦ ¸íÈ®ÇÏ°Ô È®ÀÎÇÏ µµ·Ï Çã¿ëÇÑ´Ù. (±×µéÀº setuid ÇÁ·Î±×·¥ÀÌ Æ÷ÇÔ µÇ¾úÀ»¶§´Â ´Ù¸¦ ¼ö ÀÖ´Ù; 25.2Àý [Process Persona] 353 ÆäÀÌÁö ÂüÁ¶.) »ç¿ëÀÚ´Â ±× ÇÔ¼öµéÀ» ¼ÓÀϼö ÀÖ´Â ¹æ¹ýÀÌ ¾Æ¹«°Íµµ ¾ø´Ù.
´ëºÎºÐÀÇ °æ¿ì¿¡, »ç¿ëÀÚ¸¦ ã¾Æ³»´Â ȯ°æº¯¼ö LOGNAME¸¦ »ç¿ëÇÏ´Â °ÍÀÌ ´õ¿í À¯¿ëÇÏ´Ù. ÀÌ°Í Àº »ç¿ëÀÚ°¡ Á¦¸Ú´ë·Î LOGNAME À» ¼³Á¤ÇÒ ¼ö Àֱ⠶§¹®¿¡ Á¤¹ÐÇÔ¿¡ À־ Á»´õ À¯¿¬¼ºÀÌ ÀÖ ´Ù. 22.2.2Àý [Standard Environment] 318 ÆäÀÌÁö ÂüÁ¶.
25.12 »ç¿ëÀÚ µ¥ÀÌŸº£À̽º
ÀÌ ÀýÀº µî·ÏµÈ »ç¿ëÀÚÀÇ µ¥ÀÌÅͺ£À̽º¸¦ °Ë»öÇϰí ã±âÀ§ÇÑ ¸ðµç °Í¿¡ ´ëÇØ¼ ¼³¸íÇÑ´Ù. µ¥ÀÌÅÍ º£À̽º ÀÚü´Â °ÅÀÇ ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼ `/etc/passwd'¿¡ º¸Á¸µÇ¾î ÀÖÁö¸¸, ¾î¶² ½Ã½ºÅÛ¿¡¼´Â Ư º°ÇÑ ³×Æ®¿÷ ¼¹ö¿¡°Ô ±×°ÍÀ» ¾ï¼¼½ºÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.
25.12.1 »ç¿ëÀÚÀÇ Á¤º¸¸¦ ´ã°í ÀÖ´Â µ¥ÀÌŸ±¸Á¶Ã¼.
½Ã½ºÅÛ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º¸¦ ¾ï¼¼½ºÇϱâÀ§ÇÑ ÇÔ¼ö¿Í µ¥ÀÌÅͱ¸Á¶Ã¼µéÀº Çì´õÆÄÀÏ `pwd.h'¿¡ ¼±¾ð µÇ¾î ÀÖ´Ù.
µ¥ÀÌÅÍŸÀÔ : struct passwd
passwd µ¥ÀÌÅͱ¸Á¶Ã¼´Â ½Ã½ºÅÛ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º ¾È¿¡ ¿£Æ®¸®µé
¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇϴµ¥ »ç¿ëµÈ´Ù. ±×°ÍÀº Àû¾îµµ ´ÙÀ½°ú °°Àº
¸â¹öµéÀ» °®°í ÀÖ´Ù.
char *pw_name
»ç¿ëÀÚ ·Î±×ÀÎ À̸§.
char *pw_passwd.
¾ÏÈ£ÈµÈ ºñ¹Ð¹øÈ£(password) ¹®ÀÚ¿.
uid_t pw_uid
»ç¿ëÀÚ ID ¹øÈ£.
gid_t pw_gid
»ç¿ëÀÚÀÇ µðÆúÆ® ±×·ì ID ¹øÈ£.
char *pw_gecos
ÀÌ ¹®ÀÚ¿Àº ÀüÇüÀûÀ¸·Î »ç¿ëÀÚÀÇ ½ÇÁ¦ À̸§À» Æ÷ÇÔÇϰí, °¡´ÉÇϸé ÀüȹøÈ£¿Í °°Àº ´Ù¸¥ Á¤º¸µµ Æ÷ ÇԵȴÙ.
char *pw_dir
»ç¿ëÀÚÀÇ È¨ µð·ºÅ丮(home directory), ¶Ç´Â Ãʱâ ÀÛ¾÷ µð·ºÅ丮. À̰Ϳ¡ ´ëÇÑ ÇØ¼®ÀÌ ½Ã½ºÅÛ-ÀÇÁ¸ ÀûÀÎ °æ¿ì¿¡´Â ³Î Æ÷ÀÎÅͰ¡ µÇ¾î¾ßÇÑ´Ù.
char *pw_shell
»ç¿ëÀÚÀÇ µðÆúÆ® ½©, À̳ª »ç¿ëÀÚ°¡ ·Î±×ÀÎÇÒ ¶§ ½ÇÇàµÇ´Â Ãʱâ ÇÁ·Î±×·¥. ½Ã½ºÅÛ¿¡¼ µðÆúÆ®·Î Áö Á¤µÈ °ÍÀÌ »ç¿ëµÇ´Â °æ¿ì¿¡´Â, ³Î Æ÷ÀÎÅͰ¡ µÇ¾î¾ßÇÑ´Ù.
25.12.2 ÇѸíÀÇ »ç¿ëÀÚ¿¡´ëÇØ ÀÚ¼¼È÷ ¾Ë¾Æº¸±â.
ƯÁ¤ÇÑ »ç¿ëÀÚ¿¡ ´ëÇÑ Á¤º¸¸¦ ¾Ë¾Æ³»±â À§Çؼ´Â, getpwuid ¶Ç´Â getpwnamÀ» »ç¿ëÇØ¼ ½Ã½ºÅÛ »ç ¿ëÀÚ µ¥ÀÌÅͺ£À̽º¸¦ °Ë»öÇÒ ¼ö ÀÖ´Ù. ±× ÇÔ¼öµéÀº Çì´õÆÄÀÏ `pwd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : struct passwd * getpwuid (uid_t uid)
ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ ID°¡ uidÀÎ »ç¿ëÀÚ¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getpwuidÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼ µ¡¾º¿öÁø´Ù. ³Î Æ÷ÀÎÅͰªÀº µ¥ÀÌÅͺ£À̽º¿¡ »ç¿ëÀÚ ID°¡ uidÀÎ »ç¿ëÀÚ°¡ ¾ø´Ù´Â ¸»ÀÌ´Ù.
ÇÔ¼ö : struct passwd *getpwnam (const char *name)
ÀÌ ÇÔ¼ö´Â »ç¿ëÀÚ À̸§ÀÌ nameÀÎ »ç¿ëÀÚ¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¸¦ °¡¸® Ű´Â Æ÷ÀÎÅ͸¦¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getpwnamÀÇ ¿¬¼ÓÀûÀΠȣÃâ·Î µ¡¾º¿öÁú °ÍÀÌ´Ù. ³Î Æ÷ÀÎÅͰª Àº »ç¿ëÀÚÀÇ À̸§ÀÌ nameÀÎ »ç¿ëÀÚ°¡ µ¥ÀÌÅͺ£À̽º¿¡ ¾ø´Ù´Â ¸»ÀÌ´Ù.
25.12.3 ¸ðµç »ç¿ëÀÚ ¸®½ºÆ®¸¦ °Ë»öÇϱâ.
ÀÌ ÀýÀº ÇÑ ¹ø¿¡ ÇÑ »ç¿ëÀÚ¾¿, ½Ã½ºÅÛ¿¡ ÀÖ´Â ¸ðµç »ç¿ëÀÚµéÀÇ ¸®½ºÆ®¸¦ ÀÐÀ» ¼ö ÀÖ±â À§Çؼ´Â ÇÁ ·Î±×·¥¿¡¼ ¾î¶»°Ô ÇØ¾ßÇÏ´ÂÁö¸¦ ¼³¸íÇÑ´Ù. À̰÷¿¡ ¼³¸íµÈ ÇÔ¼ö´Â Çì´õÆÄÀÏ `pwd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ ´Ù. ´ç½ÅÀº ƯÁ¤ÇÑ ÆÄÀϷκÎÅÍ »ç¿ëÀÚ ¿£Æ®¸®µéÀ» ÀбâÀ§Çؼ fgetpwent ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÇÔ¼ö : struct passwd * fgetpwent (FILE *stream)
ÀÌ ÇÔ¼ö´Â stream À¸·ÎºÎÅÍ ´ÙÀ½ »ç¿ëÀÚ ¿£Æ®¸®¸¦ ÀÐ°í ±× ¿£Æ®¸®¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í, fgetpwentÀÇ ¿¬¼ÓÀûÀΠȣÃâ·Î µ¡¾º¿öÁø´Ù. ±×·¯¹Ç·Î, ¸¸ÀÏ ´ç½Å ÀÌ ±× Á¤º¸¸¦ ÀúÀåÇÏ±æ ¿øÇÑ´Ù¸é ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷¿¡ º¹»çÇØ ³õ¾Æ¾ß¸¸ ÇÑ´Ù. streamÀº Ç¥ÁØ password µ¥ÀÌÅͺ£À̽º ÆÄÀϰú °°Àº Çü½ÄÀÇ ÆÄÀÏÀ̾î¾ß¸¸ ÇÑ´Ù.ÀÌ ÇÔ¼ö´Â ½Ã½ºÅÛ V ·ÎºÎÅÍ ¿Ô´Ù.
»ç¿ëÀÚ µ¥ÀÌÅͺ£À̽ºÀÇ ¸ðµç ¿£Æ®¸®µéÀ» °Ë»öÇÏ´Â ¹æ¹ý¿¡´Â setpwent, getpwent, ±×¸®°í endpwent °¡ ÀÖ´Ù.
ÇÔ¼ö : void setpwent (void)
ÀÌ ÇÔ¼ö´Â getpwent °¡ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º¸¦ Àбâ À§Çؼ »ç¿ëÇÏ´Â ½ºÆ®¸²À» ÃʱâÈÇÑ´Ù.
ÇÔ¼ö : struct passwd * getpwent (void)
getpwent ÇÔ¼ö´Â setpwent ¿¡ ÀÇÇØ ÃʱâÈµÈ streamÀ¸·ÎºÎÅÍ, ´ÙÀ½ ¿£Æ®¸®¸¦ ÀÐ°í ¿£Æ®¸®¸¦ °¡¸®Å° ´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í getpwentÀÇ ¿¬¼ÓÀûÀº È£Ãâ¿¡ ÀÇÇØ¼ µ¡¾º ¿öÁø´Ù. ±×·¡¼ ¸¸ÀÏ ´ç½ÅÀÌ ±× Á¤º¸¸¦ ÀúÀåÇϱ⸦ ¿øÇÑ´Ù¸é ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷À¸·Î º¹»çÇØ³õ ¾Æ¾ß¸¸ ÇÑ´Ù.
ÇÔ¼ö : void endpwent (void)
ÀÌ ÇÔ¼ö´Â getpwent¿¡ ÀÇÇØ »ç¿ëµÈ ³»ºÎ ½ºÆ®¸²À» ´Ý´Â´Ù.
25.12.4 »ç¿ëÀÚ ¿£Æ®¸®¸¦ ±â·ÏÇϱâ.
ÇÔ¼ö : int putpwent (const struct passwd *p, FILE *stream)
ÀÌ ÇÔ¼ö´Â Ç¥ÁØ »ç¿ëÀÚ µ¥ÀÌÅͺ£À̽º ÆÄÀÏ¿¡¼ »ç¿ëµÈ Çü½ÄÀ¸·Î, ½ºÆ®¸² stream¿¡ »ç¿ëÀÚ ¿£Æ®¸® *p ¸¦ ±â·ÏÇÑ´Ù. ¼º°øÇÏ¸é ¸®ÅϰªÀº 0ÀÌ°í ½ÇÆÐÇϸé 0ÀÌ ¾Æ´Ñ°ªÀÌ´Ù. SVID ¿ÍÀÇ È£È¯¼ºÀ» À§Çؼ ÀÌ ÇÔ¼ö´Â Á¸ÀçÇÑ´Ù. ¿ì¸®´Â ±¸Á¶Ã¼ struct passwd °¡ À§¿¡ ¼³¸íµÈ Ç¥ÁØÀûÀÎ °ÍÀ» Á¦¿ÜÇϰí´Â ºÎ°¡Àû À¸·Î ¾Æ¹«·± ¸â¹öµéÀ» °¡ÁöÁö ¾Ê¾Ò´Ù°í ¿¹»óÀÌ µÇ´Â °æ¿ì¿¡¸¸ ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇϰí, ±×·¸Áö ¾ÊÀº °æ ¿ìµé¿¡´Â ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇÏÁö ¸» °ÍÀº ±ÇÀåÇÑ´Ù; ÀüÇüÀûÀÎ À¯´Ð½º µ¥ÀÌÅͺ£À̽º¿Í ´õºÒ¾î »ç¿ëÀÚ¿¡ ´ëÇÑ ´Ù¸¥ È®ÀåµÈ Á¤º¸¸¦ ÇÕº´ÇÏ´Â ½Ã½ºÅÛ¿¡¼, ÀÌ ÇÔ¼ö¸¦ »ç¿ëÇØ¼ ¿£Æ®¸®¸¦ ´õÇÏ´Â °ÍÀº Áß¿äÇÑ Á¤º¸¸¦ »ý·«ÇÏ°Ô µÇ´Â °ÍÀÌ´Ù.
ÇÔ¼ö putpwent ´Â `pwd.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
25.13 ±×·ì µ¥ÀÌŸº£À̽º
ÀÌ ÀýÀº µî·ÏµÈ ±×·ìµéÀÇ µ¥ÀÌÅͺ£À̽º¸¦ ¾î¶»°Ô °Ë»öÇϰí ãÀ»°ÍÀÎÁö¿¡ ´ëÇÑ ¸ðµç °ÍÀÌ ¼³¸íµÇ¾î ÀÖ´Ù. ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼ µ¥ÀÌÅͺ£À̽º ±× ÀÚü´Â `/etc/group'¿¡ º¸Á¸µÇ°í Àִµ¥, ¾î¶² ½Ã½ºÅÛ¿¡ ¼ ƯÁ¤ÇÑ ³×Æ®¿÷ ¼ºñ½º´Â ±×°Í¿¡ ´ëÇÑ ¾ï¼¼½º¸¦ Á¦°øÇÑ´Ù.
25.13.1 ±×·ìÀ» À§ÇÑ µ¥ÀÌŸ±¸Á¶Ã¼.
½Ã½ºÅÛ ±×·ì µ¥ÀÌÅͺ£À̽º¸¦ ¾ï¼¼½ºÇϱâ À§ÇÑ ÇÔ¼ö¿Í µ¥ÀÌÅͱ¸Á¶Ã¼´Â Çì´õÆÄÀÏ `grp.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
µ¥ÀÌÅÍ Å¸ÀÔ : struct group
group ±¸Á¶Ã¼´Â ½Ã½ºÅÛ ±×·ì µ¥ÀÌÅͺ£À̽º ¾È¿¡ ¿£Æ®¸®¿¡ ´ëÇÑ Á¤º¸¸¦ ÀúÀåÇϱâ À§Çؼ »ç¿ëµÈ´Ù. ±× ±¸Á¶Ã¼´Â Àû¾îµµ ´ÙÀ½°ú °°Àº ¸â¹öµéÀ» °®°í ÀÖ´Ù.
char *gr_name
±×·ìÀÇ À̸§.
gid_t gr_gid
±×·ìÀÇ ±×·ì ID
char **gr_mem
±×·ì¿¡ ÀÖ´Â »ç¿ëÀÚµéÀÇ À̸§À» °¡¸®Å°´Â Æ÷ÀÎÅÍÀÇ º¤ÅÍ. °¢ »ç¿ëÀÚ À̸§Àº ³Î¹®ÀÚ·Î ³¡³ª´Â ¹®ÀÚ ¿À̰í, º¤ÅÍ ÀÚü´Â ³¡ÀÌ ³Î Æ÷ÀÎÅÍ·Î ³¡³´Ù.
25.13.2 ÇÑ °³ÀÇ ±×·ì¿¡ ´ëÇÑ »ó¼¼ÇÑ Á¤º¸¸¦ ¾Ë¾Æ³»±â.
getgrgid ³ª getgrnam À» »ç¿ëÇØ¼ Á¤ÇØÁø ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ±×·ì µ¥ÀÌÅͺ£À̽º¿¡¼ ã¾Æ³¾ ¼ö ÀÖ´Ù. ±× ÇÔ¼öµéÀº `grp.h'¿¡ ¼±¾ðµÇ¾î ÀÖ´Ù.
ÇÔ¼ö : struct group * getgrgid (gid_t gid)
ÀÌ ÇÔ¼ö´Â ±×·ì ID ·Î gid¸¦ °®°í ÀÖ´Â ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ °®°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¸¦ °¡¸®Å°´Â Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getgrgid ÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼ µ¡¾º¿öÁú °ÍÀÌ´Ù. ³Î Æ÷ÀÎÅÍ´Â ±×·ì ID·Î gid ¸¦ °¡Áø ±×·ìÀÌ ¾ø´Ù´Â ¸»ÀÌ´Ù.
ÇÔ¼ö : struct group * getgrnam (const char *name)
ÀÌ ÇÔ¼ö´Â ±×·ì À̸§À¸·Î nameÀ» °¡Áø ±×·ì¿¡ ´ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â Á¤ÀûÀ¸·Î ÇÒ´çµÈ ±¸Á¶Ã¼¿¡ ´ë ÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â getgrnamÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼ µ¡¾º¿öÁø´Ù. ³Î Æ÷ÀÎÅÍ´Â ±×·ìÀ̸§À¸·Î nameÀ» °¡Áø ±×·ìÀÌ ¾ø´Ù´Â ¸»ÀÌ´Ù.
25.13.3 ¸ðµç ±×·ì¿¡ ´ëÇÑ ¸®½ºÆ®¸¦ °Ë»öÇϱâ.
ÀÌ ÀýÀº ÇÁ·Î±×·¥¿¡¼ ÇÑ ¹ø¿¡ ÇÑ ±×·ì¾¿, ½Ã½ºÅÛ¿¡ÀÖ´Â ¸ðµç ±×·ì¿¡ ´ëÇÑ ¸®½ºÆ®¸¦ ¾î¶»°Ô ÀÐÀ» ¼ö ÀÖ´ÂÁö¸¦ ¼³¸íÇÑ´Ù. À̰÷¿¡ ¼³¸íµÈ ÇÔ¼öµéÀº Çì´õÆÄÀÏ `grp.h'¿¡ ¼³¸íµÇ¾î ÀÖ´Ù. ƯÁ¤ÇÑ ÆÄÀÏ·Î ºÎÅÍ ±×·ì ¿£Æ®¸®µéÀ» Àбâ À§Çؼ fgetgrent ÇÔ¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
ÇÔ¼ö : struct group * fgetgrent (FILE *stream)
fgetgrent ÇÔ¼ö´Â streamÀ¸·ÎºÎÅÍ ´ÙÀ½ ¿£Æ®¸®¸¦ Àаí, ±× ¿£Æ®¸®¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸ Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í fgetgrent ÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ µ¡¾º¿öÁö±â ¶§¹®¿¡ ¸¸ÀÏ ´ç½ÅÀÌ ±× Á¤º¸¸¦ ÀúÀåÇϱ⸦ ¿øÇÑ´Ù¸é ±× ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷À¸·Î º¹»çÇØ³õ¾Æ¾ß¸¸ ÇÑ´Ù. streamÀº Ç¥ÁØ ±×·ì µ¥ÀÌÅÍÆÄÀϰú °°Àº Çü½ÄÀ» °¡Áø ÆÄÀÏÀ̾î¾ß¸¸ ÇÑ´Ù.
±×·ì µ¥ÀÌÅͺ£À̽º¿¡ ÀÖ´Â ¸ðµç ¿£Å͸®µéÀ» °Ë»öÇÏ´Â ¹æ¹ýÀº setgrent, getgrent, ±×¸®°í endgrent °¡ ÀÖ´Ù.
ÇÔ¼ö : void setgrent (void)
ÀÌ ÇÔ¼ö´Â ±×·ì µ¥ÀÌÅͺ£À̽º·ÎºÎÅÍ Àбâ À§ÇÑ ½ºÆ®¸²À» ÃʱâÈÇÑ´Ù. getgrent ÇÔ¼öÀÇ È£Ãâ¿¡¼ ÀÌ ½ºÆ®¸²ÀÌ »ç¿ëµÈ´Ù.
ÇÔ¼ö : struct group * getgrent (void)
getgrent ÇÔ¼ö´Â setgrent ¿¡ ÀÇÇØ ÃʱâÈµÈ ½ºÆ®¸²À¸·ÎºÎÅÍ ´ÙÀ½ ¿£Æ®¸®¸¦ ÀÐ°í ±× ¿£Å͸®¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. ±× ±¸Á¶Ã¼´Â Á¤ÀûÀ¸·Î ÇÒ´çµÇ¾ú°í getgrentÀÇ ¿¬¼ÓÀûÀΠȣÃâ¿¡ ÀÇÇØ¼ µ¡¾º¿ö Áø´Ù. ±×·¡¼ ¸¸ÀÏ ´ç½ÅÀÌ ±× Á¤º¸¸¦ ÀúÀåÇϱ⸦ ¿øÇÑ´Ù¸é ±× ±¸Á¶Ã¼ÀÇ ³»¿ëÀ» ´Ù¸¥°÷À¸·Î º¹»çÇØ ³õ¾Æ¾ß¸¸ ÇÑ´Ù.
ÇÔ¼ö : void entgrent (void)
ÀÌ ÇÔ¼ö´Â getgrent ¿¡ ÀÇÇØ »ç¿ëµÈ ³»ºÎ½ºÆ®¸²À» ´Ý´Â´Ù.
25.14 »ç¿ëÀÚ¿Í ±×·ì µ¥ÀÌÅͺ£À̽º¿¡ ´ëÇÑ ¿¹Á¦.
´ÙÀ½Àº ½Ã½ºÅÛ µ¥ÀÌÅͺ£À̽º ÁúÀÇ ÇÔ¼öµéÀ» »ç¿ëÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù. ´ÙÀ½ ÇÁ ·Î±×·¥Àº ÇÁ·Î±×·¥À» ½ÇÇà½Ã۰í ÀÖ´Â »ç¿ëÀÚ¿¡ ´ëÇÑ ¾î¶²Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.
#include <grp.h>
#include <pwd.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
int
main (void)
{
uid_t me;
struct passwd *my_passwd;
struct group *my_group;
char **members;
/* »ç¿ëÀÚ ID¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò¾î¶ó. */
me = getuid ();
my_passwd = getpwuid (me);
if (!my_passwd)
{
printf ("Couldn't find out about user %d.\n", (int) me);
exit (EXIT_FAILURE);
}
/* Á¤º¸¸¦ Ãâ·ÂÇ϶ó. */
printf ("I am %s.\n", my_passwd->pw_gecos);
printf ("My login name is %s.\n", my_passwd->pw_name);
printf ("My uid is %d.\n", (int) (my_passwd->pw_uid));
printf ("My home directory is %s.\n", my_passwd->pw_dir);
printf ("My default shell is %s.\n", my_passwd->pw_shell);
/* µðÆúÆ® ±×·ì ID¿¡ ´ëÇÑ Á¤º¸¸¦ ¾ò¾î¶ó. */
my_group = getgrgid (my_passwd->pw_gid);
if (!my_group)
{
printf ("Couldn't find out about group %d.\n",
(int) my_passwd->pw_gid);
exit (EXIT_FAILURE);
}
/* Á¤º¸¸¦ Ãâ·ÂÇ϶ó. */
printf ("My default group is %s (%d).\n",
my_group->gr_name, (int) (my_passwd->pw_gid));
printf ("The members of this group are:\n");
members = my_group->gr_mem;
while (*members)
{
printf (" %s\n", *(members));
members++;
}
return EXIT_SUCCESS;
}
´ÙÀ½Àº ÀÌ ÇÁ·Î±×·¥À» ÅëÇÑ Ãâ·ÂÀÌ´Ù.
I am Throckmorton Snurd.
My login name is snurd.
My uid is 31093.
My home directory is /home/fsg/snurd.
My default shell is /bin/sh.
My default group is guest (12).
The members of this group are:
friedman
tami