非對稱公鑰加密并且判斷是誰發過來的文件;上圖加密過程;
首先原文經過A的哈希算法生成摘要 —–>用A的私鑰來加密摘要(當B解密時就會得知是誰發的文件,相當于生成數字簽名)—————>A在用B的公鑰來加密數字簽名和原文內容—–>加密成密文的文件發送到B上——->傳到B再用其自己的私鑰將密文解密成原文和數字簽名文件——->數字簽名再用A的公鑰解密成數字摘要(就可得知誰發的文件了)——–>在對原文進行哈斯算法得出的摘要和解密的摘要對比。如果一致則原文沒有被篡改。
生成文件的摘要:(只要文件內容不變則摘要是相同的)
md5sum file (生成文件摘要)
將文件1和文件2等文件生成摘要存放到某一文件中,通過對比摘要來發現文件是否損壞
md5sum file1 file2 > f4.log
md5sum –check f4.log (自動對比現在文件的摘要和以前保存文件的摘要是否一樣來判斷文件是否損壞)
對稱加密
使用同一把密鑰,加密和解密一個文件
gpg -c file (加密) (生成一個新的文件 file.gpg)
gpg -o file2 -d file.gpg (解密文件并生成一個自定義的解密文件file2)
非對稱加密 (公鑰和私鑰是一對的。用某一個加密必須用另一個解密)
A使用B的公鑰來加密,傳送到B,B再用自己的私鑰來解密。
7上的文件用6的公鑰加密然后傳給6,6再用自己的私鑰解密案例:
1.在6和7 的主機上生成公鑰/私鑰對 (在圖形界面操作)
gpg –gen-key ? (最后按o結束)生成的密鑰對在默認目錄/root/.gnupg/下
2.在6主機上查看生成的公鑰
gpg –list-keys ?
3.在6上生成的公鑰導出
gpg -a –export -o lv.pubkey ?(文件名可以自定義)
4.從6主機上復制公鑰文件到7主機上
scp lv.pubkey 192.168.60.4:/ (將導出的公鑰文件傳送到7 上的/目錄下)
5.在7上導入6的公鑰
gpg –import /lv.pubkey
gpg –list-keys (查看公鑰)
6.在7上用6的公鑰加密文件
gpg -e -r lvcheng(6上生成密鑰是自定義的名字) file (此時生成file.gpg的文件)
7.將在7上使用6的公鑰加密的文件再次傳送到6的主機上
scp file.gpg 192.168.60.2:/data/
8. 最后在6上用其私鑰解密文件
gpg -o file1 -d file.gpg (file1為解密生成的文件名自定義)
刪除公鑰和私鑰:(需要先刪除私鑰在刪除公鑰否則會報警出錯)
gpg –delete-keys lvchen (刪除公鑰)
gpg –delete-secret-keys lvchen(刪除私鑰)
最后將文件刪除/root/.gnupg
CA和證書
PKI: Public Key Infrastructure
簽證機構:CA(Certificate Authority)
注冊機構:RA
證書吊銷列表:CRL
證書存取庫
X.509:定義了證書的結構以及認證協議標準
證書獲取
1 使用證書授權機構
生成簽名請求(csr)
將csr發送給CA
從CA處接收簽名 •
2 自簽名的證書
自已簽發自己的公鑰
SSL/TLS 安全協議
TLS協議是從SSL協議發展演變而來的
HTTPS 協議:就是“HTTP 協議”和“SSL/TLS 協議”的組合,對http協議的文本數據進行加密處理后,成為二 進制形式傳輸
OpenSSL
openssl命令
生成密鑰對兒:man genrsa
生成私鑰
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
(umask 077; openssl genrsa –out f3.key 2048) (括號需要添加,077為私鑰的權限)
對生成的私鑰使用des進行對稱加密:(umask 077; openssl genrsa –out f3.key –des -des 2048)
在對其進行解密并生成新的私鑰文件f4.key:openssl rsa -in f3.key -out f4.key ?
從私鑰中提取出公鑰
openssl rsa –in f3.key –pubout –out f5.key.pub ?
創建CA和申請證書
創建私有CA:
openssl的配置文件:/etc/pki/tls/openssl.cnf
實驗案例:把7當作服務器創建CA證書,然后6向7申請CA證數,7在頒發給6證書。
1 首先在7上建立Root CA,需要以下兩步操作 (以下格式的填寫都根據模板文件/etc/pki/tls/openssl.cnf來寫的)
1)在7上生成私鑰
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096 ) (077 設置私鑰的權限,生成的私鑰路徑必須為/etc/pki/CA/private/生成的私鑰的文件名也必須為cakey.pem)
此時查看可以發現文件已經生成了
2)自己給自己頒發證書,因為是自己搭建的rootCA
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 (輸出的路徑及文件名也是指定的。3650為指定CA證書的有效期 ,需要填寫:國家;??;市;公司名;部門名;網站域名;)
此時在/etc/pki/CA/則生成了cacert.pem的 文件;查看此文件的方法
openssl x509 -in cacert.pem -noout -text (noout為只預覽文件的內容并不生成文件)
也可以把此文件發送到windowns里以圖形方式來查看:用sz上傳到windowns里并將文件的后綴改為.cer
2 在6上(用戶或服務器)需要的的操作:(假設申請的證書給某個服務用的,生成的私鑰要放在那個服務下的配置文件里)
1)生成私鑰
(umask 077;openssl genrsa -out /data/app.key 1024 ) (假設放在/data/目錄下,應用為app的程序使用)
2)生成證書申請文件
openssl req -new -key app.key -out app.csr (隨后要填寫的內容:國家;??;市;公司;部門;那個程序使用的域名;等等)
3)將6的申請文件發給7創建的RootCA證書
scp app.csr 192.168.60.4:/etc/pki/CA (發送的目錄可以自定義,但下面頒發證書時要寫對路徑)
3 在7上CA頒發證書 (需要創建以下兩個文件夾,不然會提示報錯)
touch /etc/pki/CA/index.txt (此文件是用來記錄證書頒發完后的結果,以及證書的編號等等信息,會自動更新 ,其中V代表有效的證書)
echo 01 > /etc/pki/CA/serial (新建01“01為十六進制”的編號到此文件里,01是將來要頒發證書的編號,)
openssl ca -in app.csr -out /etc/pki/CA/ certs/app.crt -days 100 (頒發證書,輸出的路徑及文件名必須寫成這樣,100為頒發證書的有效期)
頒發過證書后,/etc/pki/CA/serial里寫的將是給下一個證書頒發的 編號應給為02,當前頒發證書的編號已經存放到/etc/pki/CA/serial.d文件里了。
4.最后將頒發證書的文件復制到6的那個程序應用上就可以了。
scp /etc/pki/CA/certs/app.crt 192.168.60.2:/data/
(其中填寫的內容有些項要一致,否則頒發證書會失敗,index.txt.attr 中將yes改為no同樣的申請也可頒發證書)
頒發證書的吊銷:
openssl ca -status 01 (查看證書狀態v代表正在使用;R代表吊銷的證書 01 為證書的編號)
openssl ca -revoke newcerts/01.pem (吊銷證書,01為要吊銷證書的編號)
吊銷的證書要發布到吊銷列表里來對外發布。
首先要新建一個文件:touch /etc/pki/CA/crlnumber并且寫入一個01的列表編號
openssl ca -gencrl -out crl.pem (之后生成crl.pem的文件為吊銷列表)
openssl crl -in crl.pem -noout -text (查看證書吊銷列表)
SSH ( 安全的遠程登錄 )
ssh, 配置文件:/etc/ssh/ssh_config (里面記錄著端口號,可以更改)
StrictHostKeyChecking no 首次登錄不顯示檢查提示 (配置文件中的一項)
兩種方式的用戶登錄認證:
基于password
基于key (公鑰的免密碼登陸)
ssh [-l user] host [COMMAND]
-p port:遠程服務器監聽的端口
-b:指定連接的源IP ( 當你的網卡上有兩個地址是通過那個ip來鏈接的??梢酝ㄟ^-b來指定)
-v:調試模式
-C:壓縮方式
-X: 支持x11轉發 (來實現圖形功能的轉發。例如在6連接到7上無法使用7上的圖形工具,只有在本機操作才可打開的圖形工具軟件,添加—X的選項后就可以在遠程實現本機才能打開的圖形軟件,退出之后使用ssh -X 連接之后就可以使用了)
-Y:支持信任x11轉發
ForwardX11Trusted yes
-t: 強制偽tty分配
ssh -t remoteserver1 ssh remoteserver2 (通過跳板機來連接被防火墻阻隔的服務器)
如果需要在服務器上執行一條命令就返回則可以不通過登陸到服務也可以執行,方便快捷。
ssh 192.268.60.2 'cat /etc/centos-release'
當用戶遠程連接ssh服務器時,會復制ssh服務器/etc/ssh/ssh_host*key.pub (CentOS7默認是ssh_host_ecdsa_key.pub)文件中的公鑰到客戶機的 ~./ssh/know_hosts中。下次連接時,會自動匹配相應私鑰,不能匹配,將拒 絕連接
基于用戶和口令登錄驗證 的詳細過程:
1 客戶端發起ssh請求,服務器會把自己的公鑰發送給用戶 ?
2 用戶會根據服務器發來的公鑰對自己的登陸密碼進行加密 ?
3 加密后的信息回傳給服務器,服務器用自己的私鑰解密自己的公鑰加密的密碼,如果密碼正確,則 用戶登錄成功
基于key的登錄方式的詳細的過程:
1 首先在客戶端生成一對密鑰(ssh-keygen) ?
2 并將客戶端的公鑰ssh-copy-id 拷貝到服務端 ?
3 當客戶端再次發送一個連接請求,包括ip、用戶名 ?
4 服務端得到客戶端的請求后,會到authorized_keys中查找,如果有響應的IP 和用戶,就會隨機生成一個字符串,例如:acdf ?
5 服務端將使用客戶端拷貝過來的公鑰進行加密,然后發送給客戶端 ?
6 得到服務端發來的消息后,客戶端會使用私鑰進行解密,然后將解密后的 字符串發送給服務端 ?
7服務端接受到客戶端發來的字符串后,跟之前的字符串進行對比,如果一致, 就允許免密碼登錄
基于key認證的具體操作過程:(客戶機到服務器實現免密碼的登陸)
每個賬號的家目錄下有.ssh/ known_hosts 文件記錄著遠程機器連接本機的公鑰。
1 . ssh-keygen -t rsa (基于rsa加密的私鑰公鑰對)(交互式選項:生成默認路徑的文件;私鑰文件的口令;)默認路徑:/root/.ssh/id_rsa) 或者使用此命令:ssh-keygen :不添加選項。就沒有交互式登陸,以及要選擇的項目。
2.ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.60.4 (默認將公鑰復制到所要登陸主機, 的/root/.ssh/authorized_keys下,如果不用此命令也可以將自己生成的公鑰文件改名為authorized_key并復制到/root/.ssh/authorized_keys里面) ssh-cop-id 192.168.60.5 也可以不加公鑰文件。自己的公鑰文件默認追加到/root/.ssh/authorized_keys里面了
3.再去連接對方則不需要輸入密碼了。如果要對方連接自己的主機實現免密碼登陸,要將自己的公鑰復制到對方的文件/root/.ssh/authorized_keys里面即可。
4 . 如果連接其他主機的非root用戶;再傳送公鑰時添加名稱即可;例如:lv@192.168.60.4 ,其公鑰文件存放在lv 用戶的家目錄文件下/home/lv/.ssh/,和root的公鑰文件存放在不同地方。
多臺主機之間普通用戶實現免密登錄:
多個主機之間都有相同的一個用戶lv
在A主機上切換到lv用戶然后生成公鑰文件:
ssh-keygen
在切換到root用戶將lv的公鑰文件遠程拷貝到B主機lv用戶的家目錄下:
ssh-copy-id -i /home/lv/.ssh/id_rsa.pub lv@10.200.10.165
(10.200.10.165為B主機的IP地址)
最后在A主機上切換到lv用戶就可以實現免密登錄到B主機的lv用戶了。
ssh lv@10.200.10.165
總結: 在B主機的lv用戶的家目錄/home/lv/.ssh/authorized_keys 里的公鑰信息就是A主機的個人公鑰信息在A主機/home/lv/.ssh/id_rsa.pub里的內容。
這種免密登錄為單向的免密登錄只能是A主機的lv用戶免密登錄到B主機的lv用戶上。
如果A主機為rootB主機為普通用戶lv .則只需要將A主機root的公鑰文文件追加到B主機lv用戶的/home/lv/.ssh/authorized_keys就可以了。
多臺主機實現互相免密碼登陸:
第一種方法:各自生成公鑰,并把各自的公鑰文件發送到各個主機上就可以了。(也可以將所有主機的公鑰文件(包括自己的公鑰文件:執行命令;ssh-copy-id -i +自己的IP地址就可以可)存放到一臺主機上然后再發送到其他主機上就可以了);如果不想實現免密碼登陸,將文件刪掉就可以了。
第二種方法:所有人共用一把鑰匙
1 .先再一臺機器上生成密鑰:ssh-keygen
2 . 將公鑰傳送到自己的機器上:ssh-copy-id 192.168.60.2 (其中IP地址為本機的地址)
3 .查看/root/.ssh已經生成三個文件了(私鑰文件;公鑰文件;記錄遠程機器登陸本機的公鑰)
4. 將.ssh下的文件全部復制到其他主機上并保留權限。
scp -pr /root/.ssh 192.168.60.4:/root/
總結:私鑰文件如果丟失,則會被別人無密碼進入所有主機;所以再生成私鑰文件時需要添加密碼。(上述操作中為了方便就沒有添加,如何添加呢?第一步生成私鑰文件時系統會要你設定密碼)如果剛才沒有添加口令,可以再次添加口令 :ssh-keygen -p
設定了私鑰的口令每次登陸又要輸入密碼了,可以啟用代理服務,又不用輸入私鑰的密碼了
具體操作:ssh-agent bash
ssh-add (此兩條命令就可以實現私鑰密碼的代理服務了,代理服務需要每次開機都要執行上述操作一次)
實現多臺機器自動化操作
1.生成IP地址的列表文件 ip.txt
2 .vim 生成基于key驗證的推送腳本:(使用expect免交換式登陸腳本)
vim ssh_key.sh
ssh-keygen -P "" -f "/root/.ssh/id_rsa" (生成私鑰文件" "為空代表私鑰的密碼沒設)
password=511111 (各個主機的登陸密碼為已知的并且要相同)
for ip in `cat /data/ip.txt`;do (依次讀取ip.txt文件里的每一行,并賦值給變量ip)
expect <<EOF (多行重定向)
spawn ssh-copy-id $ip (將生成的公鑰文件傳給IP)
expect {
"yes/no" { send "yes\n";exp_continue } (expect捕捉則不需要交互式的輸入了)
"password" { send "$password\n" }
}
expect eof
EOF
done
執行腳本后本機就可以免密碼登陸ip.txt的里的主機。
scp命令
常用選項:
-C: 壓縮數據流
-r: 遞歸復制
-p: 保持原文件的屬性信息
-q: 靜默模式
-P PORT: 指明remote host的監聽的端口 (如果目標服務器用的端口號不是標準端口號,就需要指定了)
格式:scp /data/f1 lv@192.168.60.4:/data/ (前面為本地文件的路徑,lv為遠程主機的用戶名,不寫默認為root用戶,后面跟的是要復制到的路徑。;也可以復制到遠程主機并重名文件,后面只要寫上文件的新名稱就可以了,如果文件名相同會覆蓋其舊文件的內容)
使用scp命令如果要將文件傳到其他主機的非root用戶則文件只能傳到其用戶的家目錄下,其他路徑則沒有權限 /home/lv/
rsync命令
比scp更快,只復制不同的文件 (scp命令如果復制過的相同文件再次復制時,還會再復制一遍,而rsync只把不同的文件再次復制,相同的在他的內存中無需再復制一遍就可以把文件快速的復制過來提升效率。)選項:
-n 模擬復制過程
-v 顯示詳細過程
-r 遞歸復制目錄樹
-p 保留權限
-t 保留時間戳
-g 保留組信息
-o 保留所有者信息
-l 將軟鏈接文件本身進行復制(默認)
-L 將軟鏈接文件指向的文件復制
-a 存檔,相當于–rlptgoD,但不保留ACL(-A)和SELinux屬性(-X)
命令格式與scp命令一樣:rsync ip.txt 192.168.60.4:/data/ (默認為root 用戶)
pssh工具 (默認沒有需要安裝)(只能遠程操作其他主機,并不能將本機的文件傳到其他主機上)
選項如下: ?
–version:查看版本 ?
-h:存放主機名文件列表;
touch ?ip.txt (里的內容:192.168.60.4 192.168.60.5 )
pssh -h ip.txt -i 'adduser lv ' (在多臺主機上批量創建用戶?;A是要實現基于key的驗證)
-H:主機字符串,內容格式”[user@]host[:port]” ? (要連接主機的IP地址)格式
pssh -H 192.168.60.4 -H 192.168.60.5 rm -rf /data/f1
或者寫成:pssh -H "192.168.60.4 192.168.60.5" rm -rf /data/f1
-l:登錄使用的用戶名 ?
-p:并發的線程數【可選】 ?(如果是100臺機器默認是順序執行的,-p是并發執行,速度快)
-o:輸出的文件目錄【可選】 (-o /data/ 將執行的結果信息存放到指定的文件下,后續查看)?
-e:錯誤輸入文件【可選】 ?
-t:TIMEOUT 超時時間設置,0無限制【可選】 ?
-O:SSH的選項 ?
-v:詳細模式 ?
-A:手動輸入密碼模式 ?(如果不是基于key的驗證需要輸入A才行)
-x:額外的命令行參數使用空白符號,引號,反斜線處理 ?
-X:額外的命令行參數,單個參數模式,同-x ?
-i:每個服務器內部處理信息結果輸出到本機界面上 ?
-P:打印出服務器返回信息
Pssh示例
?通過pssh批量關閉seLinux :
pssh -H root@192.168.1.10 -i "sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config"
?(如果命令里面有""/'' 則外面要添加與里面不同的引號來區分開)
將標準錯誤和標準正確重定向都保存至/app目錄下
pssh -H 192.168.1.10 -o /app -e /app -i "hostname"
PSCP.PSSH命令 :(功能是將本地文件批量復制到遠程主機)
選項
-v 顯示復制過程
-a 復制過程中保留常規屬性
-r 遞歸復制目錄 ?
具體操作示例:
將本地f1 復制到/data/目錄
pscp.pssh -H 192.168.1.10 /data/f1 /data/
pscp.pssh -h ip.txt /tata/f1 /data/? (ip.txt文件為遠程主機IP的列表)
將本地多個文件批量復制到/data/目錄
pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /data/ ?
將本地目錄批量復制到/data/目錄
pscp.pssh -H 192.168.1.10 -r /root/test/ /data
PSLURP.PSSH命令 (功能是將遠程主機的文件批量復制到本地 )
-L 指定從遠程主機下載到本機的存儲的目錄,local是下載到本地后的名稱
-r 遞歸復制目錄
批量下載目標服務器的passwd文件至/data下,
pslurp -H 192.168.1.10 -L /data/ /etc/passwd passwd/user (passwd/user 遠程復制到本機必須指定名稱如果用原來的名字則寫上原來的名字passwd如果不用則寫上新的名字,此項必須要寫否則執行失敗)
pslurp -h ip.txt -L /data/ /etc/passwd passwd/user (-L 后面跟的是本機要存儲的路徑)
SSH端口轉發
本地轉發:(某一服務無法直接連接內網的服務器,通過內網的一臺ssh服務器來連接)
選項:
-f 后臺啟用
-N 不打開遠程shell,處于等待狀態
-g 啟用網關功能 ?
示例
ssh –L 9527:telnetsrv:23 -Nf sshsrv (9527為本機空閑的隨機端口,后面跟上要遠程連接的服務器地址及端口號;最后跟上中間充當ssh服務的主機IP地址;-Nf選項為后臺連接需要重新開個終端了)
當訪問本機的9527的端口時,被加密后轉發到sshsrv的ssh服務,再解密被轉發到 telnetsrv:23
data —–>localhost:9527——-> localhost:XXXXX ——->sshsrv:22 ——->sshsrv:YYYYY —–>telnetsrv:23
案例:有6 ;7;7.5 三臺服務器在7.5上設防火墻將6的主機禁止連接(只針對6),然后6主機通過7主機當ssh服務轉接到7.5上;具體過程如下:
1.在6和7上查看telnet服務是否開啟又或者沒用安裝此包:
yum intall telnet-server (服務包安裝)
yum install telnet (客戶端包安裝)
systemctl start telnet.socket (啟用服務)
ss -ntl 來查看telnet 的23號端口有沒有起來
2.將7.5設防火墻阻止6的連接:
iptables -A INPUT -s 192.168.60.2 -j REJECT (IP地址為6主機的地址)
設好之后驗證6是否能連接7.5主機:使用ssh連接查看即可;應該是拒絕連接的
3. ssh -L 9527:192.168.60.5:23 192.168.60.4 (9527為6主機的隨便不用的端口即可,第一個的IP地址為要連接的7.5的主機的地址,23為要連接主機的telnet服務的端口號,后面的IP地址為當作跳板的7的主機的IP)
4. 此時已經連接到跳板機的界面里,重新開個終端在連接7.5的主機 :此時用ss -ntl 可以產看內部連接的端口號9527已經開啟了。
talnet 127.0.0.1 9527 (用此命令就可以連接到7.5上了)
登陸時只能用7.5主機的普通用戶登陸; 但登陸之后可以切換到root賬號。
詳細步驟查看下面博客地址:
https://blog.csdn.net/u011314255/article/details/80401580
遠程轉發:
示例:
ssh –R 9527:telnetsrv:23 –N sshsrv
讓sshsrv偵聽9527端口的訪問,如有訪問,就加密后通過ssh服務轉發請求到本 機ssh客戶端,再由本機解密后轉發到telnetsrv:23
Data ——->sshsrv:9527 ——>sshsrv:22——>localhost:XXXXX ——>localhost:YYY——>telnetsrv:23
動態端口轉發:
?當用firefox訪問internet時,本機的1080端口做為代理服務器,firefox的訪問 請求被轉發到sshserver上,由sshserver替之訪問internet
ssh -D 1080 root@sshserver
在本機firefox設置代理socket proxy:127.0.0.1:1080
curl –socks5 127.0.0.1:1080 http://www.qq.com
sudo
配置文件:/etc/sudoers, /etc/sudoers.d/
授權規則格式: 用戶 登入主機=(代表用戶) 命令 :root ALL=(ALL) ALL
visudo –c 檢查語法 的功能
簡單案例:授權lv用戶查看/etc/shadow文件的內容
1. 使用visudo 進入配置文件 添加一行 (在root下面的地方添加;使用visudo命令就可以直接打開配置文件了。)
lv 192.168.60.2=(root) /usr/bin/cat /etc/shadow
保存退出后:用命令sudo cat/etc/shadow 就可以查看文件了 ; 默認代表root用戶
(192.168.60.2為限定主機;命令必須將其路徑寫上;里面授權的命名要和外面執行的命令一致,否則無法執行)
組授權
不僅可以授權用戶還可以授權組,但要在組名的前面添加% 系統默認%wheel 組有root級別的權限,如果加入到此組當中就相當于有了root的權限了
usermod -aG "wheel" lv (添加進wheel組當中)
gpasswd -d lv wheel (將lv用戶移除此組)
不在系統文件上更改;可以在備用的文件上添加某一用戶的權限/etc/sudoers.d/
在此文件新建lv文件然后按照上面格式添加其權限也可以。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98732