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

๐Ÿ” Linux ไผบๆœๅ™จ้˜ฒ็ฆฆ็ฌฌไธ€็ทš:SSH ๅฎ‰ๅ…จๅŠ ๅ›บ、MFA ไบŒ้šŽๆฎต้ฉ—่ญ‰่ˆ‡ Fail2Ban ๅฏฆๆˆฐ

    ๐Ÿ” Linux ไผบๆœๅ™จ้˜ฒ็ฆฆ็ฌฌไธ€็ทš:SSH ๅฎ‰ๅ…จๅŠ ๅ›บ、MFA ไบŒ้šŽๆฎต้ฉ—่ญ‰่ˆ‡ Fail2Ban ๅฏฆๆˆฐ

    ๅฆ‚ๆžœไฝ ็š„ Linux ไผบๆœๅ™จๆœ‰ๅฐๅค–้–‹ SSH,้‚ฃๅฎƒๅนพไนŽไธ€ๅฎšๆฏๅคฉ้ƒฝๅœจ่ขซๆŽƒๆ、่ขซๆ’žๅฏ†็ขผ、่ขซๅ˜—่ฉฆๅผฑๅฃไปค。 ็œŸๆญฃ่ƒฝ「้•ทๆœŸ็ฉฉๅฎš」ๆ‰›ไฝ็ฌฌไธ€็ทš็š„ๅšๆณ•,ไธๆ˜ฏๅชๅšๅ–ฎ้ปž่จญๅฎš,่€Œๆ˜ฏๆŠŠไธ‰ไปถไบ‹ไธฒ่ตทไพ†: SSH ๆœฌ้ซ”็กฌๅŒ–MFA(ไบŒ้šŽๆฎต้ฉ—่ญ‰)Fail2Ban ่‡ชๅ‹•ๅฐ้Ž–

    ้€™็ฏ‡ๆœƒ็”จ「่ƒฝ็›ดๆŽฅไธŠ็ทš」็š„่ง’ๅบฆ,ๆŠŠ่จญๅฎšๆ‹†ๆˆๅฏ่ค‡่ฃฝ็š„ๆฎต่ฝ:ไฝ ็…ง่‘—ๅšๅฎŒ,SSH ็š„ๆ”ปๆ“Š้ขๆœƒ็ซ‹ๅˆป็ธฎๅฐไธ€ๅคงๆˆช。


    ✅ ็›ฎๆจ™่ˆ‡ๅปบ่ญฐ่ทฏ็ทš

    ้ …็›ฎ ๅปบ่ญฐ่จญๅฎš ็›ฎ็š„
    ็™ปๅ…ฅๆ–นๅผ ๅชๅ…่จฑ SSH Key(ๅฟ…่ฆๆ™‚ๅŠ  MFA) ็›ดๆŽฅ็ ๆމ「ๅฏ†็ขผ่ขซ็Œœๅˆฐ」้€™ๆข่ทฏ
    ๅธณ่™Ÿ่ˆ‡ไพ†ๆบ ้™ๅˆถ AllowUsers / AllowGroups,ๅฟ…่ฆๆ™‚้™ๅˆถไพ†ๆบ IP ๆธ›ๅฐ‘ๅฏ่ขซๅ˜—่ฉฆ็š„็ฏ„ๅœ
    MFA ไฝฟ็”จ TOTP(Google Authenticator / Authy / ๅ…ถไป– OTP App) ๅฐฑ็ฎ—็ง้‘ฐๅค–ๆดฉไนŸๅคšไธ€้“้–€
    ๆšดๅŠ›็ ด่งฃ้˜ฒ่ญท Fail2Ban ๅฐ้Ž–ๅคฑๆ•—็™ปๅ…ฅ IP(ๅซ systemd journal ๆจกๅผ) ๆŠŠๆฉŸๅ™จไบบๆ‰“ๅˆฐ「่‡ชๅทฑๆ”พๆฃ„」
    ๅฏฆๅ‹™ๆ้†’: ๅš SSH hardening ๅ‰,่ซ‹ๅ…ˆไฟๆŒ「็ฌฌไบŒๅ€‹ SSH ้€ฃ็ทš」ๆˆ–「ไธปๆŽงๅฐ/ILO/IPMI」ๅฏ็”จ,้ฟๅ…ๆ”น้Œฏ่จญๅฎšๆŠŠ่‡ชๅทฑ้Ž–ๅœจ้–€ๅค–。

    1) SSH ๅŸบ็คŽๅฎ‰ๅ…จๅŠ ๅ›บ(sshd_config)

    ไปฅไธ‹ไปฅๅธธ่ฆ‹่ทฏๅพ‘ /etc/ssh/sshd_config ็‚บไธป。ๆฏๆฌกไฟฎๆ”นๅพŒ,ๅ…ˆๅš่ชžๆณ•ๆชขๆŸฅๅ† reload。

    # 1) ๅ…ˆๅš่ชžๆณ•ๆชขๆŸฅ(ๅพˆ้‡่ฆ)
    sudo sshd -t
    
    # 2) ๅ†ๅš reload(ๆฏ” restart ๅฎ‰ๅ…จ)
    sudo systemctl reload sshd

    1-1. ้—œๆމ root ็›ดๆŽฅ็™ปๅ…ฅ + ้—œๆމๅฏ†็ขผ็™ปๅ…ฅ

    # /etc/ssh/sshd_config
    
    # ็ฆๆญข root ็›ดๆŽฅ็™ปๅ…ฅ(ๅปบ่ญฐ็”จไธ€่ˆฌๅธณ่™Ÿ + sudo)
    PermitRootLogin no
    
    # ้—œๆމๅฏ†็ขผ็™ปๅ…ฅ(ๆ ธๅฟƒ้˜ฒ็ทš)
    PasswordAuthentication no
    
    # ๅ•Ÿ็”จ้‡‘้‘ฐ็™ปๅ…ฅ(้€šๅธธ้ ่จญๅฐฑ้–‹)
    PubkeyAuthentication yes
    
    # ้œ€่ฆ PAM(ๅพŒ้ข่ฆๅš MFA ๆœƒ็”จๅˆฐ)
    UsePAM yes

    ๅฆ‚ๆžœไฝ ๆœ‰「ๅฟ…้ ˆๆšซๆ™‚ไฟ็•™ๅฏ†็ขผ็™ปๅ…ฅ」็š„ๅ ดๆ™ฏ,่‡ณๅฐ‘ไนŸ่ฆๆŠŠๅ…่จฑ็ฏ„ๅœ็ธฎๅˆฐๆœ€ๅฐ(ไพ‹ๅฆ‚ๅชๅ…่จฑๅ…ง็ถฒ、ๆˆ–ๅชๅ…่จฑ็‰นๅฎšๅธณ่™Ÿ), ็ญ‰ไฝ ็ขบ่ช Key + MFA ้ƒฝ็ฉฉไบ†,ๅ†ๆŠŠๅฏ†็ขผ้€š้“้—œๆމ。

    1-2. ้™ๅˆถๅฏ็™ปๅ…ฅ็š„ๅธณ่™Ÿ / ็พค็ต„

    # ๅชๅ…่จฑ้€™ไบ›ไฝฟ็”จ่€…็™ปๅ…ฅ(็ฏ„ไพ‹)
    AllowUsers admin ops
    
    # ๆˆ–็”จ็พค็ต„ๆŽง็ฎก(ๆ›ดๅฅฝ็ถญ่ญท)
    # AllowGroups sshusers

    1-3. ็ธฎ็Ÿญๅ˜—่ฉฆ็ช—ๅฃ、้™ไฝŽๆ’ž้–€ๆ•ˆ็އ

    # ้™ไฝŽๆšดๅŠ›็ ด่งฃๆ•ˆ็އ(ไพ้œ€ๆฑ‚่ชฟๆ•ด)
    MaxAuthTries 3
    LoginGraceTime 20
    
    # ไฟๆดป(้ฟๅ…้•ท้€ฃ็ทšๅกไฝ;ไนŸ่ƒฝ้™ไฝŽๆŸไบ›่ณ‡ๆบไฝ”็”จ)
    ClientAliveInterval 60
    ClientAliveCountMax 2

    1-4. ๅฏ้ธ:ๆ”น Port(้™ไฝŽๆŽƒๆ้›œ่จŠ)

    # ๅฏ้ธ:ๆ”นๆˆ้ซ˜ไฝ Port(ไธๆ˜ฏๆ ธๅฟƒๅฎ‰ๅ…จ,ไฝ†ๅฏ้™้›œ่จŠ)
    Port 2222

    ๅฆ‚ๆžœไฝ ๆ”นไบ† Port,่จ˜ๅพ—ๅŒๆญฅ่ชฟๆ•ด้˜ฒ็ซ็‰†(firewalld/ufw/nftables)่ˆ‡ Fail2Ban jail ็š„ port ่จญๅฎš。


    2) ๅŠ ไธŠ MFA(ไบŒ้šŽๆฎต้ฉ—่ญ‰):TOTP(PAM Google Authenticator ๆจก็ต„)

    ้€™่ฃก็คบ็ฏ„「ๆœ€ๅธธ่ฆ‹、้ƒจ็ฝฒๆˆๆœฌๆœ€ไฝŽ」็š„ TOTP:ๆ‰‹ๆฉŸ OTP App ๆŽƒ QR code ๅพŒ,ๆฏ 30 ็ง’็”ข็”Ÿไธ€ๆฌก็ขผ。 ไฝ ไนŸๅฏไปฅๆ›ๆˆ Duo、็กฌ้ซ”้‡‘้‘ฐๆˆ–ๅ…ฌๅธๆ—ขๆœ‰ IdP,ไฝ†ๆฆ‚ๅฟต็›ธๅŒ:ๆŠŠ SSH ็š„้ฉ—่ญ‰ๆ‹†ๆˆๅ…ฉ้“้–€

    2-1. ๅฎ‰่ฃๅฅ—ไปถ

    Debian / Ubuntu:

    sudo apt update
    sudo apt install -y libpam-google-authenticator

    RHEL / Rocky / Alma(ๅธธ่ฆ‹ไฝœๆณ•ๆ˜ฏๅ•Ÿ็”จ EPEL):

    # ๅ…ˆๅ•Ÿ็”จ EPEL(่‹ฅไฝ ็’ฐๅขƒๅทฒๅ•Ÿ็”จๅฏ็•ฅ)
    sudo dnf install -y epel-release
    
    # ๅฎ‰่ฃ Google Authenticator PAM
    sudo dnf install -y google-authenticator

    2-2. ๅฐ่ฆ็™ปๅ…ฅ็š„ๅธณ่™Ÿ็”ข็”Ÿ secret(ๆฏๅ€‹ๅธณ่™Ÿ้ƒฝ่ฆๅšไธ€ๆฌก)

    # ็”จ「่ฉฒไฝฟ็”จ่€…」่บซๅˆ†ๅŸท่กŒ(ไธ่ฆ็”จ root ไปฃ่ท‘)
    google-authenticator

    ่ท‘ๅฎŒๅพŒๆœƒๅพ—ๅˆฐ QR code ่ˆ‡ๅ‚™ๆด็ขผ,่ซ‹็ซ‹ๅณๅญ˜ๅˆฐๅฎ‰ๅ…จไฝ็ฝฎ(ไพ‹ๅฆ‚ๅฏ†็ขผ็ฎก็†ๅ™จ)。 OTP ่‹ฅๅคฑๆ•ˆ,้€šๅธธๆ˜ฏๆ™‚้–“ไธๅŒๆญฅ้€ ๆˆ็š„,ไผบๆœๅ™จๅ‹™ๅฟ…็ถญๆŒ NTP ๆญฃๅธธ。

    2-3. ่จญๅฎš PAM:/etc/pam.d/sshd

    # /etc/pam.d/sshd
    # ๅŠ ๅœจ้ฉ็•ถไฝ็ฝฎ(้€šๅธธๅœจ @include common-auth ไน‹ๅ‰/้™„่ฟ‘)
    auth required pam_google_authenticator.so

    ไฝ ไนŸๅฏไปฅๅŠ ไธŠๅƒๆ•ธ(ไพ‹ๅฆ‚ๅ…่จฑๅฐๅน…ๆ™‚้–“ๆผ‚็งป、ๆˆ–ๅ…่จฑๆฒ’ๆœ‰ secret ็š„ๅธณ่™Ÿๅ…ˆไธๅฅ—็”จ),ไฝ†ๅปบ่ญฐไธŠ็ทšๆ™‚ๆŽก「ๅšดๆ ผ」็ญ–็•ฅ。

    2-4. ่จญๅฎš sshd:ๅผทๅˆถ「Key + OTP」,ไธ่ฆๅ†่ฆๅฏ†็ขผ

    ้‡้ปžๆ˜ฏๅ…ฉๅฅ:KbdInteractiveAuthentication yes ่ˆ‡ AuthenticationMethods。 ้€™ๆœƒ่ฎ“ๆต็จ‹่ฎŠๆˆ:ๅ…ˆ้ฉ—่ญ‰ SSH Key,ๅ†่ทณๅ‡บ OTP(keyboard-interactive)ๆŒ‘ๆˆฐ。

    # /etc/ssh/sshd_config
    
    UsePAM yes
    PasswordAuthentication no
    
    # ๅ•Ÿ็”จ้ต็›คไบ’ๅ‹•(OTP ่ตฐ้€™ๆข)
    KbdInteractiveAuthentication yes
    
    # ๅผทๅˆถๅŒๆ™‚้€š้Ž:publickey + keyboard-interactive(OTP)
    AuthenticationMethods publickey,keyboard-interactive

    ๅฅ—็”จๅ‰่ซ‹ๅ…ˆไฟ็•™ไธ€ๅ€‹ๅทฒ็™ปๅ…ฅ็š„ SSH ้€ฃ็ทš็ช—ๅฃ,ไธฆ็”จๅฆไธ€ๅ€‹็ต‚็ซฏๆธฌ่ฉฆ็™ปๅ…ฅๆˆๅŠŸๅพŒๅ† reload sshd。


    3) Fail2Ban:ๆŠŠๆšดๅŠ›็ ด่งฃ「่‡ชๅ‹•ๅฐ้Ž–」

    Fail2Ban ๆœƒๅˆ†ๆž็™ปๅ…ฅๅคฑๆ•—็š„็ด€้Œ„(log ๆˆ– systemd journal),็•ถๆŸๅ€‹ IP ๅœจๆŒ‡ๅฎšๆ™‚้–“ๅ…งๅคฑๆ•—ๆฌกๆ•ธ้Žๅคš,ๅฐฑ่‡ชๅ‹•ไธ‹้˜ฒ็ซ็‰†่ฆๅ‰‡ๅฐ้Ž–。 ไฝ ๅฏไปฅๆŠŠๅฎƒๆƒณๆˆ「้‡ๅฐๆ’ž้–€่กŒ็‚บ็š„่‡ชๅ‹•ๅๅˆถ」。

    3-1. ๅฎ‰่ฃ Fail2Ban

    Debian / Ubuntu:

    sudo apt update
    sudo apt install -y fail2ban

    RHEL / Rocky / Alma:

    sudo dnf install -y fail2ban
    sudo systemctl enable --now fail2ban

    3-2. ๅปบ่ญฐ็”จ jail.d/ ่‡ช่จ‚(้ฟๅ…่ฆ†ๅฏซ)

    ๅปบ็ซ‹ไธ€ๅ€‹ๅฐˆ้–€็ฎก SSH ็š„ๆช”ๆกˆ:

    sudo mkdir -p /etc/fail2ban/jail.d
    sudo nano /etc/fail2ban/jail.d/sshd.local

    ็ฏ„ไพ‹(ๅ้€š็”จ、ๅฏ็›ดๆŽฅ็”จ):

    # /etc/fail2ban/jail.d/sshd.local
    
    [DEFAULT]
    # ่‹ฅ็ณป็ตฑไธป่ฆ็”จ systemd journal,ๅปบ่ญฐ็›ดๆŽฅ็”จ systemd backend
    backend = systemd
    
    # ๅฟฝ็•ฅ็™ฝๅๅ–ฎ(ๆŠŠไฝ ็š„็ฎก็†ไพ†ๆบ IP / VPN ๅ‡บๅฃๅŠ ้€ฒไพ†)
    ignoreip = 127.0.0.1/8
    
    # ๅคฑๆ•—็ตฑ่จˆ็ช—ๅฃ(10 ๅˆ†้˜ๅ…ง)
    findtime = 10m
    
    # ๅ…่จฑๅคฑๆ•—ๆฌกๆ•ธ
    maxretry = 5
    
    # ๅฐ้Ž–ๆ™‚้–“(ๅฏ็”จ 10m/1h/1d ้€™็จฎๆ ผๅผ)
    bantime  = 6h
    
    # ไพไฝ ็š„็ณป็ตฑ้ธๆ“‡ banaction(iptables ๆˆ– nftables)
    # banaction = iptables-multiport
    # ่‹ฅไฝ ็š„็ณป็ตฑไปฅ nftables ็‚บไธป,ๅฏๆ”น nftables(ไธๅŒ็™ผ่กŒ็‰ˆ action ๅ็จฑๅฏ่ƒฝ็•ฅๆœ‰ๅทฎ็•ฐ)
    # banaction = nftables
    
    [sshd]
    enabled = true
    # ่‹ฅไฝ ๆ”น Port,้€™่ฃกไนŸ่ฆ่ทŸ่‘—ๆ”น
    port = ssh
    # Debian/Ubuntu ๅธธ่ฆ‹ logpath(่‹ฅไฝ ไธ็”จ journal)
    # logpath = /var/log/auth.log
    # RHEL ็ณปๅธธ่ฆ‹ logpath(่‹ฅไฝ ไธ็”จ journal)
    # logpath = /var/log/secure

    3-3. ๅ•Ÿๅ‹•ไธฆๆชขๆŸฅ็‹€ๆ…‹

    sudo systemctl enable --now fail2ban
    sudo fail2ban-client status
    sudo fail2ban-client status sshd

    ็œ‹ๅˆฐ Banned IP list ๅฐฑ่กจ็คบ jail ๆญฃๅธธๅทฅไฝœ。ไฝ ไนŸๅฏไปฅ็›ดๆŽฅ็œ‹ Fail2Ban ่‡ชๅทฑ็š„ log(ๅคšๆ•ธ็’ฐๅขƒ้ ่จญๅœจ /var/log/fail2ban.log)。

    3-4. ๅธธ็”จๆ“ไฝœ:่งฃๅฐ、ๆ‰‹ๅ‹•ๅฐ้Ž–、ๆŸฅ่ขซๅฐ้Ž–ๆธ…ๅ–ฎ

    # ๆŸฅ็œ‹ sshd jail ็‹€ๆ…‹
    sudo fail2ban-client status sshd
    
    # ่งฃๅฐๆŒ‡ๅฎš IP
    sudo fail2ban-client set sshd unbanip 203.0.113.10
    
    # ๆ‰‹ๅ‹•ๅฐ้Ž–(ๅฐ‘็”จ,ไฝ†ๆŽ’้šœๆ™‚ๆœƒ็”จๅˆฐ)
    sudo fail2ban-client set sshd banip 203.0.113.10

    4) ไธŠ็ทšๅ‰ๆœ€ๅพŒๆชขๆŸฅ(ๆˆ‘้€šๅธธๆœƒ็…ง้€™ไปฝ่ท‘)

    # SSH ่จญๅฎš่ชžๆณ•ๆชขๆŸฅ
    sudo sshd -t
    
    # ้‡ๆ–ฐ่ผ‰ๅ…ฅ(ไธ่ฆๆ€ฅ่‘— restart)
    sudo systemctl reload sshd
    
    # ๆชขๆŸฅ SSH ็›ฃ่ฝ(Port ๆ˜ฏๅฆๆญฃ็ขบ)
    sudo ss -lntp | grep sshd
    
    # ๆธฌ่ฉฆ:็”จๅฆไธ€ๅ€‹็ต‚็ซฏ็™ปๅ…ฅ(็ขบ่ชๆต็จ‹ๆ˜ฏ Key -> OTP)
    ssh -p 2222 admin@your.server
    
    # Fail2Ban ๆ˜ฏๅฆๅ•Ÿ็”จ、sshd jail ๆ˜ฏๅฆๅ•Ÿ็”จ
    sudo systemctl status fail2ban --no-pager
    sudo fail2ban-client status sshd

    5) ้€ฒ้šŽๅŠ ๅˆ†(้ธๅš,ไฝ†ๅพˆๅ€ผๅพ—)

    • ๅชๅ…่จฑ็ฎก็†็ถฒๆฎต: ๅœจ้˜ฒ็ซ็‰† / ้›ฒ็ซฏ Security Group ้™ๅˆถไพ†ๆบ IP,SSH ไธ่ฆๆ”พๅ…จไธ–็•Œ。
    • ๅˆ†ๅฑค็ฎก็†: ไธ€่ˆฌๅธณ่™Ÿ็™ปๅ…ฅ + sudo;ๅšด็ฆๅ…ฑ็”จๅธณ่™Ÿ;ๆŠŠๅฏ็™ปๅ…ฅๅๅ–ฎ็ธฎๅˆฐๆœ€ๅฐ。
    • ้‡‘้‘ฐๆฒป็†: ๅผทๅˆถไฝฟ็”จ่€…็”จๅฏ†็ขผ็ฎก็†ๅ™จไฟๅญ˜็ง้‘ฐ passphrase;ๅฎšๆœŸ็›ค้ปž authorized_keys。
    • ๅ‘Š่ญฆ่ˆ‡็จฝๆ ธ: Fail2Ban ๅฐ้Ž–ไบ‹ไปถๅฏๅšๅฏ„ไฟก/ๆŽจ้€;sshd LogLevel ๅฏ่ฆ–้œ€ๆฑ‚่ชฟ้ซ˜。

    ๐Ÿ’ฌ ็•™่จ€่Š่Š:ไฝ ็š„ SSH ้˜ฒ่ญทๅšๅˆฐๅ“ชไธ€ๅฑค?

    ๆˆ‘ๅพˆๆƒณ็Ÿฅ้“ไฝ ็›ฎๅ‰็š„็’ฐๅขƒๆ˜ฏ:

    • ✅ ๅช็”จ SSH Key?้‚„ๆ˜ฏไปไฟ็•™ๅฏ†็ขผ็™ปๅ…ฅ?
    • ✅ ๆœ‰ๅŠ  MFA(ไบŒ้šŽๆฎต้ฉ—่ญ‰)ๅ—Ž?ๆ˜ฏ TOTP、Duo,้‚„ๆ˜ฏ็กฌ้ซ”้‡‘้‘ฐ?
    • ✅ Fail2Ban ไฝ ๆ˜ฏ็”จ logpath ้‚„ๆ˜ฏ systemd journal?bantime / findtime ๆ€Ž้บผ่จญ?

    ไนŸๆญก่ฟŽ็›ดๆŽฅ่ฒผไฝ ็š„ sshd_config(ๆ•ๆ„Ÿ่ณ‡่จŠ้ฎๆމ)ๆˆ– Fail2Ban jail ่จญๅฎš,ๆˆ‘ๅฏไปฅๅนซไฝ ไธ€่ตทๆชขๆŸฅๆ˜ฏๅฆๆœ‰้ขจ้šชๆดž。

    ๅปถไผธ้–ฑ่ฎ€

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

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

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

    ๅญ—็ดš