Linux 加密安全和私有CA的搭建方法

2022-07-26 18:00:16

常用安全技術

3A:

  • 認證:身份確認
  • 授權:許可權分配
  • 審計:監控做了什麼

安全通訊

加密演演算法和協定

  • 對稱加密:

  • 非對稱加密

  • 單向加密:雜湊(hash)加密

  • 認證協定

對稱加密:

  • 加密和解密使用的是同一個金鑰

  • 是通過將原始資料分割成若干塊來逐個進行加密

  • 特點:效率高、速度快

  • 缺點:加密解密使用的金鑰相同,需要提前把金鑰發給別人且不能確定資料來自於傳送方。

常見的對稱加密演演算法:

  • DES:56位加密,把資料切成56Bit一塊來進行加密

  • 3DES:DES的方式加密三次

  • AES:高階加密標準,金鑰長度是可變的。 (128, 192, 256bits)

  • Blowfish,Twofish

  • IDEA,RC6,CAST5

非對稱加密演演算法:

  • 金鑰成對出現,加密和解密用的金鑰不相同

  • 通訊雙方都需要各自的金鑰和私鑰

  • 特點:公鑰加密、私鑰解密,可以確認資料的來源

公鑰:public key,公開給所有人,

私鑰:secret key,private key  私有的,必須保證其私密性,用於自已加密簽名
可以使用私鑰來加密、也可以使用公鑰來加密。

公鑰和私鑰是成對的,需要使用同一個人的鑰匙才能進行解密

數位簽章:採用私鑰來進行加密、使用公鑰來進行解密。(其他人的到的資料只能使用他的公鑰來解密,這樣就能確定資料的來源性)
非對稱加密的兩種使用場景:
資料安全:加密的資料只有自己能解開 --- 公鑰加密、私鑰解密

資料來源確認:確定資料的來源性 --- 私鑰加密、公鑰解密(實現數位簽章)

缺陷:複雜程度高

常見的非對稱加密常見演演算法:

  • RSA:三個發明人首字母簡稱。加密和數位簽章都可以實現

  • DSA(Digital Signature Algorithm):數位簽章演演算法,只能做來源確認,不能做資料加密。

  • ECC:橢圓曲線密碼編碼學,比RSA加密演演算法使用更小的金鑰,提供相當的或更高等級的安全

對稱加密演演算法適合加密大的資料

非對稱加密演演算法合適加密小的資料

雜湊(hash)演演算法

  • 雜湊演演算法又稱為雜湊演演算法,是一種單向的加密演演算法,是不可逆的。

  • 雜湊演演算法算出來的結果叫做摘要(digest)。

  • 雜湊演演算法固定時,摘要的長度是固定的大小,內容不同。摘要的內容由資料決定。

  • 通過摘要無法推出原有資料的內容

使用場景:
雜湊演演算法:用來確認資料的完整性
	類似於指紋,人不同,指紋就不同。得到指紋但是不知道他是誰。
	可以用來檢查資料是否被篡改,因為資料不變,摘要也不會發生改變。

常用的雜湊演演算法

  • md5: 摘要是128bits字元 已經被破解了

  • sha1: 摘要是160bits字元 已經被破解了

  • sha224、sha256、sha384、sha512

兩個賬號的密碼一樣,但是得到的雜湊摘要不一樣,這是因為為了保證資訊的安全,在加密密碼之前加鹽(隨機字串)處理,然後再進行加密。這樣就保證了同樣的密碼,生成的雜湊摘要不一樣的原因。1

演演算法的組合使用

資料加密的實現

  • 採用對稱和非對稱金鑰的組合使用。

  • 實現資料加密,無法驗證資料完整性和來源

張三先使用對稱加密來加密資料檔案,然後使用李四的公鑰來加密這個對稱加密的金鑰檔案。最後把這兩個檔案發給李四。

李四收到這兩個檔案後,先使用自己的私鑰解密加密的金鑰檔案得到對稱加密的金鑰,最後使用這個金鑰來解密資料。

數位簽章的實現

不加密資料,可以保證資料來源的可靠性、資料的完整性和一致性

張三先使用雜湊演演算法得到一個摘要,摘要放在資料的後面,然後使用私鑰來加密這個摘要資訊(資料沒加密)。然後把資料和數位簽章發給李四。

李四通過張三的公鑰來解密得到加密的摘要資訊,然後再對資料使用相同的雜湊演演算法來進行加密。

最後對比兩個摘要是不是一樣。一樣就確定了資料是張三發來的。

加密和簽名的實現

即實現資料加密,又可以保證資料來源的可靠性、資料的完整性和一致性
方法一:使用這種方法實現,如果資料很大的話。效率就會很低

張三加密過程:先把資料使用雜湊演演算法得到一個摘要,然後使用私鑰進行加密得到簽名。把資料放在這個簽名的後面。
然後再使用接受者的公鑰將他們進行加密。

李四解密過程:首先使用自己的私鑰進行解開得到裡面的簽名和資料。然後使用同樣的雜湊演演算法對資料進行加密,並且使用張三的公鑰將張三傳送過來的摘要解密

最後對比兩個摘要是都相同。

方法二:三種加密演演算法的綜合使用

張三先使用雜湊演演算法將資料進行加密,將得到的摘要資訊附加到資料後面,在使用自己的私鑰加密摘要資訊的到數位簽章。
然後使用對稱加密的方式將他們全部加密,再使用李四的公鑰來加密這個對稱金鑰檔案。

李四得到資料以後,首先通過自己私鑰解密得到對稱金鑰,然後再進行對稱解密得到資料和張三的數位簽章。
再通過張三的公鑰來解密這個簽名得到張三生成的摘要資訊。再通過同樣的雜湊演演算法生成一個摘要。對比兩個摘要是否一樣。

金鑰交換

  • 方法一:對稱金鑰發給對方:使用對方的公鑰加密,對方使用私鑰來進行解密。

  • 方法二:DH演演算法:生成對稱(對談)金鑰

CA和證書

  • PKI:Public Key Infrastructure 公共金鑰加密體系

  • 簽證機構:CA(Certificate Authority),

  • 序號產生器構:RA

  • 證書吊銷列表:CRL,存放被吊銷了的證書

CA的證書頒發過程:

A、B直接把公鑰傳送給對方,因為存在中間人攻擊,所以誰也不敢信。後面就需要一個權威機構來進行擔保。

A、B的公鑰通過認證機構CA進行簽名(私鑰加密),簽名完以後加入一些其他資訊,比如有限期、說明資訊等。這樣就行成了一個證書。

例如A和B需要通訊的時候,A就把自己的證書傳送給通訊的對方,B得到這個證書以後,通過CA公鑰的解密得到了A的公鑰。

根CA會給子CA頒發證書,子CA再給使用者頒發證書。

例如:B想要解開A傳送給他的證書,就需要拿到CA1的公鑰,因為CA1的證書是根CA給的,所以根CA就有CA1的公鑰。B利用根CA個CA1頒發的證書,間接就得到了CA1的公鑰,就可以解開A的證書。

#任何一個主機(windows)都有最根上面的根CA的證書。(系統安裝以後就自帶的)

加密相關的一些安全協定

安全協定SSL\TLS

  • SSL:安全通訊協定,後來改名為TLS協定。

  • TLS: Transport Layer Security(傳輸層安全性協定),裡面整合和很多功能。

  • TLS是一個通用的協定,可以實現各種不加密協定的加密。

  • TLS協定的作用:用於在兩個通訊應用程式之間提供保密性和資料完整性

HTTPS協定

http協定是不加密的,http協定+TLS協定就是https協定

HTTPS的通訊過程:

伺服器端設定:會向指定CA組織申請證書

使用者端傳送https請求

伺服器將自己的證書傳送給使用者端

使用者端校驗證書的有效性(是否是權威CA頒發、是否過期等)

如果校驗通過,使用者端就使用伺服器端的公鑰(伺服器端傳送過來的證書中有)生成一個隨機的key傳送給伺服器端

伺服器端使用自己的私鑰來解密得到這個key

後面雙方就可以使用這個key(對稱金鑰來進行資料的傳輸)

openssl

  • openssl是一個開放原始碼的軟體庫包。

  • 應用程式可以使用這個包來實現資料加密、身份確認等功能。

  • 這個包廣泛被應用在網際網路的網頁伺服器上

openssl軟體包的元件:
libcrypto:用於實現加密和解密的庫

libssl:用於實現ssl通訊協定的安全庫

openssl:多用途命令列工具  #最長用的一個元件,裡面的核心工具:openssl

Base64編碼

作用:實現編碼轉換的作用。實現把ascii碼中不可見的字元轉換為可見的字元

ascii中可見的字元有64個

ascii碼可見的字元:aA-zZ 0-9 = / 26+26+10+2=64

openssl命令

  • 互動式(預設)

  • 批次處理:

檢視openssl的版本

互動式:
[root@ubuntu1804 ~]#openssl
OpenSSL> version

批次處理式:
root@ubuntu2004:~# openssl version
openssl命令實現對稱加密

enc:對稱加密演演算法工具,實現對稱加密和解密

#命令格式
openssl enc -e -des3 -a -salt -in 需要加密的檔案 -out 加密後的檔案

-e:表示加密

-des3:表示使用3des這種非對稱加密演演算法

-a:表示使用Base64進行編碼轉換

-salt:表示加鹽

-in:表示需要加密的檔案

-out:後面存放加密生成的結果的檔案

解密:把-e換成-d就行了
openssl enc -d -des3 -a -salt -in testfile.cipher -out testfile

-d:表示解密
openssl實現單向雜湊加密

dgst:用於資料摘要,摘要就是使用雜湊演演算法單項加密得到的。

#格式
openssl  使用的加密演演算法 需要加密的檔案  #dgst可以省略

例如:openssl sha512 filename

#或者使用sha1sum| sha256sum | sha512sum  filename 得到的值是一樣的,因為他們使用的演演算法是一樣的。

[root@vms88 ~]# sha1sum aa
f572d396fae9206628714fb2ce00f72e94f2258f  aa
[root@vms88 ~]# openssl sha1 aa
SHA1(aa)= f572d396fae9206628714fb2ce00f72e94f2258f

雜湊演演算法:md5, sha1, sha256,sha512…
openssl 命令生成使用者密碼

passwd:生成雜湊密碼。生成各種口令密文

格式:
openssl passwd --help

例如: openssl passwd -6  #會要求輸入兩次密碼且會自動新增對應的鹽,也可以人為指定鹽

#CentOS7也可以使用python來生成sha512加密的口令:

-6:表示採用sha512這種加密算嗎(Centos7上面沒有)
-5:sha256演演算法
-1:md5演演算法
openssl 生成亂數

rand:生成隨機位元組

/dev/random:結合硬體資訊來生成字元。亂數用光了就會阻塞程式的執行

/dev/urandom:亂數也是來自硬體,亂數用光了會用軟體模擬生成偽亂數。不會阻塞執行。
#使用rand子命令來實現亂數的生成。

格式:
openssl rand -base64|-hex NUM

NUM: 表示位元組數,使用-hex,每個字元為十六進位制,相當於4位元二進位制,出現的字元數為NUM*2

openssl rand -base64 10  隨機生成一個10個位元組的符號(位元組不是3的整數倍就會出現等號的情況,=號是用來佔位的,四個位元組一組)
範例:隨機生成十個使用者,每個使用者分配一個隨機的密碼。
#!/bin/bash
for i in {1..10};do  #{1..10}表示生成1..10的一個數位列表
	 id user$i  &> /dev/null || useradd user$i #使用id命令檢視使用者是否存在,不存在就建立這個使用者
         passwd=`openssl rand -base64 10` #獲取到一個隨機密碼
	 echo $passwd | passwd user$i --stdin &> /dev/null #給生成的使用者指定密碼
	 echo user$i:$passwd >> user.txt #將密碼儲存到一個指定檔案
done

openssl命令實現 PKI

PKI:Public Key Infrastructure 公共金鑰加密體系

生成私鑰:

openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE [指定的對稱加密演演算法]  [NUM_BITS,預設2048]

-out:表示生成私鑰的輸出檔名

# 也可以給生成的私鑰進行堆成加密

對稱加密演演算法:man genrsa
-aes128, -aes192, -aes256, -aria128, -aria192, -aria256, -camellia128, -camellia192, -camellia256, -des, -des3, -idea

解密加密了的私鑰

如果在生成私鑰的時候採用堆成加密的方法加密了,解密的方法是:

#格式

openssl rsa -in 加密了的私鑰檔案 -out 解密後的檔案
公鑰是隱藏在私鑰內部的,可以通過私鑰的到公鑰。
#從私鑰中提取出公鑰

openssl rsa -in 私鑰檔案 -pubout -out 提取出來儲存的公鑰檔案

建立私有CA實現證書申請頒發

建立私有CA的工具:

  • OpenCA

  • openssl

openssl的組態檔

/etc/pki/tls/openssl.cnf

openssl的這個組態檔主要是設定CA證書頒發和申請的一些設定資訊。

組態檔說明
[ ca ]
default_ca      = CA_default            # 預設使用的CA

####################################################################
[ CA_default ]
dir             = /etc/pki/CA           # 存放和CA相關的檔案的目錄(CentOS7這個檔案預設存在)
certs           = $dir/certs            # 存放頒發的證書  Cert:證書
crl_dir         = $dir/crl              # 存放被吊銷的證書
database        = $dir/index.txt        # 存放ca的索引(需要人為建立)
new_certs_dir   = $dir/newcerts         # 存放新證書的位置
certificate     = $dir/cacert.pem       # ca的自簽名證書
serial          = $dir/serial           # 證書的編號(第一次需要人為建立並編號,後面會自動遞增) serial:連續的
crlnumber       = $dir/crlnumber        # 證書吊銷列表的編號
crl             = $dir/crl.pem          # 證書吊銷列表的檔案
private_key     = $dir/private/cakey.pem# CA的私鑰
x509_extensions = usr_cert              # The extensions to add to the cert
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

policy          = policy_match  #指定使用的匹配策略

# For the CA policy
[ policy_match ]
countryName             = match
stateOrProvinceName     = match
organizationName        = match
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

三種策略:
match匹配:使用者申請證書的時候必須和CA一致(國家,省份,組織)
optional可選
supplied提供

建立私有CA

  • 建立對應檔案

  • 給自己頒發自簽名證書

1.建立CA相關檔案
#建立CA所需要的檔案:資料庫檔案和證書索引檔案
#database        = $dir/index.txt        # database index file.
#serial          = $dir/serial           # The current serial number

#生成證書索引資料庫檔案  只需要建立檔案就行,內容不需要手動維護
touch /etc/pki/CA/index.txt

#指定第一個頒發證書的序列號
echo 01 > /etc/pki/CA/serial
2.給CA頒發自己的證書
(1)生成CA的私鑰
#private_key     = $dir/private/cakey.pem# The private key
cd /etc/pki/CA/
(umask 066; openssl genrsa -out private/cakey.pem 2048)
(2)生成CA的自簽名證書
#certificate     = $dir/cacert.pem
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem

#選項說明
-new:生成新證書籤署請求

-x509:表示證書的格式

-key:生成請求時用到的私鑰檔案

-days n:證書的有效期限

-out /PATH/TO/SOMECERTFILE: 證書的儲存路徑

範例:Centos8搭建私有CA

  • 1.根據openssl對應的組態檔建立對應的檔案

  • 2.建立私鑰檔案

  • 3.生成自簽名證書

#建立對應的檔案(CentOS7上面預設存在)

[root@centos8 ~]#mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
#index.txt和serial檔案在頒發證書時需要使用,所以需要提前建立

[root@centos8 ~]#touch /etc/pki/CA/index.txt
[root@centos8 ~]#echo 01 > /etc/pki/CA/serial
#在指定的位置建立CA的私鑰

[root@centos8 ~]#cd /etc/pki/CA/
[root@centos8 CA]#(umask 066; openssl genrsa -out private/cakey.pem 2048)
#給CA自己頒發自簽名的證書

[root@centos8 ~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days
3650 -out /etc/pki/CA/cacert.pem
#需要互動輸入國家、省、地區、組織等內容

#檢視自簽名證書的資訊
[root@centos8 ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -text

-in:指定輸入的檔案

-noout:不輸出為檔案

-text:以文字方式來進行顯示

使用者實現證書的申請

  • 1.使用者生成證書的私鑰,然後利用這個私鑰完成證書的申請

  • 2.利用這個私鑰檔案來生成證書申請檔案(若是match這種策略。填寫的 國家 省 組織必須一致)

  • 3.將生成的證書申請檔案給CA,由CA頒發證書

採用match這種策略這三個選項必須保持一致,如果採用的是option這種策略的話就不用保持一致都可以
#生成私鑰檔案

[root@centos8 ~]#(umask 066; openssl genrsa -out /data/app1/app1.key 2048)
#私鑰一般使用key作為字尾要標識
#利用私鑰生成證書申請檔案

[root@centos8 ~]#openssl req -new -key /data/app1/app1.key -out /data/app1/app1.csr

#證書申請檔案的字尾一般都是以csr為字尾作為標識

#互動式輸入資訊的時候 國家 省 組織不需要保持一致,其他隨意
#CA通過證書申請檔案來頒發證書
[root@centos8 ~]#openssl ca -in /data/app1/app1.csr -out /etc/pki/CA/certs/app1.crt -days 1000

-in:輸入檔案

-out:輸出檔案

#檢視頒發的證書檔案
openssl x509 -in /etc/pki/CA/certs/app1.crt -noout -text

[root@Centos8 CA]# tree /etc/pki/CA
/etc/pki/CA
├── cacert.pem
├── certs
│   └── app1.crt #生成的證書檔案
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old  #前一個檔案的備份
├── newcerts
│   └── 01.pem #和app1.crt是同一個東西,自動生成的一個備份檔案
├── private
│   └── cakey.pem
├── serial
└── serial.old

#serial:存放的是下一個證書的證書編號
#檢視證書的有效性
openssl ca -status 01  #01就是這個證書的標號
將證書相關檔案傳送到使用者端使用
#cp /etc/pki/CA/certs/app1.crt /data/app1/ #放到使用者端的指定位置
字尾規定:
.crt #證書檔案的標識

.csr #證書申請檔案的標識  證書申請完成後,這個證書申請檔案就沒啥用了

.key #私鑰的標識  .pem也是私鑰的標識,但是windows不是別pem結尾的檔案

一個證書申請檔案只能申請一次證書。
實現一個申請檔案申請多個證書的方法;

[root@Centos8 CA]# cat index.txt.attr
unique_subject = yes  #把yes變為no就可以了

證書的吊銷

例如:
openssl ca -revoke /etc/pki/CA/newcerts/11.pem 

# 11.pem檔案標識要吊銷的證書檔案。


#檢視證書的狀態 從index這個檔案也能看出來  V:標識生效的   R:標識無效的證書
openssl ca -status 11

生成證書吊銷列表檔案

公開被吊銷的檔案。其他使用者可以獲取已經吊銷了的證書檔案列表

#需要建立一個clinumer檔案才可以  吊銷證書也需要一個吊銷證書的number 類似於index.txt

#這個檔案預設不存在,需要手動建立出來

echo 01 > /etc/pki/CA/crlnumber

openssl ca -gencrl -out /etc/pki/CA/crl.pem   #證書吊銷檔案的路徑是約定好的