ssh服務簡單介紹
SSH協議框架中最主要的部分是三個協議:
*傳輸層協議(The Transport Layer Protocol)提供服務器認證,數據機密性,信息完整性等的支持;
*用戶認證協議(The User Authentication Protocol)則為服務器提供客戶端的身份鑒別;
*連接協議(The Connection Protocol)將加密的信息隧道復用成若干個邏輯通道,提供給更高層的應用協議使用;各種高層應用協議可以相對地獨立於SSH基本體系之外,並依靠這個基本框架,通過連接協議使用SSH的安全機制。
同時SSH協議框架中還為許多高層的網絡安全應用協議提供擴展的支持。它們之間的層次關系可以用如下圖來表示:
一,ssh建立鏈接過程
1.服務器上產生公鑰 2.客戶端帶着私鑰訪問服務器 3.服務器上公鑰返回給客戶端,並且用自己的公鑰和客戶端發來的私鑰生成key pair 4.客戶端再次帶着自己的私鑰和服務器發來的公鑰生成key pair訪問服務器 5.服務器用自己的key pair和客戶端的key pair進行比對,建立鏈接 注意: 在第一次鏈接的時候,會在本地生成密鑰文件/.ssh/known_hosts(可以存放多個)
二,ssh生成密鑰對過程
1.客戶端 ssh-keygen -t dsa 生成2個文件,id_dsa(私鑰),id_dsa_pub(公鑰) 2.客戶端 發送公鑰到服務器端 3.客戶端 帶着公鑰發送鏈接請求 4.驗證公鑰 5.服務器 用公鑰加密質詢,發送至客戶端 6.客戶端 用私鑰解密質詢 7.客戶端 將解密后的質詢發送回服務器 8.服務器 驗證質詢 9.驗證通過,鏈接建立
三,sshd_config配置文件可修改地方
1.#Port 22 2.PermitRootLogin yes 默認是打開的,就是允許客戶端用root鏈接 3.#PermitEmptyPasswords no 是否允許空密碼 下面是可以解決鏈接慢 1.UseDNS no 拒絕域名解析 2.GSSAPICleanupCredentials no
四,客戶端鏈接ssh基本語法
1.指定端口的鏈接,會跳到鏈接的機子上 ssh -p22 user@ip -p指定端口,默認即位22 2.在鏈接的機子上執行命令,不會跳到鏈接的機子上 ssh -p22 user@ip command
五,基於ssh加密的scp命令
1.推:scp -P22 /etc/file user@ip:/tmp -P這個指定端口是大寫p 2.拉:scp -P22 user@ip:/tmp/file /etc/ 3.參數介紹: -r遞歸,表示拷貝目錄 -p表示拷貝前后保持文件目錄屬性 -l limit限制速度 通常scp -P22 -rp 即可 4.scp每次都是全量的拷貝,不同於rsync的增量
六,基於ssh加密的sftp遠程上傳下載(不推薦用,因為可以使用命令)
1.sftp -oPort=22 user@ip oPort指定端口 2.上傳本地文件到遠程主機 當我們鏈接上的時候,可以通過ls查看當前目錄文件 通過,put /etc/file /tmp 將本地的file上傳到遠程主機的/tmp目錄 默認如果不加/tmp,發送到/root目錄下 3.下載遠程主機文件到本地 通過,get /etc/file /tmp 將遠程主機上的file文件下載到/tmp下 默認如果不加/tmp,下載到我們開始執行鏈接命令的目錄下
七,非交互式創建密鑰
我們手動創建是通過,ssh-keygen -t dsa,然后回車 1.自動創建 ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa > /dev/null 2>&1 2.將公鑰發送到遠程主機 ssh-copy-id -i .ssh/id_dsa.pub "-p22 user@ip" 發送過去后,遠程主機會產生.ssh/authorized_keys文件,權限是600,本地會多出.ssh/known_hosts文件
八,提權執行
1.直接root賬號,將sshd_config里面允許root登錄 2.sudo提權實現沒有權限的用戶拷貝 首先,配置sudoers:
終端命令;visudo,相當於配置/etc/sudoers ## Allow root to run any commands anywhere
用戶或者組 機器=授權角色 可執行命令 root ALL=(ALL) ALL joker ALL=(ALL) /usr/bin/rsync
@group ALL=(ALL) ALL
user ALL=(ALL) NOPASSWD:ALL 解釋:
第一個ALL代表機器,就是所有機器,第二個ALL代表所有角色,第三個ALL代表可以執行所有命令,NOPASSWD代表提權命令時不需要提示密碼
然后,加載sudoers文件 visudo -C 最后,用joker用戶通過基於ssh的rsync發送文件
用戶或者組在執行授權的特殊權限命令時后格式為sudo 命令,切換到root格式為 sudo su - ,需要輸入當前用戶的密碼,而不是root密碼 ssh -p22 -t user@ip sudo rsync ~/hosts /etc/hosts
注意;
如果,提示命令找不到,很可能是環境變量導致
root下,echo $path
user下,echo $path
在user下,修改vi ~/.bash_profile,將/usr/local/sbin:/sbin:/usr/sbin加入進去 3.利用suid實現沒有權限用戶拷貝(了解即可) chmod u+s 'which rsync'
附贈基於ssh的scp推送腳本
#!/bin/bash if [ $# -ne 2 ];then echo "usage:/bin/bash $0 {avg1 avg2}" exit 1 fi . /etc/init.d/functions for ip in 1 2 3 do scp -p22 file user@ip:/tmp > /dev/null 2&1 if [ $? -eq 0 ];then action "fenfa hosts ip" /bin/true else action "fenfa hosts ip" /bin/false fi done
九,非交互模式產生密鑰
1.yum install expect -y 2.mkpasswd -l 10 參數介紹,生成隨機字符串,-l是指生成多少個字符 3.簡單介紹expect的過程 首先,還是需要手動ssh-keygen生成私鑰,公鑰 然后,spawn ssh-copy-id -i id_dsa.pub "-p 22 user@ip" expect { "yes/no" {send "yes\r":exp_continue} "*password" {send "123\r"} } expect eof
附贈基於expect免密鑰分發腳本
#!/bin/bash # The author is joker, which is used to manage the host. expect_order=`which expect 1>/dev/null 2>&1` if [ $? -eq 1 ];then yum install expect -y sleep 1 sh $0 else Distribute(){ for IP in $(cat /service/script/distribute_ip.txt);do Passwd=$1 USER=$2 expect -c " spawn ssh-copy-id -i /root/.ssh/id_rsa.pub -p 22 $USER@$IP expect { \"*yes/no*\" {send \"yes\r\"; exp_continue} \"*password*\" {send \"$Passwd\r\";exp_continue} \"*password*\" {send \"$Passwd\r\";} } " if [ $? -eq 0 ];then echo -e "\033[32m 綠色字,ssh $IP 鏈接成功 \033[0m" else echo -e "\033[31m 紅色字,ssh $IP 鏈接失敗,請檢查原因 \033[0m" fi done } Distribute "Poppy1115" root fi ########################################### # distribute_ip.txt,注意該文件適合在同一個地區使用,內網互動,否則去除內網地址 # 外網地址 內網地址