2018-05-16

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,这个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不同,返回不同的解析地址。

你可能感兴趣的:(2018-05-16)