一、创建私有CA并进行证书申请。
1.1 创建CA相关目录及文件
[root@Centos8 ~]# mkdir /etc/pki/CA/{certs,crl,newcerts,private}
[root@Centos8 ~]# tree /etc/pki/CA/
/etc/pki/CA/
├── certs
├── crl
├── newcerts
└── private
index.txt和serial文件在颁发证书时需要使用,如果不存在,会创建失败,需自行创建定义
[root@Centos8 ~]# touch /etc/pki/CA/index.txt #生成证书索引数据文件
[root@Centos8 ~]# echo 0F > /etc/pki/CA/serial # 指定颁发的第一个证书的序列号为0
1.2 创建CA密钥
[root@Centos8 ~]# cd /etc/pki/CA/
[root@Centos8 CA]# (umask 066; openssl genrsa -out private/cakey.pem 2048)
1.3 给CA颁发自签名证书
[root@Centos8 private]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
[root@Centos8 CA]# sz cacert.pem
将文件传输到windows,文件扩展名为cacert.pem.crt,打开可查看该CA证书详细。
1.4 用户生成私钥及证书申请
生成用户私钥存放路径
[root@Centos8 ~]# mkdir /data/app
[root@Centos8 ~]# (umask 066; openssl genrsa -out /data/app/app.key 2048)
1.5 生成证书申请文件
[root@Centos8 ~]# openssl req -new -key /data/app1/app1.key -out /data/app1/app1.csr
默认要求 国家,省,公司名称三项必须和CA一致
1.6 CA颁发证书
[root@Centos8 CA]# openssl ca -in /data/app/app.csr -out /etc/pki/CA/certs/app.crt -days 1000
[root@Centos8 CA]# tree
.
├── cacert.pem
├── certs
│ ├── app1.crt
│ └── app.crt
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── newcerts
│ ├── 0F.pem
│ └── 10.pem
├── private
│ └── cakey.pem
├── serial
└── serial.old
4 directories, 12 files
1.7 将证书相关文件发送到用户端使用
[root@Centos8 CA]# cp /etc/pki/CA/certs/app.crt /data/app/
[root@Centos8 CA]# tree /data/app/
/data/app/
├── app.crt
├── app.csr
└── app.key
1.8 证书的信任
默认的证书在windows最开始是不受信任的
二、ssh常用参数、用法
2.1. ssh服务介绍
ssh: secure shell protocol, 22/tcp, 安全的远程登录,实现加密通信,代替传统的 telnet 协议
具体的软件实现:
OpenSSH:ssh协议的开源实现,CentOS 默认安装
dropbear:另一个ssh协议的开源项目的实现
SSH 协议版本
v1:基于CRC-32做MAC,不安全;man-in-middle
v2:双方主机协议选择安全的MAC方式,基于DH算法做密钥交换,基于RSA或DSA实现身份认证
2.1.1公钥交换原理
客户端发起链接请求
服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
客户端生成密钥对
客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
2.1.2 ssh加密通讯原理
2.2 客户端ssh命令
ssh命令是ssh客户端,允许实现对远程系统经验证地加密安全访问。
当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的~/.ssh/know_hosts中。下次连接时,会自动匹配相对应的私钥,如不能匹配,将拒绝连接。
ssh客户端配置文件: /etc/ssh/ssh_config
格式
ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
常见选项
-p port #远程服务器监听的端口
-b #指定连接的源IP
-v #调试模式
-C #压缩方式
-X #支持x11转发
-t #强制伪tty分配,如:ssh -t remoteserver1 ssh -t remoteserver2 ssh
remoteserver3
-o option 如:-o StrictHostKeyChecking=no
-i <file> #指定私钥文件路径,实现基于key验证,默认使用文件: ~/.ssh/id_dsa,
~/.ssh/id_ecdsa, ~/.ssh/id_ed25519,~/.ssh/id_rsa等
2.2.1范例
[root@Centos8 ~]# ssh -t 10.0.0.7 ssh 10.0.0.6 #强制伪tty分配,centos6显示远程终端为centos7,实际则是从8登录。
[root@Centos7 ~]# who
root pts/0 2021-11-02 20:29 (10.0.0.1)
root pts/1 2021-11-02 20:29 (10.0.0.8)
[root@Centos6 ~]# who
root pts/0 2021-11-03 04:28 (10.0.0.1)
root pts/1 2021-11-03 04:29 (10.0.0.7)
远程命令执行
[root@Centos8 ~]# ssh 10.0.0.7 "sed -i.bak '/StrictHostKeyChecking/s/.*/StrictHostKeyChecking no/' /etc/ssh/ssh_config" #首次登录不提示检查,默认是开启检查的
root@10.0.0.7's password:
在远程主机执行本地脚本
[root@Centos8 ~]# cat /root/test.sh
#!/bash/bin
hostname -I
[root@Centos8 ~]# bash /root/test.sh
10.0.0.8
[root@Centos8 ~]# ssh 10.0.0.18 /bin/bash < test.sh
root@10.0.0.18's password:
10.0.0.18
2.2.2 ssh验证方式登录
ssh服务登录的常用验证方式
用户/口令
基于密钥
基于用户和口令登录验证
- 客户端发起ssh请求,服务器会把自己的公钥发送给用户
- 用户会根据服务器发来的公钥对密码进行加密
- 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
基于密钥的登录方式
4. 首先在客户端生成一对密钥(ssh-keygen)
5. 并将客户端的公钥ssh-copy-id 拷贝到服务端
6. 当客户端再次发送一个连接请求,包括ip、用户名
7. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,如13579。
8. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
9. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
10. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。
2.2.3 实现基于密钥登录的方式
在客户端生成密钥对
ssh-keygen -t rsa [-P 'password'] [-f “~/.ssh/id_rsa"]
[root@Centos8 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # 回车,接受默认值,密钥的存放文件位置。
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): # 回车,接受空密码,密钥安全性降低。
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.#私钥
Your public key has been saved in /root/.ssh/id_rsa.pub.#公钥
[root@Centos8 ~]# ll .ssh/
total 8
-rw------- 1 root root 2622 Nov 2 20:52 id_rsa
-rw-r--r-- 1 root root 581 Nov 2 20:52 id_rsa.pub
把公钥文件传输至远程服务器对应用户的家目录
[root@Centos8 ~]# ssh-copy-id root@10.0.0.7
[root@Centos7 ~]# ll .ssh/
total 4
-rw------- 1 root root 581 Nov 2 21:03 authorized_keys
验证,无需密码验证·
[root@Centos8 ~]# ssh 10.0.0.7
Last login: Tue Nov 2 20:49:20 2021 from 10.0.0.1
对私钥加密
[root@Centos8 ~]# ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):
Key has comment 'root@Centos8.3.1-magedu.org'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
[root@Centos8 ~]# ssh 10.0.0.7
Enter passphrase for key '/root/.ssh/id_rsa':
Last login: Tue Nov 2 21:04:52 2021 from 10.0.0.8
[root@Centos7 ~]#
启用ssh代理,验证代理(authentication agent)保密解密后的密钥,口令就只需要输入一次,在GNOME中,代理被自动提供给root用户。
[root@Centos8 ~]# ssh-agent bash
[root@Centos8 ~]# ps aux|grep agent
root 1922 0.0 0.0 27420 520 ? Ss 21:11 0:00 ssh-agent bash
root 1940 0.0 0.0 12132 1124 pts/1 S+ 21:11 0:00 grep --color=auto agent
[root@Centos8 ~]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (root@Centos8.3.1-magedu.org)
[root@Centos8 ~]# ssh 10.0.0.7
Last login: Tue Nov 2 21:08:53 2021 from 10.0.0.8
[root@Centos7 ~]#
2.2.4 其他ssh客户端常用工具
scp命令
scp [options] SRC... DEST/
方式:
scp [options] [user@]host:/sourcefile /destpath
scp [options] /sourcefile [user@]host:/destpath
scp [options] [user@]host1:/sourcetpath [user@]host2:/destpath
常用选项:
-C 压缩数据流
-r 递归复制
-p 保持原文件的属性信息
-q 静默模式
-P PORT 指明remote host的监听的端口
rsync 命令
rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包。
注意:通信两端主机都需要安装 rsync 软件
rsync -av /etc server1:/tmp #复制目录和目录下文件
rsync -av /etc/ server1:/tmp #只复制目录下文件
常用选项
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留修改时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-u 如果接收者的文件比发送者的文件较新,将忽略同步
-z 压缩,节约网络带宽
-a 存档,相当于-rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
--delete 源数据删除,目标数据也自动同步删除
sftp命令
交互式文件传输工具,用法和传统的ftp工具相似,利用ssh服务实现安全的文件上传和下载使用ls cd mkdir rmdir pwd get put等指令,可用?或help获取帮助信息。
sftp [user@]host
[root@Centos8 ~]# sftp -help
usage: sftp [-46aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
[-D sftp_server_path] [-F ssh_config] [-i identity_file]
[-J destination] [-l limit] [-o ssh_option] [-P port]
[-R num_requests] [-S program] [-s subsystem | sftp_server]
destination
2.2.5 ssh高级应用
SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。此外,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 连接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道” (tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯。
SSH 端口转发能够提供两大功能:加密 SSH Client 端至 SSH Server 端之间的通讯数据,突破防火墙的限制完成一些之前无法建立的 TCP 连接。
SSH 本地端口转发
ssh -L localport:remotehost:remotehostport sshserver
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 启用网关功能
范例:
#当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23
#data<-->localhost:9527 <-->localhost:XXXXX<-->sshsrv:22<-->sshsrv:YYYYY<--
>telnetsrv:23
ssh -L 9527:telnetsrv:23 -Nfg sshsrv
telnet 127.0.0.1 9527
[root@Centos8 ~]# ssh -fNL 9527:10.0.0.7:80 10.0.0.18
SSH远程端口转发
ssh -R sshserverport:remotehost:remotehostport sshserver
示例:
#让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解
密后转发到telnetsrv:23
#Data<-->sshsrv:9527<-->sshsrv:22<-->localhost:XXXXX<-->localhost:YYYYY<--
>telnetsrv:23
ssh -R 9527:telnetsrv:23 -Nf sshsrv
范例:远程端口转发并实现网关功能
[root@Centos8 ~]# yum -y install httpd;systemctl start httpd;echo website On 10.0.0.28 > /var/www/html/index.html #10.0.0.28作为http服务器。
[root@Centos8 ~]# vim /etc/ssh/sshd_config #修改ssh-server配置
GatewayPorts yes #必须先打开gateway功能,否则无法打开所有IP对应的端口
[root@Centos8 ~]# systemctl restart sshd
[root@Centos8 ~]# ssh -fNgR 9527:10.0.0.28:80 10.0.0.8 #在ssh客户端中指定远程转发服务器IP及端口
[root@Centos6 ~]# curl 10.0.0.8:9527
website On 10.0.0.28
[root@Centos7 ~]# curl 10.0.0.8:9527
website On 10.0.0.28
三、搭建dhcp服务,并实现ip地址申请分发
DHCP实现
注意:实现DHCP服务前,先将网络已有DHCP服务,如:vmware中的DHCP关闭,访止冲突。
DHCP服务的实现软件:
dhcp(CentOS 7 之前版本) 或 dhcp-server(CentOS 8 中的包名)
dnsmasq:小型服务软件,可以提供dhcp和dns功能。
3.1DHCP服务器配置文件
注意:
DHCP服务器本身采用静态IP
必须配置和DHCP网卡的静态IP所在网段的subnet 段,否则DHCP服务无法启动
/etc/dhcp/dhcpd.conf 格式
全局配置
subnet {
...
}
host {
}
3.3以centos8为实例搭建DHCP服务器
#下载安装DHCP服务服务端
[root@Centos8 ~]# yum install -y dhcp-server.x86_64
#yum安装的DHCP服务,无法启动,需自行定义配置文件,用范例配置文件修改
cp /usr/share/doc/dhcp-server/dhcpd.conf.example /etc/dhcp/dhcpd.conf
配置DNS解析地址以及租期时效(s为单位)
配置DHCP服务分发IP地址取值范围以及网关地址
#请求DHCP服务器分发IP地址的客户端
[root@Centos7 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO=dhcp
ONBOOT=yes
#重启网卡
[root@Centos7 ~]# nmcli connection reload
[root@Centos7 ~]# nmcli connection up eth0
#查看获取到的IP地址
[root@Centos7 ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:4e:16:42 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.150/24 brd 10.0.0.255 scope global noprefixroute dynamic eth0
valid_lft 7102sec preferred_lft 7102sec
inet6 fe80::20c:29ff:fe4e:1642/64 scope link
valid_lft forever preferred_lft forever
valid_lft forever preferred_lft forever
[root@Centos7 ~]# ping www.baidu.com
PING www.a.shifen.com (112.80.248.76) 56(84) bytes of data.
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=1 ttl=128 time=14.6 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=2 ttl=128 time=18.6 ms
64 bytes from 112.80.248.76 (112.80.248.76): icmp_seq=3 ttl=128 time=15.1 ms
查看DHCP服务器日志
[root@Centos8 ~]# cat /var/lib/dhcpd/dhcpd
dhcpd6.leases dhcpd.leases dhcpd.leases~
[root@Centos8 ~]# cat /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.3.6
# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;
server-duid "\000\001\000\001)\024\016\302\000\014)eO\270";
lease 10.0.0.150 {
starts 2 2021/11/02 15:04:00;
ends 2 2021/11/02 17:04:00;
cltt 2 2021/11/02 15:04:00;
binding state active;
next binding state free;
rewind binding state free;
hardware ethernet 00:0c:29:4e:16:42;
client-hostname "Centos7";
}