Linux加密/解密原理

密码算法和协议:四大类

对称加密:
用于加密任意大小的数据块数据内容,加密方和解密方使用的是同一个密码。
公钥加密:(非对称加密)
加密和解密使用的是不同的密码,有公钥和私钥,密钥是成对出现的,公钥是从私钥中提前出来的,私钥是很长的,私钥加密速度比较慢。公钥是公开的,公钥加密需要用私钥解密,用私钥加密得用公钥解密。
单向加密:
数据完整性算法:抽取数据的特征码,且在二次抽取后和此前的抽取进行比较,以验证数据的确没有被人篡改过的。
认证协议:
用基于某种特性的算法来完成通信双方的真实性。

对称加密

常见的算法:
DES(56位密钥)数据加密标准、3DES、AES(128、192、256、384、512位密钥)高级加密标准、Blowfish、Twofish、IDEA、RC6、CAST5。。。
特性:
1.加密、解密使用同一个口令(密钥);
2.将明文分隔成固定大小的块,逐个进行加密;
简单通信过程:当用户A和B通信时,需要提供一个密钥,A和C通信时也需要提供一个密钥,也即任何人之间通信都需要提供密钥,且在两个人第一次通信时,由于互相都不知道对方的密钥,在网络上传输密钥时是明文传输的,密钥安全性不能得到保证。
缺陷:
1.密钥过多;
2.密钥传输;
密钥交换、身份验证、数据完整性都不能得到保证。

公钥加密也叫非对称加密

常见的算法:
RSA(即可用来加密也可用来做身份验证)、DSA(只能做身份验证)、EIGmail。
加密和解密不是使用同一个密钥,密钥是成对出现的。
密钥:public key公钥,secret key私钥。
使用公钥加密只能用与之配对的私钥解密,使用私钥加密也只能用与之配对的私钥加密。
通常用于:

  • 身份认证
  • 密钥交换(密钥传送) IKE(Internet Key Exchange) 互联网密钥交换
    常见DH算法:
    Diffie-Hellman(以下简称DH)密钥交换是一个特殊的密钥交换的方法。DH可以让双方在完全缺乏对方(私有)信息的前提条件下通过不安全的信道达成一个共享的密钥。此密钥用于对后续信息交换进行对称加密。

单向加密

常见的加密工具:
MD5(128位)、SHA1(160位)、SHA256、SHA384、SHA512。。。
通过提取数据指纹(特征码)可以实现数据完整性校验。
特性:

  • 定长输出
  • 雪崩效应(输入条件的微小变化会产生输出条件的巨大变化)

在身份验证、数据完整性、数据保密性都得到保证的一个通信过程。以上三种加密方式都使用到了
以AA和BB通信为例:
(1)首先AA把要通信的数据用单向加密计算后得到特征码,用AA的私钥把特征码加密都附加在通信数据的尾部,AA在使用一种算法(对称加密)把整个数据进行加密生成一个字串,AA用BB的公钥把加密的密码加密放在这段字串后面一并发给BB。
(2)BB收到数据后,用自己的私钥把加密的密码解密,再使用解密后的密码解密这段字串,解密后用AA的公钥把加密的特征码解密,再使用相同的单向加密计算这段数据的特征码,把计算出来的特征码和发送过来的特征码对比,一样则接收数据,不一样则放弃接收数据。
(3)这里最重要的一步就是公钥的获取,如何得到对方的公钥,又如何得知一定是对方的公钥?
此时就需要依赖于CA,每个人所发的公钥对方无法验证其真假,就像你说自己是xx,那怎么证明你就是xx呢?生活中我们都是通过***来验证的,但是***不能你自己做一张印上一个名字,就说自己叫xx,需要提供一张由公安部门所颁发的权威的***才能得到认可,因为大家是信任公安部门的权威性的。这里把公安部门称为第三方机构也即是这里的CA。AA和BB通信之前要向CA去注册认证自己的身份。
(4)AA向CA申请给自己发一个证(里面包含公钥、名字、有效期等CA会使用单向加密计算这些数据特征码,CA再用自己的私钥加密这段特征码并附加在证书的后面),AA就把自己的证给BB,那此时BB如何去验证AA发来的证书不是伪证书?则BB需要信任CA,才能信任CA所颁发的证书,BB使用CA的公钥解密这段特征码,再用相同的单向加密计算这些数据特征码,比较两个特征码是否一致,此时CA的证书(公钥)从何而来呢?CA是自己给自己给发证书的。有的比较通用的证书在操作系统上都内置有,不需要通过网络传输。还有一些电子商务网站,你信任这些网站,你访问时就安装它的证书。且需要提供有公信力CA是需要向根CA注册申请,都是需要比较高的金额。
(5)如果在公司内部用,只需要自己创建一个私有CA,在公司私有网络中使用。
还有一种特殊情况,如果说私钥丢失了,该如何处理呢?
如何私钥丢了,必须让获得公钥的主机知道公钥被废了,因此CA机构需要维持一张列表(证书吊销列表),一旦私钥丢弃,则向CA申请自己的证书作废。CA机构就把丢失私钥的主机放到证书吊销列表中。
则通信时,还需要增加一步就是通信的对方收到数据后,需要到CA机构查看发送方是否在证书吊销列表中。(注意互联网上绝大部分通信者都没有这样做,因此互联网上通信还是存在安全隐患的)

一个证书颁发机构加上证书吊销列表等等形成了互联网安全通信的基本框架,这个基本框架也叫PKI(公钥基础设施)。
在用户注册证书的时候,就需要到第三方颁发机构申请证书,向RA(注册机构)申请,有CA做签名认证。证书是有很多种格式的。由ITU-T组织所定义的证书格式规范称为x.509(主要定义了关于证书结构和认证协议的标准)。
x.509标准有三个,第1、2、3版本,x509是基于公钥密码体制和数字签名的服务,在众多通信模型中都会被使用到(IP安全、TLS/SSL和S/MIME(安全地址邮件通信模型))。

最新证书所包含的内容:
证书的版本号、证书的序列号、算法参数、发行者的名称、有效期限、主体名称(证书的拥有者名字[用户使用的就是用户名,服务器使用的是主机名不能是ip])、公钥(对方提供的)、发行者的唯一ID、主体的唯一ID、。。、CA的签名(验证证书合法性)。
一个证书在签署之前,由请求者自己先发送一个证书签署请求按照特定格式做好自己能填的信息(主体名称、公钥等)其他内容则留空提交给CA,由CA把其他内容都填充完,并且自己做好签名,就可以发给请求者。
PKI公钥基础设施,是一种规范,任何遵循此种规范组织或架构等都认为是遵循PKI标准的,PKI有下面几部分内容组成:

  • 签证机构:CA
  • 注册机构:RA 证书
  • 吊销列表:CRL
  • 证书存取库:用来检查证书是否存在的接口
    PKI最前端是证书存取库,用户通过证书存取库获取证书,而后内容是证书的注册机构、后是签证机构。
    用户通过存取库与RA交互,RA与CA交互,CA前端有一个证书吊销列表,用户通过存取库与证书吊销列表进行交互。

安全基本防护及用户提权

linu安全应用

信息安全分类

物理安全:主机/机房环境
系统安全:操作系统
应用安全:各种网络服务,应用程序
网络安全:网络访问控制,防火墙规则
数据安全:信息的备份与恢复,加密解密
管理安全:保障性的规范,流程,方法

linux基本防护

系统账号安全
1.与用户相关的常用命令:

useradd userdel usermod shwan chage passwd

2.与用户相关的配置文件:

/etc/passwd /etc/shadow /etc/login.defs

3.管理用户passwd 选项 用户名:

-l:锁定
-u:解锁
-S:状态

4.管理用户usermod 选项 用户名:

-L:锁定
-U:解锁
-s:修改shell

5.管理用户chage 选项 用户名:

-E 年-月-日:账号有效期
-d:用户修改密码的最后时间

6.阻止普通用户关机:

配置目录/etc/security/console.apps
[root@158 ~]# mkdir -m 700 locked
[root@158 ~]# mv poweroff(其他程序类似于reboot halt等) locked

7.伪装登陆提示:

本地登陆 /etc/issue
[root@158 ~]# vim /etc/issue
Anonymous

远程登陆 /etc/issue.net
[root@158 ~]# vim /etc/issue.net
Anonymous

文件系统安全

1.历史命令控制:

[root@158 ~]# vim /etc/profile
export HISTTIMEFORMAT=' %F %T ' 加上命令显示执行时间
HISTSIZE=1000 默认1000条记录
[root@158 ~]# source /etc/profile 使命令生效

2.程序和服务的控制:

禁用非必要的系统服务:chkconfig ntsysv
禁止平台用户执行init.d目录下的脚本:
[root@158 ~]# chmod o-x /etc/init.d/ 限制"other"权限

3.文件系统的规划和挂载:

/boot /home /var等单独分区
mount挂载选项
[root@158 ~]# vim /etc/fstab
/dev/sdb1 /disk ext4 defaults 0 0 (开机自动挂载)
defaults默认挂载
参数:rw, suid, dev, exec, auto, nouser, async, and relatime.
-o nosuid:禁用suid sgid特殊权限
-o noexec:禁止运行二进制文件

4.锁定/解锁保护文件:

/etc/hosts,/etc/sysconfig/network,/etc/resolv.conf 
/etc/passwd,/etc/shadow,/etc/profile,/etc/bashrc
ext3/ext4的文件属性控制:lsattr(查看),chattr(更改)
属性i:不可变
属性a:仅可追加
[root@158 opt]# lsattr sql.txt(查看) 
-------------e- sql.txt
+ - =控制方式
[root@158 ~]# chattr +i /etc/hosts (更改)

用户切换/提权

1.用户切换 su 切换到root用户:

su 用户名 只切换用户,不切换到用户的系统环境
su - 用户名 切换用户的同时,切换到用户的系统环境
su -c "命令" 用户名 切换到用户身份执行命令,需要输入用户的密码 su -c "mkdir /root/a.txt" root

2.用户提权(root给普通用户提权):

/etc/sudoers 主配置文件
visudo 打开配置文件的命令 等效与vim /etc/sudoers
[root@158 ~]# grep -v '^$\|^#' /etc/sudoers(去掉空行和#号)
root	ALL=(ALL) ALL

授权记录格式:

用户 主机列表=命令列表
%用户组名 主机列表=列表命令

示例:

[root@158 ~]# vim /etc/sudoers
hydra localhost,158=/etc/init.d/mysql status(本机登陆,本机主机名)
hydraxx localhost,158=/etc/init.d/httpd * , /usr/bin/vim /etc/httpd/conf/httpd.conf(*表示可以执行http服务的所有命令,命令要用绝对路径)
hydraxxx localhost,158=/sbin/* , !/sbin/rm -rf(!取反,sbin下的什么命令都可以用,但是不能用rm命令)
%web localhost,158=/sbin/service httpd * , /usr/bin/vim /etc/httpd/conf/httpd.conf, NOPASSWD:ALL(%web用户组 NOPASSWD:ALL表示不需要密码)

3.普通用户调用提权命令:

sudo -l 查看自己可以使用的提权命令(首次查看需要输入自己的密码)
[hydra@158 ~]$ sudo /etc/init.d/mysql status(调用提权命令要加上sudo)

4.别名设置(别名名称必须大写):
给用户定义别名

vim /etc/sudoers
User Aliases 别名名称=用户列表
User_Alias ADMINS = jsmith, mikem

给命令定义别名

vim /etc/sudoers
Cmnd_Alias 别名名称=命令列表
Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp

给客户端地址定义别名

vim /etc/sudoers
Host Aliases 别名名称=主机名列表 
Host_Alias MAILSERVERS = smtp,smtp2

示例:调用用户别名和命令别名,以及客户端地址别名

[root@158 ~]# vim /etc/sudoers
ADMINS localhost,158=SOFTWARE,DELEGATING, NOPASSWD:ALL
ADMINS smtp=SOFTWARE,DELEGATING, NOPASSWD:ALL

5.启动sudo日志,记录普通用户登陆后执行过的提权命令:

[root@158 ~]# vim /etc/sudoers
Defaults logfile="/var/log/sudo"(日志路径)