09葵花寶典Openssl和DNS
本節主要介紹網絡上相關數據加密和DNS知識,以及在linux上的實現。
一、常見加解密知識
數據加密是現代網絡應用的基礎之一。加密技術好比人類的衣服,第一實現了抵御自然環境的變化,第二使人類邁向了文明。
通常來講,加密就是使用密鑰K將數據從A變成B,而解密就是將數據從B通過K(或者與K成對的K1)將其還原為A。其中B可以公開,得到B的人,如果沒有密鑰K或者K1,將無法或者A是什么。
有三個方面:對稱加密、單項加密、公鑰加密(非對稱加密),每種加密類型都有其特點和相應的應用場景。
1、對稱加密。
對稱加密使用的加密密鑰和解密密鑰是相同的,即使用K來加密,也使用K來解密。加密方A和解密方B同時擁有密鑰K。在傳輸數據時,雙方必須事先約定好需要使用的密鑰K。 常見的對稱加密算法有:des,3des,AES等
2、單項加密。
單項加密主要是用于提出數據的特征碼或者說指紋信息的。就是將給定的信息A,變成一個固定長度的數據(固定大?。〣,這個B就稱為A的特征碼(指紋)。變化過程成為單項加密。其特點是只要A不變,變化過程使用的算法不變,B就一定不會變。當A有些許的變化時,B就有很大的改變 常見的單項加密算法有:MD5,sha1,sha256等
3、公鑰加密。
公鑰加密也叫非對稱加密,其特點是加密和解密所使用的密鑰是成對出現,加密時使用K,解密時使用與其成對的K1,或者加密時使用K1,解密時使用K。一般而言,我們將K和K1分別稱為私鑰和公鑰。其中,公鑰可通過私鑰導出。
公鑰加密有三個作用:一是加密。它可以像對稱加密一樣,對數據進行加密,但一般而言,公鑰加密的計算量是對稱加密的3個數量級以上,如果用其對大量數據進行加密,效率是非常低的。二是數字簽名。如果用一個公鑰能解密一段數據,那么這段數據必然是用與其對應的私鑰進行加密的,私鑰的擁有著,對其不能否認。第三是密鑰分發。前面說到對稱加密時,加密雙方必須有約定相同的密鑰,并且這個密鑰不能被第三方獲知,否則,加密將沒有意義。公鑰加密,即可實現雙方實時的約定這個密鑰,且密鑰本身并不在信息傳播路徑上傳送。
實現數據加密功能的公鑰加密方法有:RSA,DSA,ElGamal等;實現數字簽名功能的公鑰加密算法有:RSA;實現密鑰分發的公鑰加密方法有:RSA,D-H等。
在公鑰加密算法中,還有一個重要問題,就是公鑰對由誰產生,由誰認證的問題。例如,在數字簽名過程中,使用私鑰對數據進行簽名,那么,這個私鑰由誰來認可,這就是一個認證的過程。通常,在網絡上,有專門的認證機構,它們之間互相信任,然后,由這些認證機構對其他機構和個人簽發證書,證書中包括了該證書的公鑰以及使用人相關的信息,相當于電子身份證一樣。這個專門的認證機構,稱之為CA。在我們練習和某些小規模的生產環境中,需要建立一個私有的CA來簽發證書。
二、openssl工具
下面,介紹Linux上面,使用Openssl工具,來實現數據的對稱加密、單項加密、以及建立私有CA頒發證書等功能。Openssl命令有三類子命令,即標準命令、消息摘要命令(單項加密)、加解密命令,下面分別說明。
openssl工具的配置文件是/etc/pki/tls/openssl.cnf,定義了openssl的相關默認設置,特別是在用openssl創建私有CA時,也定義了其默認設置。
1、對稱加密
]# openssl des3 -e -base64 -in /tmp/fstab -out /tmp/fstab1
使用des3算法,用base64格式,對/tmp/fstab文件進行加密,加密后文件為/tmp/fstab1
]# openssl des3 -d -base64 -in /tmp/fstab1 -out /tmp/fstab1-jie
使用des3算法,對使用base64格式的加密文件/tmp/fstab1進行解密,解密后文件為fstab1-jie
-e 加密(encode) -d 解密(decode) -base64 編碼格式(同-a),-in 指明要加密或解密的文件,-out 指明加密后或解密后的文件。
可選的常見對稱加密算法可用 openssl ? 來查看 Cipher commands
2、單項加密
]# openssl dgst -md5 fstab
MD5(fstab)= f91e11874e54184589b273386c49c81a
可使用md5sum命令來驗證,該命令也是使用md5算法來計算輸入數據的特征碼
]# md5sum fstab
f91e11874e54184589b273386c49c81a fstab
使用-sha1、-sha256等算法選項,與sha1sum、sha256sum等命令相同,即只要輸入數據相同,算法相同,輸出必定相同。
使用openssl的dgst自命令對/tmp/fstab來進行單項加密,使用的單項加密算法為sha256,使用openssl ?來查看可使用的單項加密算法
3、公鑰加密
3-1、生成私鑰
]# openssl genrsa -out /tmp/private.key 1024
但是,通常情況下,私鑰文件是不能被除root以外的用戶讀取的,默認情況下,生成私鑰文件的權限時644,需要將其修改為600,可以這樣操作:
]# (umask 077; openssl genrsa -out /tmp/private.key 1024)
]# ll private.key
-rw-------. 1 root root 887 May 10 22:29 private.key
3-2、生成CA的自簽名證書
CA的自簽名證書,需要一個私鑰,在openssl.cnf文件中,默認私鑰文件存放路徑為:private_key = $dir/private/cakey.pem# The private key,其中,$dir 為/etc/pki/CA
生成的證書文件為:certificate = $dir/cacert.pem # The CA certificate
1、生成私鑰:
]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048
2、生成CA自簽名證書:
]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert/pem
-new 指明這是一個新的證書簽署請求
-x509 outputs a self signed certificate instead of a certificate request,輸出自簽證書
-key 私鑰
-out 自簽證書文件
執行上述命令后,會出現交互式命令行,需要輸入該自簽證書的相關信息,后面請求CA簽署的簽名除
輸入完成后,即可生成CA的自簽證書
創建CA所需的目錄和文件,其中目錄3個,文件2個
mkdir /etc/pki/CA/{certs,newcerts,crr}
touch /etc/pki/CA/{serial,index.txt}
echo 01 > /etc/pki/CA/serial
3、證書請求者生成請求簽名的私鑰,方法同1,
生成證書請求文件:
openssl req -key file/to/private.key -out /file/to/certs.csr
4、使用相應的工具,將請求簽名的私鑰安全拷貝至CA上,如scp命令
scp root@ipaddr:/path/tofile /path/to/dest/file
將ipaddr主機中/path/tofile文件拷貝至本機的/path/to/dest/file中,前面表示源文件,后面表示目標,也可以源是本機,目標是遠程主機。
5、使用ca命令對請求進行簽署
]# openssl ca -in /etc/pki/CA/certs/certs.out -out /etc/pki/CA/newcerts/certs.crt
6、使用openssl x509查看以簽署證書相關信息
]# openssl x509 -in certs.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=SHANNXI/O=xfy/OU=cb/CN=cb.koala.com/emailAddress=admin.koala.com
三、DNS服務
DNS(domain name service)域名服務,是將主機名或域名轉換為IP地址的服務,或者反過來講ip地址轉換為主機名或域名。因為人類不容易記憶IP地址,而容易記憶與訪問相關的名字。
DNS有2種解析分類,一種是主機名(域名)到IP的解析,稱為正向解析,相應的解析域稱為正向域。另一種是IP到主機名(域名)的解析,稱為反向解析,對應的解析域稱為方向域。
域名是層次或者說層級結構,有根,頂級域,二級域等等。
根用點 . 來表示,頂級域有.com .mil .org .gov .edu 等,后面有增加了國家域(地區域),如 .cn .hk 等
一個完整的主機名,如www.haidu.com,稱為FQDN,即Full Qualified Domain Name
DNS解析,有兩種方法,一種叫迭代,另一種叫遞歸。所謂迭代,就是,當客戶端向服務器端請求查詢某個域名時,服務器端如果不負責該域名的解析(或者沒有這個域名的解析結果),會返回給客戶端一個結果,該結果指明了客戶端應該向那個服務器去請求解析該域名,然后客戶端再去向指向的服務器去請求;指向的服務器根據其配置,返回解析結果或再回合一個指向服務器,讓客戶端去請求解析,直至解析成功或返回錯誤結果。所謂遞歸,是指客戶端向某服務器發出請求后,該服務器通過向其他服務器查詢,得到解析結果或錯誤結果,直接返回給客戶端。可以看出區別就是,迭代查詢,客戶端可能查詢一次或多次才能得到結果,而遞歸查詢,客戶端只需一次查詢,就可以得到結果。
在互聯網上的DNS解析服務,通常是客戶端到其指向的服務器間,是迭代查詢,即客戶端只需向DNS服務器發出DNS請求,服務器通過迭代或遞歸的方式得到結果后,最后返回給客戶端查詢結果。而服務器在查詢時,一般采用迭代,先向根服務器發出請求,然后根據根的相應,迭代出結果。
1、bind
在Linux上,使用的DNS服務端程序叫bind(berkeley Internet name domain ),對應的進程為named。下面介紹bind程序的配置和使用。
1-1、bind程序主配置文件。
主配置文件為/etc/named.conf,通過該文件中的include指令,將其他配置區域配置文件包含進來
在主配置文件中,options段需要特別注意:一是監聽端口,應該監聽在該機提供DNS服務的地址的53號端口上;二是directory,指明了主目錄,后面相關的配置,都是在這個主目錄下的(/var/named);三是allow-query 允許查詢,根據情況改為可查詢的地址;四是recursion,即允許該服務器為哪些地址進行遞歸查詢,這個應該只允許公司內部網段的機器。還有兩個安全選項:dnssec-enable和dnssec-validation 一般都設為no
在次配置文件/etc/named.rfc1912.zones中,主要定義了一些解析區域,如localhost.localdomain 以及一個反向的解析區域。
由于反向解析域用的較少,這里只介紹正向解析域的相關配置
對于正向解析域的定義,一般遵循以下格式:
zone "ZONE_NAME" IN {
type master|slave|stub|hint|forward;
file "file/to/zonefile";
allow-transfer { 192.168.1.181; };
};
ZONE_NAME 指明該區域的名字,如二級域名magedu.com type 該區域的類型,有master(主),slave(從),hint(根),forward(只轉發)等 file 說明該區域所定義的域名解析存放域名與地址間對應關系的文件,可以認為是數據庫 allow-transfer 當該區域是主區域是,允許那個地址上的從服務器來同步該區域的信息。
1-2、下來看區域文件如何定義
區域文件是一條一條的域名和IP地址的對應關系,基本需要有以下幾個組成部分
name [TTL] IN rr_type value 其中 TTL值是time to live 生存時間,指該記錄被其他主機查詢到后,可在其他主機上緩存的時間 rr_type resource record type 有以下幾種類型,SOA start of authority 起始記錄(每個區域文件的必須以一個SOA記錄起始);A address 即域名至ip地址的解析;NS name server 指該記錄是一個域名服務器記錄 AAAA 域名到IPv6地址的解析;MX 郵件服務器;CNAME 別名記錄 記錄 PTR反解記錄,即ip地址到域名的解析記錄。
SOA記錄 name 和區域定義中的ZONE_NAME一致 TTL 可在SOA記錄前,使用$TTL 來統一定義,默認時間為s 可使用單位是H M D等 IN 規定格式,必須有 rr_type SOA value值包括 該區域域名 管理員郵件地址(@符合需要用.代替,因為@在區域文件中代表區域名) 相關數據定義 包括 serial_num(序列號) freshtime(刷新時間) retrytime(重試時間) deadtime(死亡時間) negotiatetime(否定回答重試時間)
MX 記錄 name 郵件服務器的域名 rr_type MX priority 郵件服務器的優先級(0-100),越小越優先 value FQDN 一個MX記錄,需要有一個與其FQDN對應的A記錄
A記錄 name 一般為FQDN rr_type A value ip地址
NS記錄
name 域名 rr_type NS value FQDN 一個NS記錄需要有一個與其FQDN對應的A記錄
CNAME記錄 name 域名 rr_type CNAME value 域名
下面以一個例子來說明區域文件的定義和格式
$TTL 1D
@ IN SOA @ koala.com. (
3; serial
1D; refresh
12H; retry
3H; expire
3D; min
)
IN NS ns1.koala.com.
IN NS ns2.koala.com.
fin IN NS ns1.fin.koala.com.
ns2 IN A 192.168.1.181
ns1 IN A 192.168.1.180
web IN A 192.168.1.180
ns1.fin IN A 192.168.1.187
$TTL 1D 全局定義該區域文件中的所有記錄在查詢主機上的緩存有效時間 @ 代表該區域,和named配置文件中的ZONE_NAME一樣 必須以SOA記錄開始 SOA記錄中()內的值,分別是序列號,刷新時間、重試時間、死亡時間、否定回答過期時間
如果下一條記錄沒有name值,則隱含表示該name值是繼承上一條的name值
在FQDN中可使用兩種格式:一種是全格式,全格式的域名必須以.結尾;一種是簡化格式,簡化格式一定不能以點結尾,如上例中的fin,轉換為全格式為:fin.koala.com. 主意,后面必須有.
3、安裝配置:
安裝 配置好yum源后,使用yum install bind 來安裝,
更改主配置文件,主要該監聽ip地址,allow-query地址,recursive 還有dnssec等內容
默認安裝好后,使用systemctl start named.service來啟動DNS服務 named進程監聽在TCP UDP的53端口 可使用ss -tan命令來查看53端口是否啟動
3-1、配置一個簡單的域
1、在/etc/named.rfc1912.zones中添加域定義文件,
2、根據上面域文件中定義的域數據文件位置,創建一個域記錄文件,即以SOA記錄開頭的文件 域類型可定義為master
3-2、配置第一步定義的DNS域的從域
對于DNS而言,主從關系只是域層面上的,一個DNS可以有多個域,說主從,只是說是哪個域是主域,哪個域是從域,而不是服務器級別的
定義一個從域,需要兩個步驟:
1、依據配置簡單域的方法,配置一個DNS域,域類型必須為master 在域定義文件中,可是用 allow-transfer { IPaddr } 來限制那些地址的DNS服務器中的域可以稱為次域的從域,以上都在設置為主域的DNS上配置。
2、在設置為從域的DNS上 首先配置一個和主域ZONE_NAME 相同的域定義文件,該文件中 配置與主域文件不同地方如下: type slave 說明這是從域 masters { ipaddr } 主域服務器的地址 其余可以不用配置
可以使用 named-checkconf來檢查配置文件是否正確 使用named-checkzone ZONE_NAME /path/to/zonefile來檢查區域文件是否正確
使用dig -t TYPE(rr_type) typevalue @ip 來測試,也可以使用host命令來測試
3-3、配置子域授權
即在當前域下,再配置一個子域,配置方法如下:
1、在父域的域記錄文件中,首先定義一個NS記錄,該NS記錄的name為自域的名稱,value為該自域DNS服務器的FQDN (根據前面描述,該NS記錄,必須有一個與之對應的A記錄,來指向該自域DNS的服務器) 2、在子域中,如配置一個簡單的DNS域一樣,配置好該域的域定義文件和域記錄文件即可。
以上修改完配置文件,需要重新啟動named服務或者重新加載配置文件,可使用systemctl 或者rndc reload
named服務還可以實現acl控制,view試圖等功能,結合起來可實現,對于不同的解析請求,根據請求者的ip不同,返回不同的解析地址。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98672