加密和安全

常用的安全技术

3A

认证 授权 审计 安全通信

加密算法和协议

对称加密 非对称加密 单向加密 认证协议

data 明文 ---加密(算法+key1)---》密文  ----》解密(算法+key2)---data明文
key1=key2 对称
key1!= key2 不对称
[root@localhost ~]# yum -y install telnet-server

[root@localhost ~]# rpm -ql telnet
package telnet is not installed
[root@localhost ~]# rpm -ql telnet-server
/usr/lib/systemd/system/telnet.socket
/usr/lib/systemd/system/telnet@.service
/usr/sbin/in.telnetd
/usr/share/man/man5/issue.net.5.gz
/usr/share/man/man8/in.telnetd.8.gz
/usr/share/man/man8/telnetd.8.gz
[root@localhost ~]# systemctl enable --now telnet.socket
Created symlink from /etc/systemd/system/sockets.target.wants/telnet.socket to /usr/lib/systemd/system/telnet.socket.

root@localhost ~]# ss -ntl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port              
                 
LISTEN      0      5             192.168.122.1:53                                    *:*                  
LISTEN      0      128                       *:22                                    *:*                  
                 
LISTEN      0      128                    [::]:22                                 [::]:*                  
LISTEN      0      128                    [::]:23                                 [::]:*      

telnet 容易被捕获


1.7 加密算法和协议

1.7.1对称加密算法

对称加密:加密和解密使用同一个密钥

特性:

  • 加密、解密使用同一个密钥,效率高
  • 将原始数据分割成固定大小的块,逐个进行加密

缺陷:

  • 密钥过多
  • 密钥分发
  • 数据来源无法确认

常见对称加密算法:

  • DES:Data Encryption Standard,56bits
  • 3DES:
  • AES:Advanced (128, 192, 256bits)
  • Blowfish,Twofish
  • IDEA,RC6,CAST5

1.7.2 非对称加密算法

1.7.2.1 非对称加密算法介绍
Alice <---> Bob

Alice
 Pa,Sa
Bob
 Pb,Sb

公钥:公开的,小广告 
public
私钥:不公开的,身份证 secret

成对使用,使用一个钥匙加密,只能使用另一把钥匙解密

Alice <---> Bob
data 明文 ---加密(算法+key1)---》密文  ----》解密(算法+key2)---data明文
加密功能
key1=Pb(必须前提有Bob的公钥)
key2=Sb
数据来源确认
key1=Sa
key2=Pb
x

1.7.3 单向哈希算法

哈希算法:也称散列算法,将任意数据缩小称固定大小的指纹,称为digest 即摘要

hash(data)----> digest 
1》单向,不可逆
2》data不同,digest比不同,data相同,digest比相同
3》digset长度由hash算法决定,md5(data)---》128bit
作用:数据完整性的判断。摘要值记住,对比之后的是否有变化。


特性:

  • 任意长度输入,固定长度输出
  • 若修改数据,指纹也会改变,且有雪崩效应,数据的一点微小改变,生成的指纹值变化非常大。
  • 无法从指纹中重新生成数据,即不要逆,具有单向性

功能:数据完整性

常见算法

md5: 128bits、sha1: 160bits、sha224 、sha256、sha384、sha512

1.7.4 综合应用多种加密算法

综合加密和签名

即实现数据加密,又可以保证数据来源的可靠性、数据的完整性和一致性

方法1:Pb{Sa[hash(data)]+data}

在这里插入图片描述

最常用合理的:

方法2:对称key{Sa[hash(data)]+data}+Pb(对称key)

在这里插入图片描述

1.8 CA和证书

1.8.1 中间人攻击

Man-in-the-middle,简称为 MITM,中间人

在这里插入图片描述

公钥文件所在目录

公钥文件

cat /etc/pki/rpm-gpg
[root@centos rpm-gpg]# cat RPM-GPG-KEY-CentOS-7 
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.5 (GNU/Linux)

mQINBFOn/0sBEADLDyZ+DQHkcTHDQSE0a0B2iYAEXwpPvs67cJ4tmhe/iMOyVMh9
Yw/vBIF8scm6T/vPN5fopsKiW9UsAhGKg0epC6y5ed+NAUHTEa6pSOdo7CyFDwtn
4HF61Esyb4gzPT6QiSr0zvdTtgYBRZjAEPFVu3Dio0oZ5UQZ7fzdZfeixMQ8VMTQ
4y4x5vik9B+cqmGiq9AW71ixlDYVWasgR093fXiD9NLT4DTtK+KLGYNjJ8eMRqfZ
Ws7g7C+9aEGHfsGZ/SxLOumx/GfiTloal0dnq8TC7XQ/JuNdB9qjoXzRF+faDUsj
WuvNSQEqUXW1dzJjBvroEvgTdfCJfRpIgOrc256qvDMp1SxchMFltPlo5mbSMKu1
x1p4UkAzx543meMlRXOgx2/hnBm6H6L0FsSyDS6P224yF+30eeODD4Ju4BCyQ0jO
IpUxmUnApo/m0eRelI6TRl7jK6aGqSYUNhFBuFxSPKgKYBpFhVzRM63Jsvib82rY
438q3sIOUdxZY6pvMOWRkdUVoz7WBExTdx5NtGX4kdW5QtcQHM+2kht6sBnJsvcB
JYcYIwAUeA5vdRfwLKuZn6SgAUKdgeOtuf+cPR3/E68LZr784SlokiHLtQkfk98j
NXm6fJjXwJvwiM2IiFyg8aUwEEDX5U+QOCA0wYrgUQ/h8iathvBJKSc9jQARAQAB
tEJDZW50T1MtNyBLZXkgKENlbnRPUyA3IE9mZmljaWFsIFNpZ25pbmcgS2V5KSA8
c2VjdXJpdHlAY2VudG9zLm9yZz6JAjUEEwECAB8FAlOn/0sCGwMGCwkIBwMCBBUC
CAMDFgIBAh4BAheAAAoJECTGqKf0qA61TN0P/2730Th8cM+d1pEON7n0F1YiyxqG
QzwpC2Fhr2UIsXpi/lWTXIG6AlRvrajjFhw9HktYjlF4oMG032SnI0XPdmrN29lL
F+ee1ANdyvtkw4mMu2yQweVxU7Ku4oATPBvWRv+6pCQPTOMe5xPG0ZPjPGNiJ0xw
4Ns+f5Q6Gqm927oHXpylUQEmuHKsCp3dK/kZaxJOXsmq6syY1gbrLj2Anq0iWWP4
Tq8WMktUrTcc+zQ2pFR7ovEihK0Rvhmk6/N4+4JwAGijfhejxwNX8T6PCuYs5Jiv
hQvsI9FdIIlTP4XhFZ4N9ndnEwA4AH7tNBsmB3HEbLqUSmu2Rr8hGiT2Plc4Y9AO
aliW1kOMsZFYrX39krfRk2n2NXvieQJ/lw318gSGR67uckkz2ZekbCEpj/0mnHWD
3R6V7m95R6UYqjcw++Q5CtZ2tzmxomZTf42IGIKBbSVmIS75WY+cBULUx3PcZYHD
ZqAbB0Dl4MbdEH61kOI8EbN/TLl1i077r+9LXR1mOnlC3GLD03+XfY8eEBQf7137
YSMiW5r/5xwQk7xEcKlbZdmUJp3ZDTQBXT06vavvp3jlkqqH9QOE8ViZZ6aKQLqv
pL+4bs52jzuGwTMT7gOR5MzD+vT0fVS7Xm8MjOxvZgbHsAgzyFGlI1ggUQmU7lu3
uPNL0eRx4S1G4Jn5
=OGYX
-----END PGP PUBLIC KEY BLOCK-----

1.8.2 CA和证书

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MtYswZj4-1659102443068)(C:\Users\78715\AppData\Roaming\Typora\typora-user-images\image-20220630101726469.png)]

PKI:Public Key Infrastructure 公共密钥加密体系

签证机构:CA(Certificate Authority)

注册机构:RA

证书吊销列表:CRL

X.509:定义了证书的结构以及认证协议标准

  • 版本号
  • 序列号
  • 签名算法
  • 颁发者
  • 有效期限
  • 主体名称

证书类型:

  • 证书授权机构的证书
  • 服务器证书
  • 用户证书

获取证书两种方法:

  • 自签名的证书: 自已签发自己的公钥
  • 使用证书授权机构:

​ 生成证书请求(csr)

​ 将证书请求csr发送给CA

​ CA签名颁发证书

1.8.3 安全协议 SSL/TLS

http+mysql+ftp
ssl
tcp
ip
ethernet

http+ssl=https
mysql+ssl=mysqls
ftp+ssl=ftps

机密性 认证 完整性 重放保护

1.8.4 HTTPS

HTTP over SSL 或 HTTP over TLS ,对http协议的文本数据进行加密处理后,成为二进制形式传输

HTTPS工作的简化过程
在这里插入图片描述

1 客户端发起https请求
用户在浏览器里输入一个https网址,然后连接到服务器的443端口

2 服务端的配置
采用HTTPS协议的服务器必须要有一套数字证书,可以自己制作,也可以向组织申请。区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面。这套证书其实就是一对公钥和私钥

3 传送服务器的证书给客户端
证书里其实就是公钥,并且还包含了很多信息,如证书的颁发机构,过期时间等等

4  客户端解析验证服务器证书
这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如:颁发机构,过期时间等等,如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随机值。然后用证书中公钥对该随机值进行非对称加密

5  客户端将加密信息传送服务器
这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了

6 服务端解密信息
服务端将客户端发送过来的加密信息用服务器私钥解密后,得到了客户端传过来的随机值

7 服务器加密信息并发送信息
服务器将数据利用随机值进行对称加密,再发送给客户端

8 客户端接收并解密信息
客户端用之前生成的随机值解密服务段传过来的数据,于是获取了解密后的内容


2 OpenSSL

2.1 OpenSSL 介绍

在这里插入图片描述

包括三个组件:

  • libcrypto:用于实现加密和解密的库
  • libssl:用于实现ssl通信协议的安全库
  • openssl:多用途命令行工具

2.2 Base64 编码

Base64是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法

2.3 openssl 命令

运行模式

  • 交互模式
  • 批处理模式

子命令

  • 标准命令
  • 消息摘要命令
  • 加密命令

2.3.2 openssl命令生成随机数

随机数生成器:伪随机数字,利用键盘和鼠标,块设备中断生成随机数

/dev/random #仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom #从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
openssl rand -base64|-hex NUM

NUM: 表示字节数,使用-hex,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2

范例:生成随机10位长度密码

[root@centos8 ~]#openssl rand -base64 9 |head -c10
ip97t6qQes[root@centos8 ~]#
[root@centos8 ~]#tr -dc '[:alnum:]' < /dev/urandom |head -c10
DO2mDp3eZu[root@centos8 ~]#

base64 3个字节一个单位 如果不满3个会自动补齐,生成=号 能被3整除 就不会有=

2.3.3 openssl命令实现 PKI

生成私钥

生成私钥
------------------------------------------------------
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE [-aes128] [-aes192] [-aes256] [-des3] [NUM_BITS,默认2048]
对称加密算法:man genrsa
-aes128, -aes192, -aes256, -aria128, -aria192, -aria256, -camellia128, -camellia192, -camellia256, -des, -des3, -idea

----------------------------------------------------------
解密加密的私钥
openssl rsa -in /PATH/TO/PRIVATEKEY.FILE -out /PATH/TO/PRIVATEKEY2.FILE


范例

#用加密对称密钥加密私钥,此方式更安全,但是不方便
[root@rocky8 ~]# (umask 077 ; openssl genrsa -out /data/app1.key)
Generating RSA private key, 2048 bit long modulus (2 primes)
....+++++
....................................................+++++
e is 65537 (0x010001)
[root@rocky8 ~]# ll /data/app1.key
-rw------- 1 root root 1679 Jul  1 21:04 /data/app1.key
[root@rocky8 ~]# cat 
^H^C
[root@rocky8 ~]# 
[root@rocky8 ~]# cat /data/app1.key
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAltW8ShKRjPbeG0zHIq+qeznTrdwC4iWTZnDKs1jcCFAza96D
Omf9PjENhEvF8I6X+ONp6Q6mZLV5rFGXlQX/GJh4FFPmLu9hFbSlk+7EFRZWVUMx
4lBqBRynbl2UfaaOOV3orRpSPd5bRR0ZmDSL8UoE8YHuKMxUH3sdb4cbVVZnQlU5
ViL0L+UHBih7RVilQy9oZnHVXCE6KTf4HGyKQ/I2ZvHQUlr6sVV7pXBllIQ3Mz1b
RIlD7CZJKt5eM6LZYvQnTwT3ledDO2EWt/UBqjR8hDctKixpfs1gMBCpT5Q8f2rr
12NWrLeeZHbJmJkEhbQ77nloXYXqKvEgxUQlmQIDAQABAoIBADxKatzg1zUVaGpZ
IjAHL4nZ73bLPovOoUCNTTirCCh6hlNTufiaoGs/iDudXh1toelmXWs+49vVfjEW
3BRBNVpLd5QIhTW1kYTvlE+xXMdhCllCZqojon0wmuxOk5A2Bxt/IgYvQzhfrPPP
Ue+48UcdYyR13xCHvAhpWba+tnpBViKJ3mBRCTGIiQ/6ImSbPyLhfHbf79PdaI7l
RilXV5DJ0UhnIMKKCG8FsjqbdDgvbskDCXr+GKT8wvgP5ATMC1sNyEawth09/GRV
s5f5Tv77Y6uNb/4NCNYMQSzzUcUxhipzJ2M4bxpI0yqFMCkc7Sa5OEHBarcezdp/
iKw1qgECgYEAxsxVkIFtit7RcNc3yiZZM/zsG8gFbBdPORWvkGvYKLFOMWLXxDPc
ZdQhZMoq5E89WNhhliVsUxcmNbRWrq/a5/2W0L8TvvyaSWqsaqtIKEX3Ss/jtoZq
VnVw5o8UUNjaO0cw5fxlmq1Q3TNGEZ9+hk2ueGkK4BqFBQ8EBrrPHhECgYEAwjxh
TBaUt6q7X9flDxsIoZGfSMjVB0+23ySs55sGv9tBnCe1ayFmHwlktHbVQAh0zy8F
Vlwi9tJeFncCn2cqpL/YwGnH5Slsn2qpGiZFMVdQ6J3Wp1nKN0grCK+tv4n3OdJ2
cB4mP3g6paPgcNiR7gT8qm98Z5PJnL2qsi5vpwkCgYEAikX1/d0IZF83LlWD6Idj
5FU3pNsralOMNxhuVPWuFB+/U3p8uWuZEPrLf19fFg5HjVR0DAtbnS+s1A3rfPW0
PUiVbfx5r43jgs0/v7IDLn/70X1n1b0Imbp2HOfIKbOrly+dQ1qbEUsbw7+2LOvT
BXdisz3c4qOPgkU/d67YAQECgYEAl/tG5pKEq3IcS1JTGQ6+Ii4fxIPgrGfjX5cC
8/aJwXV+UQGBIuJvVbmz4sFY+1GilLrmIjzV3uucU1er5a6D34V9xJEAqH9RTyvW
RW/MlF8OH/XhD/FiGP+PLKzJ9yWtHMFhizkMFH2u5gzkgWf0R5n/Wh0B6sno54xB
FErhcoECgYBHBHDtFMV2mbmVq4wV03hvIA54Mty9TWTdj2dKjWUkItVOAX8ArLLw
uX/1vyS0ZbkunhqSLtfzb2l7AV81GAktJIxisd4BNiEmgHqPcSIqD224Ce+e4x50
J6vzd653t0I6fhcv7fTPJa2a/wxuichS9kbLamaxh7x6t/yOVlFpUw==
-----END RSA PRIVATE KEY-----
[root@rocky8 ~]# 

2.4 建立私有CA实现证书申请颁发

两步

自己的ca证书(自己给自己)

给客户的证书

证书申请及签署步骤

  1. 生成证书申请请求
  2. RA核验
  3. CA签署
  4. 获取证书

openssl的配置文件

/etc/pki/tls/openssl.cnf

三种策略:match匹配、optional可选、supplied提供

match:要求申请填写的信息跟CA设置信息必须一致
optional:可有可无,跟CA设置信息可不一致
supplied:必须填写这项申请信息

2.4.1 创建私有CA

1 创建CA所需要的文件

mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private}
#生成证书索引数据库文件
touch /etc/pki/CA/index.txt

#指定第一个颁发证书的序列号
echo 01 > /etc/pki/CA/serial

2 生成CA私钥

cd /etc/pki/CA/
(umask 066 ; openssl genrsa -out private/cakey.pem 2048)
#umask 权限减之后的权限

3 生成CA自签名证书

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out  /etc/pki/CA/cacert.pem





[root@rocky8 CA]# openssl x509 -in /etc/pki/CA/cacert.pem -noout -text  #查看证书

选项说明

-new:生成新证书签署请求
-x509:专用于CA生成自签证书
-key:生成请求时用到的私钥文件
-days n:证书的有效期限
-out /PATH/TO/SOMECERTFILE: 证书的保存路径

2.4.2 申请证书并颁发证书

1 为需要使用证书的主机生成私钥

(umask 066 ; openssl genrsa -out  /data/test.key 2048)
-----------------------------------------------------
- out /data/  #替换成以后的服务文件

2 为需要使用证书的主机生成证书申请文件

openssl seq -new -key /data/test.key -out /data/test.csr

3 在CA签署证书并将证书颁发给请求者

openssl ca -in /data/test.csr -out /etc/pki/CA/certs/test.crt -days 100

注意:默认要求 国家,省,公司名称三项必须和CA一致

4 查看证书中的信息

openssl x509 -in /PATH/FROM/CERT_FILE -noout -text|issuer|subject|serial|dates

#查看指定编号的证书状态
openssl ca -status SERIAL

[root@rocky8 CA]# openssl ca -status 0F
Using configuration from /etc/pki/tls/openssl.cnf
0F=Valid (V)


法2:只在centos7上 ,8上没有,可以copy

cat makefile

cd /etc/pki/tls/certs
make  /data/test.key  

2.4.3 吊销证书

在客户端获取要吊销找的证书的serial

openssl x509 in /PATH/FROM/CERT_FILE -noout -serial -subject

在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书:

openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem

指定第一个吊销证书的编号,注意:第一次更新证书吊销列表前,才需要执行

echo 01 > /etc/pki/CA/crlnumber

更新证书吊销列表

openssl ca -gencrl -out /etc/pki/CA/crl.pem

2.4.4 证书生成脚本

#证书存放目录
DIR=/data


#每个证书信息
declare -A CERT_INFO
CERT_INFO=([subject0]="/O=heaven/CN=ca.god.com" \
           [keyfile0]="cakey.pem" \
           [crtfile0]="cacert.pem" \
           [key0]=2048 \
           [expire0]=3650 \
           [serial0]=0    \
           [subject1]="/C=CN/ST=hubei/L=wuhan/O=Central.Hospital/CN=master.liwenliang.org" \
           [keyfile1]="master.key" \
           [crtfile1]="master.crt" \
           [key1]=2048 \
           [expire1]=365
           [serial1]=1 \
           [csrfile1]="master.csr" \
           [subject2]="/C=CN/ST=hubei/L=wuhan/O=Central.Hospital/CN=slave.liwenliang.org" \
           [keyfile2]="slave.key" \
           [crtfile2]="slave.crt" \
           [key2]=2048 \
           [expire2]=365 \
           [serial2]=2 \
           [csrfile2]="slave.csr"   )

COLOR="echo -e \\E[1;32m"
END="\\E[0m"

#证书编号最大值
N=`echo ${!CERT_INFO[*]} |grep -o subject|wc -l`

cd $DIR 



for((i=0;i<N;i++));do
    if [ $i -eq 0 ] ;then
        openssl req  -x509 -newkey rsa:${CERT_INFO[key${i}]} -subj ${CERT_INFO[subject${i}]} \
            -set_serial ${CERT_INFO[serial${i}]} -keyout ${CERT_INFO[keyfile${i}]} -nodes \
	    -days ${CERT_INFO[expire${i}]}  -out ${CERT_INFO[crtfile${i}]} &>/dev/null
        
    else 
        openssl req -newkey rsa:${CERT_INFO[key${i}]} -nodes -subj ${CERT_INFO[subject${i}]} \
            -keyout ${CERT_INFO[keyfile${i}]}   -out ${CERT_INFO[csrfile${i}]} &>/dev/null

        openssl x509 -req -in ${CERT_INFO[csrfile${i}]}  -CA ${CERT_INFO[crtfile0]} \
	    -CAkey ${CERT_INFO[keyfile0]}  -set_serial ${CERT_INFO[serial${i}]}  \
	    -days ${CERT_INFO[expire${i}]} -out ${CERT_INFO[crtfile${i}]} &>/dev/null
    fi
    $COLOR"**************************************生成证书信息**************************************"$END
    openssl x509 -in ${CERT_INFO[crtfile${i}]} -noout -subject -dates -serial
    echo 
done
chmod 600 *.key
echo  "证书生成完成"
$COLOR"**************************************生成证书文件如下**************************************"$END
echo "证书存放目录: "$DIR
echo "证书文件列表: "`ls $DIR`

3 ssh服务

3.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实现身份认证

3.1.1 公钥交换原理

在这里插入图片描述

  • 客户端发起连接请求
  • 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
  • 客户端生成密钥对
  • 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
  • 客户端发送加密后的值到服务端,服务端用私钥解密,得到Res
  • 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
  • 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

-------------------------------------------------------------------------------------
得到对方的公钥

[root@centos ~]# cat .ssh/known_hosts
10.0.0.48 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBMcBNYLAe728VopCBDpemp/Oeb0J2YIcQm4OVp0+/G8C5JAsU2Xk/09wTsuZDL9YdSTeJS6ygL2LMiCRxfzTxl0=


如何核实是真正的对方
对比一下公钥,自己连接自己

root@rocky8 ~]# ssh 127.0.0.1
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:6zcq8CZzA2RNOaK/mIMUva+0eUhhbOf1BaEhFtIISkU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ECDSA) to the list of known hosts.
root@127.0.0.1's password: 
Last login: Sun Jul  3 14:32:45 2022 from 10.0.0.1

如果主机失去了,在重新连接主机,要删除对应的公钥

[root@centos ~]# cat .ssh/known_hosts

----------------------------------------------------------------------
d ----- daomen 守护进程

ls /etc/ssh/sshd_config  #服务端
ls /etc/ssh/ssh_config   #客户端


3.1.2 ssh加密通讯原理

在这里插入图片描述

3.2 openssh 服务

OpenSSH是SSH (Secure SHell) 协议的免费开源实现,一般在各种Linux版本中会默认安装,基于C/S结构

服务器端程序:/usr/sbin/sshd

Unit 文件:/usr/lib/systemd/system/sshd.service

客户端:

  • Linux Client: ssh, scp, sftp,slogin
  • Windows Client:xshell, MobaXterm,putty, securecrt, sshsecureshellclient

3.2.1 客户端 ssh命令

ssh命令是ssh客户端,允许实现对远程系统经验证地加密安全访问

当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub文件中的公钥到客户机的~/.ssh/know_hosts中。下次连接时,会自动匹配相对应的私钥,不能匹配,将拒绝连接

ssh客户端配置文件: /etc/ssh/ssh_config


-----------------------------------------------------------------------------------------
新建文件
dd if=/dev/zero of=f1.img bs=1M count=100


3.2.2 其它ssh客户端工具

---------------------------------------------------------------------------------
scp命令 方式:
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工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包

---------------------------------------------------------------------------------
👍rsync对比 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 源数据删除,目标数据也自动同步删除
--progress 显示进度
--bwlimit=5120 #限速以KB为单位,5120表示5MB


❤一些常识

ssh的登录
ssh 一般 通过连接主机和用户登录   用户在Linux是root 省去了
ssh root@10.0.0.17  

修改ssh的默认端口22

vim /etc/ssh/sshd_config
Port NUM
systemctl restart sshd.service

通过加端口登录

ssh -p NUM root@10.0.0.17


ssh -p NUM root@10.0.0.17  'command'  #可以在后面执行命令(可以多个)

✨yes/no 省去

方法1:在ssh的客户端配置中
vim /etc/ssh/ssh_config
StrictHostKeyChecking no

方法2:在写命令写入
ssh -o StrictHostKeyChecking=no 10.0.0.17

密码解决 不用输入



自动登录 ssh工具 sshpass

由EPEL源提供,ssh登陆不能在命令行中指定密码。sshpass的出现,解决了这一问题。sshpass用于非交互SSH的密码验证,一般用在sh脚本中,无须再次输入密码(本机known_hosts文件中有的主机才能生效)。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。

格式
sshpass [option] command parameters

常见选项
-p password #后跟密码它允许你用 -p 参数指定明文密码,然后直接登录远程服务器
-f filename #后跟保存密码的文件名,密码是文件内容的第一行
-e #将环境变量SSHPASS作为密码

[root@centos ~]# yum -y install sshpass
[root@centos ~]# rpm -ql sshpass
/usr/bin/sshpass
/usr/share/doc/sshpass-1.06
/usr/share/doc/sshpass-1.06/AUTHORS
/usr/share/doc/sshpass-1.06/COPYING
/usr/share/doc/sshpass-1.06/ChangeLog
/usr/share/doc/sshpass-1.06/NEWS
/usr/share/man/man1/sshpass.1.gz

[root@centos ~]# ssh 10.0.0.48
The authenticity of host '10.0.0.48 (10.0.0.48)' can't be established.
ECDSA key fingerprint is SHA256:6zcq8CZzA2RNOaK/mIMUva+0eUhhbOf1BaEhFtIISkU.
ECDSA key fingerprint is MD5:ab:bb:c3:ef:6d:82:c8:e8:8b:a4:d0:f9:8a:c9:96:59.
Are you sure you want to continue connecting (yes/no)? ^C
[root@centos ~]# sshpass -p 123123 ssh -o StrictHostKeyChecking=no 10.0.0.48
Warning: Permanently added '10.0.0.48' (ECDSA) to the list of known hosts.
Last login: Sun Jul  3 20:00:11 2022 from 127.0.0.1
[root@rocky8 ~]# 


会暴露密码
方法1:
可以写入文件

sshpass -f sshpass.txt ssh -o StrictHostKeyChecking=no 10.0.0.48 

加权限 自己看

方法2:
写入path变量
export SSHPASS=123123
echo $SSHPASS
sshpass -e ssh -o StrictHostKeyChecking=no 10.0.0.48 



IPLIST="
10.0.0.100
10.0.0.7
"
PASS=centos1
. /etc/os-release

pre_os () {
if [[ $ID =~ ubuntu ]];then
   dpkg -l  sshpass &> /dev/null || { apt update; apt -y install sshpass; }
elif [[ $ID =~ rocky|centos|rhel ]];then
    rpm -q sshpass &>/dev/null || yum -y install sshpass
else
    echo "不支持当前操作系统"
    exit
fi

}

change_root_pass () {

[ -f ip_pass.txt ] && mv ip_pass.txt ip_pass.txt.bak

for ip in $IPLIST;do
    pass=`openssl rand -base64 9` 
    sshpass -p $PASS  ssh -o StrictHostKeyChecking=no  $ip "echo root:$pass | chpasswd" 
    if [ $? -eq 0 ];then
        echo  "$ip:root:$pass" >> ip_pass.txt
        echo "change root password is successfull on $ip"
    else
        echo "change root password is failed on $ip"
    fi
done

}

pre_os

change_root_pass

3.2.3 ssh登录验证方式介绍

ssh服务登录的常用验证方式

  • 用户/口令
  • 基于密钥

基于用户和口令登录验证

在这里插入图片描述

  1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户
  2. 用户会根据服务器发来的公钥对密码进行加密
  3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥的登录方式

在这里插入图片描述

  1. 首先在客户端生成一对密钥(ssh-keygen)

  2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

  3. 当客户端再次发送一个连接请求,包括ip、用户名

  4. 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生
    成一个字符串,例如:eghuo

  5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

  6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

  7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

3.2.4 实现基于密钥的登录方式

在客户端生成密钥对

ssh-keygen -t rsa [-P 'password'] [-f “~/.ssh/id_rsa"]

把公钥文件传输至远程服务器对应用户的家目录

ssh-copy-id [-i [identity_file]] [user@]host

重设私钥口令:

ssh-keygen -p

验证代理(authentication agent)保密解密后的密钥,口令就只需要输入一次,在GNOME中,代理被自动提供给root用户

#启用代理
ssh-agent bash
#钥匙通过命令添加给代理
ssh-add

3.2.5 ssh服务器配置

服务器端:sshd

服务器端的配置文件: /etc/ssh/sshd_config

服务器端的配置文件帮助:man 5 sshd_config


范例:在Ubuntu上启用root远程ssh登录

#修改sshd服务配置文件
vim /etc/ssh/sshd_config
#PermitRootLogin prohibit-password 注释掉此行
PermitRootLogin yes 修改为下面形式

systemctl restart sshd


  • ssh 服务的最佳实践

  • 建议使用非默认端口

  • 禁止使用protocol version 1

  • 限制可登录用户

  • 设定空闲会话超时时长

  • 利用防火墙设置ssh访问策略

  • 仅监听特定的IP地址

  • 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12|xargs

  • 使用基于密钥的认证

  • 禁止使用空密码

  • 禁止root用户直接登录

  • 限制ssh的访问频度和并发在线数

  • 经常分析日志

4 利用 sudo 实现授权

4.1 sudo 介绍

4.2 sudo 组成

包:sudo

配置文件:/etc/sudo.conf

授权规则配置文件

/etc/sudoers
/etc/sudoers.d

安全编辑授权规则文件和语法检查工具

/usr/sbin/visudo
检查语法
visudo -c
#检查指定配置文件语法
visudo -f /etc/sudoers.d/test
root all=(all) all
授权人  主机 代表谁 执行命令
ehuo    10.0.0.10  



4.3 sudo 命令

udo命令
ls -l /usr/bin/sudo
sudo -i -u wang 切换身份功能和 su 相似,但不一样,sudo必须提前授权,而且要输入自已的密码
sudo [-u user] COMMAND
-V 显示版本信息等配置信息
-u user 指定代表的用户,默认为root
-l,ll 列出用户在主机上可用的和被禁止的命令
-v 再延长密码有效期限5分钟,更新时间戳
-k 清除时间戳(1970-01-01),下次需要重新输密码
-K 与-k类似,还要删除时间戳文件
-b 在后台执行指令
-p 改变询问密码的提示符号
示例:-p "password on %h for user %p: "

4.4 sudo 授权规则配置

配置文件 /etc/sudoers, /etc/sudoers.d/

配置文件中支持使用通配符 glob

? 任意单一字符
* 匹配任意长度字符
[wxc] 匹配其中一个字符
[!wxc] 除了这三个字符的其它字符
\x 转义
[[alpha]] 字母 
/bin/ls [[alpha]]*

配置文件规则

1 别名定义:不是必须的

2 授权规则:必须的

sudoers 授权规则格式
用户   登入主机=(代表用户)   命令

user   host=(runas)   command

root     all=(all)    all


user: 运行命令者的身份
host: 通过哪些主机
(runas):以哪个用户的身份
command: 运行哪些命令

5 PAM认证机制

5.1 PAM 介绍

6 时间同步服务

加密和安全当前都离不开时间的同步,否则各种网络服务可能不能正常运行

7版本之前的同步时间 8以后没有了!
ntptime

*/10 * * * * /usr/sbin/nptdate ntp.aliyun.com  #十分钟同步


6.2 时间同步服务

时间同步服务

多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用的故障,利用NTP(Network Time Protocol) 协议使网络中的各个计算机时间达到同步。目前NTP协议属于运维基础架构中必备的基本服务之一

时间同步软件实现:

  • ntp
  • chrony

ntp:

将系统时钟和世界协调时UTC同步,精度在局域网内可达0.1ms,在互联网上绝大多数的地方精度可以达到1-50ms

chrony:

实现NTP协议的的自由软件。可使系统时钟与NTP服务器,参考时钟(例如GPS接收器)以及使用手表和键盘的手动输入进行同步。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IbudIOk1-1659102443072)(C:\Users\78715\AppData\Roaming\Typora\typora-user-images\1658927984357.png)]

NTP需要持续运行,开机自启

6.3 chrony

优势

chrony 文件组成

包:chrony

两个主要程序:chronyd和chronyc

  • chronyd:后台运行的守护进程,用于调整内核中运行的系统时钟和时钟服务器同步。它确定计算
    机增减时间的比率,并对此进行补偿
  • chronyc:命令行用户工具,用于监控性能并进行多样化的配置。它可以在chronyd实例控制的计
    算机上工作,也可在一台不同的远程计算机上工作

服务unit 文件: /usr/lib/systemd/system/chronyd.service

监听端口: 服务端: 123/udp,客户端: 323/udp

配置文件: /etc/chrony.conf

配置文件chrony.conf

server  #可用于时钟服务器,iburst 选项当服务器可达时,发送一个八个数据包而不是通常的一个数据 包。 包间隔通常为2秒,可加快初始同步速度

pool   #该指令的语法与server 指令的语法相似,不同之处在于它用于指定NTP服务器池而不是单个NTP服务器。池名称应解析为随时间可能会变化的多个地址

driftfile #根据实际时间计算出计算机增减时间的比率,将它记录到一个文件中,会在重启后为系统时钟作出补偿

rtcsync  #启用内核模式,系统时间每11分钟会拷贝到实时时钟(RTC)

allow / deny #指定一台主机、子网,或者网络以允许或拒绝访问本服务器

cmdallow / cmddeny #可以指定哪台主机可以通过chronyd使用控制命令

bindcmdaddress #允许chronyd监听哪个接口来接收由chronyc执行的命令

makestep # 通常chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在调整期大于某个阀值时调整系统时钟

local stratum 10  #即使server指令中时间服务器不可用,也允许将本地时间作为标准时间授时给其它
客户端

6.3.4 NTP 客户端工具

chronyc 可以运行在交互式和非交互式两种方式,支持以下子命令

help 命令可以查看更多chronyc的交互命令
accheck 检查是否对特定主机可访问当前服务器
activity 显示有多少NTP源在线/离线
sources [-v]  显示当前时间源的同步信息
sourcestats [-v]显示当前时间源的同步统计信息
add server 手动添加一台新的NTP服务器
clients 报告已访问本服务器的客户端列表
delete 手动移除NTP服务器或对等服务器
settime 手动设置守护进程时间
tracking 显示系统时间信息

6.3.5 公共NTP服务

pool.ntp.org:项目是一个提供可靠易用的NTP服务的虚拟集群cn.pool.ntp.org,0-3.cn.pool.ntp.org

阿里云公共NTP服务器

Unix/linux类:ntp.aliyun.com,ntp1-7.aliyun.com

windows类: time.pool.aliyun.com

腾讯公共NTP

time1-5.cloud.tencent.com

大学ntp服务

s1a.time.edu.cn 北京邮电大学

s1b.time.edu.cn 清华大学

s1c.time.edu.cn 北京大学

国家授时中心服务器:210.72.145.44

美国标准技术院: time.nist.gov

6.3.6 时间工具

timedatectl 时间和时区管理

#查看日期时间,时区级NTP状态
timedatectl
#查看时区列表:
timedatectl list-timezones
#修改时区:
timedatectl set-timezone Asia/Shanghai

#修改时区
root@ubuntu2004:~# rm -f /etc/localtime
root@ubuntu2004:~# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#修改日期时间:
timedatectl set-time "2017-01-23 10:30:00"
#开启NTP:
timedatectl set-ntp true/false
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ehuo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值