openssl、ssh

PKI:公鑰基礎設施,保證服務器向客戶端發送的證書的可靠性;html

簽證機構:CAlinux

註冊機構:RA算法

證書吊銷列表:CRLshell

證書存取庫:CAB安全


威瑞信——verisign服務器

GlobalSign架構

賽門鐵克併發

AsiaCOMdom


國際標準化組織定義了證書的標準結構,X.509協議標準:ssh

證書的內容:

證書的版本號;

證書的序列號;

簽名算法ID;

證書擁有者的信息;

證書有效期;

主體名稱;

主體公鑰;

主體的惟一標識;

發證者的惟一標識;

發證者的數字簽名;

擴展信息;


可以實現SSL/TLS安全協議的應用程序:

OpenSSL(SSL/TLS),gpg(PGP,TLS)


OpenSSL及其組件:

OpenSSL是一個開源實現SSL/TLS的標準;

libcrypto:實現加解密的算法的庫;

libss:實現SSL功能的庫;

openssl:多用途命令行工具;


openssl命令行工具:

衆多的子命令實現各類安全加密功能;


標準命令:

dgst, enc, ca, req, genrsa, rand, crl, passwd, x509,...


消息摘要命令:

使用dgst子命令來調用,爲dgst子命令提供加密算法(單向加密算法);


加密命令:

使用enc子命令來調用,爲enc子命令提供加密算法(對稱加密算法);


項目案例:

1.使用openssl加密:

對稱加密:openssl enc


openssl enc -ciphername [-in filename] [-out filename] [-e] [-d] [-a/-base64] [-salt]

經常使用選項:

-ciphername:算法名稱,包括des3,des,aes,rc4,...

-e:加密

-d:解密

-a/-base64:純文本格式編碼;

-salt:加隨機鹽

-in filename:要加密的文件路徑;

-out filename:加密以後的文件的輸出路徑;


加密示例:

~]# openssl enc -e -des3 -a -salt -in /PATH/TO/SOME_FILE -out /PATH/TO/SOME_ENCRYPTED_FILE


~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.des3


解密示例:

~]# openssl enc -d -des3 -a -salt -in /PATH/TO/SOME_ENCRYPTED_FILE -out /PATH/TO/SOME_FILE


~]# openssl enc -d -des3 -a -salt -in fstab.des3 -out fstab


單向加密:openssl dgst

openssl dgst -ciphername /PATH/TO/SOME_FILE


示例:

openssl dgst -md5 fstab


2.使用openssl生成隨機數:

openssl rand命令:


openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num


openssl rand -base64|-hex LENGTH(bytes)


3.生成用戶密碼:

openssl passwd命令:

openssl passwd [-1] [-salt string] 


~]# openssl passwd -1 -salt $(openssl rand -base64 5)


4.公鑰加密算法:RSA,ELGamal;

openssl genrsa命令:生成RSA算法的私鑰

openssl rsa命令:從私鑰中提取RSA公鑰


openssl genrsa [-out filename] [-des] [-des3] [-idea] [-f4] [-3] [numbits]


示例:

~]# (umask 077; openssl genrsa -out myp.key2 4096) 建議使用

~]# (umask 077; openssl genrsa 4096 > myp.key3)


openssl rsa


openssl rsa [-in filename] [-out filename] [-pubout]


示例:

openssl rsa -in myp.key2 -out mykey.pub


5.創建私有CA:(OpenCA)

1.建立CA所在主機的私鑰文件;

2.生成自簽證書;

3.爲CA提供必要的目錄級文件及文本格式的文件;

目錄級文件:

/etc/pki/CA/certs

/etc/pki/CA/crl

/etc/pki/CA/newcerts

文本格式文件:

/etc/pki/CA/serial

建立serial文件的時候,須要給該文件提供一個初始序列號,通常01;

/etc/pki/CA/index.txt


CA的專有配置文件:/etc/pki/tls/openssl.cnf


CA公鑰保存位置:/etc/pki/CA/cacert.pem 

CA私鑰保存位置:/etc/pki/CA/private/cakey.pem


建立私有CA的步驟:

1.建立CA的私鑰文件:

~]# (umask 077 ; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)


2.生成自簽證書:

~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem  -out /etc/pki/CA/cacert.pem -days 3653


-new:生成新證書籤署請求;

-x509:生成自簽證書,專用於私有CA的自簽證書的頒發;

-key:指定CA的私鑰文件的路徑

-out:生成的自簽證書所保存的路徑

-days:設置證書有效期限;單位是天


3.知足CA所必須的目錄級文件和文本文件的佈局:

~]# touch /etc/pki/CA/index.txt

~]# echo 01 > /etc/pki/CA/serial


SSL:https --> http over ssl


全棧HTTPS機制;


https實現方式:

1.在某臺服務器上安裝了httpd程序;

2.建立服務器的私鑰文件:

~]# mkdir /etc/httpd/conf/ssl

~]# cd /etc/httpd/conf/ssl

ssl]# (umask 077 ; openssl genrsa -out /etc/httpd/conf/ssl/httpd.key 4096)

3.生成證書請求文件:

ssl]# openssl req -new -key /etc/httpd/conf/ssl/httpd.key -out /etc/httpd/conf/ssl/httpd.csr -days 3653


4.由CA簽發證書:在CA所在的服務器上完成;

~]# openssl ca -in /tmp/csrs/httpd.csr -out /tmp/csrs/httpd.crt -days 365


5.在CA上查看證書內容:

~]# openssl x509 -in /etc/pki/CA/newcerts/01.pem -noout -serial -subject


吊銷證書:須要在CA上執行;

1.獲取客戶端證書相應的序列號:

~]# openssl x509 -in /etc/pki/CA/newcerts/01.pem -noout -serial


2.吊銷證書:

~]# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem


注意:SERIAL應該換成對應證書的序列號;


3.生成吊銷證書的吊銷編號:第一次吊銷證書的時候,必須作此步驟;

echo "SERIAL" > /etc/pki/CA/crlnumber


注意:SERIAL應該換成對應證書的序列號;


4.更新證書吊銷列表:

~]# openssl ca -genctl -out /etc/pki/CA/ca.crl



使用gpg實現對稱加密

對稱加密file文件

gpg -c file

ls file.gpg

解密file

pgp -o file2 -d file.gpg


使用gpg工具實現公鑰加密

在hostA主機上生成公鑰/私鑰對

gpg --gen-key

在hostA主機上查看公鑰

gpg --list-keys

在hostA主機上導出公鑰到link.pubkey

gpg -a --export -o link.pubkey

從hostA主機上覆制公鑰文件到需加密的B主機上

scp link.pubkey hostB:

在需加密數據的hostB主機上生成公鑰/私鑰對

gpg --list-keys

gpg --gen-key


注意:若是系統提醒熵池中隨機數不夠用,可使用下列命令:

~]# rngd -r /dev/urandom


在hostB主機上導入公鑰

gpg --import link.pubkey

gpg --list-keys

用從hostA主機導入的公鑰,加密hostB主機的文件file,生成file.gpg

gpg -e -r link.pubkey file

file file.gpg

複製加密文件到hostA主機

scp fstab.gpg hostA:

在hostA主機解密文件

gpg -d file.gpg gpg -o file -d file.gpg

刪除公鑰和私鑰

gpg --delete-secret-keys qhdlink

gpg --delete-keys qhdlink


注意:應該先刪私鑰,再刪公鑰;


OpenSSH:

實施遠程登陸的服務器端應用程序;


什麼是登陸?


在分時系統中,容許多個用戶同時使用一臺計算機的資源,爲了保證安全以及更方便的記錄不用用戶的操做行爲,系統爲每一個用戶創建一個邏輯身份,即用戶的帳戶標識;爲了對用戶進行身份覈實,還爲用戶指定了口令。用戶在使用該系統以前須要輸入這個邏輯標識以及口令,這個驗證過程就叫"登陸"。


遠程登陸:

Telnet:

C/S: 默認不容許管理員直接遠程登陸;

Client:telnet

Server:telnet-server

Socket Pair:23/TCP


安裝telnet-server:本地光盤yum源中;


CentOS 6:關閉防火牆和SElinux

~]# chkconfig telnet on

~]# service xinetd start


CentOS 7:關閉防火牆和SElinux

~]# systemctl start telnet.socket


注意,telnet默認不容許root用戶直接登陸;


SSH: Secure SHell,安全的shell;

用於取代較早的很是不安全的telnet協議;


C/S:22/TCP


Client:OpenSSH(ssh,scp,sftp),Xshell,SecureCRT,sshsecureshellclient,putty


Server:OpenSSH(sshd), dropbear(dropbear)


SSH協議:

V1:不安全,禁用;

V2:當前安全的應用協議;


SSH提供的認證方式:

基於口令的認證;

基於密鑰的認證;

用戶提供一對兒密鑰,私鑰保存在客戶端,公鑰保存在遠程服務器端某個用戶的家目錄下;


OpenSSH應用程序具體使用

Openssh的組成:

服務端程序:sshd,/etc/ssh/sshd_config

客戶端程序:ssh,/etc/ssh/ssh_config;scp,sftp


客戶端程序:

ssh命令:

ssh — OpenSSH SSH client (remote login program)

ssh [options]... [user@]hostname [command]

經常使用選項:

-l user:指定這次使用哪一個用戶進行遠程登陸;若是使用了此選項,則ssh命令中的主機名前面的用戶名須要省略;


注意:若是沒有使用-l選項指定用戶,又沒有在主機名前面加用戶名,則ssh客戶端程序默認使用本地主機當前登陸的用戶的用戶名做爲這次遠程登陸的用戶名;


-p port:指明用於訪問遠程服務器的目標端口號;

-b bind_address:指明這次訪問的服務器的固定源IP地址;

-X:支持X11轉發;

-Y:支持受信任的X1轉發;


ssh遠程鏈接服務器時的配置選項很是複雜,這些選項均可以定義在ssh的配置文件中:/etc/ssh/ssh_config

其格式:

HOST pattern

OPTION1 VALUE

OPTION2 VALUE

...


基於密鑰的認證機制:

用戶提供一對兒密鑰,私鑰保留在客戶端,公鑰分發並保留至遠程服務器端某個用戶的家目錄中;


1.建立密鑰對兒:

ssh-keygen命令:

ssh-keygen — authentication key generation, management and conversion


用法:

ssh-keygen [-q] [-b bits] [-t type] [-f output_keyfile] [-P passphrase]


經常使用選項:

-q:靜默模式;

-b bits:指定建立的密鑰的長度;

RSA:最少768bits,默認2048bits;

DSA:明確指定1024bits

ECDSA:256bits,384bits,521bits;

ED25519:忽略-b指定的長度;

-t type:指明公鑰加密算法的類型

在ssh協議V2中可使用:「dsa」, 「ecdsa」, 「ed25519」, or 「rsa」

-f output_keyfile:指定生成的密鑰文件的路徑;

-P passphrase:指明私鑰的加密密碼;



ssh-copy-id命令:

ssh-copy-id — use locally available keys to authorise logins on a remote machine


用法:

ssh-copy-id [-i [identity_file]] [-p port] [user@]hostname


經常使用選項:

-i:指定要複製的公鑰文件;

-p port:指定鏈接到的服務器端的端口;



經常使用的ssh密鑰驗證的操做過程:

1.生成密鑰對

ssh-keygen -t rsa -P 'passphrase' -f /PATH/TO/KEY_PAIR

2.發送公鑰到目標服務器某個用戶的家目錄:

ssh-copy-id -i /PATH/TO/PUBLIC_KEY user@HOSTNAME

3.遠程登陸:

ssh -l user HOSTNAME

ssh user@HOSTNAME


scp命令:基於ssh鏈接完成的複製命令;

scp - secure copy (remote file copy program)


兩種使用情形:

推送:Push

scp [options]... SRC HOST:/PATH/TO/DEST


拉取:Pull

scp [options]... HOST:/PATH/FROM/SRC DEST


經常使用選項:

-r:遞歸複製,複製目錄內容;

-p:保留源文件的權限信息;

-q:靜默模式

-P port:指明遠程主機ssh協議監聽的端口;


sftp:

ftp over ssh;

ftp over ssl(ftps);


C/S架構

S:sftp-server,有sshd服務進程管理的一個子服務項目,是sshd的一個子系統;在CentOS系統中默認是啓用的;

C:sftp命令

sftp [user@]HOSTNAME


sftp> help 獲取幫助


ssh協議客戶端工具:ssh,scp,sftp


ssh協議的服務器端工具:

sshd程序:/etc/ssh/sshd_config


格式:

配置指令 值


經常使用的指令:

Port 22:指明sshd服務要監聽的端口號;通常在生成環境的服務器端,須要修改這個指令的值爲非22號端口;

ListenAddress 0.0.0.0:指明sshd服務進程要監聽的IP地址;建議監聽某個特定的IP地址,以提升安全性;

Protocol 2:選擇ssh協議的版本;

PermitRootLogin yes:是否容許使用root直接完成遠程登陸;在生產環境的服務器中,應該禁用此功能;

UseDNS yes:是否容許使用DNS反向解析主機名;建議關閉此功能;


AllowUsers user1 user2 ...:設置登陸用戶的白名單;

AllowGroups group1 group2 ...:設置組的白名單;


DenyUsers user1 user2 ...:設置登陸用戶的黑名單;

DenyGroups group1 group2 ...:設置組的黑名單;


注意:對於/etc/ssh/sshd_config配置文件作出修改以後,必須讓sshd服務器進程從新讀取該配置文件,才能使新配置生效;

# systemctl reload sshd.service

# service sshd reload


ssh服務的最佳實踐方案:

1.不要使用默認的22號端口;

2.禁止使用sshv1;

3.設置可登陸的白名單或黑名單;

4.設置空閒會話的超時時長;

5.利用防火牆來設置ssh訪問安全策略和規則;

6.僅監聽特定IP地址,不要設成0.0.0.0;

7.若是必須使用口令認證,則使用複雜密碼;

8.建議最好使用基於密鑰的認證;

9.禁止使用空密碼;

10.禁止root用戶直接遠程登陸;

11.限制ssh的訪問頻度和併發數;

12.作好日誌,常常分析;


dropbear

ssh協議的另外一種實現

輕量級的實現方案,多用於嵌入式環境;


dropbear的rpm包,在EPEL源中;

mirrors.sohu.com/fedora-epel/$releasever/$basearch

mirrors.aliyun.com

mirrors.163.com

mirrors.tsinghua.edu.cn


可使用dropbear源代碼包進行編譯安裝;

源代碼包能夠在https://matt.ucc.asn.au/dropbear/dropbear.html下載;


編譯環境:

yum groupinstall "Development tools" "Server Platform Development"

yum install zlib-devel(可選)


若是選擇了編譯源代碼的方式進行安裝:

1.解壓以後的目錄中,有一個INSTALL的文件,查看該文件以得到安裝方法

2.~]# ./configure

3.~]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert"

4.~]# make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert" install


啓動dropbear:

dropbear -h

dropbearkey -h

獲取相應的幫助信息;


1.建立保存密鑰文件的目錄:

~]# mkdir /etc/dropbear

2.建立對應密鑰:

~]# dropbearkey -t rsa -s 2048 -f /etc/dropbear/dropbear_rsa_host_key

~]# dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key

~]# dropbearkey -t ecdsa -s 521 -f /etc/dropbear/dropbear_ecdsa_host_key

3.啓動dropbear服務,並使其運行於前臺;

~]# dropbear -p IP:PORT -F -E


選項含義:

-p IP:PORT:指定這次啓動的dropbear服務進程監聽的套接字;

-F:將dropbear服務進程運行於前臺;

-E:將dropbear服務進程運行期間產生的信息從標準錯誤輸出而不是寫入到系統日誌文件(syslog, /var/log/messages);

-w:禁止root用戶直接登陸到dropbear服務器;


客戶端訪問:

~]# ssh -p PORT user@host

~]# dbclient -p PORT user@host

相關文章
相關標籤/搜索