Linux ssh安全遠程登錄
本章內容:
構建SSH遠程登錄系統
SSH(secure shell)是標準的網絡協議,主要用于實現字符界面的遠程登錄管理,及遠程文件復制功能。SSH協議對通過網絡傳輸的數據進行了加密處理,其中包括了用戶登錄時輸入的用戶口令。與早期的Telnet(遠程登錄)、rsh(遠程執行命令)、rcp(遠程文件復制)等應用相比,SSH協議提供了更好的安全性,SSH協議監聽的端口:tcp22。
SSH協議支持兩種方式的用戶登錄認證:
(1)基于密碼驗證的SSH登錄體系
(2)基于密鑰對兒驗證的SSH登錄體系
openssh:
client/server:客戶端/服務器
client:客戶端軟件有ssh、scp、sftp
server:服務器軟件有sshd
Windows上的遠程客戶端有:xshell securecrt putty sshsecureshellclinet
ssh服務器:
sshd服務器主配置文件:/etc/ssh/sshd_config
常用參數:
Port #### //監聽端口
AddressFamily any //監聽地址
PasswordAuthentication yes |no //是否允許密碼驗證登錄
protocol //協議
LoginGraceTime 2m //登錄等待超時時間
PermitRootLogin yes |no //是否允許root登錄
MaxAuthTries 6 //嘗試錯誤密碼輸入次數(一半)
MaxSessions 10 //每個網絡連接嘗試最大會話次數
AuthorizedKeysFile .ssh/authorized_keys //key驗證默認公鑰存放路徑
ClientAliveInterval 0 //用戶連接上sshd服務多久不活動就斷開連接
UseDNS yes |no //是否使用DNS
#no default banner path //登錄sshd服務時的提示標語
Banner /etc/ssh.txt //登錄sshd服務時的提示標語
限制可登錄用戶的辦法:
AllowUsers zheng mage //如果此處沒有添加root用戶,那么root也就拒絕
DenyUsers zhangsan lisi //拒絕登錄sshd服務的用戶,拒絕優先
AllowGroup //允許那些組內用戶登錄
DenyGroup //拒絕哪些組內用戶登錄
ssh服務的最佳實踐:
1、不要使用默認端口
2、禁止使用protocol version 1
3、限制可登錄用戶
4、設定空閑會話超時時長
5、利用防火墻設置ssh訪問策略
6、僅監聽特定的IP地址
7、基于口令認證時,使用強密碼celv
例:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30 | xargs
8、使用基于密鑰的認證
9、禁止root用戶直接登錄
10、禁止使用空密碼
11、限制ssh的訪問頻率和并發在線數
12、做好日志,經常分析
ssh客戶端:
ssh客戶端主配置文件:/etc/ssh/ssh_config
命令行客戶端工具:
1)ssh遠程登錄:使用ssh命令遠程登錄服務器時,最典型的命令格式如下。
ssh username@sshserver [command]
或者簡寫為:
ssh ip address
ssh支持的選項:
-p:port遠端服務器監聽的端口
-b:指定連接的源ip
-v:調試模式
-c:壓縮方式
-X:支持x11轉發
-y:支持信任x11轉發 forward x11 trusted yes
-t:強制偽tty分配
ssh -t remoteserver1 ssh remoteserver2
-l:直接以誰的身份登錄sshd服務器
ssh -l zheng 192.168.3.2 (必須指定用戶名)
命令格式中sshserver表示需要登錄到的SSH服務器的地址,可以是主機名或者IP地址,而username表示用于登錄的用戶賬號,該賬號應該是SSH服務器中的系統用戶賬號。用戶名與服務器地址之間使用“@”符號進行分隔。
當客戶端第一次使用ssh客戶端命名連接sshd服務器時,在你輸入yes的時候,客戶機會自動復制sshd服務器/etc/ssh/ssh_host_rsa_key.pub中的公鑰到自己家目錄./.ssh/known_hosts文件中。下次再連接時,sshd服務器就會發一個私鑰簽名數據給ssh客戶端,如果ssh客戶端能解開則證明是原來連接過的sshd服務器,否則客戶端則會報警提示。(WARNING REMOTE HOST IDENTIFICATION CHANGED!)遠程主機標識發生改變。
修改sshd服務器的監聽端口號:
[root@centos7 ssh]# vim /etc/ssh/sshd_config
[root@centos7 ssh]# systemctl reload sshd //重新加載服務
如果selinux是開啟狀態,還需執行:
[root@centos7 ssh]# semanage port -a -t ssh_port_t -p tcp 2222
使用centos6客戶機測試:
[root@centos6 ssh]# ssh 192.168.3.11 -p 2222
若不想每次ssh連接時都輸入指定的端口號2222,我們這是就可以更改客戶端(centos6)的配置文件。
[root@centos6 ssh]# vim /etc/ssh/ssh_config
客戶端改完配置文件無需重啟服務。
使用centos6客戶機測試:
[root@centos6 ssh]# ssh 192.168.3.11
基于key驗證遠程登錄openssh服務器:
在客戶端創建密鑰對:
在客戶端使用ssh-keygen命令工具為當前用戶創建密鑰對文件,可以使用的加密算法為rsa或dsa(ssh-keygen命令的-t選項用于指定算法類型),ssh-keygen命令執行完畢后將密鑰文件保存到用戶指定的位置,默認位于用戶宿主目錄下的.ssh/目錄下。其中id_rsa.pub是用戶的公鑰文件,可以提供給ssh服務器;id_rsa是用戶的私鑰文件,權限默認為600,私鑰文件用妥善保管,不能泄露給他人。用戶可以在創建密鑰對兒的過程中設置一個私鑰密碼短語或(ssh-keygen -P “ PASSWD”)直接指定。
(1)在客戶端生成密鑰對兒;
ssh-keygen -t rsa|dsa -P PASSWD
或者寫成:
(2)ssh-keygen (私鑰保護密碼在創建的過程中填寫,默認為rsa加密算法)
(3)給私鑰保護密碼設置密碼代理;
* 這樣口令就只需要輸入一次;
* 需先執行ssh-agent bash 啟動密碼代理服務;
* 在使用ssh-add命令把私鑰保護密碼托管給密碼代理服務;
* 如果客戶機重啟還需重新設置私鑰保護密碼托管。
上傳公鑰文件給服務器:
將客戶端用戶創建的公鑰文件發送給openssh服務器,并保存到服務器的授權密鑰庫中。服務器的授權密鑰庫文件位于各用戶宿主目錄下的.ssh/目錄,默認的文件名是authorized_keys。
(1)拷貝公鑰文件到遠程服務器上;
ssh-copy-id -i (public_file絕對路徑) [user@]host
測試基于key驗證遠程登錄openssh服務器:
實驗環境部署:
(1)在客戶端centos7服務器上使用ssh-keygen命令生成密鑰對。
(2)使用ssh-copy-id命令把生成的公鑰文件發送給openssh服務器。
(3)在客戶端centos7上使用ssh命令進行key驗證遠程登錄測試。
1、在客戶端centos7服務器上使用ssh-keygen命令生成密鑰對;
查看/root/.ssh目錄下生成的public/private文件
2、使用ssh-copy-id命令把生成的公鑰文件發送給openssh服務器;
在centos6主機上查看/root/.ssh/目錄下是否多出了一個授權密鑰文件,authorized_keys。
3、在客戶端centos7上使用ssh命令進行key驗證遠程登錄測試。
注意:在ssh連接centos6時需要輸入一下保護私鑰的密碼,如果這樣決定麻煩,我們也可以啟用ssh私鑰保護密碼托管。
* 需執行ssh-agent bash 啟動密碼代理服務;
* 使用ssh-add命令把私鑰保護密碼托管給密碼代理服務;
* 如果客戶機重啟還需重新設置私鑰保護密碼托管。
使用SecureCRT、Xshell實現基于key驗證:
SecureCRT實現基于key驗證:
在SecureCRT工具—–>創建公鑰—–>生成Identity.pub文件,并復制到需要遠程登錄的openssh服務器上相應文件authorized_keys中,需注意新建的authorized_keys文件權限為600,并且要轉換Identity.pub為openssh服務器兼容的格式,需在openssh服務器上執行ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys.
Xshell實現基于key驗證:
在xshell工具中——->新建用戶密鑰生成向導——–>生產密鑰參數——->密鑰類型:RSA|DSA———->密鑰長度:768|1024|2048|3072——–>下一步——–>生成公鑰對——->下一步———>用戶密鑰信息(密鑰名稱、輸入給用戶密鑰加密的密碼)——–>下一步———>公鑰注冊—–保存為文件(將公鑰文件保存桌面)——>完成。
復制到需要遠程登錄的openssh服務器上相應文件authorized_keys中,需注意新建的authorized_keys文件權限為600;然后就可以新建會話連接了,輸入主機IP,在用戶身份驗證中選擇publickey,輸入用戶名,選擇用戶密鑰,點擊完成。
scp命令:
scp [options] SRC ……..DEST/
兩種方式:
scp [options] [user@]host:/sourcefile /desrpath
scp [options] /sourcefile [user@]host:/destpat
常用選項:
-c:壓縮數據流;
-r:遞歸復制;
-p:保持原文件的屬性信息;
-q:靜默模式;
-P:port 指明 remote host的監聽的端口;
注意:scp命令目標主機中存在的文件也會重新拷貝,效率較低。
示例:
[root@centos7 Desktop]# scp 192.168.3.7:/root/f1.sh ./
[root@centos7 Desktop]# scp ./linux-3.18.42.tar.xz 192.168.3.7:/root
rsync命令:
rsync命令:基于ssh和rsh服務實現高效率的遠程系統之間復制文件;
使用安全的shell連接作為傳輸方式;
比scp命令效率更快,只復制不同的文件;適用于更新網站;
rsync -av /etc server1:/tmp 把整個目錄復制過來
rsync -av /etc/ server1:/tmp 只復制目錄下文件
常用選項:
-n:模擬復制過程
-v:顯示詳細過程
-r:遞歸復制目錄樹
-p:保留權限
-t:保留時間戳
-g:保留組信息
-o:保留所有者信息
-l:把符號鏈接文件做為符號文件進行復制(默認)
-L:將軟鏈接文件指向文件復制
-a:存檔模式,相當于-riptgoD,但不保留ACL(-A)和SELinux屬性(-x)。
注意:rsync命令只復制目標服務器上不存在的文件,效率高。
示例:
[root@centos7 ~]# rsync ./f1.md5 192.168.3.7:/root
[root@centos7 ~]# rsync -rp 192.168.3.7:/etc ./
xftp命令:
交互式文件傳輸工具;
用法和傳統的ftp工具相似;
sftp命令利用ssh服務實現安全的文件上傳和下載;
使用 ls cd mkdir rmdir pwd get put等指令;
sftp [user@]host
示例:
[root@centos7 ~]# sftp 192.168.3.7
ssh端口轉發:
什么是SSH端口轉發?
SSH 會自動加密和解密所有SSH 客戶端與服務端之間的網絡數據。但是,SSH 還能夠將其他TCP 端口的網絡數據通過SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務。這一過程也被叫做“隧道”(tunneling),這是因為SSH 為其他TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如,Telnet,SMTP,LDAP 這些TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時,如果工作環境中的防火墻限制了一些網絡端口的使用,但是允許SSH 的連接,也能夠通過將TCP 端口轉發來使用SSH 進行通訊
SSH 端口轉發能夠提供兩大功能:
?加密SSH Client 端至SSH Server 端之間的通訊數據。
?突破防火墻的限制完成一些之前無法建立連接的tcp連接。
本地轉發:
-L localport:host:hostportsshserver
ssh–L 9527:telnetsrv:23 -N sshsrv
telnet 127.0.0.1 9527
當訪問本機的9527的端口時,被加密后轉發到sshsrv的ssh服務,再解密被轉發到telnetsrv:23
data?àlocalhost:9527 ?àlocalhost:XXXXX?àsshsrv:22 ?àsshsrv:YYYYY ?àtelnetsrv:23
選.項:
-f 后臺啟用
-N 不開遠程shell
-g 啟用網關功能
遠程轉發:
-R sshserverport:host:hostport sshserver
ssh -R 9527:telnetsrv:23 -N sshsrv
讓sshsrv偵聽9527端口的訪問,如有訪問,就加密后通過ssh服務轉發請求到本機ssh客戶端,再由本機解密后轉發到telnetsrv:23
Data <—->sshsrv:9527<—–>sshsrv:22<—–>localhost:xxx<—–>localhost:yyyy<—>telnet:23
示例:
實驗環境:centos5使用ssh隧道Telnet centos7主機。
centos5 ip:192.168.3.5
centos6 ip:192.168.3.6
centos7 ip:192.168.3.7
(1)centos6 和centos7在同一個局域網內,centos5為互聯網上的設備;
(2)局域網內的策略允許centos5訪問centos6;
(3)使用ssh端口轉發實現centos5安全訪問centos7;
[root@centos5~]#ssh -L 9527:192.168.3.7:23 -N 192.168.3.6
[root@centos5~]#telnet 127.0.0.1 9527 //這樣就可以telnet(ssh安全)連接centos7了。
動態端口轉發:
當用firefox訪問internet時,本機的1080端口做為代理服務器,Firefox的訪問請求被轉發到sshserver上,由sshserver替之訪問Internet。
在本機firefox設置代理socket proxy:127.0.0.1:1080
#ssh -D 1080 root@sshserver
X協議轉發:
所有圖形化應用程序都是x客戶程序:
能夠通過tcp/ip連接遠程x服務器
數據沒有加密機,但是它通過ssh連接隧道安全進行
ssh -X user@remotehost gedit
remotehost主機上的gedit工具,將會顯示在本機的x服務器上。
傳輸的數據將通過ssh連接加密。
AIDE:高級入侵檢測環境
當一個入侵者進入了你的系統并且種植了木馬,通常會想辦法隱藏這個木馬(除了木馬本身的一些隱藏特性外,他會盡量給你檢查系統的過程設置障礙),通常入侵者會修改一些文件,比如管理員通常使用ps aux來查看系統進程,那么入侵者很可能用自己修改過的ps程序來替換掉你系統上的ps程序,以使用ps命令查不到正在運行的木馬程序。如果入侵者發現管理員正在運行crontab作業,也有可能替換掉crontab程序等。所以由此可見對于系統文件或是關鍵文件的檢查是很重要的,目前就系統完整性檢查的工具用的比較多的由兩款免費的但功能也很強大的工具。
AIDE(adevanced intrusion detection environment)高級入侵檢測環境,是一個入侵檢測工具,只要用途是檢查文件的完整性,審計計算機上的那些文件被更改過了。
AIDE能夠構造一個指定文件的數據庫,它使用aide.conf作為其配置文件。AIDE數據庫能夠保存文件的各種屬性,包括:權限(permission)、索引節點序號(inode number)、所屬用戶(user)、所屬用戶組(group)、文件大小、最后修改時間(mtime)、創建時間(ctime)、最后訪問時間(atime)、增加的大小以及連接數。AIDE還能夠使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每個文件的校驗碼或散列號。
這個數據庫不應該保存那些經常變動的文件信息,例如:日志文件、郵件、/proc文件系統、用戶起始目錄以及臨時目錄。
安裝AIDE:
yum -y install aide
初始化默認的AIDE的庫:
/usr/local/bin/aide –init
生成檢查數據庫(建議初始數據庫存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
檢測:
/usr/local/bin/aide —check
更新數據庫:
aide –update
AIDE的主配置文件:/etc/aide.conf
對要監控的目錄或文件初始信息生成數據庫文件;系統會默認把生成的aide.db.new.gz數據庫文件保存到/var/lib/aide目錄下:
如果要校驗的時候,需改名為:aide.db.gz
校驗aide監控的目錄和文件:
改變一下f1文件的大小:
在次使用aide –check檢測監控的目錄和文件:
由此可見aide已經檢測到了f1文件哈希值發生了改變。
如果說現在想監控f3文件了,只需改/etc/aide.conf配置文件,把!/testdir/f1刪除。
使用aide –update監控數據庫信息:
再次修改新生成的aide.db.new.gz監控數據庫文件為aide.db.gz;
su 切換用戶身份:
在大多數的Linux服務器中,通常并不建議用戶直接使用root用戶登錄系統。這樣一方面盡可能地減少了以“超級用戶”身份發生誤操作的可能性,另一方面也降低了root密碼在不安全網絡中被泄露(或暴力破解)的風險。
su -l username -c “command”
sudo命令:
sudo命令提供了一種機制,只要預先在/etc/sudoers配置文件中進行授權,即可以允許特定的用戶以超級管理員(或其他普通用戶)的身份去執行命令,而該用戶不需要知道root用戶(或其他普通用戶)的密碼。
1、sudo能夠授權指定用戶在指定主機上運行某些命令。如果未授權用戶嘗試使用sudo,會提示聯系管理員。
2、sudo可以提供日志,記錄每個用戶使用sudo操作。
3、sudo為系統管理員提供配置文件,允許系統管理員集中地管理用戶的使用權限和使用主機。
4、sudo使用時間戳文件來完成類似“檢票”的系統,默認存活期為5分鐘的“入場券”。
5、通過visudo命令編輯配置文件,具有語法檢查功能。
sudo的配置文件/etc/sudoers 或 /etc/sudoers.d/
/etc/sudoers文件的默認權限位440,通常使用專門的visudo命令進行編輯。如果直接使用vi命令編輯,則在保存文件的時候需要使用:wq!,否則系統將提示為只讀文件而拒絕保存。
sudo命令配置文件支持使用通配符glob:
?:任意單一字符;
*:匹配任意長度字符;
[wxc]:匹配其中一個字符;
[!wxc]:除了這三個字符的其它字符;
\x:轉義;
[[alpha]]:字母;示例:/bin/ls[[alpha]]
配置文件規則有兩類:
(1)別名定義:不是必須的
(2)授權規則:必須的
授權規則格式:
用戶 登入主機=(代表用戶) 命令
示例:
root ALL=(ALL) ALL
格式說明:
user:運行命令者的身份;
host:通過哪些主機
(runas):以哪個用戶的身份;
command:運行哪些命令;
別名:
user和runas:
#uid
%group_name
%#gid
user_alias | runas_alias
host:
ip或hostname
network(/netmask)
host_ailas
command:
command name
directory
sudoedit
cmnd_alias
sudo別名:
別名的四種類型:
User_Alias Runas_Alias Host_Alias Cmnd_Alias
別名格式:
[A-Z]([A-Z][0-9]_)* 別名必須是大寫字母且大寫字母開頭后可以跟數字。
別名定義:
Alias_Type NAME1 = item1,item2,item3 : NAME2 = item4, item5
定義兩個相同的別名時可以使用“:”進行分隔開。
示例1:
student ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
示例2:
student ALL=(root) /sbin/pidof,/sbin/ifconfig
%wheel ALL=(ALL) nopasswd:ALL
示例3:
User_Alias NETADMIN = netuser1,netuser2
Cmnd_Alias NETCMD = /usr/sbin/ip
NETADMIN ALL=(root)NETCMD
示例4:
User_Alias SYSADER = zheng,mage,%admins
User_Alias DISKADER = tom
Host_Alias SERS = www.magedu.com,172.16.0.0/24
Runas_Alias OP = root
Cmnd_Alias SYDCMD = /bin/chown,/bin/chmod
Cmnd_Alias DSKCMD = /sbin/parted,/sbin/fdisk
SYSADER SERS = SYDCMD,DSKCMD
DISKADER ALL=(OP) DSKCMD
示例5:
User_Alias ADMINUSER = adminuser1,adminuser2
Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd,!/usr/bin/passwd root
ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
示例6:
Defaults:wang runas_default=tom
wang ALL = (tom,jerry) ALL
示例7:
wang 192.168.175.136,192.168.175.138=(root) /usr/sbin,!/usr/sbin/useradd
示例8:
wang ALL=(ALL) /bin/cat /var/log/message*
sudo [-u user] command
-i:為了頻繁的執行某些只有超級用戶才能執行的權限,而不用每次輸入密碼,可以使用該命令。
-V:顯示版本信息等配置信息;
-u:user 默認為root
-l:列出用戶在主機上可用的和被禁止的命令
-v:在延長密碼有效期限5分鐘,更新時間戳 //認證時間戳目錄:/var/db/sudo
-k:清除時間戳,下次需要重新輸入密碼
-K:與-k類似,還要刪除時間戳文件
-b:在后臺執行指令
-p:改變詢問密碼的提示符
如 -p “password on %h for user %p”
示例1:授權zheng用戶以管理員權限:
[root@centos7 Desktop]# visudo
切換到zheng用戶使用sudo -l 查看:
示例2:
zheng ALL=(root) NOPASSWD:/usr/bin/passwd,!/usr/bin/passwd root
原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/50541