天天看點

資料加密和解密二

保證安全

為了保證資料在網絡中傳輸的安全, 就涉及到一下方面:

    技術: 加密和解密

    服務: 身份認證, 通路控制

加密解密算法:

    對稱加密: 用途: 資料交換; 常用的算法: 3DES, AES, ......

    公鑰加密: 用途: 密鑰交換, 資料加密(不推薦, 比對稱加密慢3個數量級)

    數字簽名: 常用的算法: RSA, DSA, ELGamal

    單向加密: 用途: 保證完整性; 常用的算法: MD5(128), sha系列(160, 224, 256, 384, 512)

    密鑰交換: 用途: 協商密鑰; 常用的算法: RSA, DH, ECDH, ECDHE;

SSL/TLS:

    SSL: 安全的套接字; 版本有: 1.0(已淘汰)     2.0    3.0

    TLS: IETF提出; 傳輸層安全; 版本: 1.0     1.1     1.2     1.3

SSL會話過程四個階段:

    SSL Handshake Protocol (SSL握手協定) :

    第一階段: ClientHello

        1.協商所支援的協定的版本, 如: tls1.2;

        2.用戶端生成一個随機算法, 稍後用于生成會話密鑰;

        3.協商支援的加密算法, 如: RSA, AES;

        4.協商壓縮算法;

    第二階段: ServerHello

        1.确認此次通信所使用的協定的版本;

        2.伺服器端生成一個随機數, 稍後用于生成會話密鑰;

        3.确認此次通信所使用的加密算法;

        4.确認壓縮算法;

    第三階段:

        用戶端驗證伺服器證書:

            驗證CA

            驗證證書的完整性;

            驗證證書持有者資訊;

            驗證證書的有效期限;

            驗證證書的吊銷清單;

        确認證書無誤之後, 取出其中的公鑰; 發送下列資訊到伺服器:

            一個随機數, 用于伺服器上的公鑰加密;

            編碼格式的變更(加解密);

            用戶端握手結束通知;

    第四階段:

        伺服器收到用戶端發送來的此次握手的第三階段中的Pre-Master_key;

        計算生成本次會話所用到會話密鑰, 向用戶端發送相關資訊;

            編碼格式的變更通知;

            伺服器端握手結束通知;

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

    簽證機構: CA

    注冊機構: RA

    證書吊銷清單: CRL

    證書存取庫: CAB

    注: CA與RA有可能不是同一個機構

證書頒發機構:

    威瑞信--verisig

    GlobalSign

    賽門鐵克

    AsiaCOM

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

    證書的内容:

        證書的版本号;

        證書的序列号;

        簽名算法ID;

        證書擁有者的資訊;

        證書有效期;

        主體公鑰;

        主體的唯一辨別;

        發證者的唯一辨別;

        發證者的數字簽名;

        擴充資訊;

能夠實作SSL/TLS安全協定的應用程式:

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

OpenSSL及其元件:

    OpenSSL是一個開源實作SSL/TLS的标準;

        libcryto: 實作加解密的算法的庫;

        libss: 實作SSL功能的庫;

        openssl: 多用途指令行工具;

    openssl指令行工具:

        從多的子指令實作各種安全加密功能;

        标準指令:

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

        消息摘要指令:

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

        加密指令:

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

項目案例:

    1.使用openssl加密:

        對稱加密: openssl enc

        openssl enc -iphername [-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_ENCRYPTRD_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

                openssl dgst -sha512 fstab

    2.使用openssl生成随機數:

        openssl rand指令:

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

            openssl rand -base64|-hex LENGTH(bytes)

        另一種方法取随機數的方法:

            tr -dc 0-9a-zA-Z < /dev/urandom | head -c 30 | xargs

    3.生成使用者密碼:

        openssl passwd指令:

            openssl passwd [-l] [-salt string]

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

        man手冊查詢方法: man sslpasswd

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

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

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

        示例:

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

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

                提示: 括号表示在子shell中執行該指令

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

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

        示例:

            openssl rsa -in myp.keys2 -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 rep new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3653

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

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

                -key: 指定CA的私鑰檔案的路徑;

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

                -days: 設定證書有效期限; 機關是天;

        3.滿足CA所必須的目錄級檔案和文本檔案的布局;

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

            ~]# ech0 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)

                注: 指令行中加括号表示在子shell中執行

            3.生成證書請求檔案:

                ssl]# openssl req -new -key /etc/httpd/conf/ssl/httpd.key -out /etc/httpd/conf/ssl/htpd.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

            4.更新證書吊銷清單:

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

使用gpg實作對稱加密

    對稱加密file檔案

        gpg -c file

    解密file

        gpg -o file -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主機上生成公鑰/私鑰對

        注意: 如果系統提醒熵池中随機數不夠用, 可以使用下列指令:

            ~]# rngd -r /dev/urandom

    在hostB主機上導入公鑰

        gpg --import link. pubkey

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

        gpg -e -r link.pubkey file

    複制加密檔案到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: 本地CD光牒yum源中;

        CentOS 6:關閉防火牆和SELinux

            ~]# chkconfig telnet on

            ~]# service xineted 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)(不能與OpenSSH同時使用, 因為占用同一端口)

        SSH協定版本:

            V1: 不安全, 禁用;

            V2: 目前安全的應用協定;

        SSH提供的認證方式:

            基于密碼的認證;

            基于密鑰的認證;

                使用者提供一對密鑰, 私鑰儲存在用戶端; 公鑰儲存在遠端伺服器某個使用者的家目錄下;

    OpenSSH應用程式具體使用:

        Openssh的組成:

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

            用戶端程式: ssh, /etc/ssh/ssh_config; scp, sftp

        用戶端程式:

            ssh指令: (遠端登入程式)

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

                常用選項:

                    -l user: 指定此次使用哪個使用者進行遠端登入(伺服器的使用者); 如果使用了此選項, 則ssh指令中的主機名前面的使用者名需要省略;

                        注意: 如果沒有使用-l選項指定使用者, 又沒有在主機名前面加使用者名, 則ssh用戶端程式預設使用本地主機目前登入的使用者的使用者名作為此次遠端登入的使用者名;

                    -p port: 指明使用者通路遠端伺服器的目标端口号(為避免端口遭到攻擊); 

                    -b bind address: 指明此次通路的伺服器的固定源IP位址(隻有在主機有多個IP位址才生效);

                    -X: 支援X11轉發;

                    -Y: 支援受信任的X11轉發;

                X system 圖像界面由X Server 和X Client 組成

                X11轉發: 本來應該是由伺服器端的X Client向伺服器端的X Server發起請求, 現在成了伺服器端的X Client向用戶端X Server發起請求

                ssh的X system工作原理: 用戶端向伺服器端發起ssh, 伺服器端響應并建立X Client. 用戶端也建立X Client與X Server. 資料在用戶端的X Server處理完并在用戶端的X Client顯示, 同時把資料交給伺服器端的X Client.

                ECDSA: 橢圓曲線DSA加密算法

                ssh -o StrictHostKeyChecking=no 172.168.72.1    不再提示密鑰交換, 直接生成密鑰檔案, 在對方主機的家目錄中~/.ssh/

        ssh遠端連接配接伺服器是的配置選項非常複雜, 這些選項都可以定義在ssh的配置檔案中: /etc/ssh/ssh_config

            其格式:

                HOST pattern
                    OPTION1 VALUE
                    OPTION2 VALUE
                    ......      

        基于密鑰的認證機制:

            使用者提供一對密鑰, 私鑰保留在用戶端, 公鑰分發并保留至遠端伺服器端某個使用者的家目錄中;

            1.建立密鑰對:

                ssh-keygen指令:    認證密鑰的生成, 管理和轉換

                    用法:

                        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協定版本2中可以使用: "dsa", "ecdsa", "ed25519", or"rsa"

                        -f output_keyfile: 指定生成的密鑰檔案的路徑;

                        -p passphrase: 指定私鑰的加密密碼;

                    示例:

                        ssh-keygen -t rsa -b 2048 -f ssh/id.rsa -P '123456'

                ssh-copy-id指令:    使用本地可用的密鑰授權登陸遠端機器

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

                        常用選項:

                            -i: 指定要複制的公鑰檔案;

                            -p port: 指定連接配接到得伺服器端的端口;

                        ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]

    常用的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連接配接完成的複制指令:

        兩種使用情形:

            推送: Push

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

            拉取: Pull

                scp [options] ... HOST:/PATH/TO/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 擷取幫助

            示例: sftp: 172.168.72.1

    ssh協定的伺服器端工具: ssh, scp, sftp

    ssh協定的伺服器端工具:

        ssh程式: /etc/ssh/sshd_config

        常用的指令:

            Port 22: 指明sshd服務要監聽的端口号; 一般在生成環境的伺服器端, 需要修改這個指令的值為非22号端口;

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

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

            PermotRootLogin yes: 是否允許使用root直接完成遠端登入; 在生成環境的伺服器中, 應該禁用此功能;

            User DNS 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(CentOS 6中使用)

    ssh服務的最佳實踐方案:

        1.不要使用預設的22号端口;

        2.禁止使用ssh v1.0;

        3.設定可登入的白名單或黑名單;

        4.設定空閑會話的逾時時長;

        5.利用防火牆來設定ssh通路安全政策和規則;

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

        7.如果必須使用密碼認證, 則使用複雜密碼;

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

        9.禁止使用空密碼;

        10.禁止root使用者直接遠端登入;

        11.限制ssh的通路頻度和并發數;

        12.做好日志, 經常分析;

gropbear

    ssh協定的另一種實作; 輕量級的實作方案, 多用于嵌入式環境;

    dropbear的rpm包, 在EPEL源中; 常用的yum源有:

        mirrors.sohu.com

        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="gropbear dbclient dropbearkey dropbearconvert"

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

    啟動dropbear:

        dropbear -h

        dropbearkey -h

        擷取相應的幫助資訊;

        1.建立儲存密鑰檔案的目錄:

            ~]# mkdir /etc/dropbear

        2.建立對應密鑰:

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

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

            ~]# dropbearkey -t ecdsa -s521 -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/mesages);

                -w: 禁止root使用者直接登入到dropbear伺服器;