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

๐Ÿงฐ Linux PAM ่ˆ‡ sudo ๆฌŠ้™ๅฎ‰ๅ…จๆŽง็ฎกๆŒ‡ๅ—

    ๐Ÿงฐ Linux PAM ่ˆ‡ sudo ๆฌŠ้™ๅฎ‰ๅ…จๆŽง็ฎกๆŒ‡ๅ—

    ๅœจ Linux ็ณป็ตฑไธญ,PAM(Pluggable Authentication Modules)่ˆ‡ sudo ๆ˜ฏ็ถญ้‹ไบบๅ“กๆœ€ๅธธๆŽฅ่งธ็š„ๅฎ‰ๅ…จๆŽง็ฎกๆฉŸๅˆถ。้€้Ž้ˆๆดป็š„ๆจก็ต„ๅŒ–้ฉ—่ญ‰ๆžถๆง‹่ˆ‡็ดฐ็ทป็š„ๆฌŠ้™่จญๅฎš,ๆˆ‘ๅ€‘่ƒฝๆœ‰ๆ•ˆ้™ไฝŽ่ชค็”จ่ˆ‡ๅ…ฅไพต้ขจ้šช,ๅปบ็ซ‹ๅฎ‰ๅ…จๅˆๅฝˆๆ€ง็š„็ฎก็†็’ฐๅขƒ。

    ๐Ÿ“˜ ไธ€、PAM ๆ˜ฏไป€้บผ?

    PAM(ๅฏๆ’ๅ…ฅๅผ้ฉ—่ญ‰ๆจก็ต„)ๆ˜ฏ Linux ็š„ๆ ธๅฟƒๅฎ‰ๅ…จๆก†ๆžถ,็”จๆ–ผ็ตฑไธ€็ฎก็†ไฝฟ็”จ่€…็™ปๅ…ฅ、่ช่ญ‰、ๅฏ†็ขผ็ญ–็•ฅ่ˆ‡ๅธณ่™Ÿ้Ž–ๅฎš็ญ‰ๅ‹•ไฝœ。ๅ„ๆœๅ‹™(ๅฆ‚ SSH、su、login)็š†้€้Ž PAM ้€ฒ่กŒ่บซๅˆ†้ฉ—่ญ‰。

    PAM ่จญๅฎšๆช”ไฝ็ฝฎ:

    /etc/pam.d/
    ├── login
    ├── sshd
    ├── su
    ├── sudo
    └── system-auth
    

    ๆฏๅ€‹ๆœๅ‹™้ƒฝๅฏไฝฟ็”จไธๅŒ PAM ๆจก็ต„ๆŽงๅˆถ็™ปๅ…ฅ่กŒ็‚บ,ๅฆ‚ pam_unix.sopam_tally2.sopam_faillock.so

    ---

    ๐Ÿงฉ ไบŒ、PAM ้ฉ—่ญ‰ๆต็จ‹่งฃๆž

    ไปฅ sshd ็‚บไพ‹,็™ปๅ…ฅๆ™‚ๆœƒไพๅบๅŸท่กŒไปฅไธ‹ๆจก็ต„:

    1. auth:ไฝฟ็”จ่€…่บซไปฝ้ฉ—่ญ‰。
    2. account:ๅธณ่™Ÿ็‹€ๆ…‹่ˆ‡ๅˆฐๆœŸๆชขๆŸฅ。
    3. password:ๅฏ†็ขผ่ฎŠๆ›ด่ฆ็ฏ„。
    4. session:็™ปๅ…ฅ่ˆ‡็™ปๅ‡บ้šŽๆฎตๅ‹•ไฝœ。

    ็ฏ„ไพ‹่จญๅฎš(/etc/pam.d/sshd):

    auth       required     pam_sepermit.so
    auth       substack     password-auth
    account    required     pam_nologin.so
    session    required     pam_selinux.so close
    session    required     pam_loginuid.so
    
    ---

    ๐Ÿ” ไธ‰、ๅธณ่™Ÿ้Ž–ๅฎš่ˆ‡็™ปๅ…ฅๆฌกๆ•ธ้™ๅˆถ

    ไฝฟ็”จ pam_faillock ๆจก็ต„ๅฏ้˜ฒๆญขๆšดๅŠ›็ ด่งฃ็™ปๅ…ฅ:

    auth required pam_faillock.so preauth silent deny=3 unlock_time=300
    auth [default=die] pam_faillock.so authfail
    account required pam_faillock.so
    

    ้€™ไปฃ่กจ:้€ฃ็บŒ 3 ๆฌก็™ปๅ…ฅๅคฑๆ•—ๆœƒ้Ž–ๅฎšๅธณ่™Ÿ 5 ๅˆ†้˜。 ๅฏ็”จไธ‹ๅˆ—ๆŒ‡ไปคๆŸฅ่ฉข้Ž–ๅฎš็‹€ๆ…‹:

    pam_tally2 --user username
    faillock --user username
    
    ---

    ๐Ÿงฑ ๅ››、sudo ๆฌŠ้™ๆŽง็ฎกๅŽŸๅ‰‡

    sudo ่ฎ“ไธ€่ˆฌไฝฟ็”จ่€…ไปฅๅ—้™ๆ–นๅผๅŸท่กŒ็ฎก็†ๅ“กๆŒ‡ไปค,ๆ˜ฏๆœ€้‡่ฆ็š„ๆฌŠ้™็ฎก็†ๅทฅๅ…ท。

    ็ทจ่ผฏ sudoers:

    sudo visudo
    

    ๅธธ่ฆ‹่จญๅฎš็ฏ„ไพ‹:

    # ๅ…่จฑ user1 ไฝฟ็”จ root ๆฌŠ้™ๅŸท่กŒๆ‰€ๆœ‰ๆŒ‡ไปค
    user1 ALL=(ALL) ALL
    
    # ้™ๅˆถ group admin ๅช่ƒฝ้‡ๅ•Ÿๆœๅ‹™
    %admin ALL=(ALL) /bin/systemctl restart *
    
    # ็ฆๆญข็‰นๅฎšๆŒ‡ไปค
    user2 ALL=(ALL) ALL, !/bin/rm
    

    ๆŸฅ็œ‹็›ฎๅ‰ไฝฟ็”จ่€…็š„ sudo ๆฌŠ้™:

    sudo -l
    
    ---

    ๐Ÿง  ไบ”、ๆๅ‡ sudo ่ˆ‡ PAM ็š„ๅฎ‰ๅ…จๅฑค็ดš

    • ไฝฟ็”จ visudo ็ทจ่ผฏ,้ฟๅ…่ชžๆณ•้Œฏ่ชคๅฐŽ่‡ด้Ž–ๆญป。
    • ๅœจ PAM ไธญๆ•ดๅˆ pam_faillock.so ไปฅ้™ๅˆถ sudo ็™ปๅ…ฅๆฌกๆ•ธ。
    • ้–‹ๅ•Ÿ sudo ๆ—ฅ่ชŒ:ๅœจ /etc/sudoers ๅŠ ๅ…ฅ Defaults logfile="/var/log/sudo.log"
    • ๅปบ่ญฐๆญ้… auditd ๆˆ– Rsyslog ๆ”ถ้›† sudo ไฝฟ็”จ็ด€้Œ„。
    ---

    ๐Ÿ›ก ๅ…ญ、่ˆ‡็ณป็ตฑๅฎ‰ๅ…จๆจก็ต„ๆ•ดๅˆ(Fail2Ban / Rsyslog)

    ๅฐ‡ sudo ่ˆ‡ PAM ้Ž–ๅฎšไบ‹ไปถๅฐŽๅ…ฅ Rsyslog,ๅฏๆญ้… Fail2Ban ้€ฒ่กŒ้˜ฒ่ญท:

    # /etc/rsyslog.d/sudo.conf
    if $programname == 'sudo' then /var/log/sudo.log
    & stop
    

    Fail2Ban ๅฏ้€้Ž /etc/fail2ban/filter.d/sudo.conf ๅตๆธฌๅฏ็–‘ sudo ๅ˜—่ฉฆ,่‡ชๅ‹•ๅฐ้Ž– IP。

    ---

    ๐Ÿ“˜ ็ต่ชž

    PAM ่ˆ‡ sudo ๆ˜ฏ Linux ๆฌŠ้™ๅฎ‰ๅ…จ็š„ๅ…ฉๅคงๆ”ฏๆŸฑ。ๅฆฅๅ–„้‹็”จ้€™ไบ›ๆจก็ต„,ๅฏ้˜ฒๆญขๆšดๅŠ›็™ปๅ…ฅ、ๆฌŠ้™ๆฟซ็”จ่ˆ‡ๆœช็ถ“ๆŽˆๆฌŠๆ“ไฝœ。ๅปบ่ญฐๅฎšๆœŸๆชขๆŸฅ PAM ่จญๅฎš่ˆ‡ sudo ๆ—ฅ่ชŒ,ๆญ้… Fail2Ban、Rsyslog ็ญ‰็›ฃๆŽงๅทฅๅ…ท,ๅณ่ƒฝๆง‹็ฏ‰็ฉฉๅ›บ็š„ๅคšๅฑค้˜ฒ่ญท้ซ”็ณป。


    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    — WWFandy・็ณป็ตฑ็ถญ้‹็ญ†่จ˜

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

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

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

    ๅญ—็ดš