為了方便使用,一般服務器都會通過配置遠程訪問來保證隨時配置服務器,但是不正確的遠程訪問配置會對系統產生安全隱患,產生被入侵的風險,
使用安全的登錄認證方式
現代服務器環境往往需要用戶遠程登錄,而遠程登錄本身就具有一定的安全風險————中間人攻擊,
在早期,telnet是一種常用的登錄方式,但它過于古老,而且使用明文傳輸,這使得對其的攻擊代價十分之小,極易遭到攔截與偽造,現代遠程登錄已經基本拋棄了telnet,而是通過SSH服務遠程登錄服務器,
SSH會加密所有的傳輸資料,并且可以防御DNS和IP欺騙,經過SSH壓縮的資料也可以提高遠程訪問的傳輸效率,
SSH在服務端運行的是sshd服務,sshd服務對應的主組態檔是/etc/ssh/sshd_config,
使用強密碼
很多時候,為了方便記憶,用戶往往會使用一些簡單的密碼,例如自己的生日、某個時間點或者一些其他內容,但這些密碼其實安全性很低,在撞庫攻擊下很容易就受到攻破,所以建議使用隨機生成的高位強密碼,并周期性更換,
Linux系統自帶的openssl就可以生成一串強密碼供用戶使用,建議使用32位以上的強密碼,這樣可以有效的防止撞庫攻擊,
如生成一串十六位的密碼:
$ openssl rand -base64 16
WjzyDqedkWf3e5A3tJw/c=
使用密鑰認證
使用強密碼認證仍存在一定的風險,如管理員忘記或遺失密碼,甚至泄露密碼,而密鑰認證則是一種更加安全的認證方式,因為其將密鑰檔案存盤在客戶端與服務器中,不必輸入密碼就可以進行登錄,避免了密碼泄露的風險,
這里以Xshell6為例,講解通過密鑰認證方式遠程登錄Linux服務器的實作方法,
- 首先打開Xshell,選擇“工具-新建用戶密鑰生成向導”,進入密鑰生成視窗,選擇密鑰型別為RSA,長度建議至少為1024位,點擊下一步

- 等待密鑰生成,生成完畢后直接點擊下一步,

- 輸入密鑰資訊,以及密鑰密碼,點擊下一步,

- 點擊“保存為檔案”,將pub后綴的公鑰保存到本地,完成,

- 此時私鑰已經被Xshell保存在本地了,通過“工具-用戶密鑰管理者”可以查看生成的密鑰,

- 到目前為止,已經成功的生成密鑰,并將公鑰與私鑰都保存在了本地,接下來我們需要設定用戶使用SSH2協議,如,將user01設定為使用SSH2登錄
$ mkdir /home/user01/.ssh
$ chmod 700 /home/user01/.ssh
然后將公鑰上傳到服務器,并且匯入密鑰,在將公鑰上傳后,使用以下命令將公鑰匯入到服務器,并修改公鑰檔案的權限:
$ ssh-keygen && cat /上傳公鑰的路徑/id_rsa_2048.pub >> /home/user01/.ssh/authorized_keys
$ chmod 600 /home/user01/.ssh/authorized_keys
- 為了服務器的安全,我們還需要將SSH2修改為只能接受PublicKey認證的方式來驗證用戶:
$ vim /etc/ssh/sshd_config
##修改以下配置:
Protocol 2 #僅允許使用SSH2
PubkeyAuthentication yes #啟用PublicKey認證
AuthorizedKeyFile .ssh/authorized_keys #PublicKey檔案路徑
PasswordAuthentication no #不使用口令認證
最后重啟sshd服務:
$ systemctl restart sshd
- 接下來就可以使用密鑰方式來登錄服務器了,在Xshell的會話屬性中,將用戶身份認證方式改為PublicKey方式,并且選擇用戶密鑰就可以使用密鑰方式登陸服務器,

shell命令日志
用戶在shell中的操作記錄會被保存在用戶目錄下的.bash_history檔案中,通過這個檔案可以查詢shell命令的執行歷史,有助于進行系統審計與問題排查,
并且,在遭受到黑客攻擊后,也可以通過這個檔案查詢黑客登錄服務器所執行的歷史命令操作,但是黑客在攻擊會為了毀滅痕跡而洗掉.bash_history檔案,所以我們要對該檔案進行保護,
默認的.bash_history并不會區分不同用戶操作命令與執行時間,我們可以通過以下方式來讓history命令記錄所有的shell命令的執行時間,編輯/etc/bashrc檔案:
HISTFILESIZE=4000 #定義保存命令的總數
HISTSIZE=4000 #定義輸出的命令總數
HISTTIMEFORMAT='%F %T' #定義時間格式
export HISTTIMEFORMAT #傳遞變數
然后可以利用以下方法來實作詳細記錄登陸過系統的用戶、IP地址、shell命令以及詳細操作時間,并將這些資訊以檔案方式保存在一個安全的目錄,
將以下代碼添加到/etc/profile檔案中:
#history
USER_IP='who -u am i 2>/dev/null| awk '{print SNF}'|sed -e 's/[()]//g''
HISTDIR=/usr/share/.history
if [ -z $USER_IP ]
then
USER_IP='hostname'
fi
if[ ! -d $HISTDIR ]
then
mkdir -p $HISTDIR
chmod 777 $HISTDIR
fi
if [ ! -d $HISTDIR/${LOGNAME} ]
then
mkdir -p $HISTDIR/${LOGNAME}
chmod 300 $HISTDIR/${LOGNAME}
fi
export HISTSIZE=4000
DT='date +%Y$m$d_%H%M%S'
export HISTFILE="$HISTDIR/${LOGNAME}/${USER_IP}.history.SDT"
export HISTTIMEFORMAT="[%Y.%m.%d %H:%M:%S]"
chmod 600 $HISTDIR/${LOGNAME}/*.history* 2>/dev/null
tcp_wrappers防火墻
tcp_wrappers是Linux中用于分析TCP/IP資料包的軟體,類似的如iptables,與iptables不同的是,iptables通過監視系統運行狀態阻擋惡意攻擊,而tcp_wrappers可以實作對系統中提供某些服務的控制,
tcp_wrappers有一個TCP的守護行程叫作tcpd,以ssh為例,每當有ssh的連接請求時,tcpd即會截獲請求,先讀取系統管理員所設定的訪問控制檔案,符合要求,則會把這次連接原封不動的轉給真正的ssh行程,由ssh完成后續作業;如果這次連接發起的ip不符合訪問控制檔案中的設定,則會中斷連接請求,拒絕提供ssh服務,
但tcp_wrappers仍存在有一定的局限性,Linux中的一個服務是否可以使用tcp_wrappers,取決于服務是否應用了libwrapped庫檔案,系統中默認的一些服務,如sshd、portmap、sendmail、xinetd、vsftpd、tcpd等都可以使用tcp_wrappers,
我們可以通過以下命令來檢查系統中是否安裝有tcp_wrappers:
$ rpm -q tcp_wrappers
如果輸出有關tcp_warppers的資訊,則說明系統中已經安裝了tcp_warppers,
tcp_wrappers有兩個組態檔:/etc/hosts.allow和/etc/hosts.deny,
Linux對組態檔的執行是順序的,先讀取/etc/hosts.allow,一旦滿足就應用,而拋棄后面的配置,所以可以只設定/etc/hosts.allow檔案,然后在/etc/hosts.deny中設定為所有計算機都不能登陸,
組態檔準從如下語法:
service:host(s) [:action]
其中,
- service:服務名,如sshd、vsftpd、sednmail等
- host(s):主機名或IP地址,可以有多個,
- action:動作,符合條件后采取的動作,
常見關鍵字有: - ALL:所有服務或所有IP,
- ALL EXCEPT:除指定的以外所有的服務或IP,
例如:
ALL:ALL EXCEPT 192.168.123.8
表示除192.168.123.8以外的請求都會被允許或拒絕,取決于以上內容寫在哪個組態檔里,
附錄
/etc/ssh/sshd_config檔案內容
| 文本 | 作用 |
|---|---|
| Port 22 | 用來設定sshd監聽的介面,建議修改為5位數字以上的陌生數字埠 |
| Protocol 2 | 設定使用的SSH協議版本為SSH1或SSH2,SSH1存在漏洞,建議不變 |
| ListenAddress 0.0.0.0 | 用于設定sshd服務器系結的IP地址 |
| HostKey /etc/ssh/ssh_host_dsa_key | 用于設定服務器密鑰檔案的位置 |
| KeyRegenerationInterval 1h | 用于設定生成密鑰的周期,可以防止入侵者利用盜取的密鑰 |
| ServerKeyBits 1024 | 用于定義密鑰長度 |
| SyslogFacility AUTHPRIV | 用于設定在記錄來自sshd的訊息時,是否給出facility code |
| LogLevel INFO | 用于設定log檔案的訊息級別 |
| LoginGraceTime 2m | 如果用戶登錄失敗,在切斷鏈接前,服務器需要等待的時間, |
| PermitRootLogin no | 是否允許root用戶登錄,建議設定為no |
| StrictModes yes | 用于設定SSH在接受登陸請求之前是否檢查用戶根目錄和rhosts檔案的權限和屬主,建議設定為yes |
| RSAAuthentication no | 設定是否開啟RSA密鑰認證,只針對SSH1,使用RSA密鑰登錄時,需要開啟 |
| PubkeyAuthentication yes | 設定是否使用公鑰驗證,使用公鑰驗證時,需要開啟 |
| authorizedKeyFile .ssh/authorized_key | 用于設定公鑰檔案路徑,與PubkeyAuthenticatio配合使用 |
| IgnoreUserKnownHosts no | 用于設定SSH在進行RSAAuthentication安全認證時忽略用戶的$HOME/.ssh/known_hosts檔案 |
| IgnoreRhosts yes | 用于設定驗證時是否使用~/.rhosts和~/.shosts檔案, |
| PassWordAuthentication yes | 用于設定是否開啟密碼驗證 |
| PermitEmptyPasswds no | 用于設定是否允許用空密碼登錄系統,必須為no |
| ChallengeResponseAuthenthtication no | 禁用s/key密碼 |
| UsePAM no | 是否使用PAM認證 |
| X11Forwarding yes | 用于設定是否允許X11轉發 |
| PrintMotd yes | 用于設定是否顯示歡迎登錄資訊,建議加入警告資訊以震懾攻擊者 |
| PrintLastLog no | 是否顯示上次登錄資訊 |
| Compression yes | 是否壓縮命令 |
| TCPKeepAlive yes | 是否防止死鏈接,通過心跳包的方式來進行連接 |
| UseDNS no | 是否使用DNS反向決議 |
| MaxStartups | 允許幾個尚未登陸的連接,已建立的連接不算入其中,設定為5個可以防止對服務器進行惡意連接 |
| MaxAuthTries 3 | 設定最大失敗嘗試登陸次數,合理設定可以防御撞庫攻擊 |
| AllowUser <用戶名> | 指定用戶允許通過遠程登錄訪問,多個用戶以空格分隔 |
| AllowGroups <組名> | 指定用戶組允許通過遠程登錄訪問,多個用戶組以空格分隔 |
| DenyUsers <用戶名> | 指定用戶禁止通過遠程登錄訪問,多個用戶以空格分隔 |
| DenyGroups <組名> | 指定用戶組禁止通過遠程登錄訪問,多個用戶組以空格分隔 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/145676.html
標籤:Linux
上一篇:CentOS下 安裝 Nginx
