安全運維之遠程訪問

爲了方便使用,通常服務器都會經過配置遠程訪問來保證隨時配置服務器,可是不正確的遠程訪問配置會對系統產生安全隱患,產生被入侵的風險。css

使用安全的登陸認證方式

現代服務器環境每每須要用戶遠程登陸,而遠程登陸自己就具備必定的安全風險————中間人攻擊。
在早期,telnet是一種經常使用的登陸方式,但它過於古老,並且使用明文傳輸,這使得對其的攻擊代價十分之小,極易遭到攔截與僞造。現代遠程登陸已經基本拋棄了telnet,而是經過SSH服務遠程登陸服務器。
SSH會加密全部的傳輸數據,而且能夠防護DNS和IP欺騙,通過SSH壓縮的數據也能夠提升遠程訪問的傳輸效率。
SSH在服務端運行的是sshd服務,sshd服務對應的主配置文件是/etc/ssh/sshd_configshell

使用強密碼

不少時候,爲了方便記憶,用戶每每會使用一些簡單的密碼。例如本身的生日、某個時間點或者一些其餘內容,但這些密碼其實安全性很低,在撞庫攻擊下很容易就受到攻破。因此建議使用隨機生成的高位強密碼,並週期性更換。
Linux系統自帶的openssl就能夠生成一串強密碼供用戶使用,建議使用32位以上的強密碼,這樣能夠有效的防止撞庫攻擊。
如生成一串十六位的密碼:vim

$ openssl rand -base64 16
WjzyDqedkWf3e5A3tJw/c=

使用密鑰認證

使用強密碼認證仍存在必定的風險,如管理員忘記或遺失密碼,甚至泄露密碼。而密鑰認證則是一種更加安全的認證方式,由於其將密鑰文件存儲在客戶端與服務器中,沒必要輸入密碼就能夠進行登陸,避免了密碼泄露的風險。
這裏以Xshell6爲例,講解經過密鑰認證方式遠程登陸Linux服務器的實現方法。安全

  1. 首先打開Xshell,選擇「工具-新建用戶密鑰生成嚮導」,進入密鑰生成窗口。選擇密鑰類型爲RSA,長度建議至少爲1024位。點擊下一步
  2. 等待密鑰生成,生成完畢後直接點擊下一步。
  3. 輸入密鑰信息,以及密鑰密碼,點擊下一步。
  4. 點擊「保存爲文件」,將pub後綴的公鑰保存到本地,完成。
  5. 此時私鑰已經被Xshell保存在本地了,經過「工具-用戶密鑰管理者」能夠查看生成的密鑰。
  6. 到目前爲止,已經成功的生成密鑰,並將公鑰與私鑰都保存在了本地,接下來咱們須要設置用戶使用SSH2協議,如,將user01設置爲使用SSH2登陸
$ mkdir /home/user01/.ssh
$ chmod 700 /home/user01/.ssh

而後將公鑰上傳到服務器,而且導入密鑰,在將公鑰上傳後,使用如下命令將公鑰導入到服務器,並修改公鑰文件的權限:bash

$ ssh-keygen && cat /上傳公鑰的路徑/id_rsa_2048.pub >> /home/user01/.ssh/authorized_keys
$ chmod 600 /home/user01/.ssh/authorized_keys
  1. 爲了服務器的安全,咱們還須要將SSH2修改成只能接受PublicKey認證的方式來驗證用戶:
$ vim /etc/ssh/sshd_config
##修改如下配置:
Protocol 2                             #僅容許使用SSH2
PubkeyAuthentication yes               #啓用PublicKey認證
AuthorizedKeyFile .ssh/authorized_keys #PublicKey文件路徑
PasswordAuthentication no              #不使用口令認證

最後重啓sshd服務:服務器

$ systemctl restart sshd
  1. 接下來就可使用密鑰方式來登陸服務器了,在Xshell的會話屬性中,將用戶身份認證方式改成PublicKey方式,而且選擇用戶密鑰就可使用密鑰方式登錄服務器。

shell命令日誌

用戶在shell中的操做記錄會被保存在用戶目錄下的.bash_history文件中,經過這個文件能夠查詢shell命令的執行歷史,有助於進行系統審計與問題排查。
而且,在遭受到黑客攻擊後,也能夠經過這個文件查詢黑客登陸服務器所執行的歷史命令操做,可是黑客在攻擊會爲了毀滅痕跡而刪除.bash_history文件,因此咱們要對該文件進行保護。
默認的.bash_history並不會區分不一樣用戶操做命令與執行時間,咱們能夠經過如下方式來讓history命令記錄全部的shell命令的執行時間,編輯/etc/bashrc文件:app

HISTFILESIZE=4000        #定義保存命令的總數
HISTSIZE=4000            #定義輸出的命令總數
HISTTIMEFORMAT='%F %T'   #定義時間格式
export HISTTIMEFORMAT    #傳遞變量

而後能夠利用如下方法來實現詳細記錄登錄過系統的用戶、IP地址、shell命令以及詳細操做時間,並將這些信息以文件方式保存在一個安全的目錄,
將如下代碼添加到/etc/profile文件中:ssh

#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

但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 <組名> 指定用戶組禁止經過遠程登陸訪問,多個用戶組以空格分隔
相關文章
相關標籤/搜索