SSH協議框架中最主要的部分是三個協議:安全
*傳輸層協議(The Transport Layer Protocol)提供服務器認證,數據機密性,信息完整性等的支持;bash
*用戶認證協議(The User Authentication Protocol)則爲服務器提供客戶端的身份鑑別;服務器
*鏈接協議(The Connection Protocol)將加密的信息隧道複用成若干個邏輯通道,提供給更高層的應用協議使用;各類高層應用協議能夠相對地獨立於SSH基本體系以外,並依靠這個基本框架,經過鏈接協議使用SSH的安全機制。網絡
同時SSH協議框架中還爲許多高層的網絡安全應用協議提供擴展的支持。它們之間的層次關係能夠用以下圖來表示:框架
一,ssh創建連接過程ssh
1.服務器上產生公鑰 2.客戶端帶着私鑰訪問服務器 3.服務器上公鑰返回給客戶端,而且用本身的公鑰和客戶端發來的私鑰生成key pair 4.客戶端再次帶着本身的私鑰和服務器發來的公鑰生成key pair訪問服務器 5.服務器用本身的key pair和客戶端的key pair進行比對,創建連接 注意: 在第一次連接的時候,會在本地生成密鑰文件/.ssh/known_hosts(能夠存放多個)
二,ssh生成密鑰對過程ui
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基本語法spa
1.指定端口的連接,會跳到連接的機子上 ssh -p22 user@ip -p指定端口,默認即位22 2.在連接的機子上執行命令,不會跳到連接的機子上 ssh -p22 user@ip command
五,基於ssh加密的scp命令3d
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,注意該文件適合在同一個地區使用,內網互動,不然去除內網地址 # 外網地址 內網地址