1 sshd 服務安裝
SSH(Secure Shell)建立在應用層和傳輸層基礎上的安全協議。它使用加密驗證來確認用戶身份,並對兩台主機之間的所有通信加密。
SSH主要的組件有:一個服務器守護進程sshd,一個用於遠程登錄的ssh,還有用戶主機之間復制文件的 sftp/scp。SSH其它組件:生成公鑰對的 ssh-keygen 命令。
SSHD服務安裝
方法一:利用掛載系統鏡像軟件包
openssh 軟件包提供了服務端后台程序與客戶端工具,用來加密遠程控制和文件傳輸過程的數據,並由此來代替原來類似服務 telnet、ftp。
需要安裝 openssh 三個安裝包:
openssh-8.0p1-3.el8.x86_64.rpm 包含openssh服務端和客戶端需要的核心文件
openssh-clients-8.0p1-3.el8.x86_64.rpm openssh 客戶端軟件包
openssh-server-8.0p1-3.el8.x86_64.rpm openssh 服務端軟件包
方法二:yum安裝
yum install openssh openssh-clients openssh-server -y
2 sshd 服務配置和管理
openssh的配置文件
/etc/ssh/ssh_config 與客戶端相關的配置文件
/etc/sshd/sshd_config 與服務端相關的配置文件
注:sshd在配置文件中,參數前面#號表示是默認值,當然也表示注釋。
ssh啟動與開機自啟
如果不是顯示enabled,則執行systemctl enable sshd.service命令
[root@web ~]# systemctl list-unit-files|grep sshd.service sshd.service enabled [root@web ~]# systemctl status sshd.service
3 sshd 優化安全參數
修改sshd默認監聽端口
大家都知道sshd預設22端口,容易被黑客利用進行掃描22端口進行暴力破解服務器的賬戶密碼。最安全的做法是修改成非22端口。
[root@web ~]# grep Port /etc/ssh/sshd_config
Port 22999
注:比如我的sshd改成監聽22999端口,也可以使用多個端口。
Protocol
使用最新的SSH 2協議版本,1版本有漏洞
[root@web ~]# grep Protocol /etc/ssh/ssh_config # Protocol 2
SyslogFacility AUTHPRIV
當客戶端使用ssh登錄系統,ssh會記錄日志,這個日志類型為AUTHPRIV,ssh服務日志存放:/var/log/secure
[root@web ~]# grep SyslogFacility /etc/ssh/sshd_config #SyslogFacility AUTH SyslogFacility AUTHPRIV
LoginGraceTime
當客戶端內規定時間內沒有成功登錄就強迫斷線,若無單位則默認為秒,建議設置低,增加暴力破解難度
[root@web ~]# grep LoginGraceTime /etc/ssh/sshd_config LoginGraceTime 15
PermitRootLogin no
是否允許root直接登錄系統,默認是允許的,真實的生產環境服務器是不允許root賬戶直接登錄,僅允許普通用戶登錄,需要用到root再從切換到root用戶,或者給普通用戶提權。
[root@web ~]# grep PermitRootLogin /etc/ssh/sshd_config PermitRootLogin no
PasswordAuthentication yes
是否需要密碼驗證,默認是yes,根據不同安全級別要求,有的通過秘鑰驗證登錄,有時候設置不需要密碼登錄。
PermitEmptyPasswords no
默認no,不允許空密碼登錄。
[root@web ~]# grep PermitEmptyPasswords /etc/ssh/sshd_config #PermitEmptyPasswords no
4 sshd 服務防止暴力破解
防止暴力破解方法有兩種
配置安全的sshd服務(方法一)
1) 設置復雜密碼
2) 修改默認端口
3) 不予許root直接登錄到系統
4) 不予許密碼登錄,設置秘鑰認證登錄系統
通過秘鑰認證實現sshd認證
實例環境
服務端ip:192.168.136.131
客戶端ip:192.168.136.132
服務端操作
[root@localhost ~]# ssh-keygen # 客戶端同樣也需要執行此命令生成秘鑰對 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): # 提示輸入秘鑰文件的保存路徑,回車選擇默認 Enter passphrase (empty for no passphrase): # 這里的密碼是對生成的秘鑰文件的保護口令,回車不設置 Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:u8KmvbOAJXxGIUjU1rPbSctsgEJJKcoD/g5E60qqdtg root@localhost.localdomain The key's randomart image is: +---[RSA 3072]----+ |+== o | |+= + + | |O o o o | |.O o o . | |o * + B S | | + B . B . | |+ * ... . | |oo E o= . | |+ . .o+=. | +----[SHA256]-----+ [root@localhost ~]# ls ~/.ssh # id_rsa是私鑰,id_rsa.pub是公鑰 id_rsa id_rsa.pub known_hosts [root@localhost ~]# ssh-copy-id -i 192.168.136.131 # 把公鑰復制給服務端 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" The authenticity of host '192.168.136.131 (192.168.136.131)' can't be established. ECDSA key fingerprint is SHA256:RrtsYZi3En9ZT5Xw6PJfu0MyJYhjnSQgWn3tvJj3q7k. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.136.131's password: # 這里輸入的是服務端主機的密碼 Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.136.131'" and check to make sure that only the key(s) you wanted were added. [root@localhost ~]#
登錄服務端驗證
[root@localhost ~]# cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDSZShpC4YV0aI4gEUabkNwFPAX+BAQmNqUDNMx7DyAi0yw2IDwSZ+InaUqAnY1KYTQxfUaTfj2om9zXQBthUwpKhmofn0rsP0SSKMm/wZq98g9NhCBkRPAwDYRSLEseHIdvXKcQFLP/V209bIMAdFnf9nk5W6jtmh4uLUrl5gCXSqtNwh+Pn0iQTAT+bvbl+qvyyX/PTjczS6Ex7CUp/B6F/O5rLm4qCEae8cDEMzUhSa8jj2LcckyVkOXtaoBFoejFoISPqDFcRNRk3O4+xvqkjeUQ63aI10OU3NeVP/dqGiVlyGChj7cSuSBMAJYUdbUl0SQMHYBNNAyTCLqQJhCw0zyFSQF/GrYMzD74m6gdChlpUGg+F1dHivQBX1lDGyHRziTOMx0owFRyFMqwDAtXMePPpfW7tBNnMQT/BA14Y2Fezzzh44/mvdycNVcxFBr58fzy+c0S97pQZTWndAOfCenCjRsbcHzg+UYOc2qkjJ/D+FncN/eUYXYz0YSoEs= root@localhost.localdomain
登錄客戶端主機192.168.136.132,驗證是否可以正常連接登錄服務端192.168.136.131
[root@localhost ~]# ssh root@192.168.136.131 Activate the web console with: systemctl enable --now cockpit.socket Last login: Mon Jun 1 09:34:28 2020 from 192.168.136.1 [root@localhost ~]# hostname -I #正常登錄,不需要密碼驗證 192.168.136.131 192.168.122.1
通過開源的防護軟件來防護安全(方法二)
優點:使用簡單、靈活、功能強大
實戰背景:
最近公司網站一直被別人暴力破解sshd服務密碼。雖然沒有成功,但會導致系統負載很高,原因是在暴力破解的時候,系統會不斷認證用戶,從而增加了系統資源額外開銷,導致訪問公司網站速度很慢。然后fail2ban程序可以監視你的系統日志,然后匹配日志的錯誤信息(正則式匹配)執行相應的屏蔽動作(一般情況下是防火牆),而且可以發送e-mail通知系統管理員,很實用、很強大!
簡單來說其功能就是防止暴力破解。工作的原理是通過分析一定時間內相關服務日志,將滿足動作的相關ip利用iptables/firewalld加入到drop列表一定時間。
官方地址:http://www.fail2ban.org
安裝
[root@localhost ~]# yum install -y epel-release [root@localhost ~]# yum --enablerepo=epel install -y fail2ban
相關主要文件說明
[root@localhost ~]# ls /etc/fail2ban/ action.d fail2ban.conf fail2ban.d filter.d jail.conf jail.d paths-common.conf paths-fedora.conf
/etc/fail2ban/action.d #動作文件夾,內含默認文件。firewall以及mail等動作配置
/etc/fail2ban/fail2ban.conf #定義了fail2ban日志級別,日志位置及sock文件位置
/etc/fail2ban/filter.d #條件文件夾,內含默認文件。過濾日志關鍵內容設置。
/etc/fail2ban/jail.conf #主要配置文件,模塊化。主要設置啟用ban動作的服務及動作閥值。
應用實例
設置條件:ssh遠程登錄5分鍾3次密碼驗證失敗,禁止用戶ip訪問主機1小時,1小時該限制自動解除,用戶可重新登錄。
因為動作文件(action.d/firewallcmd-ipset)以及日志條件匹配(filter.d/sshd.conf)安裝后是默認存在的,基本不用做任何修改,所有主要需要配置的就只有jail.conf文件。啟用sshd服務的日志分析,指定動作閥值即可。
vim /etc/fail2ban/jail.conf
[DEFAULT] ignoreip = 127.0.0.1/8 #忽略的ip列表,不受設置限制 bantime = 86400 #屏蔽時間,單位秒 findtime = 600 #在這個時間段內超過規定次數會被ban掉 maxretry = 3 #最大嘗試次數 banaction = firewallcmd-ipset #禁止的動作,iptables-multiport backend = auto #日志檢測機制(gamin、polling、auto三種) [sshd] enabled = true filter = sshd port = 22 logpath = /var/log/secure action = firewallcmd-ipset[name=SSH, port=ssh, protocol=tcp] #動作的相關參數,對應action.d/firewallcmd-ipset文件 bantime = 3600 findtime = 300 maxretry = 3
啟動
systemctl restart fail2ban
systemctl restart firewalld
測試
故意輸錯三次密碼
[root@server01 ~]# ssh root@192.168.136.131 root@192.168.136.131's password: Permission denied, please try again. root@192.168.136.131's password: Permission denied, please try again. root@192.168.136.131's password: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). [root@server01 ~]# ssh root@192.168.136.131 ssh: connect to host 192.168.136.131 port 22: Connection refused