Ä¿ÇǴнº, ½Ã½ºÅÛ ¿£Áö´Ï¾îÀÇ ½°ÅÍ
  ÀϹÝÀ¯Àú°¡ 1024ÀÌÇÏ Æ÷Æ®¸¦ »ç¿ëÇÏ·Á¸é ÀÛ¼ºÀÏ : 2010/11/11 20:54
 
  • ±Û¾´ÀÌ : ÁÁÀºÁøÈ£ ( http://coffeenix.net/ )
  • Á¶È¸¼ö : 19344
     
    Á¦  ¸ñ : ÀϹÝÀ¯Àú°¡ 1024ÀÌÇÏ Æ÷Æ®¸¦ »ç¿ëÇÏ·Á¸é
    ÀÛ¼ºÀÚ : ÁÁÀºÁøÈ£(truefeel, http://coffeenix.net/ )
    ÀÛ¼ºÀÏ : 2010.10.26(È­)


    ¸®´ª½º/À¯´Ð½º ±âº» ȯ°æ¿¡¼­´Â 1024 ÀÌÇÏ Æ÷Æ®(privileged ports)´Â root¸¸ »ç¿ëÇÒ ¼ö°¡ ÀÖ´Ù. OSº°·Î °¢°¢ ´ÙÀ½ ±â´ÉÀ» »ç¿ëÇϸé ÀϹÝÀ¯Àú°¡ 1024ÀÌÇÏ Æ÷Æ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    1) FreeBSD : MAC ÀÎÁõ ¸ÅÄ¿´ÏÁò (FreeBSD 5.x ÀÌ»ó)
    2) Linux   : capabilities ¼³Á¤ (File capabilities¸¦ ¼³Á¤Çϱâ À§Çؼ­´Â Ä¿³Î 2.6.24 ÀÌ»ó)
    3) Solaris : RBAC·Î ±ÇÇÑ ºÎ¿©  (Solaris 8 ÀÌ»ó)


    1. FreeBSD¿¡¼­ MAC ¸ðµâ ·Îµù



    FreeBSD¿¡¼­´Â Ä¿³ÎÀÇ MAC(Mandatory Access Control) ÀÎÁõ ¸ÅÄ¿´ÏÁòÀ» »ç¿ëÇϸé ÀϹÝÀ¯Àú°¡ 1024ÀÌÇÏ Æ÷Æ® bind¸¦ ½±°Ô ó¸®ÇÒ ¼ö ÀÖ´Ù. ¸ÕÀú MAC portacl ¸ðµâÀ» ·ÎµùÇÑ´Ù.

     
    # kldload mac_portacl
    # kldstat
    Id Refs Address    Size     Name
    1    4 0xc0400000 b7ffe8   kernel
    2    1 0xca62f000 3000     mac_portacl.ko
     


    ºÎÆö§ ÀÚµ¿À¸·Î ·ÎµùµÇµµ·Ï /boot/loader.conf¿¡ mac_portacl_load="YES" ¸¦ Ãß°¡ÇÑ´Ù. ¸ðµâ ·Îµù½Ã syslog¿¡´Â ´ÙÀ½°ú °°Àº ·Î±×°¡ ³²´Â´Ù.

     
    Oct 22 14:04:29 ?????? kernel: Security policy loaded: TrustedBSD MAC/portacl (mac_portacl)
     


    ¸¸¾à ¸ðµâ ·Îµù½Ã ´ÙÀ½°ú °°Àº ¿¡·¯°¡ »ý°å´Ù¸é Ä¿³Î¿¡¼­ MAC ¸ðµâÀ» Áö¿øÇÏÁö ¾Ê´Â °æ¿ìÀÌ´Ù.

     
    # kldload mac_portacl
    kldload: can't load mac_portacl: No such file or directory
     


    ÀÌ ¶§ /var/log/messages ¿¡´Â ´ÙÀ½°ú °°ÀÌ ·Î±×°¡ ³²´Â´Ù.

     
    Oct 22 13:17:26 ?????? kernel: KLD mac_portacl.ko: depends on kernel_mac_support - not available
     


    Ä¿³Î ¼³Á¤ ÆÄÀÏ¿¡ ´ÙÀ½À» Ãß°¡ÇÏ°í ÀçÄÄÆÄÀÏÇÑ´Ù. FreeBSD 8.xºÎÅÍ´Â ±âº» Æ÷ÇԵǾî ÀÖ´Ù.

     
    options         MAC
     


    sysctl·Î °ü·Ã ¼Ó¼ºµéÀ» »ìÆ캸ÀÚ.

     
    # sysctl security.mac
    security.mac.labeled: 0
    security.mac.max_slots: 4
    security.mac.version: 4
    security.mac.mmap_revocation_via_cow: 0
    security.mac.mmap_revocation: 1
    security.mac.portacl.rules:                    <-- ¿©±â¼­ ºÎÅÍ ¸ðµâ ·Îµù ÈÄ Ãß°¡µÈ ¼³Á¤
    security.mac.portacl.port_high: 1023
    security.mac.portacl.autoport_exempt: 1
    security.mac.portacl.suser_exempt: 1
    security.mac.portacl.enabled: 1
     



    2. FreeBSD¿¡¼­ ÀϹÝÀ¯Àú°¡ 1024ÀÌ bindÇÏ´Â ¿¹

    999Æ÷Æ®¸¦ uid 1005°¡ ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï Çغ¸ÀÚ.

     
    # sysctl security.mac.portacl.rules=uid:1005:tcp:999
    security.mac.portacl.rules:  -> uid:1005:tcp:999

    [ UID 1005 ÀÏ¹Ý À¯Àú·Î ½ÇÇà ]
    % nc -l 999 (Å×½ºÆ®¸¦ À§ÇØ nc¸í·ÉÀ» »ç¿ëÇß´Ù. CentOS´Â µ¿ÀÏÇÑ ¿É¼ÇÀÌ°í, µ¥ºñ¾È ¶Ç´Â ¿ìºÐÅõ´Â nc -l -p 999)
    nc: Operation not permitted
     


    ±×·±µ¥, ±ÇÇÑÀÌ ¾ø´Ù°í ÇÑ´Ù. ±×·¸´Ù. ±âÁ¸ÀÇ À¯´Ð½º bind Á¦ÇÑ ¼³Á¤À» ÇØÁ¦ÇØ¾ß ÇÑ´Ù. reserved port ÃÖ´ëÄ¡¸¦ 0À¸·Î ¹Ù²Ù°Å³ª 998(999Æ÷Æ®¸¦ ÀÏ¹Ý À¯Àú°¡ ¿ÀÇÂÇÒ °ÍÀ̹ǷΠ998ÀÓ)·Î ¹Ù²Û´Ù. 998·Î ¼³Á¤Çß´Ù¸é, 998±îÁö´Â ±âÁ¸ÀÇ À¯´Ð½º bind Á¦ÇÑ ¼³Á¤À» µû¸£°Ú´Ù´Â °ÍÀÌ´Ù.

     
    # sysctl net.inet.ip.portrange.reservedhigh
    net.inet.ip.portrange.reservedhigh: 1023
    # sysctl net.inet.ip.portrange.reservedhigh=998
    net.inet.ip.portrange.reservedhigh: 1023 -> 998
     


    ¸¸¾à UID 1005°¡ 999Æ÷Æ®¿Í 1000Æ÷Æ®¸¦ ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù.
     
    # sysctl security.mac.portacl.rules=uid:1005:tcp:999,uid:1005:tcp:1000
     



    3. Linux¿¡¼­ setcap ¸í·ÉÀ¸·Î capabilities ¼³Á¤



    ¸®´ª½ºÀÇ capabilities ¼³Á¤À» ÅëÇؼ­ ÀÏ¹Ý À¯Àú°¡ 1024ÀÌÇÏ Æ÷Æ® »ç¿ëÀÌ °¡´ÉÇÏ´Ù. capabilities¶õ ¹«¾ùÀϱî? ÀüÅëÀûÀÎ À¯´Ð½º/¸®´ª½º¿¡¼­´Â root°¡ ¸ðµç ±ÇÇÑÀ» °¡Áø´Ù. ÀϹÝÀ¯Àú°¡ rootÀÇ ÀϺΠ±ÇÇÑÀ» °®±â À§Çؼ­´Â SetUID/SetGID³ª sudo µî ±âÃÊÀûÀÎ ¹æ¹ýÀ¸·Î ±ÇÇÑÀ» ºÎ¿©ÇÒ ¼ö ¹Û¿¡ ¾ø¾ú´Ù. ÇÏÁö¸¸ capabilities´Â rootÀÇ ±ÇÇÑÀ» ¼¼ºÐÈ­(Ä¿³Î ¸ðµâ load/remove, ÆÄÀÏ ¼ÒÀ¯ÀÚ/¼ÒÀ¯±×·ì º¯°æ, kill±ÇÇÑ, ping Çã¿ë(ICMPÇã¿ë), ¸®ºÎÆà µî)ÇÏ¿©, ÀÏ¹Ý À¯Àúµµ rootÀÇ ´Ù¾çÇÑ ±ÇÇÑÀ» °®µµ·Ï ¸¸µç º¸¾È ¸ðµ¨ÀÌ´Ù. ÀÏ¹Ý À¯Àú¿¡°Ô ÆÐŶ ¸ð´ÏÅ͸µÅøÀ» »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çã¿ëÇÒ ¼ö ÀÖ´Ù. PAM ¸ðµâÀ» »ç¿ëÇϸé user¸¦ ÁöÁ¤ÇÏ¿© ±ÇÇÑ ºÎ¿©µµ ÇÒ ¼ö ÀÖ´Ù.

    capabilitiesÀº Ä¿³Î¿¡¼­ Áö¿øÇØ¾ß Çϸç, File capabilities¸¦ À§Çؼ­´Â 2.6.24ÀÌ»óÀ» »ç¿ëÇÏ¸é µÈ´Ù. ¼³Á¤Àº setcap, getcap ¸í·ÉÀ» »ç¿ëÇÑ´Ù.

    capabilities ¸ÇÆäÀÌÁö¸¦ º¸¸é, CAP_NET_BIND_SERVICEÀÌ 1024ÀÌÇÏ Æ÷Æ®(privileged ports)¿¡ ´ëÇØ ±ÇÇÑ ºÎ¿© ¿ªÇÒÀ» ÇÑ´Ù.

     
    CAP_NET_BIND_SERVICE
           Bind a socket to Internet domain privileged ports (port numbers less than 1024).
     


    1) capabilities ¼³Á¤À» À§ÇØ libcap2°¡ ÆÐÅ°Áö°¡ ÇÊ¿äÇÏ´Ù.
       ¨ç µ¥ºñ¾È/¿ìºÐÅõ´Â libcap2-bin ÆÐÅ°Áö(setcap, getcap µîÀÇ ¸í·ÉÀ» °®°í ÀÖÀ½)¸¦ ¼³Ä¡ÇÑ´Ù.
       ¨è CentOS´Â http://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/ ¿¡¼­ ¼Ò½º¸¦ ¹Þ´Â´Ù.
          ÀÌ ¼Ò½º ÄÄÆÄÀÏÀ» À§Çؼ­´Â libattr-devel ÆÐÅ°Áö°¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.
    2) setcap¸í·ÉÀ¸·Î CAP_NET_BIND_SERVICE¸¦ 1024ÀÌÇÏ Æ÷Æ®¸¦ »ç¿ëÇÒ ÆÄÀÏ¸í¿¡ ¼³Á¤À» ÇØÁÖ¸é µÈ´Ù. ½Éº¼¸¯ ¸µÅ© ÆÄÀÏÀº ÁöÁ¤ÇÒ ¼ö°¡ ¾ø´Ù.
    3) ¼³Á¤À» È®ÀÎÇÏ·Á¸é getcapÀ», ±×¸®°í ¼³Á¤À» ´Ù½Ã »©·Á¸é -r ¿É¼ÇÀ» »ç¿ëÇÏ¸é µÈ´Ù.

     
    [ ¸í·É Çü½Ä ] setcap capability1[,capability2][=-+][value] <filename>
    # setcap 'cap_net_bind_service=+ep' /usr/bin/nc (Å×½ºÆ®¸¦ À§ÇØ nc¸í·ÉÀ» »ç¿ëÇß´Ù.)
    # getcap /usr/bin/nc
    /usr/bin/nc = cap_net_bind_service+ep
    #
    # setcap -r /usr/bin/nc (¼³Á¤ »©±â)
    # getcap /usr/bin/nc
    #
     


    capabilities À̸§ÀÎ cap_net_bind_serviceÀº ´ë¼Ò¹®ÀÚ ±¸º°ÀÌ ¾øÁö¸¸, set ÇØ´çÇÏ´Â ep´Â ¼Ò¹®ÀÚ¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù.
    ¿¬»êÀÚ´Â +, -, = 3°¡Áö·Î, chmodÀÇ ¿¬»êÀÚ¿Í µ¿ÀÏÇÑ Àǹ̸¦ °®´Â´Ù. °¢°¢ Ãß°¡(+), »èÁ¦(-), ÁöÁ¤ÇÑ ±ÇÇÑÀ¸·Î µ¿ÀÏ(=)ÇÏ°Ô º¯°æÇÑ´Ù.
    file capabilities set¿¡´Â ´ÙÀ½ 3°¡Áö°¡ ÀÖ´Ù.

    - e : effective   -> È¿·ÂºÎ¿©
    - p : Permitted   -> Çã¿ë
    - i : Inheritable -> exec ÇÒ ¶§ ±ÇÇÑ »ó¼Ó ¿©ºÎ

    capabilities manpage¿¡¼­ °¢ set¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀÖ´Ù. ÆÄÀÏ¿¡ cap_net_bind_service ±ÇÇÑÀ» ºÎ¿©ÇÏ·Á¸é ep ¶Ç´Â eip¸¦ ¼ÂÆÃÇÏ¸é µÈ´Ù´Â °Í¸¸ ¾Ë°í ÀÖÀ¸¸é µÈ´Ù.

    ´ÙÀ½Àº 999Æ÷Æ®¸¦ ¿ÀÇÂÇÑ ¿¹ÀÌ´Ù. ÀÏ¹Ý À¯Àú·Î ½ÇÇàµÈ °ÍÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
     
    [ ÀÏ¹Ý À¯Àú°¡ 999Æ÷Æ® ¹ÙÀεù ]
    $ nc -l 999 (µ¥ºñ¾È ¶Ç´Â ¿ìºÐÅõ¿¡¼­´Â nc -l -p 999)

    [ root·Î È®ÀÎ ]
    # netstat -anp
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address     Foreign Address     State      PID/Program name
    tcp        0      0 0.0.0.0:999       0.0.0.0:*           LISTEN     18021/nc        <--- 999Æ÷Æ®¸¦ 18021 PID°¡
    ... »ý·« ...
    # ps auxww|grep "[n]c "
    coffeenix 18021  0.0  0.0   1728   612 pts/15   S+   18:59   0:00 nc -l 999 <--- 18021 PID ½ÇÇàÀ¯Àú´Â coffeenix
     



    4. Linux¿¡¼­ capabilities Á» ´õ ¾Ë±â

    1) PAM ¸ðµâ

    pam_cap.so PAM ¸ðµâµµ Á¦°øÇϹǷÎ, ·Î±äÀ» Çϰųª su ÀÌ¿ë½Ã 'À¯Àúº°'·Î ´Ù¸¥ ±ÇÇÑÀ» ºÎ¿©ÇÒ ¼ö ÀÖ´Ù. /etc/security/capability.conf ¿¡ capabilities¸¦ ¼³Á¤ÇÑ´Ù.
    CentOS¿¡¼­ libcap2 ¼Ò½º¸¦ °¡Á®´Ù PAM ¸ðµâÀ» ¼³Ä¡ÇÒ °æ¿ì ¸ÕÀú pam-devel ÆÐÅ°Áö°¡ ¼³Ä¡µÇ¾î ÀÖ¾î¾ß ÇÑ´Ù.

    2) ÇÁ·Î¼¼½ºÀÇ capabilities set »óÅ ȮÀÎ

    capabilitiesÀÇ Effective/Inheritable/Permitted set(ÁýÇÕ)Àº °¢°¢ 32bit·Î ÀÌ·ïÁ® ÀÖ´Ù. ±×¸®°í, °¢ bitº°·Î ¾î¶² ±ÇÇÑ(ÀÚ°Ý)À» °®´ÂÁö ÁöÁ¤µÇ¾î ÀÖ´Ù. CAP_NET_BIND_SERVICE Àº 11¹ø° bit(0100 0000 0000 => hex 0400)¿¡ ÇØ´çÇÑ´Ù. ³ª¸ÓÁö ±ÇÇѵéÀÌ ¸î ¹ø° bitÀÎÁö´Â /usr/include/linux/capability.h¿¡ ÀÚ¼¼È÷ ³ª¿ÍÀÖÀ¸´Ï »ý·«ÇÑ´Ù.

    ÇÁ·Î¼¼½ºÀÇ capabilities set »óÅ ȮÀÎÇغ¸ÀÚ. setcapÀ¸·Î ¼³Á¤ÇصРÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. ±×¸®°í ÇØ´ç ÇÁ·Î¼¼½ºÀÇ PID¸¦ È®ÀÎÇÑ´Ù. cat /proc//status|grep Cap ¸í·ÉÀ¸·Î bitmap °á°ú¸¦ È®ÀÎÇÒ ¼ö ÀÖ´Ù.

     
    # cat /proc/26494/status|grep cap
    CapInh:¡¡¡¡¡¡0000000000000000         <-- Inheritable capabilities
    CapPrm:¡¡¡¡¡¡0000000000000400         <-- Effective   capabilities (Hex 0400. Áï, CAP_NET_BIND_SERVICEÀÌ setµÇ¾úÀ½À» È®ÀÎÇÒ¼ö ÀÖ´Ù.)
    CapEff:¡¡¡¡¡¡0000000000000400         <-- Permitted   capabilities (Hex 0400)
    CapBnd:¡¡¡¡¡¡ffffffffffffffff
     



    5. Solaris¿¡¼­ RBAC·Î ±ÇÇÑ ºÎ¿©



    ÀüÅëÀûÀÎ À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â root°¡ ¸ðµç ±ÇÇÑÀ» °®´Â´Ù. ±×·¯³ª ÀÌ rootÀÇ ±ÇÇÑ ÀϺθ¦ ´Ù¸¥ À¯Àú¿¡°Ô ÇÒ´çÇÏ´Â °ÍÀÌ ½±Áö ¾Ê¾Ò´Ù.
    RBAC(Role Based Access Control, ·Ñ ±â¹Ý  Á¢±Ù Á¦¾î)´Â root°¡ °®´Â ±ÇÇÑ Áß ÀϺθ¦ ¹­Àº ÈÄ, ±× ±ÇÇÑ ¹­À½À» À¯Àú¿¡°Ô ºÎ¿©ÇÒ ¼ö°¡ ÀÖ´Â º¸¾È¸ðµ¨ÀÌ´Ù. ±ÇÇÑÀÇ ¹­À½À» '·Ñ(Role)'À̶ó´Â ºÎ¸¥´Ù.

    ¨ç ·ÑÀ» »ý¼º(roleadd)ÇÏ°í, (roleadd)
    ¨è ±× ·ÑÀÌ ¾î¶² ±ÇÇÑÀ» °®´Â ·ÑÀÎÁö¸¦ Á¤ÀǸ¦ ÇÑ´Ù. (roleadd, rolemod)
    ¨é ±×¸®°í, ±× ·Ñ¿¡ ¼ÓÇÏ´Â À¯Àú¸¦ ¼³Á¤ÇÏ¸é µÈ´Ù. (usermod)

    ÀÌ·± ·Ñ ±â¹Ý Á¢±Ù Á¦¾î´Â ¾÷¹« ¿ªÇÒº°·Î ±ÇÇÑ ¹­À½À» ¸¸µé¾î À¯Àú¿¡°Ô ±ÇÇÑÀ» ºÐ»êÇÒ ¼ö°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î, ÆÄÀϽýºÅÛ mount¸¦ ÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀ» 'disk'¶ó´Â ·Ñ¸í(·Ñ¸íÀº IDó·³ ÀÓÀÇ·Î ¸¸µé¸é µÊ)À¸·Î ¸¸µé¾ú´Ù°í ÇÏÀÚ. ±×¸®°í ÀÌ ·Ñ¿¡ À¯Àú¸¦ ÇÒ´çÇϸé ÇØ´ç À¯Àú´Â mount ±ÇÇÑÀ» ºÎ¿©¹Þ°Ô µÈ´Ù.

    ÀÚ¼¼ÇÑ ±ÇÇÑ ¸ñ·ÏÀº privileges man page ¶Ç´Â /etc/security/priv_names¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
    ´ÙÀ½Àº coffeenixÀ¯Àú°¡ 1024ÀÌÇÏ Æ÷Æ®¸¦ ¿­¼ö ÀÖ´Â ±ÇÇÑ(±ÇÇѸí : PRIV_NET_PRIVADDR)À» °®´Â ¿¹ÀÌ´Ù. ·Ñ »ý¼º ¹æ¹ýÀ¸·Î ½ÃµµÇغÃÁö¸¸ ½±°Ô µÇÁö ¾Ê¾Æ¼­, ·Ñ »ý¼º¾øÀÌ À¯Àú¿¡°Ô Á÷Á¢ ±ÇÇÑÀ» ºÎ¿©ÇÏ´Â ¹æ¹ýÀ¸·Î 󸮸¦ Çß´Ù. ¼³Á¤ ÈÄ Àç·Î±äÇÏ¸é ±ÇÇÑÀ» °®´Â´Ù.

     
    # usermod -K defaultpriv=basic,net_privaddr coffeenix
     


    /etc/user_attr¿¡¼­ ´ÙÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.
     
    coffeenix::::type=normal;defaultpriv=basic,net_privaddr
     



    6. Âü°íÀÚ·á

    * FreeBSD Handbook - 16.10 The MAC portacl Module
      http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/mac-portacl.html

    * Is there a way for non-root processes to bind to ¡°privileged¡± ports (<1024) on Linux?
      http://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-1024-on-linux
    * Linux : capabilities man page
      http://www.kernel.org/doc/man-pages/online/pages/man7/capabilities.7.html
    * Linux : setcap man page
      http://manpages.ubuntu.com/manpages/lucid/man8/setcap.8.html
    * Linux Security Capabilities
      http://fpmurphy.blogspot.com/2009/05/linux-security-capabilities.html
    * [Linux] POSIX capability (ÇѱÛ)
      http://studyfoss.egloos.com/5338802

    * Solaris 10 Non-Root User...Port 80
      http://blogs.sun.com/tls/entry/solaris_10_non_root_user
    * Custom Roles Using RBAC in the Solaris OS
      http://www.sun.com/bigadmin/content/submitted/custom_roles_rbac.jsp


    Ä¿ÇǴнº, ½Ã½ºÅÛ ¿£Áö´Ï¾îÀÇ ½°ÅÍ / URL : http://coffeenix.net/board_view.php?bd_code=1716