Linux系統——ssh-key連接原理
SSH是一種客戶端連接,在Linux服務器下通過遠程的方式將本地電腦連接到對方的電腦上。
遠程連接的方式:
(1)telnet命令(為明文傳輸,不安全)
(2)(2)SSH(加密傳輸,安全)
操作的兩臺服務器都需要安裝scp軟件包(openssh-clients)
(1)telnet命令(為明文傳輸,不安全)
兩臺服務器安裝telnet
# telnet 192.168.214.129 22
表示連接成功
通過這種方式可以判斷對方的端口是否開啟(常在腳本中使用)
(2)SSH(加密傳輸,安全)
# ssh 192.168.214.129 (默認超級用戶)
# ssh [email protected]
# netstat -antup | grep 22
SSH結構
SSH服務端是一個守護進程(daemon),它在後臺運行並響應來自客戶端的連接請求。SSH服務端的進程名為sshd,負責實時監聽遠程SSH客戶端的連接請求,並進行處理,一般包括公共密鑰認證,密鑰交換,對稱密鑰加密和非安全連接等。這個SSH服務就是我們前面基礎系統優化中保留開機自啟動的服務之一。
ssh客戶端包含ssh以及像scp(遠程拷貝),slogin(遠程登錄),sftp(安全FTP文件傳輸)等應用程序。
ssh的工作機制大致是本地的ssh
基於密鑰的安全驗證(密鑰的權限認證必須是700)
ssh-keygen是生成密鑰對的命令(rsa指加密算法)
ssh-copy-id是分發密鑰對的命令
(1)客戶端創建密鑰
# ssh-keygen是生成密鑰對的命令(rsa指加密算法)
回車
密鑰對密碼,不是Linux登錄密碼,有了密鑰對可以不輸密碼進行登錄,也可以在密鑰對的基礎上再加一層密碼
若不設密鑰對密碼,直接回車(空密碼),再次輸入仍不設密碼
(2)將公鑰id_rsa.pub
(服務端)
# ls ~/.ssh
known_hosts文件是記錄連接過的IP(清空該記錄就會再次彈出yes/no)
密鑰的目錄權限或文件權限過大,連接就會失敗(因為權限過大,Linux擔心影響安全,所以不會成功)
(服務端)
# mkdir .ssh/
# chmod 700 .ssh/
(客戶端)
# scp .ssh/id_rsa.pub 192.168.214.129:~/.ssh/
scp的基本參數
-P(大寫):接端口,默認22
-r:遞歸,表示拷貝目錄
-p:表示在拷貝前後保持文件或目錄屬性
-l limit:限制速度
(3)將拷貝過去的id_rsa.pub文件裏的內容追加到~/.ssh/authorized_key文件裏
(服務端)
# cd .ssh
# cat id_rsa.pub > authorized_keys
(4)此時回到第一臺服務器進行遠程SSH連接
(客戶端)
# ssh 192.168.214.129
若在普通用戶下的.ssh目錄下也添加公鑰並改名為authorized_key,也可免密鑰登錄
(客戶端)
# scp ~/.ssh/id_rsa.pub [email protected]:~
普通用戶的家目錄下沒有.ssh目錄,放在家目錄下即可
(服務端)
# cd /home/daisy
# touch authorized_keys
# chown daisy authorized_keys
# cat id_rsa.pub > authorized_keys(操作若失敗,將authorized_keys的權限改為600)
# mkdir .ssh
# mv authorized_keys .ssh/
# chmod 700 .ssh/
# chown -R daisy.daisy .ssh/ (-R 遞歸授權)
(客戶端)
# ssh [email protected]
非交互式免密鑰登錄
# ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
通過ssh-copy-id進行公鑰的自動分發
(客戶端)
# ssh-copy-id -i ~/.ssh/id_dsa.pub [email protected]
(服務端)
(客戶端)
# ssh [email protected]
自動免密鑰登錄(sshpass公網安裝)
# sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub [email protected]
若known_hosts文件內容清空,不想屏幕出現yes/no選項時
通過sshpass+ssh-keygen+ssh-copy-id進行免交互的SSH密鑰批量分發
# sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no [email protected]"
/etc/ssh/ssh_config配置文件中將 StrictHostKeyChecking=yes改為no,重啟sshd
StrictHostKeyChecking=no
SSH基於密鑰的安全認證總結
1)如果我們要進行免密碼的SSH連接,那麽在創建密鑰對的時候不輸入任何密碼就可以了。
2)SSH基於密鑰的安全認證的本質其實就是將密鑰對中的公鑰裏的內容拷貝到對方服務器的用戶家目錄下的.ssh目錄裏的authorized_keys文件裏。
3)你想要和對方服務器的哪個用戶進行密鑰對認證,那麽你就要把公鑰拷到對方該用戶的家目錄下的.ssh目錄裏的authorized_keys文件裏(如果是想和普通用戶進行密鑰對登錄,需要拷貝到/home目錄下的該用戶家目錄下。)
4)ssh-keygen -t參數可以指定密鑰對的加密類型。如果不指定默認rsa加密
排故:
若出現遠程傳輸數據緩慢的情況,對雙方的/etc/ssh/sshd_config進行修改
(1)# vim /etc/ssh/sshd_config
(2)# service sshd reload
如果端口已修改為特殊端口,那麽用上面的命令連接就會發生問題
報錯字符串對應的可能問題:
1,no route to host 可能為防火墻影響
2,Connection refused可能為防火墻
Connection refused 還可能是連接的對端服務沒開或者端口改變了。
13 #Port 22
#ssh連接默認端口22
15 #ListenAddress 0.0.0.0
#設置sshd服務監聽的客戶端IP地址範圍
42 #PermitRootLogin yes
# 是否允許root用戶遠程登錄
65 #PermitEmptyPasswords no
#是否允許空密碼
81 GSSAPIAuthentication yes
#是否關閉GSSAPI認證
122 #UseDNS yes
#是否使用DNS
1)一旦修改了Port,那麽ssh登錄時就需要-p指定端口號,不然會登錄失敗,ssh默認登錄22端口
3)一旦修改了ListenAddress,監聽地址,那麽不再地址範圍內的所有客戶端將無法遠程連接服務器。
4)一旦 PermitRootLogin no 被啟用,那麽root賬戶將不能夠進行ssh遠程登錄。
5)一旦啟用了PermitEmptyPasswords yes,那麽所有無密碼的用戶也就可以遠程登錄了,並且還是免密碼的方式。
6)UseDNS no :建議用no,不需要對DNS進行反向解析,可以加快ssh連接速度。
7)修改配置文件後,需要重啟sshd服務才能生效
ssh-key自動批量分發腳本要求:
如果客戶機偽裝openssh-clients或sshpass,那麽,腳本需要能夠自動搭建本地yum倉庫及雲yum倉庫,自動化安裝
腳本自動判斷某網段內所有的存活IP(ping -c 1 IP地址)
對所有存活IP進行密鑰對批量分發
匯報分發完成情況
#!/bin/bash
Wget1=http://mirrors.aliyun.com/repo/epel-6.repo
Wget2=http://mirrors.163.com/.help/CentOS6-Base-163.repo
umount /dev/cdrom &>/dev/null
[ -d /media/cdrom ]|| mkdir -p /media/cdrom
mount /dev/sr0 /media/cdrom &>/dev/null
if [ $? -ne 0 ];then
echo "please check cd!"
exit
fi
[ -d /etc/yum.repos.d ]|| mkdir -p /etc/yum.repos.d
cd /etc/yum.repos.d
mv * /tmp
cat > /etc/yum.repos.d/local.repo << FOF
[local]
name=local
baseurl=file:///media/cdrom
gpgcheck=0
enabled=1
FOF
yum -y clean all &>/dev/null
[ $? -eq 0 ] && echo "cleaned successfully"
yum makecache &>/dev/null
[ $? -eq 0 ] && echo "yum installed successfully" || echo "install failed"
which wget
if [ $? -ne 0 ];then
yum -y install wget &>/dev/null
if [ $? -ne 0 ];then
echo "install failed"
exit
fi
wget -O /etc/yum.repos.d/epel.repo $Wget1
if [ $? -ne 0 ];then
echo "aliyun install failed"
exit
fi
wget -O /etc/yum.repos.d/163.repo $Wget2
if [ $? -ne 0 ];then
echo "163 install failed"
exit
fi
else
wget -O /etc/yum.repos.d/epel.repo $Wget1
if [ $? -ne 0 ];then
echo "aliyun install failed"
exit
fi
wget -O /etc/yum.repos.d/163.repo $Wget2
if [ $? -ne 0 ];then
echo "163 install failed"
exit
fi
fi
yum -y install openssh-clients &>/dev/null
[ $? -eq 0 ] && echo "scp install successfully" || exit
yum -y install sshpass &>/dev/null
[ $? -eq 0 ] && echo "sshpass install successfully"
Path=/tmp
for IP in 192.168.214.{1..254}
do
ping -c 1 -i 0.1 $IP &>/dev/null
if [ $? -eq 0 ];then
echo "$IP alive"
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P ""
sshpass -p "123456" ssh-code-id -i ~/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no $IP"
mv ~/.ssh $Path/.ssh$IP
fi
done
SSH入侵案例
一,事件回顧
這次的服務器被入侵是一個典型的弱密碼導致的入侵事件,由於某人員的疏忽,在某臺服務器上新建了test用戶,且使用同名的弱密碼,以便於調試工作所需的腳本工具,就在當天在做腳本調試的時候發現了某些異常的錯誤,使用root用戶無法ssh遠程登陸其他服務器,同時scp命令出現異常無法使用,但其他服務器可以使用scp將文件拷貝到該服務器,之後將問題反饋給運維人員,由我們運維進行排查。
二,排查過程
收到問題反饋,主要涉及ssh相關的問題後,我們運維對該服務器進行排查,發現使用ssh -v中的openssl版本無法顯示,且輸出的幫助信息與其他服務器不一致,然後查看ssh配置,發現配置文件(ssh_config和sshd_config)文件已更新,其內容被全部註釋,這時還沒有意識到被入侵,悲哀+1,起初以為同事對該服務器做了升級了ssh版本,後來確認無升級之類的操作。
(1)查看ssh版本
# ssh -v
(2)查看ssh進程及其相關文件,ssh和sshd進程文件已更新,ssh_config和sshd_config配置文件已更新,配置文件內容全部註釋,ssh_host_key和ssh_host_key.pub為新增文件,其他服務器沒有這兩個文件。
(3)繼續排查,將一臺正確的配置文件覆蓋至該服務器,重啟ssh服務後,使用ssh命令發現無法識別該配置文件中的參數(到這裏其實應該發現ssh進程文件已被篡改,使用md5sum做比對即可)
(4)由於其他工作事務需要及時處理,排查這個事情就被擱置了,直至之後的YY討論問題拿出來詢問了下大神,才意識到有被入侵的可能
(5)詢問操作過該服務器的同事,此前正在調試腳本工具,新增了test用戶,得知其密碼為test
(6)進行深入排查,使用chkrootkit -q查看Linux系統是否存在後門,發現有異常。協同之前操作test用戶的同事,查找history命令記錄,發現一條可疑命令
(7)在另外一臺服務器上,發現某賬號家目錄下有個dead.letter文件,用於將獲取到的信息(系統信息,IP地址,賬號密碼等)發送至指定的郵箱
(8)又在另外一臺服務器上部署了一套可疑的程序,估計是作為肉雞功能
(9)找到/usr/include/statistics為主程序的目錄,其中update為主程序,通過autorun腳本進行部署,執行crond偽裝成crond服務,使原crond服務隱藏且無法啟動,將cron覆蓋至原有crontab文件來每分鐘執行update二進制程序,mech.pid記錄偽裝的crond程序的PID
三、清理工作
緊急修復清理
將準備好的正常的ssh相關文件上傳至被入侵服務器的/tmp目錄下
(1)查看並修改屬性
(2)恢復ssh和sshd
(3)刪除多余的文件以及恢復crond
後續安全工作
(1)修改所有設計的服務器的賬戶密碼,之後其他使用同類密碼的服務器也許改掉
(2)配置防火墻策略,只允許公司外網IP可ssh訪問服務器
(3)對弈被入侵的服務器系統後期逐步重做系統,避免存在未清理的後門
四,總結
此次的遭受攻擊,問題主要是運維安全意識較差,以及防火墻策略比較松散,為了便於遠程工作,像ssh端口未做限制,服務器幾乎是裸奔的狀態。經過此番折騰,也對服務器安全方面做了一次警示,需加強防禦工作,同時也了解到典型的ssh後門功能:其一是超級密碼隱身登陸;其二是記錄登陸的賬號密碼。後續還需制定一系列入侵檢測機制,以防再次出現入侵事故。
如何防止SSH登錄入侵小結:
病毒通常在
(1)各種開機自啟動裏面放著
/etc/rc.local /etc/init.d/
(2)定時任務
/var/spool/cron/*
(3)系統的定時任務目錄
如何防止SSH登錄入侵
(1)用密鑰登錄,不用密碼登錄
(2)防火墻封閉SSH,指定源IP限制(局域網,信任公網)
(3)開啟SSH只監聽本地內網IP(ListenAddress10.0.0.8)
(4)盡量不給服務器外網IP
(5)最小化軟件安裝
(6)給系統的重要文件或命令做一個指紋
(7)給他鎖上chattr +i +a
IT公司企業級批量分發管理
(1)中小企業最基本實用的SSH-KEY密鑰的方案(key+expect,腳本+sudo,ssh key(密鑰認證)+ansible)
(2)門戶網站PUPPET(復雜,太重)
(3)趕緊、小米、SALTSTACK批量管理
主機名 |
網卡eth0 |
網卡eth1 |
用途 |
m01 |
10.0.0.61 |
172.16.1.61 |
中心批發服務器 |
nfs01 |
10.0.0.31 |
172.16.1.31 |
接收節點服務器 |
web01 |
10.0.0.8 |
172.16.1.8 |
接收節點服務器 |
backup |
10.0.0.41 |
172.16.1.41 |
備份服務器 |
要求所有服務器在同一用戶chensiqi系統用戶下,實現A機器從本地分發數據到B,C機器上,發到B,C的過程中不需要系統提示輸入密碼驗證,當然,除了分發的功能,還可以批量查看所有客戶機上的CPU,LOAD,MEM,系統版本信息。
即實現從A服務器發布數據到B,C客戶端服務器以及查看信息的免密碼登錄驗證解決方案:分發數據流方向如下:
A ---->B
A ---->C
A ---->D
Linux系統——ssh-key連接原理