Java教程

加密与安全

本文主要是介绍加密与安全,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

加密与安全

概述

image-20220710150432278

Linux内的邮件服务:postfix,监听端口smtp 25端口

DDOS攻击:泛洪攻击,flood,能够在短时间内发送大量的TCP包攻击网站,使得网站的连接数(承受并发)过高,瘫痪

--->拒绝服务

查看selinux的状态:getenforce

disabled或者是Enforcing

3A认证安全:认证、授权、审计

磁盘加密:阿里云ECS的系统盘加密

常见加密算法:

1.DES,3DES,数据加密标准(data encyption standard)---56位

2.AES,高级加密算法---128、192位

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

对称加密不是很安全,但是加密速率高(不需要自己的公钥发来发去),适合加密大量的数据TB PB级别。加密传输数据等

DES,AES,3DES等

非对称加密:双方有公钥和私钥,发送公钥

用私钥加密,要用公钥解密(类似gitlab验证,ssh-key验证都是将私钥保留,将公钥发送给对端主机,然后我ssh连接的时候,是通过我自己的私钥去解密的),解密自己的连接(解密自己的数据包)

因为只有公钥可以对Alice的私钥解密--->确认数据来源为Alice。因为gitlab有ssh的公钥了,能解析ssh发来的私钥加密包,一般的网站验证都是用RSA认证

公钥的作用:一般都是用于解密私钥的请求的

RSA算法:公钥加密算法,著名的公钥加密算法

一般的https算法,用的是RSA+AES算法的结合,网页端https加密

RSA加密算法的效率比较低,加密大量数据的速度慢

image-20220706215631380

ssh协议使用的就是rsa加密算法,把pub公钥发送到各个主机或者是gitlab,jenkins等,完成主机的身份验证

image-20220706222543854

hash算法(加密算法):唯一的hash值

数据--->hash算法--->hash值

如果源数据相同,比如说都是同一个文件(文件内容一致),那么经过hash算法的hash值也一样,确认文件内容一致;如果文件内容不一致,则hash值完全不同

MD5算法,sha1算法已经被破解,md5加密还可以临时的用于判断文件是否被修改等,比较md5sum加密值或者其他算法的加密值

常见算法:md5加密(hash值 128位--->显示的是32位的16进制),sha128(160位),sha256,sha512等算法

image-20220706225202230

##各种算法
##md5算法
md5sum + file ##使用md5算法计算出这个file的hash值
baf172378e0d27f555b95affa525307d  1+100.sh

##sha1算法,位数比md5要长(160位)
sha1sum + file 	
sha512sum file
sha256sum file

image-20220706225645552

sha512加密,128位的16进制数

image-20220706230214630

暴力破解概念:一个个数字猜,比如算法内指定是大小写字母+数字,那么假如是16位的随机字符算法,一个字符就是26+26+10=56种,16位就是56^16,这么多次的猜测(暴力破解)

image-20220706230526165

yum源加密gpgkey:用于检查来自yum源的包是否合法

这个gpgkey(公钥),这个yum源发布后,使用的yum源的私钥加密,那么gpgkey的公钥就可以解了,从而验证包来源的合法性

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=https://repo.huaweicloud.com/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
##这里是一个在Cent OS 7上面的gpgkey校验key

综合加密:结合AES和RSA算法(对称和非对称算法)

其实公钥也存在一个问题:如果有人冒充中间商截取A-B获取公钥的信息,从而发送一个假的公钥给到A的话(假冒B),那么A会将自己的真实信息用中间商的公钥加密,然后返回给中间商,从而泄露信息

混合对称算法和非对称算法,比如AES 128和sha256算法,类似互联网http访问的安全信息(AES+RSA)

流程加密:

1.原始data---对称加密(对称秘钥人人都有)---RSA加密,使用公钥B加密(类似gitlab的公钥B)

2.解密data:用私钥B解开公钥B,得到对称秘钥,在用对称秘钥解开data

image-20220707213833599

实现数字签名(验证数据的合法性,是否是同一个文件),使用hash算法先进行加密得到hash值(唯一),在通过RSA算法公钥私钥加密

一般较常应用与pdf等加密文档,数字签名技术等(先hash再RSA)

1.data---hash算法:data的hash值---B的公钥加密

2.B的私钥解密---再用hash算法算一遍data的hash值---比较hash值,一样的即证明数据来源为合法的

image-20220707214618190

CA证书(SSL加密证书)

权威机构颁发的证书,SSL证书,有效期一般是一年的有效期,也有证书颁发机构,CA机构

DV、OV等

证书类型:单域名、多域名、泛域名证书

CA签名

CA证书加密的原理:CA机构 作为靠谱的中间商,加入还是A向B请求信息,A发公钥给到CA,CA用自己的权威私钥给A的公钥加密,同时B有CA机构的公钥,和B的公钥,用B的公钥加密返回给B,B用私钥再解密

image-20220707230307707

https加密证书

Chrome、edge等官方浏览器上受信任的根证书颁发机构,一般都存在于世界上,世界上的根证书颁发机构有不多,对应专门的证书企业

像这个暴雪的证书blizzard,暴雪也是一个根证书的颁发机构,自己给自己颁发证书:自签名证书,因为根机构已经是最高权限的机构了

image-20220707232553773

CA证书包含的内容:签名算法sha256(RSA)、签名的hash算法(客户端验证证书的合法性,对比hash值),公钥算法RSA

image-20220707232906187

自己购买的域名:www.cwjcloudtest.cn

域名颁发机构为DV(单域名免费版SSL证书),还有泛域名,多域名

根证书颁发机构:Digicert,在华为云上(或者是各大公有云厂商)上面都有

image-20220707233249092

image-20220707233432468

一般来说,在云厂商购买证书都涉及这几个参数:

1.证书类型:针对不同类型的企业、用途选择,同时价格也不一样,按照实际生产用途使用证书

2.证书品牌(根证书颁发机构):www.cwjcloudtest.cn选择的是digicert,华为云官网是globalsign,阿里云也是globalsign

3.域名类型:单域名、多域名、泛域名

4.有效期:一般都为1年

image-20220707233816482

SSL协议/TLS协议

HTTPS的原理:CA就是为了将服务端的公钥变得有效,可靠,客户端访问的时候才能放心访问;而这个可靠来自于可靠的根证书颁发机构(CA)

目前主流使用:TLS 1.2版本的协议

保护WEB应用层的数据包,SSH协议包裹,SSH:安全套接字,加上SSL证书

image-20220708211758519

HTTPS的工作原理:根本过程就是验证服务器(域名)证书(公钥)来源的真实性

1.客户端发起请求,请求访问某个服务器站点(url),访问443端口(其中站点必须放通443端口)

2.站点返回服务器的证书给到客户端,客户端验证证书的真实可靠性;如果有问题会提示安全/不安全/不受信任的证书,服务端发送公钥(证书)给到客户端

3.客户端验证成功,将加密信息给到服务器,用服务器的公钥加密

4.服务器用私钥解密信息,获取到传输的数据

企业内部使用生成SSL证书,自己生成就行;一般在互联网上申请的公共的CA,这个都是和根证书颁发机构申请的

openssl项目:生成企业内部免费证书用于加密服务

开放源码的软件库包,用于生成私有的CA证书

每台Linux的机器,都是自带openssl服务的

##查看版本
openssl version

image-20220708234136817

基本语法

##使用openssl技术对文件进行hash运算,得到唯一的hash值
[root@ecs-web01 ~]#openssl sha512 1.sh 
SHA512(1.sh)= 3c7db731a40a5ca38935f1b5868aed6f84f66678772a22b04b25a04d098e36f4a095b67d35ab1476769846a214978e030360b4fb67ad22f71b534781d17419df

等同于sha512sum 1.sh

##openssl生成密码,自动生成一串加密的密文,可能是版本不一样,生成密文的密码,对原来的密码加密
openssl passwd -6 caiweijia123
[root@localhost ~]#openssl passwd -6 123
$6$nq8pcEoJbqN7FLq3$aSwUOh/OtSxGP8N/yxGaLgD2hwsluDkU.qCQrN1fFgclesBlUOywUyqEqEtcgwO1ExRj8MqdA8Igj9NaDXBsz/

##也可以使用openssl+密码输出密文
##存储在/etc/shadow的就是sha512加密过的密文
catyer:$6$f63BKB2X09nKyqtf$Ipvckz1/eRXs5J/CFNvcCgcJJQFtyiuCiUx09Byej7FIfdjPuiiimYJe.iP6skoa.hawaX58PHcxzTLEFjZj80::0:99999:7:::

原理上,sha512是可以被解密的,但是需要花很长的时间,需要量子计算机才能解密,工具一般也不能解密

openssl生成私钥

openssl可以生成密钥对,密钥对就指的是公钥+私钥,称为密钥对

生成一个服务的私钥

##生成一个私钥
openssl genrsa -out /key/app1.key
cat /key/app1.key

image-20220709091545538

给私钥加密(使用对称算法),因为非对称算法就是rsa,已经生成了密钥对了

使用aes算法加密的时候,需要输入一个密码(解密密码)--->但是不推荐,直接有私钥就行了

openssl genrsa -out /key/app2.key -aes128 ##-aes128表示使用什么对称算法进行加密

image-20220709091842721

一些对称算法加密的方式:常用的一般为aes128 aes192 aes256等,需要在rsa的基础上再加一层加解密

image-20220709092033851

使用ssh-keygen生成一个密钥对(本地生成),这个也是单纯的rsa算法,没有使用对称加密过

image-20220709092218522

私钥的生成:随机数,就像k8s的token一样,临时生成一个token或者是生成一个永久的都行

openssl根据私钥生成公钥(一般不需要手动生成,服务使用会自动解密)

这里没有再用aes加密,所以可以直接生成公钥的

-pubout需要加这个参数

openssl rsa -in /key/app1.key -pubout -out /key/app1.pub 

image-20220709092656585

根据aes加密过的私钥生成公钥,需要手动输入一个phrase来验证aes加密,解密

openssl rsa -in /key/app2.key -pubout -out /key/app2.pub 

image-20220709092903377

(重要)一个内网内如果想实现服务加密互访,需要搭建根CA,由根CA来颁发证书,自签名无法通信,自签名证书适用于单个服务

openssl生成CA证书(根CA)

私有CA:一般都是企业内部使用,直接就是根证书,一般不存在什么1级证书2级证书等目录

其实企业内部可以生成多个CA证书的,自签名证书

一般存放的目录:/etc/pki下面

[root@ecs-web01 ~]#tree /etc/pki/CA
/etc/pki/CA
├── certs
├── crl
├── newcerts
└── private

CA证书配置文件的路径:/etc/pki/tls/openssl.cnf

默认的配置参数,生成CA证书得配置参数

其中需要注意:

1.自签名证书certificate:$dir/xxx.pem要和openssl req -new -x509 -key /etc/pki/CA/private/ca.pem -days 3650 -out /etc/pki/CA/ca-cert.pem ###这个路径是自签名证书---一致

2.自己的私钥:$dir/private要和openssl genrsa -out private/ca.pem一致

[root@master tls]#pwd
/etc/pki/tls
[root@master tls]#ls
cert.pem  certs  ct_log_list.cnf  misc  openssl.cnf  private

##一定需要match匹配的字段,这些字段都可以修改路径的
[ CA_default ]
dir             = /etc/pki/CA           # 证书的根目录CA目录
certs           = $dir/certs            # CA下的certs,证书的存放位置,存放每个授予的证书
crl_dir         = $dir/crl              # Where the issued crl are kept
database        = $dir/index.txt        # 数据库索引存放index.txt
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.

certificate     = $dir/ca-cert.pem       # The CA certificate 这个是自己的自签名CA证书
serial          = $dir/serial           # The current serial number CA证书的序列号
crlnumber       = $dir/crlnumber        # the current crl number
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/ca.pem #这个是自己的私钥
RANDFILE        = $dir/private/.rand    # private random number file

x509_extensions = usr_cert              # The extentions to add to the cert

##CA证书的属性
default_days    = 365                   # 有效期默认1年
default_crl_days= 30                    # how long before next CRL
default_md      = sha256                # 默认RSA加密算法:sha256,可以修改
preserve        = no                    # keep passed DN ordering

##自签名和颁发的证书所需要match的字段,所以说还是不能乱填的
[ policy_match ]
countryName             = match ##国家名字
stateOrProvinceName     = match ##省份名
organizationName        = match ##公司名
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional

##实验环境,暂时将这些修改为自定义optional
[ policy_match ]
countryName             = optional
stateOrProvinceName     = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional


1.生成CA需要的文件:两个文件

touch index.txt  ##生成证书索引的数据库文件
echo 01 > serial ##颁发证书的序列号,这个序列号要是十六进制的,不能乱填
ls
certs  crl  index.txt  newcerts  private  serial

2.生成CA的私钥--->这个是自己的私钥
在7版本,6版本或者之前,生成一个文件默认的权限是644,需要修改下私钥的权限,或者直接chmod改一下600也可以

openssl genrsa -out private/ca.pem
ll private/ca.pem 
-rw------- 1 root root 1679 Jul  9 10:44 private/ca.pem ##ca默认路径,只有拥有者root可以访问others都不可以访问
可能还得chmod 600一下:chmod 600 private/ca.pem

3.生成CA证书(自签名证书),根据私钥生成自签名证书

颁发者和授予者都是自己,自签名证书;

企业内部其实也可以随便填,但是需要知道你这个证书是干嘛的,什么name,可以根据业务来划分(nginx,k8s,mysql,tomcat等),在openssl.cnf文件上也不一定需要match

##生成CA证书自签名
openssl req -new -x509 -key /etc/pki/CA/private/ca.pem -days 3650 -out /etc/pki/CA/ca.pem ###这个路径是自签名证书

-x509:生成自签名的参数
-key:使用之前生成的私钥文件,写好路径
-days:指定使用年限:10年
-out:输出一个私钥(证书文件),.cert文件

[root@ecs-web01 CA]#openssl req -new -x509 -key /etc/pki/CA/private/ca.pem -days 3650 -out /etc/pki/CA/ca-cert.pem
-----
##自己的可以随便填,如果是企业内的话,最好是命名规范一点
Country Name (2 letter code) [XX]:CN ##填写国家代码,CN---中国
State or Province Name (full name) []:SZ ##填写省份
Locality Name (eg, city) [Default City]:SZ ##城市
Organization Name (eg, company) [Default Company Ltd]:catyer ##公司名
Organizational Unit Name (eg, section) []:catyu^H ##部门名称
Common Name (eg, your name or your server's hostname) []:catyer 
Email Address []:catyer@11.com

##证书的基本格式输出.cert,查看master节点的证书说明
##关键参数:C=CN ST=GD O=CAT
[root@master CA]#openssl x509 -in /etc/pki/CA/ca-cert.pem  -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            88:fe:3b:bf:0c:8c:46:51
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=GD, L=SZ, O=CAT, OU=CAT, CN=CAT/emailAddress=cat
        Validity
            Not Before: Jul  9 03:11:33 2022 GMT
            Not After : Jul  6 03:11:33 2032 GMT
        Subject: C=CN, ST=GD, L=SZ, O=CAT, OU=CAT, CN=CAT/emailAddress=cat
        Subject Public Key Info:

在windows下查看这个新的证书.crt后缀,在windows环境下需要修改,但是提示是不受信任的证书

image-20220709111351691

nginx服务生成证书(由根CA生成)

给到一个服务使用:需要

1.CA机构的自签名证书,ca.pem

2.服务的私钥,nginx.key:openssl genrsa -out nginx.key

3.服务的证书.crt:根据证书申请文件.csr申请.crt文件

前置条件:需要生成好CA的自签名证书,CA的私钥,并且规划好.pem的文件路径,写好文件路径

1.先生成一个服务的私钥

openssl genrsa -out /key/nginx.key

2.为需要生成证书的主机/服务生成证书申请文件,格式为.csr(申请文件)

openssl req -new -key /key/nginx.key -out /key/nginx.csr

[root@master CA]#openssl req -new -key /key/nginx.key -out /key/nginx.csr
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:GD
Locality Name (eg, city) [Default City]:SZ
Organization Name (eg, company) [Default Company Ltd]:CAT

3.通过CA申请证书并且颁发给服务,有效期为365天

openssl ca -in /key/nginx.csr -out /etc/pki/CA/certs/nginx.crt -days 365

[root@master CA]#openssl ca -in /key/nginx.csr -out /etc/pki/CA/certs/nginx.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jul  9 04:25:34 2022 GMT
            Not After : Jul  9 04:25:34 2023 GMT ##有效期到2023年
        Subject:
            countryName               = CN ##基本的配置,一定要和CA机构的一致
            stateOrProvinceName       = SZ
            organizationName          = CAT
            organizationalUnitName    = CAT
            commonName                = CAT
            emailAddress              = CAT

4.生成完毕,查看证书的信息

证书文件格式:nginx.crt---/etc/pki/CA/certs/nginx.crt,其实就和CA机构的自签名证书ca.pem的格式是一致的,只不过现在是给到服务的证书

私钥文件格式:nginx.key---/key/nginx.key

也可以复制导出到windows桌面进行查看

openssl x509 -in /etc/pki/CA/certs/nginx.crt  -noout -text
[root@master CA]#openssl x509 -in /etc/pki/CA/certs/nginx.crt  -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 1 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=SZ, L=SZ, O=CAT, OU=CAT, CN=CAT/emailAddress=CAT
        Validity
            Not Before: Jul  9 04:25:34 2022 GMT
            Not After : Jul  9 04:25:34 2023 GMT
        Subject: C=CN, ST=SZ, O=CAT, OU=CAT, CN=CAT/emailAddress=CAT
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)


##查看index索引:cat $dir/index.txt
[root@master CA]#cat index/index.txt
V	230709042534Z		01	unknown	/C=CN/ST=SZ/O=CAT/OU=CAT/CN=CAT/emailAddress=CAT
V	230709090134Z		02	unknown	/C=CN/ST=CN/O=k8s/OU=k8s/CN=k8s/emailAddress=k8s

##查看serial序列号,现在变成02了,也就是下一个证书的编号是02
[root@master CA]#cat serial
02

吊销证书

某个证书泄漏了或者是不想用了,可以吊销证书,进入到newcerts,可以看到有01编号证书(nginx),02编号证书(k8s)

[root@master CA]#cd newcerts/
[root@master newcerts]#ls
01.pem  02.pem

吊销证书:openssl ca -revoke

吊销证书的状态:revoked(R状态)

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

##可以看到,index序列已经变成r了,证明已经吊销
[root@master CA]#openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
[root@master CA]#cat index/index.txt
R	230709042534Z	220709091050Z	01	unknown	/C=CN/ST=SZ/O=CAT/OU=CAT/CN=CAT/emailAddress=CAT
V	230709090134Z		02	unknown	/C=CN/ST=CN/O=k8s/OU=k8s/CN=k8s/emailAddress=k8s

记录吊销证书的文件:culnumber,先更新这个文件的编号为01

echo 01 > crlnumber
echo 01 > crlnumber/crlnumber

更新证书吊销列表

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

查看crl文件

openssl crl -in /etc/pki/CA/crl/crl.pem

[root@master CA]#openssl crl -in /etc/pki/CA/crl/crl.pem  -noout -text
Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: /C=CN/ST=SZ/L=SZ/O=CAT/OU=CAT/CN=CAT/emailAddress=CAT
        Last Update: Jul  9 13:16:58 2022 GMT
        Next Update: Aug  8 13:16:58 2022 GMT
        CRL extensions:
            X509v3 CRL Number: 

在本地计算机配置为受信任证书

拷出来的K8s证书,k8s.crt

image-20220709170425805

Cent OS 7直接生成自签名证书.pem和私钥.key(脚本模式)

根本的流程还是调用/usr/bin/openssl证书来实现

##如果是生成自签名证书,则不用根CA;如果是需要根CA,则需要在CA上生成CA的私钥以及CA的证书
##1.生成私钥
openssl genrsa -out /certs/nginx.key

##2.生成证书申请文件.csr
openssl req -new -key /key/nginx.key -out /key/nginx.csr

##3.nginx服务申请证书
openssl ca -in /key/nginx.csr -out /etc/pki/CA/certs/nginx.crt

##4.查看证书
openssl x509 -in /etc/pki/CA/certs/nginx.crt -noout -text

##5.使用ssl证书
将证书配置到各个服务内,形成加密

进入到目录/etc/pki/tls/certs,make就可以了,基于Makefile这个文件(脚本)来实现的

可以在这里openssl genrsa去掉-aes128加密,就不用输入phrase密码了

image-20220709214900776

生成各种各样的证书,也可以编写脚本来实现,不过需要实现交互式的openssl命令,这里还是得输入证书的信息

make nginx.crt ##私有CA颁发的证书
make nginx.key ##私钥,用于解密公钥
make nginx.csr ##证书申请文件csr
make nginx.pem ##自签名证书

image-20220709215259711

Cent OS 7执行创建.crt .key .pem等脚本

##进入指定目录创建,也可以openssl创建,mv到指定的目录存放
DIR=/key
SER=nginx

cd /etc/pki/tls/certs
make $SER.crt
make $SER.key
make $SER.pem
mv $SER.crt $SER.key $SER.pem $DIR
if [ $? -eq 0 ];then
        echo "$SER.crt $SER.key $SER.pem 创建成功"
fi

###生成私钥
#openssl genrsa -out /$DIR/$SER.key
#
###生成证书申请文件
#openssl req -new -key /$DIR/$SER.key -out /$DIR/$SER.csr
#
###生成证书
#openssl ca -in /$DIR/$DIR.csr -out /etc/pki/CA/certs/$SER.crt


SSH服务

用于连接远程主机,远程传输,远程操作等,openSSH服务默认安装的,安全的

通信过程:

1.ssh 192.168.244.132:首次连接确认是否是连接这台机器

2.确认,则将这台机器的公钥记录下来,下次连直接用公钥就行(对应算法)

3.下次直接使用密码

4.服务端也会获取到客户端的公钥,双方都有公钥,保证信息传输的安全性;服务端通过自己的私钥解密传输过来的公钥;客户端通过自己的私钥解密传过来的公钥

##主机IP,算法,公钥
192.168.244.132 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOf8Uo6Tm0vy+2g9ctYsTwc/tfWcXHQtY5EywK0odPY1KFdXvw/bi75eyTbBqMUnX90RY36V+SV2CF05KCP1FJ0=

192.168.244.133 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOf8Uo6Tm0vy+2g9ctYsTwc/tfWcXHQtY5EywK0odPY1KFdXvw/bi75eyTbBqMUnX90RY36V+SV2CF05KCP1FJ0=

基于ssh-keygen认证(本质上都是传公钥)

手动添加pubkey到服务端的过程,会进行验证,验证成功后自动认证,不需要人工输入账密

需要自己生成公钥私钥(密钥对)

ssh-keygen:默认算法是rsa算法

[root@master script]#ssh-keygen --help
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       
##生成密钥对
ssh-keygen

##传输公钥
##-p 1258表示用不同的SSH端口连接
scp -P 1258 root@192.168.244.132:/root ##--->这个是scp命令,ssh和scp的一个是小写p,一个是大写P
ssh-copy-id root@192.168.244.132 

在远端机器生成key,传输过来的rsa算法加密的公钥,在.ssh的authkey目录下,同时known_host会添加多一个已知的主机地址

image-20220710092957530

image-20220710093056723

各个主机做ssh-keygen认证(expect)

原理:只要通过公钥验证就可以实现互访

思路:

1.在主机上先ssh-keygen生成自己的密钥对id_rsa和id_rsa.pub

2.ssh-copy-id root@192.168.244.128自己,生成自己的auth_key,自己生成了auth_key,known_host等文件

3.scp -r .ssh root@主机:将自己的.ssh目录复制到各个主机,那各个主机就可以识别到128这台主机了,同时各个主机也可以访问到128主机

如果远端机器修改了密码passwd,SSH还是可以连接的(基于key认证,基于公钥验证)

#!/bin/bash

pass="123"
cd /root
rm -rf .ssh

#host=`hostname -I`

##生成ssh-keygen
expect <<EOF
	spawn ssh-keygen
	expect {
		"key" { send "\n"; exp_continue }
		"passphrase" { send "\n"; exp_continue }
		"same" { send "\n"; exp_continue }
	}
EOF

##生成自己的auth_key
expect <<EOF
spawn ssh-copy-id root@192.168.244.128
expect {
            "yes/no" { send "yes\n"; exp_continue }
            "password" { send "$pass\n" }
}
expect eof
EOF

##循环复制到各个主机
for i in {132..133};do

expect <<EOF
spawn scp -r .ssh root@192.168.244.$i:/root
expect {
             "yes/no" { send "yes\n"; exp_continue }
             "password" { send "$pass\n" }
}
expect eof
EOF

if [ $? -eq 0 ];then
	echo "host 192.168.244.$i send success"
fi

done

各个主机做ssh-keygen认证(sshpass+expect)

sshpass:是ssh服务用于取消对每个主机的密码认证的服务,因为ssh 不能给连接的主机指定密码,可以指定明文密码

-p password:指定明文密码
-f file:可以跟记录密码的文件
-e:将环境变量SSHPASS作为密码

需要安装一下

rpm -qa | grep sshpass || yum -y install sshpass
rpm -q sshpass

sshpass+expect的组合

StrictHostKeyChecking=no:表示不再询问yes还是no,默认yes,-i表示把公钥复制过去

ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null:默认的key

由于sshpass貌似不支持1258端口,所以复制到139.9.57.240还得靠expect

host="
192.168.244.132
192.168.244.133
"
pass1=123
pass2=Caiwj@1258!
cd /root
rm -rf .ssh
ssh-keygen -P "" -f /root/.ssh/id_rsa &>/dev/null ##生成一个ssh-keygen的密钥对
rpm -q sshpass && echo "sshpass already install" || yum -y install sshpass
for i in ${host};do
        sshpass -p $pass1 ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub $i
#       sshpass -p $pass1 ssh -o StrictHostKeyChecking=no $i "echo `hostname -I` >> /root/ip"
        ssh $i "echo `hostname -I`"
done

#sshpass -p $pass2  -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub 139.9.57.240
expect <<EOF
        spawn ssh-copy-id -p 1258 root@139.9.57.240
        expect {
                "yes/no" {send "yes\n";exp_continue}
                "password" {send "Caiwj@1258!\n"}
        }
        expect eof
EOF

rsync:同步复制工具(可实现增量传输)

常用参数

##源 目的主机,也可以从目的主机复制到本地
rsync -av /etc server1:/tmp
rsync -av /server1:/tmp /etc

-a:包含rsync大部分的功能
-v:显示过程
-u:如果复制过来的文件比较新,则直接覆盖

#/etc和/etc/的区别:/etc拷贝包括目录下所有的文件,/etc/拷贝/etc下的文件,不拷贝目录
##区别
rsync -av f1 192.168.244.132:/data
rsync -av f1/ 192.168.244.132:/data

拷贝增量数据(SMS迁移工具就是借助Linux主机内的rsync组件来实现的)

拷贝data下的文件f1

##拷贝三个文件
rsync -av f1/ 192.168.244.132:/data
sending incremental file list
./
f1.txt
f2.txt
f3.txt

echo {1..10} >> f1/f1.txt ##对f1文件做一些改动

##再次拷贝,发现只拷贝增量数据incremental,只拷贝有变化的文件f1.txt
rsync -av f1/ 192.168.244.132:/data
sending incremental file list
f1.txt

sent 41,138 bytes  received 71,719 bytes  45,142.80 bytes/sec
total size is 314,572,821  speedup is 2,787.36

ll
total 307204
drwxr-xr-x 2 root root        48 Jul  9 23:26 f1
-rw-r--r-- 1 root root 104857621 Jul  9 23:28 f1.txt
-rw-r--r-- 1 root root 104857600 Jul  9 23:26 f2.txt
-rw-r--r-- 1 root root 104857600 Jul  9 23:26 f3.txt

实现拷贝脚本文件(只拷贝增量数据)

rsync需要对不同的ssh端口用法:rsync -e "ssh -p 1258",前提是需要做好ssh密钥对认证

复制script下的所有文件,或者说是同步script下的所有文件到目标主机

date=`date +%F_%H`
#scp -r -p -P 1258 /script/ root@139.9.57.240:/ &>/dev/null
rsync -e "ssh -p 1258" -av /script/ root@139.9.57.240:/
if [ $? -eq 0 ];then
        echo "$date点传输成功" >> /script/scp/scp.txt
fi

##写个crontab -e任务
* */1 * * * /bin/sh /script/scp/scp.sh

ssh服务配置文件

现在管理服务的总父进程:systemd进程,负责创建启动管理服务进程

lastb:查看you谁登录失败过

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

#Port 22
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::

端口配置,监听本地的IP地址,默认0.0.0.0为所有IP

HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

密钥对加密算法,一般是非对称加密算法rsa等

ss -nt:查看已经建立连接的服务,监听的是本地的地址192.168.244.128:22端口,远端的是客户端端口(建立连接的)

image-20220712211606186

基于key的验证:可以把允许用户名密码登录关掉

复制都是复制公钥给到目标端的主机,私钥不会复制出去,目标端的主机记录的也是公钥,最后的是主机名

然后只要有源端主机(master)的私钥,就可以远程免密连接到目标端(slave)

image-20220712213104540

Ubuntu:默认关闭root登录,需要开启root用户登录

在生产中也可以禁止root用户登录

sudo:用于执行root命令

生产中一般是不给root权限的,因为权限太高很麻烦,如果是堡垒机就可以

管理员授权给到用户,用户具有管理员的权限,或者是执行某些command的权限

主配置文件:/etc/sudoers

vim /etc/sudoers

如果不对catyer授权,则会出现catyer不在授权用户范围的错误提示error

sudo -u username command:指令

##基本格式
root    ALL(在哪个主机)=(代表的用户,可以写root)       ALL(COMMAND指令)

#COMMAND指令需要写指令的完整路径,可以使用which来查看命令的路径which ls 
which cat which ls 
/usr/bin/cat

root    ALL=(ALL)   ALL
catyer  ALL
catyer  ALL=(root)      /usr/bin/ls 允许catyer用户执行ls /root命令
##注意:配置文件必须要和实际执行的命令一致,也是一种管理权限的手段,可以使用root用户临时授权一下,可以指定指令,也可以指定all

catyer  ALL=(root)      /usr/bin/ls /root,/usr/bin/mount /dev/sdb /mnt/mount
catyer  ALL=(root)      usr/bin/mount 
##授权某个命令,写命令路径即可,表示授权挂载命令,添加一个,即可授权多个command,不需要另起一行
catyer#sudo ls /root

image-20220714230423139

pid=0:管理员账号

一个账号之所以是管理员的原因:因为账号的pid=0,用id可以查看pid,$3就是pid的列

image-20220714232202130

grep /bin/bash /etc/passwd

image-20220714232252998

awk -F: '{print $1":"$3}' /etc/passwd:$1和$3之间可以指定一个分隔符

pam:安全认证相关模块,库

对应的目录:

/etc/pam.d

/etc/security

chrony时间同步机制

云服务器:云厂商机器内置的时间服务器,ntpserver

ntp.aliyun.com:阿里云的ntp服务器地址,不要使用ntp服务,不标准

ntpdate:只是一次性的时间同步,不是永久的同步

使用chrony服务:实现配置本地的ntp服务器

ntp服务器:自己既是服务端也是客户端,其实例如阿里云的ntp.aliyun.com这些服务器,也是基于国际的原子钟来进行时间同步的,同时NTP服务器又作为企业内网的NTP服务器(服务端)

image-20220715230846321

通过NTP协议实现时间同步

yum info:可以查看yum源内的软件包信息

yum info ntp:查看ntp软件的信息

yum info chrony:查看chrony软件包的信息

chrony更好一点,效率比较高,精度比较高一些,可以达到微秒级别的精准度

查看软件是否安装:rpm -q chrony

rpm -q chrony
chrony-3.2-2.el7.x86_64

配置文件:chrony.conf+服务chronyd

服务名称:chronyd

systemctl status chronyd

默认开机启动+chronyd.service服务的方式运行

image-20220715232433014

配置好后,重启一下chrony服务,类似nginx/mysqld服务一样,配置文件都在/etc/chrony.conf内

配置时间服务器

华为云:ntp.myhuaweicloud.com,server ntp.myhuaweicloud.com minpoll 4 maxpoll 10 iburst

阿里云:ntp.aliyun.com

腾讯云:time1.cloud.tencent.com

##添加iburst:可以加速同步
server ntp.myhuaweicloud.com iburst
server ntp.aliyun.com iburst
server time1.cloud.tencent.com iburst

ntpdate ntp.aliyun.com##调整时间

image-20220715233328059

image-20220715233723284

作为云厂商的内部机器(内网机器),本身的ntp服务就在华为云内网,有一个内网服务地址可以使用,直接用ntp.huaweicloud.com(有内部服务地址100.125开头的)

就可以了,不存在断公网无法同步时间;如果是IDC机器则是需要连公网才能同步时间的

image-20220715234312252

这篇关于加密与安全的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!