๐ง Linux SSH ๅฎๅ จๅผทๅๆๅ:้้ฐ็ปๅ ฅ、Port ่ฝ็งป่ Fail2Ban ๆดๅ
ๅช่ฆไธๅฐ Linux ไผบๆๅจๅฐๅค้ๆพ SSH,ๅนพไนๅฏไปฅไฟ่ญ: ไธๅฐๅนพๅ้,log ่ฃกๅฐฑๆ้ๅงๅบ็พไพ่ชไธ็ๅๅฐ็ๆดๅ็ ด่งฃๅ่ฉฆ。 ๆปๆ่ ไธไธๅฎ้ๅฎไฝ ,ไฝ「ๆๆ 22 port、ไบ่ฉฆๅธณ่ๅฏ็ขผ」ๆฉๅทฒๆฏ่ๆฏๅช้ณ。
ๆฌ็ฏไปฅๅฏฆๅ่งๅบฆ,ๆด็ไธๅฅ ๅฏ่ค่ฃฝ็ SSH ๅฎๅ จๅบๆบ(Baseline), ไธป่ฆ็ฎๆจๅ ๆฌ:
- ๆน็จ SSH ้้ฐ็ปๅ ฅ,้ไฝๅฏ็ขผ่ขซ็ไธญ็้ขจ้ช。
- ่ชฟๆด Port、ๅ ่จฑๅธณ่、ไพๆบ IP,ๆธๅฐ่ขซๆๆ่่ชค็จ。
- ้้ Fail2Ban ่ชๅๅฐ้ๆดๅ็ ด่งฃ IP。
- ๆญ้ sshd_config ็ๅ็จฎ็ดฐ็ฏ,ๅฝขๅกไธๅฅๅฏ้่คๅฅ็จ็ๅฎๅ จ้ ็ฝฎ。
ไธ、ๅบๆฌ่งๅฟต:SSH、sshd ่่จญๅฎๆชไฝ็ฝฎ
ๅ ้ๆธ ๅนพๅๅ่ฉ:
- SSH Client(ssh):ไฝ ็จไพ้ฃ็ทๅฐไผบๆๅจ็็จๅผ。
- SSH Server(sshd):ไผบๆๅจ็ซฏๅฎ่ญท็จๅผ,่ฒ ่ฒฌๆฅๅ้ฃ็ท。
- OpenSSH:ๆๅธธ่ฆ็ SSH ๅฏฆไฝ,ๅคง้จๅ Linux ็ผ่ก็้ ่จญๆก็จ。
ๅธธ่ฆ่จญๅฎๆชไฝ็ฝฎ:
/etc/ssh/sshd_config:ไผบๆๅจ็ซฏ(sshd)็ไธป่จญๅฎๆช。~/.ssh/:ๅไฝฟ็จ่ ๆฌๆฉ็ SSH ่จญๅฎ่้้ฐ。~/.ssh/authorized_keys:ไผบๆๅจ็ซฏ่จ้「ๅ ่จฑ็ปๅ ฅ็ๅ ฌ้ฐ」。
ไฟฎๆน sshd_config ๅพ,่จๅพ:
sudo sshd -t # ๆชขๆฅ่จญๅฎๆช่ชๆณ
sudo systemctl reload sshd # ๆ ssh,ไพ็ผ่ก็ๆๅๅ็จฑ
ๅจ้ ็ซฏๆน่จญๅฎๆ,ๅๅฟ ไฟ็่้ฃ็ท่ฆ็ชไธ่ฆ้้,ๅ ้็ฌฌไบๅ SSH ๆธฌ่ฉฆๆฐ่จญๅฎ,็ขบ่ชๅฏ็จๅ้ๅบ่้ฃ็ท。
ไบ、SSH ้้ฐ็ปๅ ฅ:ๅพๅฏ็ขผๅฐๅ ฌ้ฐ้ฉ่ญ
SSH ้้ฐ็ปๅ ฅๅฉ็จ「้ๅฐ็จฑๅ ๅฏ」:
- ๆฌๆฉไฟๅญ็ง้ฐ(
id_ed25519、id_rsa)。 - ไผบๆๅจไฟๅญๅ
ฌ้ฐ(
authorized_keys)。 - ็ปๅ ฅๆไผบๆๅจ็จๅ ฌ้ฐ้ฉ่ญไฝ ๆฏๅฆๆๆๅฐๆ็็ง้ฐ,่ไธๅณ่ผธๅฏ็ขผ。
1. ๅจๆฌๆฉ็ข็ SSH ้้ฐ
ๅปบ่ญฐไฝฟ็จ ed25519 ๆผ็ฎๆณ(่ผๆฐไธ้้ฐ็ญ)。
# ๅจๆฌๆฉ(ไธๆฏไผบๆๅจ)ๅท่ก:
ssh-keygen -t ed25519 -C "ไฝ ็่จป่งฃ(ไพๅฆ email)"
่ฅ็ณป็ตฑไธๆฏๆด ed25519,ไนๅฏไปฅไฝฟ็จ rsa:
ssh-keygen -t rsa -b 4096 -C "ไฝ ็่จป่งฃ"
ๆไปคๅท่กๅพๆๅไฝ :
- ่ฆๅฐ้้ฐๅญๅจๅช่ฃก(้ ่จญ
~/.ssh/id_ed25519)。 - ๆฏๅฆ่จญๅฎ passphrase(ๅปบ่ญฐ่จญๅฎ,็ญๆผ็ตฆ็ง้ฐๅไธไธๅฑค้)。
ๅฎๆๅพ,ๆฌๆฉๆๅพๅฐ:
~/.ssh/id_ed25519:็ง้ฐ(่ซๅฆฅๅไฟ่ญท,็ตไธๅคๆต)。~/.ssh/id_ed25519.pub:ๅ ฌ้ฐ(ๅฏๆพๅฟๆพๅฐไผบๆๅจ)。
ไธ、ๅฐๅ ฌ้ฐ้จ็ฝฒๅฐไผบๆๅจ:ssh-copy-id ๆๆๅ่จญๅฎ
1. ไฝฟ็จ ssh-copy-id(ๆๆนไพฟ)
่ฅ็ฎๅไผบๆๅจไปๅ ่จฑๅฏ็ขผ็ปๅ ฅ,ๅฏไปฅๅจๆฌๆฉ็ดๆฅๅท่ก:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server-ip
้ๆ:
- ไปฅ็ฎๅ็ๅฏ็ขผ็ปๅ ฅไผบๆๅจ。
- ่ชๅๆๅ
ฌ้ฐ้ๅ ๅฐ
~user/.ssh/authorized_keys。 - ่ชฟๆดๆญฃ็ขบ็ๆชๆกๆฌ้。
2. ๆๅ่จญๅฎ authorized_keys
่ฅๆฒๆ ssh-copy-id,ๅฏๆน็จๆๅๆนๅผ:
- ๅจๆฌๆฉๆชข่ฆๅ ฌ้ฐๅ งๅฎน:
cat ~/.ssh/id_ed25519.pub
- ็ปๅ
ฅไผบๆๅจ,ๅ่จญๅธณ่็บ
user:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# ๅจ authorized_keys ไธญ่ฒผไธๅๅ็ๅ
ฌ้ฐไธๆด่ก
nano ~/.ssh/authorized_keys # ๆ vi / vim
chmod 600 ~/.ssh/authorized_keys
ๆฌ้้ๅธธ้่ฆ,้ฏ่ชคๆฌ้ๆๅฐ่ด SSH ๆ็ตไฝฟ็จ้้ฐ็ปๅ ฅ。
ๅ、่ชฟๆด sshd_config:ๅ็จ้้ฐ็ปๅ ฅ、ๆบๅ้้ๅฏ็ขผ็ปๅ ฅ
็ทจ่ผฏไผบๆๅจไธ็ /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
็ขบ่ชๆๅ ๅ ฅไปฅไธ่จญๅฎ(ๅฐ่จป่งฃ # ๆฟๆ):
# ๅ็จๅ
ฌ้ฐ้ฉ่ญ
PubkeyAuthentication yes
# ็ขบ่ชๆ่ฎๅ authorized_keys
AuthorizedKeysFile .ssh/authorized_keys
# ๆซๆไฟ็ๅฏ็ขผ็ปๅ
ฅ,็ญๆธฌ่ฉฆ้้ฐๆฒๅ้กๅ้
PasswordAuthentication yes
ChallengeResponseAuthentication no
# ๅ
ๅ
่จฑ protocol 2(ๆฐ็ๆฌ้ ่จญๅณ็บ 2)
Protocol 2
้ๆฐ่ผๅ ฅ่จญๅฎ:
sudo sshd -t
sudo systemctl reload sshd
ๆฅ่ๅจๆฌๆฉ่ฉฆ่็จ้้ฐ็ปๅ ฅ:
ssh -i ~/.ssh/id_ed25519 user@server-ip
่ฅไธๅ่ฆๆฑ่ผธๅ ฅๅธณ่ๅฏ็ขผ,่ๆฏ็ดๆฅ้ฃไธ(ๆๅชๅไฝ ็ง้ฐ็ passphrase),ๅฐฑไปฃ่กจ้้ฐ็ปๅ ฅๅทฒๆๅ。
็ขบ่ช็กๅ้กๅพ้้ๅฏ็ขผ็ปๅ ฅ
ๅๆฌก็ทจ่ผฏ sshd_config:
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
็ถๅพ้ๆฐ่ผๅ ฅ sshd,ไธฆ็จๆฐ็็ต็ซฏๆฉ่ฆ็ชๆธฌ่ฉฆ้ฃ็ท。ๅฆๆไธๅๆญฃๅธธ,ไนๅพๅฐฑๅช่ฝ้้้้ฐ็ปๅ ฅ,ๅคงๅน ้ไฝๆดๅ็ ด่งฃๆๅ็ๆฉๆ。
ไบ、Port ่ฝ็งป่ๅธณ่้ๅถ:้ไฝ่ขซๆๆ่่ชค็จ้ขจ้ช
ๆน Port ไธฆไธๆฏ「็ๆญฃ็้ฒ็ฆฆ」,ไฝ่ฝๆๆ้ไฝๆๆๅช้ณ; ๆญ้ 「ๅชๅ ่จฑ็นๅฎๅธณ่ / ็พค็ต็ปๅ ฅ」,ๆๆฏๅฏฆๅไธๅพๅธธ่ฆ็ไธๅฑค้ฒ่ญท。
1. ่ชฟๆด SSH Port
ๅจ sshd_config ไธญ:
# ้ ่จญๆฏ 22,ๅฏๆน็บ 2222 ไน้ก็้็ฅๅ Port
Port 2222
่จๅพๅๆญฅๆดๆฐ้ฒ็ซ็่จญๅฎ,ไพๅฆไฝฟ็จ firewalld:
# ๅ ๅ
ฅๆฐ port
sudo firewall-cmd --permanent --add-port=2222/tcp
# ่ฅๅทฒ็ขบ่ชไธๅไฝฟ็จ 22 ไนๅฏ้้
sudo firewall-cmd --permanent --remove-service=ssh
sudo firewall-cmd --reload
้ๆฐ่ผๅ ฅ sshd ๅ,ๅๅฟ ๅ ็ขบ่ช้ฒ็ซ็ๅทฒๆพ่กๆฐ port,้ฟๅ ๆ่ชๅทฑ้ๅจ้ๅค。
2. ้ๅถๅฏ็ปๅ ฅๅธณ่่็พค็ต
ๅจ sshd_config ไธญๅ ๅ
ฅ:
# ๅ
ๅ
่จฑ็นๅฎๅธณ่็ปๅ
ฅ
AllowUsers wwfandy devuser
# ๆๆฏๅ
่จฑ็นๅฎ็พค็ต
AllowGroups sshusers
ๆญ้ ็พค็ต็ฎก็,ๅฏไปฅๅฐ「ๆ SSH ็ปๅ ฅๆฌ็ไฝฟ็จ่ 」้ไธญๅฐไธๅ็พค็ตไธญ,ๆนไพฟๆง็ฎก่็จฝๆ ธ。
3. ็ฆๆญข root ็ดๆฅ็ปๅ ฅ
PermitRootLogin no
ๅปบ่ญฐๅๆณ:
- ๅปบ็ซไธๅไธ่ฌๅธณ่(ไพๅฆ admin ๆไฝ ็ๅๅญ),ๆไบ sudo ๆฌ้。
- ๅนณๆไปฅไธ่ฌๅธณ่็ปๅ
ฅ,ๅฟ
่ฆๆ็จ
sudoๅท่ก็ฎก็ๆไฝ。
ๅ ญ、ๆดๅ Fail2Ban:่ชๅๅฐ้ๆดๅ็ ด่งฃ IP
ๅณไฝฟ้ๆๅฏ็ขผ็ปๅ ฅ,ไป็ถๆๆ็จๅผไธๆทๅ่ฉฆ้ฃ็ท、่่ฒป่ณๆบๆๅกๆปฟ log。 Fail2Ban ๅฏไปฅ็ฃๆง log ไธญ็็ฐๅธธ็ปๅ ฅ่ก็บ,้ๅฐไธๅฎๆฌกๆธๅฐฑ่ชๅ็จ้ฒ็ซ็ๅฐ้่ฉฒ IP。
1. ๅฎ่ฃ Fail2Ban
Debian / Ubuntu:
sudo apt update
sudo apt install -y fail2ban
RHEL / CentOS / Rocky / AlmaLinux:
sudo dnf install -y fail2ban
ๅๅ Fail2Ban:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
ไธ、่จญๅฎ Fail2Ban ็ฃๆง SSH
ๅฎๆน้ ่จญ่จญๅฎๆพๅจ /etc/fail2ban/jail.conf,
ๅปบ่ญฐไธ่ฆ็ดๆฅไฟฎๆน,่ๆฏๅจ /etc/fail2ban/jail.local ไธญ่ฆ่ๆๆฐๅข่จญๅฎ。
1. ๅปบ็ซ jail.local ไธฆๅ็จ sshd jail
sudo nano /etc/fail2ban/jail.local
ๅ ๅ ฅไปฅไธ็ฏไพ:
[DEFAULT]
# ไฟกไปป็ IP(ๆฐธไธๅฐ้),ๅฏๅ ๅ
ฅ่ชๅทฑๅ
ฌๅธๆ็ฎก็็ซฏ IP
ignoreip = 127.0.0.1/8 ::1
# ๅฐ้ๆ้(็ง),ไพๅฆ 30 ๅ้
bantime = 1800
# ๅจ findtime ็งๅ
งๅคฑๆ้ maxretry ๆฌกๅฐฑๅฐ้
findtime = 600
maxretry = 5
[sshd]
enabled = true
port = 2222 # ่ฅไฝ ๆน้ SSH Port,่จๅพๅๆญฅไฟฎๆน
logpath = /var/log/auth.log ; Debian/Ubuntu
# logpath = /var/log/secure ; RHEL/CentOS
backend = systemd
ๅฒๅญๅพ้ๆฐๅๅ Fail2Ban:
sudo systemctl restart fail2ban
2. ๆฅ่ฉข Fail2Ban ็ๆ ่ๅฐ้ IP
# ๆฅ็ๆๆ jail
sudo fail2ban-client status
# ๆฅ็ sshd jail ่ฉณ็ดฐ็ๆ
sudo fail2ban-client status sshd
่ผธๅบไธญๅฏไปฅ็ๅฐ็ฎๅ่ขซๅฐ้็ IP ๆธ ๅฎ。
3. ๆๅ่งฃ้คๅฐ้ๆ IP
sudo fail2ban-client set sshd unbanip 1.2.3.4
ๅฆๆ่ชคๅฐๅฐๅๆณ็ฎก็็ซฏ IP,ๅฏไปฅ็จ้ๅๆนๅผ่งฃ้ค。
ๅ ซ、ๆดๅค sshd_config ๅฎๅ จ็ธ้ๅๆธๅปบ่ญฐ
้คไบ Port ่็ปๅ ฅๆนๅผ,้ๆไธไบ็ดฐ็ฏๅฏไปฅ้ฒไธๆญฅๅผทๅๅฎๅ จๆง:
1. ้ไฝๆดๅ็ ด่งฃๆ็
# ไฝฟ็จ่
ๆๅคๅฐๆ้ๅฏไปฅ่ผธๅ
ฅๅฏ็ขผ(้้ๅฏ็ขผ็ปๅ
ฅๅพไปๅฝฑ้ฟ้้ฐๅคฑๆ)
LoginGraceTime 30
# ๅฎไธ้ฃ็ทๅ
่จฑ็่ช่ญๅ่ฉฆๆธ
MaxAuthTries 3
# ๆฏๅ้ฃ็ท็ๆๅคงๅๆ session ๆธ
MaxSessions 3
2. ๆงๅถ้็ฝฎ้ฃ็ท
# ๆฏ 60 ็งๅฐ client ็ผ้ keepalive ๆชขๆฅ
ClientAliveInterval 60
# ่ฅ้ฃ็บ 5 ๆฌกๆฒๆๆถๅฐๅๆๅฐฑๆท็ท
ClientAliveCountMax 5
ๅฏไปฅ้ฟๅ 「ๆ่ไธๅ」ๅคๅฐๆๅปๅฟ่จ้้็้ฃ็ท。
3. ้้ไธ้่ฆ็่ฝ็ผๅ่ฝ
# ่ฅไธ้่ฆ X11 ่ฝ็ผ,ๅปบ่ญฐ้้
X11Forwarding no
# ่ฅไธ้่ฆ TCP Forwarding,ๅฏ่ฆๆ
ๆณ้้ๆๆน็จ more strict ่จญๅฎ
AllowTcpForwarding no
# ่ฅไธๆไพ SFTP,ไบฆๅฏ้้็ธ้ๅญ็ณป็ตฑ(ไพๅฏฆ้้ๆฑ่ชฟๆด)
# Subsystem sftp /usr/lib/openssh/sftp-server
ๅๅๆฏ:ๆฒๅจ็จ็ๅ่ฝ,ๅฐฑไธ่ฆ้่。
ไน、Log ่็จฝๆ ธ:ๆๆก SSH ๆดปๅ็ด้
SSH ็ธ้็ log ไฝ็ฝฎ้ๅธธๅจ:
- Debian / Ubuntu:
/var/log/auth.log - RHEL / CentOS:
/var/log/secure
ๅธธ็จๆชขๆฅๆนๅผ:
# ็ๆ่ฟ็ปๅ
ฅๅคฑๆ็ด้
sudo grep "Failed password" /var/log/auth.log | tail -n 20
# ็็ปๅ
ฅๆๅ็ด้
sudo grep "Accepted" /var/log/auth.log | tail -n 20
# ๆ็บๅณๆ็ฃๆง(ๆญ้
sshd ้้ตๅญ)
sudo tail -f /var/log/auth.log | grep sshd
่ฅๆๅฐๅ ฅ้ไธญๅผๆฅ่ช็ณป็ตฑ(ไพๅฆ Loki + Grafana、ELK Stack),ๅฏไปฅๆ SSH log ็ดๅ ฅ็ตฑไธ็ฃๆง, ๆดๅฎนๆ็ผ็พ「ๅฅๆชๆ้้ป、ๅฅๆชไพๆบ」็็ปๅ ฅ่ก็บ。
ๅ、ๆด็:ไธๅฅๅฏ้่คๅฅ็จ็ SSH ๅฎๅ จๅบๆบ
ๆๆฌๆๅ งๅฎนๆด็ๆไธๅฅ「ไธ็ทๆฐไธปๆฉๆๅฟ ๅๆธ ๅฎ」:
- ๅจ็ฎก็็ซฏๆฌๆฉ็ข็ SSH ้้ฐ(ed25519 ๆ RSA 4096)。
- ๅฐๅ
ฌ้ฐ้จ็ฝฒ่ณไผบๆๅจ็
authorized_keys,ไธฆ็ขบ่ช้้ฐ็ปๅ ฅๆญฃๅธธ。 - ๅจ
sshd_configๅ็จPubkeyAuthentication,ๆบๅ้้ๅฏ็ขผ็ปๅ ฅ。 - ๅจ็ขบ่ช้้ฐ็ปๅ
ฅ็ฉฉๅฎไนๅพ,ๅฐ
PasswordAuthenticationๆน็บ no。 - ไฟฎๆน SSH Port(ไพๅฆ 2222),ไธฆๅๆญฅๆดๆฐ้ฒ็ซ็่ฆๅ。
- ่จญๅฎ
PermitRootLogin no,ๅปบ็ซไธ่ฌ็ฎก็ๅธณ่ + sudo ๆฌ้。 - ไฝฟ็จ
AllowUsers/AllowGroups้ๅฎๅฏ็ปๅ ฅๅธณ่ๆ็พค็ต。 - ๅฎ่ฃไธฆ่จญๅฎ Fail2Ban,ๅ็จ sshd jail,่ชๅๅฐ้ๆดๅ็ ด่งฃไพๆบ。
- ่ชฟๆด LoginGraceTime、MaxAuthTries、ClientAliveInterval ็ญ็ดฐ็ฏ。
- ๅปบ็ซๅบๅฎ็ log ๆชข่ฆ่็จฝๆ ธๆต็จ(ๆญ้ ้ไธญๅผๆฅ่ชๆดไฝณ)。
✅ ็ถ้ๅฅ SSH ๅฎๅ จๅบๆบๆ็บไฝ ๆๅ้็「ๆจๆบๆต็จ」,ๆฏไธๅฐๆฐไธ็ท็ Linux ไผบๆๅจๅฐฑ่ฝๅจ ไธ่ด็ๅฎๅ จๆฐดๆบ ไธ้ไฝ。ไนๅพ่ฅๅๆญ้ ้ฒ็ซ็่ฆๅ、IDS/IPS、VPN ่่ทณๆฟๆฉ, ๅฐฑ่ฝ้ๆญฅๅปบๆงๅบๆดๅฎๆด็ไผบๆๅจๅฎๅ จๆถๆง。
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ