Linux进阶_加密和安全,


本意内容

  • 关于加密与安全
  • 加密算法
    • 对称加密算法
    • 非对称加密算法
    • 单向散列
  • 密钥交换:
    • DH
    • gpg
      • 实验:使用gpg工具实现公钥加密
  • CA和证书
    • 证书获取
    • 实验:创建私有CA和颁发证书
      • 查看证书
      • 吊销证书
    • SSL/TLS
  • AIDE
    • 实验:AIDE实例
  • sudo
    • sudoers
      • sudoers示例:
  • TCP_Wrappers介绍
  • Openssl
  • PAM认证机制

关于加密与安全

  • 信息安全防护的目标
    1. 保密性 Confidentiality
    2. 完整性 Integrity
    3. 可用性 Usability
    4. 可控制性 Controlability
    5. 不可否认性 Non-repudiation

  • 安全防护环节
    1. 物理安全:各种设备/主机、机房环境
    2. 系统安全:主机或设备的操作系统
    3. 应用安全:各种网络服务、应用程序
    4. 网络安全:对网络访问的控制、防火墙规则
    5. 数据安全:信息的备份与恢复、加密解密
    6. 管理安全:各种保障性的规范、流程、方法

  • 安全攻击: STRIDE
    1. Spoofing 假冒
    2. Tampering 篡改
    3. Repudiation 否认
    4. Information Disclosure 信息泄漏
    5. Denial of Service 拒绝服务
    6. Elevation of Privilege 提升权限

  • 安全设计基本原则
    1. 使用成熟的安全系统
    2. 以小人之心度输入数据
    3. 外部系统是不安全的
    4. 最小授权
    5. 减少外部接口
    6. 缺省使用安全模式
    7. 安全不是似是而非
    8. 从STRIDE思考
    9. 在入口处检查
    10. 从管理上保护好你的系统

  • 常用安全技术
    1. 认证
    2. 授权
    3. 审计
    4. 安全通信

  • 加密算法和协议
    1. 对称加密
    2. 公钥加密
    3. 单向加密
    4. 认证协议

加密算法

对称加密算法

非对称加密算法

  • 公钥加密:密钥是成对出现
    公钥:公开给所有人;public key
    私钥:自己留存,必须保证其私密性;secret key

  • 特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然

  • 功能:
    (1)数字签名:主要在于让接收方确认发送方身份
    (2)对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
    (3)数据加密:适合加密较小数据

  • 缺点:密钥长,加密解密效率低下

  • 算法:
    RSA(加密,数字签名)
    DSA(数字签名)
    ELGamal

  • 非对称加密

  • RSA

RSA:公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的,RSA取名来自开发他们三者的名字,后成立RSA数据安全有限公司。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

  • DSA

DSA (Digital Signature Algorithm):1991年7月26日提交,并归属于David W. Kravitz前NSA员工,DSA是Schnorr和ElGamal签名算法的变种,被美国NIST作为SS(DigitalSignature Standard), DSA是基于整数有限域离散对数难题的,其安全性与RSA相比差不多。DSA只是一种算法,和RSA不同之处在于它不能用作加密和解密,也不能进行密钥交换,只用于签名,它比RSA要快很多

单向散列

  • 将任意数据缩小成固定大小的“指纹”
    (1)任意长度输入
    (2)固定长度输出
    (3)若修改数据,指纹也会改变(“不会产生冲突”)
    (4)无法从指纹中重新生成数据(“单向”)

  • 功能:数据完整性

  • 常见算法
    (1)md5: 128bits
    (2)sha1: 160bits
    (3)sha224 、sha256
    (4)sha384、sha512

  • 常用工具
    (1)md5sum | sha1sum [ --check ] file
    (2)openssl、gpg
    (3)rpm -V

  • 数字签名

  • 常用组合(对称+非对称+数字签名)
    A–>B
    A: key(data+Sa[hash(data)])+Pb(key)

  • 应用程序RPM:文件完整性的两种实施方式
    MD5单向散列:rpm --verify package_name (or -V)

  • 发行的软件包文件:GPG公钥签名
    1. rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
    2. rpm --checksig pakage_file_name (or -K)

密钥交换:

IKE( Internet Key Exchange )

DH

DH (Deffie-Hellman):生成会话密钥,由惠特菲尔德·迪菲(Bailey Whitfield Diffie)和马丁·赫尔曼(Martin Edward Hellman)在1976年发表
参看:https://en.wikipedia.org/wiki/Diffie–Hellman_key_exchange

  • DH原理:
    1. A: g,p 协商生成公开的整数g, 大素数p
    B: g,p
    2. A:生成隐私数据:a ,计算得出 ga mod pg^a\ mod\ p,发送给B
    B:生成隐私数据:b,计算得出 gb mod pg^b\ mod\ p,发送给A
    3. A:计算得出:[(gb mod p)a] mod p=gba mod p[(g^b\ mod\ p)^a]\ mod\ p = g^{ba}\ mod\ p,生成为密钥
    B:计算得出:[(ga mod p)b] mod p=gab mod p[(g^a\ mod\ p)^b]\ mod\ p = g^{ab}\ mod\ p,生成为密钥

gpg

  • 使用gpg实现对称加密
    + 对称加密file文件
    gpg -c file
    ls file.gpg
    + 在另一台主机上解密file
    gpg -o file -d file.gpg

实验:使用gpg工具实现公钥加密

公钥和私钥是一对,公钥就好比是一把“锁”,私钥就是开锁的“钥匙”(也可以反过来,公钥是钥匙,私钥是锁)一锁对应一钥匙。钥匙是不能随便给别人的,只能自己保管。锁可以给需要加密数据给你的人。想要给你发数据,就得用你的锁所数据加密,然后用自己的钥匙解开。要给别人发数据,得用别人的锁加密,别人用他自己的钥匙解密。

实验:在hostB主机上用公钥加密,在hostA主机上解密。

hostA

  1. 安装rng-tools
    yum install rng-tools
    systemctl restart rngd
  2. 在hostA主机上生成公钥+私钥对
    gpg --gen-key
  3. 在hostA主机上查看公钥
    gpg --list-keys
  4. 在hostA主机上导出公钥到wang.pubkey
    gpg -a --export -o wang.pubkey
  5. 从hostA主机上复制公钥文件到需加密的B主机上
    scp wang.pubkey root@192.168.88.66:/root

hostB

  1. 同样安装rng-tools
    yum install rng-tools
    systemctl restart rngd
  2. 在需加密数据的hostB主机上生成公钥+私钥对
    gpg --gen-key
  3. 在hostB主机上导入hostA的公钥
    gpg --import wang.pubkey
    gpg --list-keys查看是否导入成功
  4. 用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
    gpg -e -r wangxiaochun file(-r指定uid名)
    file file.gpg
  5. 复制加密文件到hostA主机
    scp fstab.gpg hostA:

hostA

  1. 在hostA主机解密文件
    gpg -d file.gpg
    gpg -o file -d file.gpg
  2. 删除公钥和私钥
    gpg --delete-keys wangxiaochun
    gpg --delete-secret-keys wangxiaochun

这种加密方式存在风险:中间人攻击。

  • 中间人攻击

CA和证书

这篇文章前部分讲解的CA证书挺通俗易懂的:
https://www.cnblogs.com/handsomeBoys/p/6556336.html

  • 证书=公钥+申请者与颁发者信息+签名
  • PKI:Public Key Infrastructure
    1. 签证机构:CA(Certificate Authority)
    2. 注册机构:RA
    3. 证书吊销列表:CRL
    4. 证书存取库:CAL
  • X.509:定义了证书的结构以及认证协议标准
    版本号、序列号、签名算法、颁发者、有效期限、主体名称、主体公钥、CRL分发点、扩展信息、发行者签名

证书获取

  • 证书类型:
    1. 证书授权机构的证书
    2. 服务器
    3. 用户证书
  • 获取证书两种方法:
    1. 使用证书授权机构
    (1) 生成证书请求(*.csr)
    (2) 将证书请求csr发送给CA
    (3) CA签名颁发证书
    2. 自签名的证书:自已签发自己的公钥

实验:创建私有CA和颁发证书

(1)建立私有CA(OpenCA 或 openssl)
(2)申请证书
(3)颁发证书

  • 证书申请及签署步骤:
    1、生成申请请求
    2、RA核验
    3、CA签署
    4、获取证书

  • 创建私有CA配置文件:
    1. openssl的配置文件:/etc/pki/tls/openssl.cnf
    2. 三种策略:match匹配optional可选supplied提供
     match:要求申请填写的信息跟CA设置信息必须一致
     optional:可有可无,跟CA设置信息可不一致
     supplied:必须填写这项申请信息,

host A

(umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

  1. 生成自签名证书
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650 << EOF
CN
beijing
beijing
wang
devops
ca.wang.com
admin@wang.com
EOF

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

  • openssl x509 -in cacert.pem -noout -text 可查看生成的证书
  • 也可以导出Windows来看看,更改后缀为cer即可。
  1. 创建所需要的文件
#生成证书索引数据库文件
touch /etc/pki/CA/index.txt
#当前证书序列号
echo 01 > /etc/pki/CA/serial

host B

  1. 申请者生成私钥
(umask 066;openssl genrsa -out /data/cert/web.key 2048)

  1. 申请者生成证书申请文件
openssl req -new -key /data/cert/web.key  -out /data/cert/web.csr <<EOF
CN
beijing
bj
wang
web
web.wang.com
web@wang.com


EOF

  1. 将证书请求文件传输给CA
scp /data/cert/web.csr root@192.168.88.77:/data/cert/

host A

  1. CA签署证书,并将证书颁发给请求者
openssl ca -in /data/cert/web.csr -out /etc/pki/CA/certs/web.crt -days 150

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

查看证书

[0]$ cat index.txt.attr
unique_subject = no
#yes表示不允许,更改为no

吊销证书

SSL/TLS

SSL:Secure Socket Layer
SSL包含记录层(Record Layer)和传输层,记录层协议确定传输层数据的封装格式。传输层安全协议使用X.509认证,之后利用非对称加密演算来对通信方做身份认证,之后交换对称密钥作为会谈密钥(Session key)。这个会谈密钥是用来将通信两方交换的数据做加密,保证两个应用间通信的保密性和可靠性,使客户与服务器应用之间的通信不被攻击者窃听。
TLS: Transport Layer Security
1995:SSL 2.0 Netscape
1996:SSL 3.0
1999:TLS 1.0
2006:TLS 1.1 IETF(Internet工程任务组) RFC 4346
2008:TLS 1.2 当前使用
2015:TLS 1.3

  • 功能:机密性,认证,完整性,重放保护

  • 两阶段协议:分为握手阶段和应用阶段
    1. 握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成
    2. 应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信

  • SSL/TLS

  • SSL/TLS
    1. Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换
    2. ChangeCipherSpec 协议:一条消息表明握手协议已经完成
    3. Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告
    4. Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
    5. HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输

  • HTTPS结构

  • HTTPS工作过程

  • 生成的随机密钥是指对称加密密钥

AIDE

当一个入侵者进入了你的系统并且种植了木马,通常会想办法来隐蔽这个木马(除了木马自身的一些隐蔽特性外,他会尽量给你检查系统的过程设置障碍),通常入侵者会修改一些文件,比如管理员通常用ps -aux来查看系统进程,那么入侵者很可能用自己经过修改的ps程序来替换掉你系统上的ps程序,以使用ps命令查不到正在运行的木马程序。如果入侵者发现管理员正在运行crontab作业,也有可能替换掉crontab程序等等。所以由此可以看出对于系统文件或是关键文件的检查是很必要的。目前就系统完整性检查的工具用的比较多的有两款:Tripwire和AIDE,前者是一款商业软件,后者是一款免费的但功能也很强大的工具
AIDE(Advanced Intrusion Detection Environment高级入侵检测环境)是一个入侵检测工具,主要用途是检查文件的完整性,审计计算机上的那些文件被更改过了

  • AIDE能够构造一个指定文件的数据库,它使用aide.conf作为其配置文件。AIDE数据库能够保存文件的各种属性,包括:权限(permission)、索引节点序号(inode number)、所属用户(user)、所属用户组(group)、文件大小、最后修改时间(mtime)、创建时间(ctime)、最后访问时间(atime)、增加的大小以及连接数。AIDE还能够使用下列算法:sha1、md5、rmd160、tiger,以密文形式建立每个文件的校验码或散列号
  • 这个数据库不应该保存那些经常变动的文件信息,例如:日志文件、邮件、/proc文件系统、用户起始目录以及临时目录
  • 初始化:
    aide --init
  • 检测:
    aide --check
  • 更新数据库:
    aide --update

实验:AIDE实例

yum install aide
  1. 在node1服务器上创建/data⽬录,在data中创建dir1⽂件夹和f1⽂件:
mkdir -p /data/dir1
echo hello > /data/f1
cd /data

  1. 然后在配置⽂件/etc/aide.conf最下⾯添加的配置信息,让其检测/data/⽬录下的内容,不检查dir1下的内容:
vim /etc/aide.conf
#最后一行添加:
/data/ CONTENT
!/data/dir1
  1. 初始化AIDE库:
aide --init

  1. 然后对f1⽂件进⾏修改, :
mv /var/lib/aide/aide.db.new.gz /var/lib/aide/aide.db.gz
echo "hello world" > /data/f1
  1. 执⾏检测,发现f1⽂件被篡改
aide --check

  1. 在dir1中创建⽂件, 更新aide数据信息:
echo fff > /data/dir1/ss
aide --update
#生成检查数据库(建议初始数据库存放到安全的地方)
cd /var/lib/aide
mv aide.db.new.gz aide.db.gz
  • aide --update —生成—> aide.db.new.gz —生成检查数据库—> aide.db.gz
  1. 然后修改dir1中的ss⽂件内容,进⾏检测,结果没有发现ss⽂件被修改过,因为在配置⽂件中定义了!/data/dir1:
echo sss >/data/dir1/ss
aide --check

sudo

•来自sudo包,man 5 sudoers
•sudo能够授权指定用户在指定主机上运行某些命令。如果未授权用户尝试使用 sudo,会提示联系管理员
•sudo可以提供日志,记录每个用户使用sudo操作
•sudo为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机
•sudo使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券”

  • su 切换身份:
    su –l username –c 'command'
  • sudo 切换身份
    sudo –i –u wang
  • sudo 命令
    sudo [-u user] COMMAND
[选项] 意义
-V 显示版本信息等配置信息
-u user 默认为root
-l 列出用户在主机上可用的和被禁止的命令
-v 再延长密码有效期限5分钟,更新时间戳
-k 清除时间戳(1970-01-01),下次需要重新输密码
-K 与-k类似,还要删除时间戳文件
-b 在后台执行指令
-p 改变询问密码的提示符号

示例:sudo -p "password on %h for user %p:"

sudoers

  • 通过visudo命令编辑配置文件,具有语法检查功能
    visudo -c检查语法
    visudo -f /etc/sudoers.d/test 指定编辑的sudoers配置文件

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

  • 时间戳文件:/var/db/sudo

  • 日志文件:/var/log/secure

  • 配置文件支持使用通配符glob
    \x 转义
    [[alpha]] 字母 示例: /bin/ls [[alpha]]*

  • 配置文件规则有两类
    1、别名定义:不是必须的
    2、授权规则:必须的

  • 示例:
    root ALL=(ALL) ALL
    wang 192.168.88.7=(root) /bin/mount /dev/sr0 /mnt

  • 格式说明:
    user host=(runas) command

  • Users运行命令者的身份和runas以哪个用户的身份:
    username#uid%group_name%#giduser_alias|runas_alias

  • host通过哪些主机:
    ip或hostnamenetwork(/netmask)host_alias

  • command运行哪些命令:
    command namedirectorysudoeditCmnd_Alias

  • 别名定义:
    AliasType NAME1 = item1, item2, item3 : NAME2 = item4, item5

  • AliasType别名有四种类型:User_Alias, Runas_Alias, Host_AliasCmnd_Alias

sudoers示例:

[root]$ vim /etc/sudoers
wang ALL=(root) /usr/bin/cat /etc/shadow
  1. 授权某个⽤户组的⽤户具有特定权限
[root]$ vim /etc/sudoers
%wang ALL= ALL
#以root身份运行可以省略“=”后的ALL或者是(root)
%wheel ALL=(ALL) NOPASSWD: ALL
#NOPASSWD表示可以不输入密码执行sudo
  1. 在/etc/sudoers.d目录授权配置文件
[root]$ vim /etc/sudoers.d/wangfile
wang  ALL=   ALL
#除了可以用vi编辑,也可以用visudo,-c可以进行内容检查
#visudo -c -f /etc/sudoers.d/wangfile
  1. sudoers配置⽂件中的其他配置⽅式
#1001 ALL=  ALL
%#1000   ALL=   ALL
#符号"#",后面跟uid,也可以用"%#"后面跟gid
  1. 别名的使用
#别名只能使⽤⼤写字⺟和数字构成
[root]$ vim /etc/sudoers.d/wang
#别名定义
User_Alias  SYSUSER=chen
Host_Alias  SYSHOST=192.168.88.0/24
Runas_Alias SYSRUNAS=root
Cmnd_Alias SYSCMD=/bin/cat /etc/shadow
#策略
SYSUSER SYSHOST=(SYSRUNAS) SYSCMD
  1. 指定wang使用sudo时默认使用tom的权限
Defaults:wang runas_default=tom
wang ALL=(tom,jerry) ALL
  1. 排除某个命令
wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd
  1. 存在一个问题
wang ALL=(ALL) /bin/cat /var/log/messages*
  • 这样的写法会导致用户可以这样执行来查看本来无法查看的文件
sudo cat /var/log/messages /etc/passwd
  • 官方的man文档也有说到这样的内容
Wildcards in command line arguments should be used with care.
     Command line arguments are matched as a single, concatenated string.
     This mean a wildcard character such as ‘?’ or ‘*’ will match across word
     boundaries, which may be unexpected.  For example, while a sudoers entry
     like:

         %operator ALL = /bin/cat /var/log/messages*

     will allow command like:

         $ sudo cat /var/log/messages.1

     It will also allow:

         $ sudo cat /var/log/messages /etc/shadow
  • 解决方法 :思路就是不让用户执行cat多个文件,也就是参数不能有空格,那么可以这么写
[root]$ vim /etc/sudoers.d/chen
chen   ALL=(root)   /bin/cat /var/log/messages*,!/bin/cat /var/log/message* *

TCP_Wrappers介绍

链接跳转:Linux进阶_TCPWrappers介绍

Openssl

链接跳转:Linux进阶_OpenSSL详解

PAM认证机制

链接跳转:Linux进阶_PAM认证机制

相关内容

    暂无相关文章