[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
[root@Centos8 ~]# cd /etc/pki/CA/ [root@Centos8 CA]# (umask 066; openssl genrsa -out private/cakey.pem 2048)
[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证书详细。
生成用户私钥存放路径
[root@Centos8 ~]# mkdir /data/app [root@Centos8 ~]# (umask 066; openssl genrsa -out /data/app/app.key 2048)
[root@Centos8 ~]# openssl req -new -key /data/app1/app1.key -out /data/app1/app1.csr
默认要求 国家,省,公司名称三项必须和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
[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
默认的证书在windows最开始是不受信任的
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实现身份认证
客户端发起链接请求
服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
客户端生成密钥对
客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密
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等
[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
ssh服务登录的常用验证方式
用户/口令
基于密钥
基于用户和口令登录验证
基于密钥的登录方式
4. 首先在客户端生成一对密钥(ssh-keygen)
5. 并将客户端的公钥ssh-copy-id 拷贝到服务端
6. 当客户端再次发送一个连接请求,包括ip、用户名
7. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,如13579。
8. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
9. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
10. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。
在客户端生成密钥对
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 ~]#
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
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实现
注意:实现DHCP服务前,先将网络已有DHCP服务,如:vmware中的DHCP关闭,访止冲突。
DHCP服务的实现软件:
dhcp(CentOS 7 之前版本) 或 dhcp-server(CentOS 8 中的包名)
dnsmasq:小型服务软件,可以提供dhcp和dns功能。
注意:
DHCP服务器本身采用静态IP
必须配置和DHCP网卡的静态IP所在网段的subnet 段,否则DHCP服务无法启动
/etc/dhcp/dhcpd.conf 格式 全局配置 subnet { ... } host { }
#下载安装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"; }