็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿ” Linux ACL / Setuid / Setgid / Sticky bit:้€ฒ้šŽๆช”ๆกˆๅฎ‰ๅ…จ่ˆ‡ๆฌŠ้™็ฎก็†ๆŒ‡ๅ—

    ๐Ÿ” Linux ACL / Setuid / Setgid / Sticky bit:้€ฒ้šŽๆช”ๆกˆๅฎ‰ๅ…จ่ˆ‡ๆฌŠ้™็ฎก็†ๆŒ‡ๅ—

    Linux ็š„ๆช”ๆกˆๆฌŠ้™ๆŽงๅˆถไธๅช rwx ๅ’Œ chmod。 ๅœจไผๆฅญ็’ฐๅขƒ、ๅคšไบบๅ”ไฝœ、ๅฐˆๆกˆ่ณ‡ๆ–™ๅคพ่ˆ‡ๅคšๆœๅ‹™ๆžถๆง‹ไธ‹,ไฝ ๅธธๆœƒ้‡ๅˆฐ:

    • ๅŒไธ€ไปฝ่ณ‡ๆ–™,้œ€็ตฆ「ๅคš็ต„ไบบ」ไธๅŒๆฌŠ้™
    • ่ฆ่ฎ“ไธ€่ˆฌไฝฟ็”จ่€…ไปฅ็‰นๅฎš่บซไปฝๅŸท่กŒ็จ‹ๅผ(ๅฆ‚ passwd)
    • ๅœ˜้šŠๅ…ฑ็”จ่ณ‡ๆ–™ๅคพ,ไฝ†ไธ่ƒฝไบ’็›ธๅˆช้™คๆ–‡ไปถ
    • ๅธŒๆœ›ๅปบ็ซ‹ UID/GID ่ฎŠๅ‹•ๅพŒ,่ณ‡ๆ–™ๅคพ่‡ชๅ‹•็นผๆ‰ฟ็พค็ต„่ˆ‡ๆฌŠ้™

    ้€™ไบ›้œ€ๆฑ‚้ƒฝๅฑฌๆ–ผ「้€ฒ้šŽๆฌŠ้™็ฎก็†」,้œ€่ฆ็”จๅˆฐ: ACL、Setuid、Setgid、Sticky bit。 ๆœฌๆ–‡ๅฐ‡็”จๆธ…ๆฅš็š„็ฏ„ไพ‹่ˆ‡ๅฏฆๆˆฐๆต็จ‹ๅธถไฝ ๆŽŒๆกๆ‰€ๆœ‰็ดฐ็ฏ€。


    ๐Ÿ“‘ ็›ฎ้Œ„


    ไธ€、ACL:็ช็ ด chmod ้™ๅˆถ็š„็ดฐ็ฒ’ๅบฆๆฌŠ้™ๆŽงๅˆถ

    ๅ‚ณ็ตฑ chmod ๆฌŠ้™ๅƒ…ๆ”ฏๆŒ:

    • Owner
    • Group
    • Others

    ไฝ†ๅœจไผๆฅญ็’ฐๅขƒๅธธ้œ€ๅŒไธ€่ณ‡ๆ–™ๅคพๆไพ›ๅคš็ต„ไบบไธๅŒๆฌŠ้™。ไพ‹ๅฆ‚:

    • ๅทฅ็จ‹้ƒจ:่ฎ€ + ๅฏซ
    • ๅ“ไฟ้ƒจ:ๅช่ƒฝ่ฎ€
    • ๅค–ๅŒ…ๅป ๅ•†:ๅช่ƒฝ่ฎ€ๆŸไบ›ๆช”ๆกˆ

    ้€™ๆ™‚ๅฐฑ้œ€่ฆ ACL(Access Control List)

    ✔ ๆŸฅ็œ‹ ACL

    getfacl filename

    ✔ ่จญๅฎš ACL(ๆ–ฐๅขžไฝฟ็”จ่€…/็พค็ต„ๆฌŠ้™)

    # ็ตฆ user tom ่ฎ€ๅฏซๆฌŠ
    setfacl -m u:tom:rw file.txt
    
    # ็ตฆ group qa ่ฎ€ๅ–ๆฌŠ
    setfacl -m g:qa:r file.txt
    

    ✔ ็งป้™ค ACL

    setfacl -b filename

    ✔ ่ณ‡ๆ–™ๅคพ่‡ชๅ‹•็นผๆ‰ฟ(default ACL)

    # ๆ–ฐๅขž้€ฒ่ณ‡ๆ–™ๅคพ็š„ๆช”ๆกˆ่‡ชๅ‹•ๅธถๆœ‰ ACL
    setfacl -m d:u:tom:rw /project/data
    

    ๅธธ่ฆ‹็”จ้€”:

    • ๅคšไบบๅ”ไฝœๅฐˆๆกˆ
    • ๅคš้ƒจ้–€ๅ…ฑ็”จ่ณ‡ๆ–™ๅคพ(Dev、QA、PM)
    • ็ฒพๆบ–ๆŽง็ฎก API ๆˆ– App ็š„ๅพŒ็ซฏๆช”ๆกˆๅญ˜ๅ–

    ไบŒ、Setuid:็จ‹ๅผไปฅๆช”ๆกˆ Owner ่บซไปฝๅŸท่กŒ

    ็•ถๆช”ๆกˆ่จญ็ฝฎ Setuid bit ๆ™‚,ๅŸท่กŒ่€…ๆœƒไปฅ「ๆช”ๆกˆ owner」็š„่บซไปฝๅŸท่กŒ,่€Œไธๆ˜ฏ่‡ชๅทฑ็š„่บซไปฝ。

    ๆœ€ๅธธ่ฆ‹็š„ไพ‹ๅญ:

    -rwsr-xr-x 1 root root /usr/bin/passwd

    passwd ้œ€่ฆไฟฎๆ”น /etc/shadow,ๅ› ๆญคๅฟ…้ ˆไปฅ root ่บซไปฝๅŸท่กŒ。

    ✔ ่จญๅฎš Setuid

    chmod u+s program

    ✔ ๅ–ๆถˆ Setuid

    chmod u-s program

    ⚠ ๅฎ‰ๅ…จ่ญฆๅ‘Š

    • ็ต•ไธ่ฆๅฐ shell script(sh, bash, python)่จญ Setuid
    • ๅฎนๆ˜“้€ ๆˆๆๆฌŠๆผๆดž
    • ๅƒ…้ฉ็”จ「็ถ“้Žๅฎ‰ๅ…จๅฏฉๆŸฅ」็š„็ทจ่ญฏ็จ‹ๅผ

    ้ฉ็”จๆƒ…ๅขƒ:

    • ้œ€่ฆไธ€่ˆฌไฝฟ็”จ่€…ๅŸท่กŒ็‰นๆฌŠๆ“ไฝœ(ไฟฎๆ”นๅฏ†็ขผ、ๆŽ›่ผ‰่ฃ็ฝฎ…)

    ไธ‰、Setgid:ไปฅ็พค็ต„่บซไปฝๅŸท่กŒ、่ณ‡ๆ–™ๅคพ่‡ชๅ‹•็นผๆ‰ฟ็พค็ต„

    Setgid ๆœ‰ๅ…ฉ็จฎ็”จ้€”:

    ๐Ÿ“Œ(1)ๆช”ๆกˆ:ไปฅ็พค็ต„่บซไปฝๅŸท่กŒ

    chmod g+s script

    ๐Ÿ“Œ(2)่ณ‡ๆ–™ๅคพ:ๆ–ฐๆช”ๆกˆ่‡ชๅ‹•็นผๆ‰ฟ็พค็ต„(ๆœ€ๅธธ็”จ)

    ็•ถ่ณ‡ๆ–™ๅคพ่จญๅฎš Setgid,ๆ–ฐๅปบ็š„ๆช”ๆกˆๆˆ–่ณ‡ๆ–™ๅคพๆœƒ่‡ชๅ‹•็นผๆ‰ฟ่ฉฒ่ณ‡ๆ–™ๅคพ็š„็พค็ต„。

    # ่จญๅฎš Setgid
    chmod g+s /project/data
    

    ้€™ๅฐๅœ˜้šŠๅ”ไฝœ้žๅธธ้‡่ฆ: ๆ‰€ๆœ‰ไบบๆ–ฐๅขžๆช”ๆกˆ้ƒฝๆœƒไฟๆŒๅŒไธ€ๅ€‹็พค็ต„,้ฟๅ…็”ข็”Ÿ「ไธๅŒไฝฟ็”จ่€…ๅฏซๅ…ฅไธๅŒ็พค็ต„」่€Œ็„กๆณ•ๅญ˜ๅ–็š„ๅ•้กŒ。

    ๅธธ่ฆ‹็”จ้€”:

    • ๅœ˜้šŠๅ…ฑ็”จ่ณ‡ๆ–™ๅคพ
    • CI/CD ็”ข็”Ÿๆช”ๆกˆ่ฆไฟๆŒ็›ธๅŒ็พค็ต„(ๅฆ‚ Jenkins)

    ๅ››、Sticky Bit:ๅคšไบบๅ…ฑ็”จ็›ฎ้Œ„็š„ๅผทๅˆถไฟ่ญท

    Sticky Bit ็š„ไฝœ็”จ: ไฝฟ็”จ่€…ๅช่ƒฝๅˆช้™ค่‡ชๅทฑๅปบ็ซ‹็š„ๆช”ๆกˆ

    ๅ…ธๅž‹ไพ‹ๅญ: /tmp

    drwxrwxrwt  tmp
                 ↑
              Sticky Bit (t)
    

    ✔ ่จญๅฎš Sticky Bit

    chmod +t /shared

    ✔ ็งป้™ค Sticky Bit

    chmod -t /shared

    ็”จ้€”:

    • /tmp
    • ๅคšไบบๅ…ฑ็”จ่ณ‡ๆ–™ๅคพ
    • ้›ฒ็ซฏๅŒๆญฅๆšซๅญ˜่ณ‡ๆ–™ๅคพ

    ไบ”、ACL vs chmod vs ็‰นๆฎŠๆฌŠ้™ๆฏ”่ผƒ่กจ

    ๅŠŸ่ƒฝ chmod ACL Setuid Setgid Sticky Bit
    ็ดฐ็ฒ’ๅบฆๆฌŠ้™
    ๅคšไบบๅ…ฑ็”จ็ฎก็†ๆ™ฎ้€š✔ ๆœ€้ฉๅˆ✔(่ณ‡ๆ–™ๅคพ)
    ไปฅ Owner ่บซไปฝๅŸท่กŒ
    ้ฟๅ…ไบ’ๅˆชๆช”ๆกˆ

    ๅ…ญ、ๅฏฆๆˆฐๆƒ…ๅขƒ:ๅฐˆๆกˆ่ณ‡ๆ–™ๅคพๆฌŠ้™ไธ€ๆฌก้…็ฝฎๅฎŒๆˆ

    ๅ‡่จญไฝ ๆœ‰ไธ€ๅ€‹ๅœ˜้šŠ่ณ‡ๆ–™ๅคพ:

    /project/data

    ้œ€ๆฑ‚:

    • Dev:่ฎ€ๅฏซ
    • QA:ๅช่ฎ€
    • ๆ‰€ๆœ‰ๆ–ฐๆช”ๆกˆ้ƒฝ่‡ชๅ‹•็นผๆ‰ฟ็พค็ต„
    • ๆฏๅ€‹ไบบไธ่ƒฝๅˆช้™คๅˆฅไบบ็š„ๆช”ๆกˆ

    ✔ ๅปบ็ซ‹็พค็ต„

    groupadd dev
    groupadd qa
    

    ✔ ่จญๅฎš่ณ‡ๆ–™ๅคพๅŸบๆœฌๆฌŠ้™

    chown root:dev /project/data
    chmod 2770 /project/data   # 2 = Setgid
    

    ✔ ๅŠ ไธŠ Sticky Bit

    chmod +t /project/data

    ✔ ่จญๅฎš ACL ็ตฆ QA(ๅช่ฎ€)

    setfacl -m g:qa:r /project/data

    ✔ ่จญ Default ACL(ๆ–ฐๆช”ๆกˆ็นผๆ‰ฟๆฌŠ้™)

    setfacl -m d:g:dev:rw /project/data
    setfacl -m d:g:qa:r   /project/data
    

    ๐Ÿ” ๅฎŒๆˆๅพŒไฝ ๆœƒๅพ—ๅˆฐ: ๅฏ็ถญ่ญท、ๅฏๆ“ดๅ……、ๅฏๅฏฉ่จˆ、ๅฏ่‡ชๅ‹•็นผๆ‰ฟ็š„ๅฐˆๆกˆ่ณ‡ๆ–™ๅคพๆฌŠ้™ๆžถๆง‹。


    ไธƒ、ๅธธ่ฆ‹ๅ•้กŒ FAQ

    Q:ACL ๆœƒ่ฎ“ๆฌŠ้™่ฎŠๅพ—่ค‡้›œๅ—Ž?

    ๆœƒ,ไฝ†ๆ›ไพ†็š„ๆ˜ฏๆ›ด้ซ˜ๅฝˆๆ€ง。ๅปบ่ญฐๆญ้… getfacl ๆŸฅ่ฉขๅทฅๅ…ท่ˆ‡ๆ–‡ไปถๆŽง็ฎก。

    Q:Setuid / Setgid ๆ€Ž้บผ็œ‹ๆ˜ฏๅฆๅ•Ÿ็”จ?

    ๆช”ๆกˆๆฌŠ้™ๆœƒๅ‡บ็พ S / s ไพ‹ๅฆ‚:

    -rwsr-xr-x

    Q:Sticky Bit ็š„ t / T ๅทฎๅœจๅ“ช?

    • t:ๅŸท่กŒไฝๅ…ƒๅญ˜ๅœจ → ๆฌŠ้™ๅฎŒๆ•ด
    • T:ๆฒ’ๆœ‰ๅŸท่กŒไฝๅ…ƒ → ไฝ† sticky bit ไปๅœจ

    • ๐Ÿง Linux ไฝฟ็”จ่€…่ˆ‡็พค็ต„็ฎก็†:useradd、usermod、passwd、sudoers ๆทฑๅบฆ่งฃๆž
    • ๐Ÿง Linux ๆช”ๆกˆ็ณป็ตฑ:inode、EXT4、XFS、ๆฌŠ้™่ˆ‡ๅฏฆ้ซ”ๅ„ฒๅญ˜็ตๆง‹
    • ๐Ÿง Linux ็ณป็ตฑๅŠ ๅ›บ:SELinux、AppArmor、auditd、Fail2Ban ๅ…จ้ขๅฎ‰ๅ…จ้˜ฒ่ญท
    • ๐Ÿง LVM ่ˆ‡็ฃ็ขŸๆ“ดๅฎน:PV/VG/LV、็ทšไธŠๆ“ดๅฑ•、็ธฎๅฐ่ˆ‡ๅฟซ็…งๅฎŒๆ•ดๆ•™ๅญธ

    — WWFandy・Linux ๆฌŠ้™็ฎก็†็ญ†่จ˜

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš