為了方便使用,一般伺服器都會通過配置遠程訪問來保證隨時配置伺服器,但是不正確的遠程訪問配置會對系統產生安全隱患,產生被入侵的風險。 使用安全的登錄認證方式 現代伺服器環境往往需要用戶遠程登錄,而遠程登錄本身就具有一定的安全風險————中間人攻擊。 在早期,telnet是一種常用的登錄方式,但它過於古 ...
為了方便使用,一般伺服器都會通過配置遠程訪問來保證隨時配置伺服器,但是不正確的遠程訪問配置會對系統產生安全隱患,產生被入侵的風險。
使用安全的登錄認證方式
現代伺服器環境往往需要用戶遠程登錄,而遠程登錄本身就具有一定的安全風險————中間人攻擊。
在早期,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 <組名> | 指定用戶組禁止通過遠程登錄訪問,多個用戶組以空格分隔 |