sshd服務搭建與管理


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

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM