概述:
所有業務的正常運轉,離不開一個安全的運行環境,系統安全性直接關系到業務穩定、可靠、以及可用性,本章就介紹一些系統安全相關的話題,具體包括:
1、加密基礎概念
2、CA和證書的基礎概念
3、ssl協議和openssl命令
4、利用openssl建立私有CA,完成證書頒發和管理
5、利用gpg實現加解密
6、ssh服務
7、dropbear提供ssh服務
8、aide監控文件安全性
9、sudo相關內容
第一章 加密基礎相關概念
1、安全的目標:
保密性:confidentiality
完整性:integrity
可用性:availability
2、攻擊類型:
威脅保密性的攻擊:竊聽,通信量分析
威脅完整性的攻擊:更改,偽裝,重放,否認
威脅可用性的攻擊:拒絕服務(DoS)
3、為了完成安全的目標用到的解決方案
技術:加密和解密
加密和解密:
傳統加密方法:替代加密方法,置換加密方法
現代加密方法:現代塊加密方法
服務:用于低于攻擊的服務,也就是為了上述安全目標而特地設計的安全服務
服務:
認證機制
訪問控制機制
4、對稱加密
對稱加密:加密和解密使用同一個秘鑰;但加密算法和解密算法可能不同
工作過程為:
發送者將發送的數據利用秘鑰,使用加密的算法加密成明文,發送給對方;接收方收到加密的數據后,利用同一個秘鑰,和解密的算法,將數據由密文解密成明文
常見的對稱加密算法:
DES:Data Encryption Standard,56位秘鑰
3DES:Triple DES
AES:Advanced Encryption Standard,支持128位、192位、256位、384位秘鑰
Blowfish
Twofish
RC6
CAST5
對稱加密特性:
<1>加密解密使用同一個秘鑰
<2>將原始數據分隔成為固定大小塊,逐個進行加密
對稱加密的缺陷:
<1>秘鑰過多
<2>秘鑰分發困難
<3>數據來源無法確認
5、公鑰加密(非對稱加密):秘鑰分為公鑰和與之配對的私鑰
公鑰:公鑰從私鑰中提取產生,可以公開給所有人;pubkey
私鑰:通過工具創建,私鑰只能使用則自己留存,必須保證其私密性,secret key
特點:用公鑰加密的數據,只能使用與之配對的私鑰解密;反之,用私鑰加密的數據只能用與之配對的公鑰解密
用途:
數字簽名:主要在于讓接收方確認發送方的身份。將數據用單項加密(MD5、SHA)算法,得出來的特征碼,用自己的私鑰進行加密,這就是數字簽名
秘鑰交換:發送方用對方的公鑰加密一個對稱加密的秘鑰,并發送給對方,以實現秘鑰交換
數據加密:一般很少用公鑰加密發送的數據本身,因為公鑰加密的加密效率很低,因此一般用對稱秘鑰加密要發送的數據本身
公鑰機密的工作模式:
模式一:公鑰加密,私鑰解密
B將數據發送給A,B就拿A的公鑰對數據進行加密,然后將加密后的數據發送給A,那此時,加密后的數據只能被A的私鑰進行解密,因此,即使有第三方拿到加密的數據,也無法完成解密,只有A自己有自己的私鑰,因此實現了數據的保密性
模式二:私鑰加密,公鑰解密
A用自己的私鑰加密一份數據給B,加密后的數據只能被A的公鑰進行解密,因此,如果有第三方拿到加密后的數據,是能夠解密的,因為A的公鑰是公開的,任何人都可以拿到,因此可以解密
但此種方式的作用,并不是真正拿來加密數據,而是用來進行身份驗證(數字簽名),也就是說,A用自己的私鑰加密一段數據(數據不是要發送的數據本身,而是要加密數據利用單向加密算法得出來的特征碼),然后發送給B,B拿A的私鑰進行解密,能夠解密成功,就證明發送方一定是A,因為只有A的公鑰能解開A的私鑰;一旦解開數據后,得到的就是要發送數據的特征碼,等后面真正發送數據后,可以利用該段特征碼,來驗證數據的完整性
公鑰加密的常用的算法:
RSA:既能實現數字簽名,也能實現加解密
DSA:有時也被稱為DSS,數字簽名標準。僅能實現數字簽名,不能實現加解密
6、單向加密:只能加密,不能解密。僅能提取數據的特征碼
特性:
定長輸出:無論原始數據多大,得出的特征碼都是固定長度的
雪崩效應:原始數據的微小改變,將導致特征碼的巨大變化
功能:主要用來實現驗證數據的完整性
常見的單向加密算法:
MD5:Message Digest 5 消息摘要,5版本。128bit定長輸出
SHA1:Secure Hash Algorithm 1,160位定長輸出
SHA224、SHA256、SHA384、SHA512
7、秘鑰交換:IKE(Internet Key Exchange)
常見的交換算法:
公鑰加密:用對方的公鑰加密對稱秘鑰,這樣對方就能以自己的私鑰解開,從而獲得對稱加密的秘鑰
DH(Deffie-Hellman)算法:
<1> A: a,p 協商生成公開的整數a, 大素數p
B: a,p
<2> A:生成隱私數據 x, (x<p ),計算得出 a^x%p,發送給B
B:生成隱私數據 y,計算得出 a^y%p,發送給A
<3> A:計算得出 ( a^y%p) ^x = a^xy%p, 生成為密鑰
B:計算得出 ( a^x%p) ^y = a^xy%p, 生成為密鑰
8、加密通信的雙方的通信過程展示
A有一段數據要發送給B,A就用單向加密的算法計算出數據的特征碼,而后A用自己的私鑰加密這段特征碼,生成數字簽名,至此能夠保證數據的完整性(通過比對特征碼),和身份驗證(數字簽名),但是不能保證數據的保密性,因為數據本身還沒被加密。
因此,A會繼續在原有數據和數字簽名的基礎上,生成一個一次性的對稱加密秘鑰,然后利用對稱加密算法結合秘鑰,去加密原有數據和數字簽名。然后,A用B的公鑰,對對稱加密的秘鑰進行加密,并附加到之前利用對稱加密算法生成的數據的后面,然后發送給B
當B收到數據后,就用B自己的私鑰解密附加在后面的對稱加密的秘鑰,從而得到了對稱加密的秘鑰(這就完成了秘鑰交換,實際是雙方都知道了對稱加密的秘鑰的過程就是秘鑰交換),然后利用對稱加密的秘鑰進一步解開數據和數字簽名,然后利用A的公鑰解開數字簽名,得到數據本身的特征碼,然后利用同樣的單項加密算法,計算出收到的數據的特征碼,然后比對特征碼,從而驗證數據的完整性
9、中間人攻擊:
以上通信過程中還是有一個嚴重的漏洞,就是當A和B鍵從來沒進行過通信,那么A怎么獲知B的公鑰,或者B怎么獲知A的公鑰。假設當A沒B的公鑰時,向B發送請求,要求獲知B的公鑰,但是此時,如果有第三方C獲取到請求后,冒充自己就是B,然后將C自己的公鑰發送給A,A就認為C就是B。而C又會冒充自己是A,向B進行通信,從而也獲取了真正B的公鑰,而此后A和B通信的過程中,就都會交由C,數據的安全性就無從保障。這種情況就是中間人攻擊
第二章 CA的和證書的基礎概念
1、PKI:Public Key Infranstructure公鑰基礎設施
由四個部分組成:
簽證機構:CA機構
注冊機構:RA,相當于CA的派出機構,用于接收注冊申請
證書吊銷列表:CRL
證書存取庫:CB
2、CA的作用
CA:保證通信雙方,能夠可靠的拿到對方的公鑰(避免中間人攻擊),而設定的雙方都信任的第三方可信機構
A將自己的公鑰提請給CA,CA經過特殊的防偽處理后,將處理后的A的公鑰發送給A,處理過后的A的公鑰就稱之為CA證書。以后,如果B如果請求要A的公鑰,那么A就將CA證書發送給B,當B拿到證書后,不會立馬就任何該證書,而是要驗證該證書是否是合法的,還要驗證是否是B信任的CA機構頒發的,驗證完了之后,才會認可
CA證書一般會包含:提請證書的人的名稱,提請人的公鑰,證書有效期,然后CA機構會用自己的私鑰,加密以上的一整段數據的特征碼,然后將加密后的特征碼(也就是數字簽名)附加在數據之后,這個整體就是CA證書
CA證書后面有CA機構用CA機構自己的私鑰對證書內容部分的特征碼加密的數據,通信方要解開此數字簽名就需要用到CA自身的公鑰,但是如何獲取到CA機構自己的公鑰,如果直接申請,那么此時又會存在中間人攻擊的可能,因此,一般是CA機構會給自己發一個CA證書,然后獲取CA自身的證書,一般不能通過網絡發送,因此一般情況下,是線下交易
3、CA證書格式:
X.509,定義證書結構和認證協議的標準,在X.509的標準中,定義了證書需要具備的結構:
版本號:是X.509的v1還是v2還是v3版本
序列號:CA機構所發出的證書的序列號
簽名算法ID:證書所使用的算法
發行者的名稱:CA機構自己的名稱
證書有效期限
主體名稱:提請CA證書的用戶的名稱
主體公鑰:
發行者的唯一標識:CA機構的ID
主體的唯一標識:提請者的ID
擴展信息
發行者的簽名:CA機構利用自己的私鑰對以上內容的特征碼加密,生成的數字簽名,將數字簽名附加在證書內容之后,作為證書的一部分
第三章 ssl協議和openssl命令
1、SSL協議:SSL和TLS
SSL:安全套接字層,由Netscape發布于1994年,分為V1.0、V2.0、V3.0但由于其版權屬于Netscape公司,且各版本均被爆出有協議漏洞,因此使用的不多
TLS:Transport Layer Security,傳輸層安全,是國際互聯網工程師協會發布的類似于SSL的協議,其分為V1.0、V1.1、V1.2、V1.3的版本,使用較多的是V1.2的版本
2、TLS的分層設計:
<1>最底層:基礎算法的原語的實現,如AES、RSA、MD5
<2>向上一層:各種算法的實現,也就是算法的具體實現的方式
<3>再向上一層:組合算法實現的半成品
<4>最高層:用各種組件拼裝而成的各種成品密碼學協議軟件;
3、SSL協議的開源實現:OpenSSL
OpenSSL由三部分組成:
libencrypt庫:加密解密庫,專用于實現加密解密功能,主要由開發人員使用
libssl庫:用于實現ssl安全通信機制的庫,主要由開發人員使用
openssl多用途命令行工具:openssl
4、SSL會話的主要的三步:
客戶端向服務器端所要并驗證證書(證書里面有服務器端的公鑰信息);
雙方協商生成對稱秘鑰;
雙方采用對稱秘鑰,進行加密通信的過程
會話過程后,進行斷開
5、在SSL會話之前開始之前的雙方Handshake Protocol,SSL握手階段的執行流程
也就是雙方在正式開始SSL會話之前的通信前商量加密算法和生成會話秘鑰階段的詳細過程介紹,(以HTTPS協議為例)
<1>第一階段:client-hello
客戶端向服務器端發送:
支持的協議版本,如:tls1.2
客戶端生成一個隨機數,用于稍后生成對稱秘鑰
支持的加密算法,比如AES、RSA、SHA
支持的壓縮算法
<2>第二階段:server-hello
服務器端向客戶端發送:
確認使用的加密通信的協議版本,如tls1.2
生成一個隨機數,用于稍后生成對稱秘鑰
確認使用的加密算法
向客戶端發送服務器證書
如果有必要,有可能會向客戶端索要客戶端的證書(如:當客戶端請求的是網銀頁面時)
<3>第三階段:客戶端收到服務器端的server-hello后給出的回應
驗證服務器證書,如果沒問題,則通過解密證書獲取到服務器的公鑰;
驗證的內容:
發證機構:驗證發證機構是否是可信的,也就是驗證證書簽名(CA的數字簽名)
證書的完整性,也是驗證證書的數字簽名里面的解密出來的特征碼
證書的持有者:驗證證書里面的持有者是否與要訪問的頁面是一致的
證書有效期
證書是否被吊銷
發送以下信息給服務器端:
一個隨機數,用于生成對稱秘鑰
編碼變更通知:表示隨后的信息都將用雙方商定的加密方法和秘鑰發送
客戶端握手結束通知:表示客戶端在正式通信前的握手階段結束
<4>第四階段:服務器端
收到客戶端發來的最后一個隨機數后,利用含此隨機數在內的一共三個隨機數生成對稱秘鑰;
向客戶端發送以下信息:
編碼變更通知:表示隨后的信息都將用雙方商定的加密方法和秘鑰發送
服務器端握手結束通知:表示服務器端握手階段已經結束
6、基于SSL的通信的實現過程整理總結:
A、B雙方要進行通信時:A為客戶端,B為服務器端
<1>A發送hello信息給B,B接收后,發送hello信息給A,此時為雙方建立通信前的確認,需要協商雙方真正通信時所用到的加密算法,包括單向加密、對稱加密、公鑰加密、秘鑰交換用的方法
<2>A請求B的證書,B于是將自己的證書(CA處理后的公鑰)發送給A
一般情況下,客戶端不會有證書提供給服務器端,因為一方面是證書的使用費使得客戶端不會去用,另一方面客戶端訪問服務器端的時候,一般不會驗證客戶端的身份,比如訪問某網站,網站不會要求客戶端有證書才響應內容給客戶端,而客戶端是要驗證服務器端的證書的,因為為了防止訪問的網站的正確性,防止釣魚網站等。
但有時服務器端也會驗證客戶端的證書,比如當客戶端訪問的是網銀頁面的時候,會驗證證書,當我們去銀行開通網銀的時候,一般會有個加密狗之類的東西,其實里面存儲的就是用戶自己的ca證書,只是一般該ca證書的頒發機構不是市面上公認的CA機構,而是銀行自己建的一個CA簽發機構,僅對自己銀行內部有效
<3>A收到B的證書后,驗證B的證書,如果驗證沒有問題
<4>A驗證B的證書沒問題后,生成一個隨機數,作為對稱加密的秘鑰,A利用雙方之前協商的秘鑰交換算法(假設為公鑰加密),則將此秘鑰用B的公鑰加密后發送給B
<5>B收到A發送過來的密文的秘鑰后,利用自己的私鑰,解密得出對稱加密的秘鑰,然后利用對稱加密的秘鑰和之前協商的對稱加密的算法,給A發送A所請求的數據,進行正常數據的發送
<6>當正常的數據傳輸完成后,A(客戶端)請求通信斷開,服務器也斷開,然后通信終止
7、openssl命令
openssl命令行工具有眾多子命令,主要分為三類:
標準命令:enc、ca、req、genrsa…
消息摘要命令(dgst子命令相關)
加密命令(enc子命令相關)
<1>使用openssl命令行工具完成對稱加密:
工具:openssl enc子命令
支持的算法:aes、des、3des等
enc命令的用法:
openssl enc -CIPHERNAME -e|d -in /PATH/TO/FILE -out /PATH/TO/FILE
選項解釋:
-CIPHERNAME:加密的算法的名稱,可通過openssl –help查看所支持的加密算法的名稱
-e|d:-e表示加密,-d表示解密
-in /PATH/TO/FILE 要加密的文件
-out /PATH/TO/FILE 加密后的文件
-pass STRING 表示對稱加密的秘鑰是什么
-a|-base64 表示以base64文本格式進行編碼,如果不指定,可能是以二進制格式進行編碼
如對/testdir/file1進行對稱加密:
openssl enc -des3 -e -a -salt -in /testdir/file1 -out /testdir/jmfile1 輸入后回車,會要求輸入對稱加密的秘鑰,輸入完成,即可完成加密
-des3表示采用des3的加密算法,-a表示以base64文本格式進行編碼,-salt表示加點雜質
解密上面加密的文件:
openssl enc -des3 -d -a -salt -in /testdir/jmfile1 -out /testdir/file2 輸入后回車,會要求輸入對稱加密的秘鑰,輸入完成,即可完成解密
<2>單向加密
工具:openssl dgst、md5sum、sha1sum、sha256sum…
用法:
md5sum /PATH/TO/FILE
sha1sum /PATH/TO/FILE
openssl dgst -md5|-sha1… /PATH/TO/FILE
<3>生成用戶密碼的命令:
工具:passwd、openssl passwd
例如:
openssl passwd -1 -salt 12345然后回車,會提示要求輸入密碼,輸入完成后,即可生成加密后的密碼
-1 表示使用md5方式加密
-salt STRING表示生成密碼時加入的雜質的內容
-salt后面加的雜質的內容可以用隨機數生成,生成隨機數可以用openssl的子命令生成
openssl passwd -1 -salt `openssl rand -hex 4`
<4>openssl生成隨機數:
工具:openssl rand
用法:openssl rand [-out FILE] [-base64] [-hex] NUM
-out FILE 表示將生成的隨機數保存在某個文件中
-base64 表示使用base64編碼,生成的隨機數后面可能會有=,要去掉=后才是真正的隨機數
-hex 表示使用十六進制數字編碼
NUM 表示生成隨機字符串的長度
如:
openssl rand -base64 10
表示生成一個10個字節的隨機數,采用base64編碼格式進行輸出
openssl rand -hex 10
輸出10個字節的16進制字節長度的隨機數,相當于輸出20個字符
Linux上的隨機數生成器:
/dev/random:僅從熵池中返回隨機數,當隨機數用盡,會阻塞后續請求隨機數的應用
/dev/urandom:從熵池中返回隨機數,隨機數用盡,會利用軟件生成偽隨機數,不會阻塞。偽隨機數不安全
熵池中隨機數的來源:
硬盤I/O中斷時間間隔
鍵盤I/O中斷時間間隔
<5>openssl實現公鑰加密:
加密解密:
支持的算法:RSA、ELGamal
工具:openssl rsautl
數字簽名:
支持的算法:RSA、DSA、ELGamal
工具:openssl rsautl
秘鑰交換
支持的算法:DH、RSA
生成私鑰:(公鑰一般不需要生成,而是自動的會從私鑰中提取產生)
openssl genrsa 512|768|1024|2048…表示生成一個長度為512、768…位的私鑰
openssl genrsa 1024 > /PATH/TO/FILE 表示生成一個1024位的私鑰保存到文件中
openssl genrsa 1024 -out /PATH/TO/FILE 也表示生成一個1024位的私鑰保存到文件中
生成的私鑰文件,不能讓其他人訪問,因此一般要將私鑰文件的權限變成600,為了簡化步驟,可以直接在生成私鑰時就定義其權限,如:
(umask 077;openssl genrsa 1024 -out /PATH/TO/FILE)
用了小括號,相當于在一個子shell中運行,因此此時的子shell的umask設置僅對子shell生效
從私鑰中提取公鑰:一般不用手工提取
openssl rsa -in /PATH/TO/私鑰文件 -pubout
表示從私鑰文件中提取出公鑰
第四章 利用openssl建立私有CA,完成證書頒發和管理
1、openssl配置文件中關于CA的配置段介紹
openssl的配置文件為/etc/pki/tls/openssl.cnf,其中定義了openssl完成CA工作時的相關屬性定義
2、建立私有CA
在確定配置為CA的服務器上生成一個自簽證書,為CA提供所需的目錄及文件即可
步驟:
<1>生成CA自己的私鑰,而在openssl的配置文件中定義了私鑰存放的位置為/etc/pki/CA/private/cakey.pem
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048 )
<2>為CA提供工作所需要的目錄及文件:
mkdir /etc/pki/CA/{certs,crl,newcerts} 注意:如果目錄不存在才創建
touch /etc/pki/CA/{serial,index.txt}
echo 01 >>/etc/pki/CA/serial
創建兩個CA工作需要用到的文件,serial為存放證書編號的文件,并且要給該文件提供一個初始的編號,標號必須是2位數字。
index.txt文件用于存放簽署過的證書的索引
<3>生成CA自己的自簽證書,而在openssl的配置文件中,也定義了自簽證書的存放位置為/etc/pki/CA/cacert.pem
發起簽署CA證書的請求
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
表示發起CA證書簽署請求,
-new表示這是一個新申請的簽署請求
-x509 表示這是自簽證書,該選項只有在CA為自己生成自簽證書時使用
-key指明私鑰的存放路徑
-out 標明所生成的請求的文件存放路徑,如果是自簽證書,將直接生成簽署過的證書,如果不是自簽證書,則將生成的簽署請求文件發送給CA服務器,由CA服務器根據請求文件生成證書文件
-days 指明申請的證書的有效期限為多少天
命令執行后會要求填入一些信息:
國家代碼:CN
省份:beijing
城市:beijing
公司名:nwc
部門:ops
持有者名稱:ca.nwc.com(注意:此處最好與此CA服務器的主機名保持一致)
管理員的郵件地址:nwc@nwc.com
3、另一個主機建立CA申請請求,CA進行簽署頒發證書
某服務器需要用到證書進行安全通行時,需要向CA服務器請求簽署證書:
步驟:
<1>在需要使用證書的服務器上建一個目錄,生成私鑰(真實環境中建議將該目錄建在需要用到證書的服務的相關目錄下,便于管理)
<2>生成簽署請求
openssl req -new -key /testdir/testssl/mykey.private -out /testdir/testssl/mykey.csr -days 365
表示生成證書簽署請求,使用的私鑰文件路徑為/testdir/testssl/mykey.private,生成的簽署請求的文件為/testdir/testssl/mykey.csr,申請的證書有效期為365天
執行命令后會要求填入一些信息:
國家、身份、城市、單位、部門、持有者、管理員郵箱等
注意:持有者要寫成主機名, 否則可能造成后期用戶訪問時,提示證書與訪問的主機名不一致,此處應為www.nwc.com
<3>將生成的請求文件拷貝到CA服務器上
<4>在CA服務器上進行簽署,生成證書,在openssl的配置文件中,定義了簽署完成的證書的存放位置為/etc/pki/CA/certs/目錄下
openssl ca -in /tmp/mykey.csr -out /etc/pki/CA/certs/mykey.crt -days 365
表示簽署證書,-in指明請求簽署文件的路徑,-out指明生成的證書的路徑,-days表示簽署多少天
命令執行后,會讓確認兩次,確認好了之后,即完成了簽署的動作,生成了簽署過后的證書
<5>將簽署的證書發給請求方
4、證書的吊銷
<1>在客戶端獲取要吊銷的證書的serial
openssl x509 -in /PATH/FROM/CERT_FILE -noout -serial -subject
<2>在CA上,根據客戶提交的serial與subject信息,對比檢驗是否與index.txt文件中的信息一致
吊銷證書:
openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
<3>生成吊銷證書的編號(第一次吊銷一個證書時才需要執行)
echo 01 > /etc/pki/CA/crlnumber
<4>更新證書吊銷列表
openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl
查看crl文件:
openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text
第五章 利用gpg實現加解密
1、gpg實現對稱加密
<1>對稱加密file文件
gpg -c file
ls file.gpg
<2>在另一臺主機上解密file
gpg -o file -d file.gpg
2、gpg實現公鑰加密
在hostB主機上用公鑰加密,在hostA主機上解密
<1>在hostA主機上生成公鑰/私鑰對
gpg –gen-key
<2>在hostA主機上查看公鑰
gpg –list-keys
<3>在hostA主機上導出公鑰到nwckey.pub
gpg -a –export -o nwckey.pub
<4>從hostA主機上復制公鑰文件到需加密的B主機上
scp nwckey.pub HOST_B:/PATH/TO/SOMEWHERE
<5>在需加密數據的hostB主機上生成公鑰/私鑰對
gpg –list-keys
gpg –gen-key
<6>在hostB主機上導入公鑰
gpg –import nwckey.pub
gpg –list-keys
<7>用從hostA主機導入的公鑰,加密hostB主機的文件file,生成file.gpg
gpg -e -r nwc file
file file.gpg
<8>復制加密文件到hostA主機
scp file.gpg HOST_A:/PATH/TO/SOMEWHERE
<9>在hostA主機解密文件
gpg -d file.gpg
gpg -o file -d file.gpg
<10>刪除公鑰和私鑰
gpg –delete-keys nwc
gpg –delete-secret-keys nwc
第六章 ssh服務
1、SSH協議的基本概念
SSH:Secure Shell
監聽在TCP協議的22號端口
SSH協議版本:
sshv1:基于CRC-32做MAC,因此不安全,建議勿用
sshv2:基于雙方主機協商選擇最安全的MAC實現機制,建議使用。
sshv2基于DH實現秘鑰交換,基于RSA或DSA實現身份認證
客戶端通過檢查服務器端的主機秘鑰來判定是否與其進一步通信
服務端程序為:openssh-server,配置文件為/etc/ssh/sshd_config
客戶端程序為:openssh-client,配置文件為/etc/ssh/ssh_config
2、SSH服務器端的相關配置:
配置文件:/etc/ssh/sshd_config
服務腳本:/etc/rc.d/init.d/sshd
服務腳本配置文件:/etc/sysconfig/sshd
獲取關于服務配置文件的幫助:man sshd_config
/etc/ssh/sshd_config配置文件中相關指令說明:(#開始的相關選項表示使用的是默認值)
Port 22 指明ssh服務監聽的端口
ListenAddress IP_ADDR 表示監聽的地址,可出現多次
0.0.0.0表示當前主機的所有地址
Protocol 2 表示支持的ssh協議版本,建議是2
SyslogFacility AUTHPRIV 表示日志記錄的設施,要想知道該設置的具體日志放在哪里,則查看rsyslog的配置文件/etc/rsyslog.conf文件中的相關定義,此處相當于日志存在/var/log/secure日志中
LogLevel INFO 表示定義記錄的日志級別
PermitRootLogin yes|no 是否允許管理員以ssh登錄
MaxAuthTries 6 表示認證時的重試次數,為此數字的一半,超過次數后會被鎖定一定時間
MaxSessions 10 表示支持的最大的ssh會話的個數
AcceptEnv 接受的環境變量參數
AllowUsers 接受那些用戶使用ssh,做用戶白名單,只要不在此名單內的用戶,都不允許登錄
如:AllowUsers nwc1 nwc2 nwc3 root
AllowGroups 接受那些用戶組使用ssh,組的白名單
DenyUsers 不允許那些用戶使用ssh,用戶黑名單
DenyGroups 不允許那些用戶組使用ssh,組黑名單
白名單和黑名單不要同時使用
X11Forwarding yes|no 是否轉發圖形窗口
#KeyRegenerationInterval 1h 密鑰的使用時間
#ServerKeyBits 1024 密鑰長度
#LoginGraceTime 2m 登陸寬限期
#PermitRootLogin yes root是否可以登錄
#StrictModes yes 嚴格模式,家目錄 屬主 屬組
PasswordAuthentication yes 是否使用用戶名和密碼的方式
Kerberos集中認證管理
使用SSH服務的最佳配置方案:
1)僅適用sshv2版本
2)限定僅允許哪些用戶訪問ssh服務
Allowusers root vivek jerry
白名單
DenyUser saroj anjali foo
黑名單
3)配置空閑會話超時長
ClientAliveCountMax 0
ClientAliveInterval 300
4)使用iptables設置ssh服務安全訪問策略
5)改變默認的端口和監聽的IP
port 300
ListenAddress 192.168.1.5
ListenAddress 202.54.1.5
勿使用默認22端口
6)使用強密碼
生成隨機密碼的函數示例:
genpasswd(){
local 1=$1
[ "$1" == "" ]&& 1=20
tr -dc A-Za-z0-9_</dev/urandom | head -c ${1} | xargs
}
7)使用公鑰認證
8)禁止空密碼登錄
9)使用前利用漏掃工具先評估下破解的可能性
google:ssh best practice
10)限制ssh訪問頻度
11)記錄好日志,經常做日志分析。
3、用戶登錄信息的獲?。?/h3>
/var/log/wtmp 用戶成功登錄的日志信息,也可直接用last命令顯示
/var/log/btmp 用戶失敗登錄的日志信息,也可用lastb命令顯示
lastlog 每個用戶最近一次成功登錄的信息
4、基于SSH的客戶端相關工具:
客戶端的命令:ssh
ssh [OPTIONS] USERNAME@HOST [COMMAND]
常見選項:(如果不提供USERNAME,則會以當前系統上的用戶,作為登錄遠程主機的用戶,如果遠程主機上的用戶不存在,則無法連接)
-p PORT 指定登錄的端口(如果遠程主機的ssh服務修改了默認監聽的端口,則需要用-p指定端口),在生產環境中建議將SSH監聽的端口改掉
COMMAND 表示不登錄對方主機,在遠程主機執行命令,然后結果返回本機后退出
-b:指定連接的源IP
-v:調試模式
-C:壓縮方式
-X: 支持x11轉發
-Y:支持信任x11轉發
ForwardX11Trusted yes
-t: 強制偽tty分配
ssh -t remoteserver1 ssh remoteserver2
5、配置基于秘鑰方式進行SSH登錄
SSH的認證機制:
基于口令
基于秘鑰:
客戶端在本地生成一對秘鑰,客戶端將公鑰復制到服務器端,要登錄的用戶的家目錄下的隱藏目錄.ssh目錄下一個名為authorized_keys或authorized_keys2文件中,這樣即可實現無需密碼登錄ssh服務端
配置過程:
<1>生成秘鑰對
ssh-keygen -t rsa -P ''
生成的秘鑰默認保存至當前用戶家目錄下的.ssh目錄的id_rsa文件中,公鑰在id_rsa.pub文件中
-P 表示不指定使用秘鑰文件時的密碼,否則以后每次使用秘鑰登錄時,都要輸入秘鑰文件的密碼
<2>復制秘鑰至遠程主機
ssh-copy-id -i /PATH/TO/公鑰文件 USERNAME@HOST
表示將本機的公鑰文件復制到哪個遠程主機的哪個用戶
6、基于ssh的復制文件命令:scp
scp SRC1 SRC2 … DEST
常用選項有:
-r 當源是目錄時,實現遞歸復制
-p 復制時,保留源文件的復制和修改時間戳以及權限
-q 復制時靜默模式
-C: 壓縮數據流
-P PORT 指定服務器端的端口(如果遠程主機的ssh服務修改了默認監聽的端口,則需要用-P指定端口)
分兩種情況:
<1>源文件在本機,目標為遠程:
scp /PATH/TO/FILE1… USERNAME@HOST:/PATH/TO/SOMEWHERE
注意:源文件為目錄時,要使用-r 選項,實現遞歸復制;多個源時,目標要是目錄
<2>源文件在遠程,目標為本機:
scp USERNAME@HOST:/PATH/TO/FILE… /PATH/TO/SOMEWHERE
注意:源文件為目錄時,要使用-r 選項,實現遞歸復制,多個源時,目標要是目錄
7、基于ssh的ftp協議的命令:sftp
查看openssh是不是支持sftp,查看openssh的配置文件/etc/ssh/sshd_config里面,是否有
Subsystem sftp /usr/libexec/openssh/sftp-server
這一行的定義,如果有,則證明支持sftp
用法:sftp USERNAME@HOST 指明以哪個用戶登錄哪個主機的ftp服務器,登錄后可利用help獲取ftp命令的使用格式
8、rsync命令(比scp更快,只復制不同的文件,對于相同的文件不復制)
基于ssh和rsh服務實現高效率的遠程系統之間復制文件
使用安全的shell連接做為傳輸方式
rsync –av /etc server1:/tmp 復制目錄和目錄下文件(源路徑后面沒有/)
rsync –av /etc/ server1:/tmp 只復制目錄下文件(原路徑后面有/)
常見選項:
-n 模擬復制過程
-v 顯示詳細過程
-r 遞歸復制目錄樹
-p 保留權限
-t 保留時間戳
-g 保留組信息
-o 保留所有者信息
-l 把符號鏈接文件做為符號文件進行復制(默認)
-L 將軟鏈接文件指向文件復制
-a 存檔模式,相當于 –rlptgoD,但不保留ACL( -A)和SELinux屬性(-X)
9、SSH的端口轉發
<1>什么是SSH端口轉發?
SSH 會自動加密和解密所有 SSH 客戶端與服務端之間的網絡數據。但是, SSH 還能夠將其他 TCP 端口的網絡數據通過 SSH 鏈接來轉發,并且自動提供了相應的加密及解密服務。這一過程也被叫做“隧道”( tunneling),這是因為 SSH 為其他 TCP 鏈接提供了一個安全的通道來進行傳輸而得名。例如, Telnet, SMTP, LDAP 這些 TCP 應用均能夠從中得益,避免了用戶名,密碼以及隱私信息的明文傳輸。而與此同時, 如果工作環境中的防火墻限制了一些網絡端口的使用,但是允許SSH 的連接,也能夠通過將 TCP 端口轉發來使用 SSH 進行通訊
<2>SSH 端口轉發能夠提供兩大功能:
加密 SSH Client 端至 SSH Server 端之間的通訊數據
突破防火墻的限制完成一些之前無法建立的 TCP 連接
<3>本地轉發
ssh -L localport:host:hostport sshserver
ssh –L 9527:telnetsrv:23 -N sshsrv
telnet 127.0.0.1 9527
當訪問本機的9527的端口時,被加密后轉發到sshsrv的ssh服務,再解密被轉發到telnetsrv:23
data–>localhost:9527–>localhost:XXXXX–>sshsrv:22–>sshsrv:YYYYY–>telnetsrv:23
選項:
-f 后臺啟用
-N 不開遠程shell
-g 啟用網關功能
<4>遠程轉發:
-R sshserverport:host:hostport sshserver
ssh –R 9527:telnetsrv:23 –N sshsrv
讓sshsrv偵聽9527端口的訪問,如有訪問,就加密后通過ssh服務轉發請求到本機ssh客戶端, 再由本機解密后轉發到telnetsrv:23
Data–>sshsrv:9527–>sshsrv:22–>localhost:XXXXX–>localhost:YYYYY–>telnetsrv:23
<5>動態端口轉發:
當用firefox訪問internet時,本機的1080端口做為代理服務器, firefox的訪問請求被轉發到sshserver上,由sshserver替之訪問internet
在本機firefox設置代理socket proxy:127.0.0.1:1080
#ssh -D 1080 root@sshserver
第七章 利用dropbear提供ssh服務
ssh協議的另一個實現: dropbear
編譯安裝dropbear準備:
<1>安裝開發包組:yum groupinstall "Development Tools" -y
<2>下載源碼包,假設為dropbear-2013.58.tar.bz2
安裝:
<3> 解壓:tar xf dropbear-2013.58.tar.bz2
<4> 查看安裝的幫助手冊:less INSTALL
<5> 切換到解壓后的目錄,并執行./configure
<6> make,指定要安裝那些工具:make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
<7> make install,指定安裝的工具:make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
啟動ssh服務:
<8> ls /usr/local/sbin/ /usr/local/bin/
<9> /usr/local/sbin/dropbear -h
<10> mkdir /etc/dropbear
<11> dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048
<12> dropbearkey -t dss -f /etc/dropbear/dropbear_dsa_host_key
<13> dropbear -p :2222 -F –E #前臺運行(因為本機有SSH,為了避免端口沖突,手動指定其運行在2222端口)
dropbear -p :2222 #后臺運行
客戶端訪問:
<14> ssh -p 2222 root@127.0.0.1
<15> dbclient -p 2222 root@127.0.0.1
第八章 aide監控文件安全性
1、aide是什么
AIDE(Advanced Intrusion Detection Environment高級入侵檢測環境)是一個入侵檢測工具,主要用途是檢查文件的完整性,審計計算機上的那些文件被更改過了。
AIDE能夠構造一個指定文件的數據庫,它使用aide.conf作為其配置文件。 AIDE數據庫能夠保存文件的各種屬性,包括:權限(permission)、索引節點序號(inode number)、所屬用戶(user)、所屬用戶組(group)、文件大小、最后修改時間(mtime)、創建時間(ctime)、最后訪問時間(atime)、增加的大小以及連接數。 AIDE還能夠使用下列算法: sha1、 md5、 rmd160、 tiger,以密文形式建立每個文件的校驗碼或散列號.
這個數據庫不應該保存那些經常變動的文件信息,例如:日志文件、郵件、 /proc文件系統、用戶起始目錄以及臨時目錄
2、AIDE安裝及其配置文件
安裝:yum install aide
其配置文件為/etc/aide.conf (指定對哪些文件進行哪些種類的檢測)
配置文件相關的定義:
@@define DBDIR /var/lib/aide //定義aide的數據庫文件 @@define LOGDIR /var/log/aide //定義aide的日志文件 database=file:@@{DBDIR}/aide.db.gz //定義aide比對時使用的數據庫文件 database_out=file:@@{DBDIR}/aide.db.new.gz //定義aide創建數據庫時的數據文件 //創建好比對數據庫后,數據庫的名稱默認就是new,如果要比對,需要將new去掉,然后利用去掉new后的數據進行驗證 #p: permissions //定義文件權限的檢測 #i: inode: //定義文件inode號的檢測 #n: number of links //定義文件鏈接數的檢測 #u: user //定義文件所屬主的檢測 #g: group //定義文件所屬組的檢測 #s: size //定義文件大小的檢測 #b: block count //定義文件占用塊數量的檢測 #m: mtime //定義文件內容修改時間的檢測 #a: atime //定義文件訪問時間的檢測 #c: ctime //定義文件修改時間的檢測 #S: check for growing size #acl: Access Control Lists //定義文件acl權限的檢測 #selinux SELinux security context //定義selinux的檢測 #xattrs: Extended file attributes //定義文件xattrs屬性的檢測 #md5: md5 checksum //定義MD5校驗檢測 #sha1: sha1 checksum //定義SHA1校驗檢測 #sha256: sha256 checksum //定義SHA256校驗檢測 #sha512: sha512 checksum #R: p+i+n+u+g+s+m+c+acl+selinux+xattrs+md5 //定義一個檢測項目的組,組名為R,檢測的內容為后面各個單獨屬性的集合 #L: p+i+n+u+g+acl+selinux+xattrs //支持自定義的檢測項目組 #E: Empty group #>: Growing logfile p+u+g+i+n+S+acl+selinux+xattrs ALLXTRAHASHES = sha1+rmd160+sha256+sha512+tiger NORMAL = R+rmd160+sha256 /opt NORMAL //定義檢測的文件路徑,及對其采用哪種方式的檢測,后面NORMAL為定義的一個檢測項目的集合 /usr NORMAL /root NORMAL !/usr/src //路徑前面帶!表示不檢測 !/usr/tmp
3、使用流程
初始化默認的AIDE的庫:
/usr/local/bin/aide –init
生成檢查數據庫(建議初始數據庫存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
檢測:
/usr/local/bin/aide –check
更新數據庫
aide –update
第九章 sudo相關內容
1、sudo的基礎概念
<1> sudo能夠授權指定用戶在指定主機上運行某些命令。 如果未授權用戶嘗試使用 sudo,會提示聯系管理員
<2>sudo可以提供日志,記錄每個用戶使用sudo操作
<3>sudo為系統管理員提供配置文件,允許系統管理員集中地管理用戶的使用權限和使用的主機
<4>sudo使用時間戳文件來完成類似“檢票”的系統,默認存活期為5分鐘的“入場券”
<5>通過visudo命令編輯配置文件,具有語法檢查功能,用visudo -c 可檢查配置文件語法
2、sudo命令本身:
sudo [-u user] COMMAND
-V 顯示版本信息等配置信息
-u user 默認為root
-l,ll 列出用戶在主機上可用的和被禁止的命令
-v 再延長密碼有效期限5分鐘,更新時間戳
-k 清除時間戳,下次需要重新輸密碼(當用戶使用sudo時,會要求輸入用戶密碼,用戶密碼默認5分鐘內有效,如果使用sudo -k則可以讓密碼立即失效,下次使用sudo又要使用密碼)
-K 與-k類似,還要刪除時間戳文件
-b 在后臺執行指令
-p 改變詢問密碼的提示符號
如 -p ”password on %h for user %p
sudo –i –u nwc切換身份
3、sudo的配置文件(/etc/sudoers)
配置文件: /etc/sudoers, /etc/sudoers.d/
時間戳文件: /var/db/sudo
日志文件: /var/log/secure
<1>配置文件支持使用通配符glob:
? :前面的字符或詞可出現一次或無
* :前面的字符或詞出現零次或多次
[nwc]:匹配其中一個字符
[^nwc]:除了這三個字符的其它字符
\x : 轉義
[[alpha]] :字母 示例: /bin/ls [[alpha]]*
<2>配置文件規則有兩類;
別名定義:不是必須的
授權規則:必須的
<3>一個sudo條目:
who which_host=(runas) command
在命令前可以使用標簽NOPASSWD:就可以讓用戶在使用該命令時不用輸入密碼
格式說明:
user: 運行命令者的身份
host: 通過哪些主機
(runas):以哪個用戶的身份
command: 運行哪些命令
<4>別名機制:類似組的概念,組里面多個角色
who:User_alias
which_host:Host_alias
runas:Runas_alias
command:Cmnd_alias
別名必須全部而且只能全部使用大寫英文字母的組合
用戶別名:User_alias 別名 =
后面可以是:
用戶名
用戶UID,用#引用
組名,用%引用
組的GID,用%#引用
還可以包含其他已經定義的用戶別名
主機別名:Host_Alias 別名 =
后面可以是:
主機名
IP
網絡地址
其他已經定義的主機別名
以哪個身份運行:Run_Alias 別名 =
后面可以是:
用戶名
%組名
其他已經定義的runas別名
命令別名:Cnmd_Alias 別名 =
后面可以是:
命令路徑(一般為絕對路徑)
目錄(此目錄內的所有命令)
其他已定義的命令別名
4、sudo示例:
例如:以nwc用戶以root身份運行useradd,usermod命令
先visudo
nwc ALL=(root) /usr/sbin/useradd,/usr/sbin/usermod
當nwc用的時候格式為:sudo /usr/sbin/useradd newbee
例如:nwc ALL=(root)NOPASSWD:/usr/sbin/useradd,/usr/sbin/usermod
表示nwc在使用useradd和usermod時都不需要輸入密碼
例如:nwc ALL=(root) NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/usermod
表示nwc在使用useradd時不要密碼,usermod要密碼
例如:
定義一個用戶組別名
User_Alias USERADMIN = nwc,%newbee,%nwc
組內包含nwc用戶,newbee組和nwc組內的所有用戶
定義一個命令組別名
Cmnd_Alias ADMINCOMMAND = /usr/sbin/useradd,/usr/sbin/userdel,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
表示定義useradd、userdel命令,passwd命令后必須跟字符,且不能對root進行passwd命令。
添加條目:
USERADMIN ALL=(root) NOPASSWD:ADMINCOMMAND
表示USERADMIN別名內的所有用戶,在所有主機上,以root身份,不需要密碼,執行ADMINCOMMAND內的所有命令
例如:
nwc ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
表示nwc用戶可以在任意主機上,以任意身份運行任意命令,wheel組類的用戶可以在任意主機上,以任意身份運行任意命令? 例如:
nwc ALL=(root) /sbin/pidof,/sbin/ifconfig
%wheel ALL=(ALL) NOPASSWD: ALL
表示nwc用戶可以在任意主機上以root身份運行/sbin/pidof,/sbin/ifconfig命令
wheel組類的用戶可以在任意主機上,以任意身份無需密碼運行任意命令
例如:
User_Alias NETADMIN=user1,user2
Cmnd_Alias NETCMD = /usr/sbin/ip
NETADMIN ALL=( root) NETCMD
表示定義一個用戶別名NETADMIN,該別名內包含用戶user1,user2
定義一個命令別名NETCMD,包含命令/usr/sbin/ip
NETADMIN內的用戶能夠在任意主機上,以root身份,運行NETCMD定義的命令,也就是user1和user2能在任意主機上以root身份運行ip命令
例如:
User_Alias SYSADER=nwc,user1,%admins
User_Alias DISKADER=tom
Host_Alias SERS=www.nwc.com,10.1.32.0/24
Runas_Alias OP=root
Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod
Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk
SYSADER SERS=(OP) SYDCMD,DSKCMD
表示定義一個用戶別名SYSADER,包含用戶nwc,user1,和admins組內的所有用戶
定義一個用戶別名DISKADER,包含用戶tom
定義主機別名SERS包含主機名為www.nwc.com的這臺主機和10.1.32.0/24這個網絡內的所有主機
定義一個運行身份的別名OP,包含身份是root
定義一個命令別名SYDCMD,包含命令/bin/chown,/bin/chmod
定義一個命令別名DSKCMD,包含命令/sbin/parted,/sbin/fdisk
定義SYSADER用戶別名的用戶,在SERS定義的主機上,以root身份,運行SYDAMD和DSKCMD定義的命令,也就是nwc、user1和admins組內的所有用戶,能夠在www.nwc.com這臺主機和10.1.32.0/24這個網絡內的所有主機上,以root身份運行/bin/chown,/bin/chmod,/sbin/parted,/sbin/fdisk命令
例如:
User_Alias ADMINUSER = adminuser1,adminuser2
Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod, /usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel
表示定義一個ADMINUSER的用戶別名,包括adminuser1和adminuser2
定義一個ADMINCMD命令別名,包括useradd、usermod命令,passwd命令后面跟字母開頭的字符串,但不能執行passwd root,也就是不能對root改密
定義允許adminuser1和adminuser2用戶能夠在所有主機上,不用輸入密碼執行useradd、usermod、和passwd定義的相關命令,但是需要密碼執行userdel命令
例如
Defaults:nwc runas_default=tom
nwc ALL=(tom,jerry) ALL
表示授權nwc用戶在所有主機上以tom或Jerry身份,運行所有命令
上面的Defaults 表示當nwc用sodu執行命令時,如果不用-u指明以誰的身份,則默認以tom的身份執行命令
例如
nwc 10.1.32.68,10.1.32.22 = (root) /usr/sbin/,!/usr/sbin/useradd
表示授權nwc用戶在10.1.32.68和10.1.32.22主機上以root身份執行/user/sbin/下的所有命令,但是不包括useradd命令
例如
nwc ALL=(ALL) /bin/cat /var/log/message*
表示授權nwc用戶在所有主機上,以任意身份,運行cat /var/log/message*命令
注意,此種方式是非常危險的,因為用戶可以利用命令 cat /var/log/message /etc/shadow ….因為*代表任意字符,故后面可以跟上任何文件
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/48542
x寫的很好,特別是加密揭解密部分,,對各種加密算法的應用場景解析的特別透徹,通讀全文能,讓人看到很多專業性所在。