SSL/TLS:

SSL:安全的套接字层;1.0 2.0 3.0

TLS:传输层安全;1.0 1.1 1.2 1.3


SSL会话过程四个阶段:

SSL Handshake Protocol:


第一阶段:ClientHello

1.协商所支持的协议的版本,如tls1.2;

2.客户端生成一个随机数,稍后用于生成会话密钥;

3.协商支持的加密算法,如:RSA,AES;

4.协商压缩算法;


第二阶段:ServerHello

1.确认此次通信所使用的协议的版本;

2.服务器端生产一个随机数,稍后用于生成会话密钥;

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

4.确认压缩算法;


第三阶段:

客户端验证服务器证书:

验证CA

验证证书的完整性;

验证证书持有者信息;

验证证书的有效期限;

验证证书的吊销列表;

确认证书无误之后,取出其中的公钥;发送下列信息到服务器:

一个随机数,用于服务器上的公钥加密;

编码格式的变更;

客户端握手结束通知;


第四阶段:

服务器收到客户端发送来的此次握手的第三阶段中的Pre-Master_key;计算生成本次会话所用到的会话密钥,向客户端发送相关信息:

编码格式的变更通知;

服务器端握手结束通知;


PKI:公钥基础设施,保证服务器向客户端发送的证书的可靠性;

签证机构:CA

注册机构:RA

证书吊销列表:CRL

证书存取库:CAB


威瑞信——verisign

GlobalSign

赛门铁克

AsiaCOM


国际标准化组织定义了证书的标准结构,X.509协议标准:

证书的内容:

证书的版本号;

证书的序列号;

签名算法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


DNS and Bind


BIND:Berkeley Internet Name Domain,伯克利互联网名称域; 


名称域——名字空间:

倒置的树

根域(.)

顶级域(Top Level Domain,TLD)

组织域:com, org, edu, gov, mil, net, ...

info, cc, 中国, ...

地理域:cn, tw, hk, jp, iq, ...

反向域:in-addr.arpa


DNS的名称解析方式:

正向解析:名称 --> IP地址

反向解析:IP地址 --> 名称


注意:正向解析和反向解析所使用的名称非同一空间,非同一棵树;也就是非同一数据库;


DNS查询类型:

递归查询

迭代查询


DNS服务器的分类:

至少负责一个域的数据库:

主DNS服务器

辅助DNS服务器(从DNS服务器)

不负责任何域的数据库:

缓存DNS服务器(存根DNS服务器)


一次完整的DNS查询请求流程:

Client --> hosts --> Local Cache --> first DNS(recursive) -->

--> 服务器本地缓存或本地数据库中有结果,直接响应客户端;

--> ROOT(iteration) --> TLD_DNS_SERVER --> 二级域DNS_SERVER --> ... --> ns.xxx. --> 解析结果;


查询得到的解析答案:

权威答案:由直接负责管理对应信息的DNS服务器返回的答案;

非权威答案:由指定的服务器从缓存中或者利用迭代的方式查询到的答案;


还有两种可能:

肯定答案:能够按照客户端请求完成正确的名称解析的答案;

否定答案:无法安装客户端的请求完成正确的名称解析所返回的答案;即客户端所请求的解析内容,不存在或无法找到映射资源;