Linux安全與加密基礎(一)
-
常見的加密算法
-
SSL: Openssl與CA認證
-
ssh服務
-
dropbear
-
AIDE
-
sudo
常見的加密算法
密碼學古以有之,尤其是在中國古代的戰爭中,在現在科技中,密碼學不得不說是一門高深的學問,普通人知其一二足矣;本文要討論的是關于加密與解密的基本原理與應用,以及關于Linux系統中的一些安全管理問題,如ssh服務,監控系統關鍵文件是否被篡改,sudo提權等。
1、對稱加密
所謂對稱加密,就是同一個密鑰可以同時用作信息的加密和解密。
常見的對稱加密算法有:DES、3DES、Blowfish、AES等。
對稱加密的特點:
對稱加密算法的優點是算法公開、計算量小、加密速度快、加密效率高。
對稱加密算法的缺點是在通信之前,發送方和接收方必須商定好秘鑰,然后雙方都能夠保存好秘鑰。另外,無法實現對數據來源的確認。
對稱加密的隱患是:如果任何一方的秘鑰沒有保存好,那么數據就不安全了;其次,收、發雙方在使用對稱加密時,都需要使用其他人不知道的唯一秘鑰,這會使得收、發雙方所擁有的鑰匙數量巨大,密鑰管理成為雙方的負擔。
其工作原理可參考下圖:將原始數據分割成固定大小的塊,逐個進行加密
2、非對稱加密
對稱加密有一個密鑰,其加密與解密的過程使用一個密鑰,而非對稱加密有兩個密鑰,即公鑰(public
key)和私鑰(private
key),公鑰與私鑰是一對兒,其加密與解密的過程要使用兩個密鑰;如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那么只有用對應的公開密鑰才能解密。
常見的非對稱加密算法有:RSA(加密,數字簽名)、DSA(數字簽名)
非對稱加密的特點:
非對稱的優點是在收發雙方通信之前,不需要協商秘鑰;公鑰與私鑰,一個用來加密,一個用來解密,而且公鑰是公開的,秘鑰是自己保存的。
非對稱加密的缺點是加密和解密花費時間長、速度慢,只適合對少量數據進行加密。
非對稱加密可參考下圖:
RSA:
從上圖可看出:在非對稱加密中,發送方首先得生成一個秘鑰對兒(公鑰與私鑰),然后公開公鑰,使用自己的私鑰加密數據成密文,最后發送;而接收方會用發送方的公鑰對密文解密。
非對稱加密可實現數字簽名與對稱密鑰交換的功能:
數字簽名:就是加密特征碼,把文件指紋信息(特征碼)取出來,用私鑰加密特征碼,數字簽名的目的是驗證對方的身份。
對稱密鑰交換:發送方用對方的公鑰加密一個對稱密鑰后發送給對方
注:提取特征碼的過程就是單向加密
3、單向加密
所謂單向加密,就是只能加密,不能解密,其作用主要就是提取數據的特征碼,又稱指紋信息。
常見的單向加密算法有:MD5: 128bits定長輸出, SHA1: 160bits輸出;SHA256, SHA512
單向加密特點:
(1) 定長輸出:無論原來的數據是多大級別,其加密結果長度是一樣的; (2)雪崩效應:原始數據微小改變,將導致結果巨大變化 (3) 不可逆
單向加密的功能:
(1) 數據完整性 (2)系統帳號密碼校驗
常用工具
md5sum | sha1sum [ --check ] fileopenssl、gpg rpm -V
4、密鑰交換
密鑰交換,IKE(Internet Key Exchange): 雙方通過交換密鑰來實現數據的加密解密;密鑰交換有以下兩種情況:
公鑰加密:將公鑰加密后通過網絡傳輸到對方進行解密,不常用,因為很有可能被截取破解;
DH(Deffie-Hellman):
雙方共有一些參數,共同協商加密算法,此外,雙方還有屬于自己的私有參數;通過共有的參數、私有參數和算法信息進行加密,然后雙方將計算后的結果進行交換,交換完成后再和屬于自己私有的參數進行特殊算法,經過雙方計算后的結果是相同的,而這個結果就是密鑰。
DH:
1、A: a,p協商生成公開的整數a,大素數p B: a,p2、A:生成隱私數據:x (x<p ),計算得出a^x%p,發送給B B:生成隱私數據:y,計算得出a^y%p,發送給A3、A:計算得出(a^y%p)^x = a^xy%p,生成為密鑰 B:計算得出(a^x%p)^y = a^xy%p, 生成為密鑰
在數據通信的過程中,加密往往都不是單一的,一個可選的加密通信過程,會有自己特有的加密算法組合,如:
a–>b
Pb{data+Sa[hash(data)]}
{Pb(key){對稱key}}+{對稱key{data+{Sa[hash(data)]}}}
一般地,一次加密的通信過程:
發送者:
1.使用單向加密算法提取生成數據的特征碼; 2.使用自己的私鑰加密特征碼附加在數據后面; 3.生成用于對稱加密的臨時密鑰; 4.用此對稱密鑰加密數據和已經使用私鑰加密后的特征碼; 5.使用接收方的公鑰加密此對稱密鑰,附加在對稱加密后的數據后方;
接收方:
1.使用自己的私鑰解密加密的對稱(臨時)密鑰,從而獲得對稱密鑰; 2.使用對稱密鑰解密對稱加密的數據和私鑰加密的特征碼密文;從而獲得數據和特征碼密文; 3.使用發送方的公鑰解密特征碼密文,從而獲得計算生成的特征碼; 4.使用與對方相同的單向加密算法計算數據的特征碼,并與解密而來的特征碼進行比較;
SSL: Secure Socket Layer
SSL(Secure Sockets Layer 安全套接層),及其繼任者傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。
1995:SSL 2.0 Netscape1996: SSL 3.0 1999: TLS 1.0 2006: TLS 1.1 RFC(Request For Comments )4346 2008:TLS 1.2 當前使用2015: TLS 1.3
SSL協議位于TCP/IP協議與各種應用層協議之間,為數據通訊提供安全支持。SSL協議可分為兩層:
SSL記錄協議(SSL Record
Protocol):它建立在可靠的傳輸協議(如TCP)之上,為高層協議提供數據封裝、壓縮、加密等基本功能的支持。 SSL握手協議(SSL
Handshake
Protocol):它建立在SSL記錄協議之上,用于在實際的數據傳輸開始前,通訊雙方進行身份認證、協商加密算法、交換加密密鑰等。
SSL的體系結構中包含兩個協議子層,其中底層是SSL紀錄協議層(SSL Record Protocol Layer);高層是SSL握手協議層(SSL HandShake Protocol Layer)。SSL的協議棧如下圖所示,其中陰影部分即SSL協議。
SSL紀錄協議層的作用是為高層協議提供基本的安全服務。SSL紀錄協議針對HTTP協議進行了特別的設計,使得超文本的傳輸協議HTTP能夠在SSL運行。紀錄封裝各種高層協議,具體實施壓縮解壓縮、加密解密、計算和校驗MAC等與安全有關的操作。
https簡介
HTTPS(Hypertext Transfer Protocol Secure)安全超文本傳輸協議
它是由Netscape開發并內置于其瀏覽器中,用于對數據進行壓縮和解壓操作,并返回網絡上傳送回的結果。HTTPS實際上應用了Netscape的完全套接字層(SSL)作為HTTP應用層的子層。(HTTPS使用端口443,而不是象HTTP那樣使用端口80來和TCP/IP進行通信。HTTPS和SSL支持使用X.509數字認證,如果需要的話用戶可以確認發送者是誰,
它的安全保護依賴瀏覽器的正確實現以及服務器軟件、實際加密算法的支持.
SSL通信過程
客戶端發起請求,包含一個hello消息,并附上客戶端支持的密碼算法和 SSL 協議的版本消息以及用于生成密鑰的隨機數。 服務器收到消息后,服務器端選擇加密壓縮算法并生成服務器端的隨機數,將該信 息反饋給客戶端;接著服務器端將自身的數字證書(一個 X.509 數字證書)發送到客戶端; 完成上述動作后后服務器端會發送“hello done”消息給客戶端。此外如果服務器需要對客戶端進行身份認證,服務器端還會發 送一個請求客戶端證書的消息。 一旦客戶端收到”hello done” , 就開始對服務器端的數字證書進行認證并檢查服務器端選中的算法是可行的。如果 服務器要求認證客戶端身份,客戶端還會發送自己的公鑰證書。 如果對服務器的身份認證通過,客戶端會發起密鑰交換的請求。 服務器端和客戶端根據先前協商的算法和交換隨機數生成對稱密鑰進行后續的通信。
ssl的相關報文:
Client Hello
Server Hello
Server–>Client
Client–>Server
Handshake協議:包括協商安全參數和密碼套件、服務器身份認證(客戶端身份認證 可選)、密鑰交換;Change Cipher Spec 協議:一條消息表明握手協議已經完成 Alert 協議:對握手協議中一些異常的錯誤提醒,分為fatal和warning兩個級別, fatal類型錯誤會直接中斷SSL鏈接,而warning級別的錯誤SSL鏈接仍可繼續,只是 會給出錯誤警告Record 協議:包括對消息的分段、壓縮、消息認證和完整性保護、加密等。 HTTPS 協議:就是“HTTP 協議”和“SSL/TLS 協議”的組合。HTTP over SSL”或“HTTP over TLS”, 對http協議的文本數據進行加密處理后,成為二進制形式傳輸
總而言之,當瀏覽器向服務器請求一個安全的網頁(通常是 https://)時,服務器就把它的證書和公匙發回來,瀏覽器檢查證書是不是由可以信賴的機構頒發的,確認證書有效和此證書是此網站的。
接著,瀏覽器使用公鑰加密了一個隨機對稱密鑰,包括加密的URL一起發送到服務器,服務器用自己的私匙解密了瀏覽器發送的鑰匙。然后用這把對稱加密的鑰匙給你請求的URL鏈接解密。
最后,服務器用你發的對稱鑰匙給你請求的網頁加密。你也有相同的鑰匙就可以解密發回來的網頁了。
ssl提供的服務
1)認證用戶和服務器,確保數據發送到正確的客戶機和服務器; 2)加密數據以防止數據中途被竊??; 3)維護數據的完整性,確保數據在傳輸過程中不被改變。
Openssl
Openssl是ssl的一個,其由三部分組成:
openssl: 多用途的命令行工具 libcrypto: 加密算法庫 libssl:加密模塊應用庫,實現了ssl及tls openssl: 眾多子命令: 標準命令 消息摘要命令(dgst子命令) 加密命令(enc子命令) 標準命令:enc, ca, req, genrsa, ... 對稱加密: 工具:openssl enc, gpg 支持的算法:3des, aes, blowflsh, towflsh
示例:
加密: ~]#openssl enc -e -des3 -a -salt -in fstab -out fstab.cry 解密: ~]#openssl enc -d -des3 -a -salt -out fstab.new -in fstab.cry
可見,加密有“鹽” -a -salt 時,解密必須加-a -salt,否則會解密失敗。但加密時可以省略-a -salt.
單向加密:
工具:openssl dgst,md5sum, sha1sum,sha224sum,...gpgdgst命令: ~]#openssl dgst -md5 /PATH/TO/SOMEFILE
[root@centos7 ~]#openssl dgst -md5 issueMD5(issue)= f078fe086dfc22f64b5dca2e1b95de2c [root@centos7 ~]#
生成用戶密碼:
工具:passwd,openssl passwd openssl passwd -1 -salt SALT
salt的生成–>生成隨機數:
工具:openssl rand ~]# openssl rand -base64 # ~]# openssl rand -hex # ~]#openssl passwd -1 -salt `openssl rand -hex 4`
公鑰加密:
加密解密: 算法:RSA, ELGamal 工具:openssl rsautl, gpg 數字簽名: 算法:RSA, DSA, ELGamal 工具:openssl rsautl, gpg 密鑰交換: 算法:DH
生成密鑰:
生成私鑰: ~]# (umask 077; openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS) 提取公鑰: ~]# openssl rsa -in /tmp/mykey2.private -pubout
MAC: Message Authentication Code,單向加密的一種延伸應用,用于實現網絡通信中保證所傳輸數據的完整性機制。
CBC-MAC HMAC:使用md5或sha1算法
隨機數生成器:random和urandom
鍵盤和鼠標 塊設備中斷 /dev/random:僅從熵池返回隨機數;隨機數用盡,阻塞 /dev/urandom:從熵池返回隨機數;隨機數用盡,會利用軟件生成偽隨機數,非阻塞
熵池:在操作系統上有一個叫做熵池的地址,它是用來保存硬件中斷產生的隨機數,即每一次硬件終端都會產生一個隨機數。
CA認證與管理
CA(Certificate Authority),即認證授權機構,是PKI(Public Key Infrastructure 公鑰基礎設施) 的一個組成部分,PKI包括:
CA:簽證機構 RA:注冊機構 CRL:證書吊銷列表 證書存取庫:請求認證時的資料庫
CA: 保證公鑰數據的安全性
在雙方通信的過程中,數據的加解密依賴于對方的公鑰,因此就需要一種可選機制能夠保證公鑰數據的安全性,這種機制就CA。
CA的公信力:A要跟B進行通信,A將自己的公鑰轉發給B,那么B就需要知道A發過來的公鑰是否為正規的CA頒發,解鈴還須系玲人,我們可通過驗證CA自身的證書就可以了!如何保證CA的公信力,從互聯網上獲得的證書自然不可信任,我們就只能從操作系統上獲得,即系統發生廠商把CA證書做進操作系統里面,在需要的時候直接去比對,如果操作系統中沒有固化的CA證書,則該CA證書是不合法的。
數字證書的獲取
獲取證書的途徑有兩種:花錢向RA注冊購買;創建私有CA
向RA注冊申請的CA通常用于企業環境當中,以滿足業務的要求;而當我們僅僅用于企業內部或個人測試需要時,可用Openssl工具創建私有CA。
我們從火狐瀏覽器上導出一個證書看看:
接下來我們就創建個私有CA吧!
使用OpenSSL創建私有CA的步驟:
1、生成私鑰2、生成自簽證書 (1) 私鑰用于簽發證書時,向證書添加數字簽名使用; (2) 證書:每個通信方都導入此證書至“受信任的證書頒發機構” 涉及的配置文件:/etc/pki/tls/openssl.cnf 工作目錄:/etc/pki/CA
我們以CentOS 7為服務端,以CentOS 6為客戶端。
服務器端:
創建私有CA:
1.創建CA的數據庫索引文件
# touch /etc/pki/CA/{serial,index.txt} # 索引文件 # echo 01 > /etc/pki/CA/serial # 索引文件編號
[root@centos7 ~]#touch /etc/pki/CA/{index.txt,serial} [root@centos7 ~]#echo 01 > /etc/pki/CA/serial [root@centos7 ~]
2.生成私鑰與自簽證書:cakey.pem –> cacert.pem
[root@centos7 ~]#(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) Generating RSA private key, 2048 bit long modulus ...............+++ ........+++ e is 65537 (0x10001) [root@centos7 ~]# [root@centos7 ~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 365
注:在bash命令行上在小括號中執行的命令,其實是通過打開一個子shell進程進行的!
-new: 生成新證書簽署請求; -x509: 專用于CA生成自簽證書; -key: 生成請求時用到的私鑰文件;- days n:證書的有效期限; -out /PATH/TO/SOMECERTFILE: 證書的保存路徑
給節點頒發證書:
客戶端: 1、生成私鑰與證書簽署請求
2、把請求發送給CA
注:a. 其中subject部分要與CA一致; b. Common Name要使用此主機的真實名字
在需要使用證書的主機生成證書請求,譬如給給web服務器生成私鑰
1.生成私鑰與證書簽署請求
[root@centos6 ~]#mkdir /etc/httpd/ssl [root@centos6 ~]#(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048) Generating RSA private key, 2048 bit long modulus .................................................................................................................+++ .......................+++ e is 65537 (0x10001) [root@centos6 ~]# [root@centos6 ~]#openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out /etc/httpd/ssl/httpd.csr
注意證書簽署請求時沒有 -x509選項。且國家、州、公司名必須要一致!
2.把請求發送給CA
[root@centos6 ~]#scp /etc/httpd/ssl/httpd.csr 10.1.1.2:/etc/pki/CA The authenticity of host '10.1.1.2 (10.1.1.2)' can't be established. RSA key fingerprint is de:09:0a:d2:ed:57:96:cf:ee:6d:7b:71:ab:93:fb:c0. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.1.1.2' (RSA) to the list of known hosts. root@10.1.1.2's password: httpd.csr 100% 1424 1.4KB/s 00:00 [root@centos6 ~]#
服務器端:簽發證書
(1) 驗證請求者信息 (2) 簽署證書 (3) 把簽署好的證書還給請求者
1.簽署證書:
[root@centos7 ~]#openssl ca -in /etc/pki/CA/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看簽署的證書:
[root@centos7 ~]#openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -text
2.把簽署好的證書發給請求者
[root@centos7 ~]#scp /etc/pki/CA/certs/httpd.crt 10.1.1.1:/etc/httpd/ssl The authenticity of host '10.1.1.1 (10.1.1.1)' can't be established. RSA key fingerprint is 39:43:7d:e0:79:7f:ca:9c:55:71:99:6d:5b:f3:c3:a3. Are you sure you want to continue connecting (yes/no)? y Please type 'yes' or 'no': yes Warning: Permanently added '10.1.1.1' (RSA) to the list of known hosts. root@10.1.1.1's password: httpd.crt 100% 4627 4.5KB/s 00:00 [root@centos7 ~]#
查看數據庫文件是否更新:
吊銷證書
1.在客戶端獲取要吊銷的證書的serial
[root@centos6 ~]#openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject serial=01 subject= /C=CN/ST=Beijing/O=Liansir.com/OU=leader/CN=centos 6/emailAddress=admin@zhizhan.com [root@centos6 ~]#
2.在CA上,根據客戶提交的serial與subject信息,對比檢驗是否與index.txt文件中的信息一致,然后吊銷證書
[root@centos7 /etc/pki/CA]#openssl ca -revoke certs/httpd.crt Using configuration from /etc/pki/tls/openssl.cnf Revoking Certificate 01. Data Base Updated [root@centos7 /etc/pki/CA]#
查看吊銷證書后的數據庫狀態:
3.生成吊銷證書的編號
[root@centos7 /etc/pki/CA]#touch crlnumber [root@centos7 /etc/pki/CA]#echo 01 > crlnumber
-
更新證書吊銷列表
[root@centos7 /etc/pki/CA]#openssl ca -gencrl -out ./crl/ca.crl Using configuration from /etc/pki/tls/openssl.cnf [root@centos7 /etc/pki/CA]#
后我們來看看CA的相關配置文件:
本文主要介紹了常見加密算法的基本原理與應用,重點是對稱加密與非對稱加密;以及涉及到網絡安全傳輸的ssl服務,重點是ssl握手協議的過程,最后通過實驗創建了一個私有CA的創建、節點如何申請證書及證書的吊銷。
2016.9.21
原創文章,作者:Liansir,如若轉載,請注明出處:http://www.www58058.com/49995