一概述
系统和网络安全始终是系统维护中最重要的部分,为了避免这些安全隐患。有效的数据加密和用户验证是必不可少的。虽然这样做并不能免除系统面临的所有隐患,有效的数据加密和用户验证是必不可少的。虽然这样做并不能免除系统面临的所有隐患,但是可以解决大部分的问题,增强系统的安全性。在LInux系统中通过对加密和身份验证保证系统的安全性。
二:Linux系统中的认证方法
LInux系统中使用的主要加密和身份验证方法有密码验证、密码加密、可插入身份验证模块以及基本身份验证和摘要身份验证。
密码验证是一种使用用户名和密码的认证方式。从终端登录本地系统或者通过网络登录到各种服务器时,会参照文件/etc/passwd和/etc/shadow,这种认证方法通过PAM(Pluggable Authentication Moudles,可插入认证模块)的pam_unix.so模块实现。
记得/etc/shadow文件中的第二个字段记录的是什么,就是加密过的用户登录密码。PAM根据用户输入密码计算出哈希值与/etc/shadow文件中存储的哈希值进行比较。如果相同,则对用户身份进行验证并允许登录。PAM配置文件中指定了使用的哈希算法类型,默认情况下,CentOS和Ubuntu都使用sha512,它可以对给定的数据执行哈希函数。哈希函数可以对输入的数据执行特定的处理并返回与输入数据相对应的值,它可以用以下这几个方面:
- 数据加密:通过散列函数对输入的数据进行加密,其特点是很难从散列值中得到相应的数据。
- 查询记录:从输入键快速查询需要的记录。
- 修改检测:计算数据的哈希值。如果值正确,就不会修改,如果值不同,则更改。
用户哈希加密的算法如下表所示:
哈希算法 | 说明 |
MD5 | Message-Disgest Algorithm 5,信息摘要算法,可以输出128位散列值 |
SHA256 | Secure Hash Algorithm256,安全散列算法,由NIST发布的标准哈希函数,可以输出256位散列值。 |
SHA512 | Secure Hash Algorithm 512,安全散列算法,由NIST发布的标准哈希函数,可以输出512位散列值 |
Blowfish | 是一种对称分组加密算法,算法执行效率较高,流程简介清晰 |
/etc/shadow文件中的第二个字段,用于加密的哈希算法类型存储为/etc/shadow的第二个字段开头的第一个字段开头的一个字符或两个字符的ID,包含在$符号中。/etc/shadow文件中的加密记录信息如下图所示:
这种加密密码在之前学习和创建用户和密码的时候已经使用好多次了。
三:PAM
PAM(可插入认证模块)是一种对应用程序执行用户身份验证的机制。它是独立于每个应用程序地身份验证机制,所设置的身份验证方法用于每个应用程序。PAM提供了支持不同身份验证的模块,用户可以通过编写PAM配置文件来选择身份验证的方法。PAM的认证方式和模块如下表所示。
认证方式 | 认证模块 | 说明 |
密码验证 | pom_unix.so | 本地系统登录和网络登录的默认身份验证方法 |
LAP认证 | pam_ldap.so | 使用LDAP验证服务器时的身份认证方法 |
Winblind | pam_winbind.so | 使用Winbind作为验证服务器时的身份验证方法 |
PAM配置文件引用/etc/pam.conf或/etc/pam.d目录下的文件,如果存在/etc/pam.d中,则会忽略/etc/pam.conf,每个使用PAM的应用程序的配置文件都位于/etc/pam.d中,使用ls命令可以看到/etc/pam目录中的文件,如下图所示:
这是在CentOS中执行的结果,如果有小伙伴使用的是Ubuntu,可以对比看看。我们系统中的配置文件由安装每个应用的程序包配置,配置文件的格式为“类型 控制标志 模块 参数”。PAM函数有四种类型,类型在配置文件的第一个字段中指定,这4种类型如下表所示:
类型 | 说明 |
account | 检查用户的属性,比如是否允许登录2 |
password | 设置用户密码 |
auth | 实现用户身份认证,比如提示用户输入密码 |
session | 负责认证后的处理,包括日志记录 |
控制标志可以用来标记处理和判断不同模块的返回值,并且该字段还指定是否引用其他的文件。PAM控制标志如下表所示:
控制标志 | 说明 |
sufficient | 如果用户通过了这个模块的验证,PAM会返回认证成功的信息 |
requisite | 如果这个模块是success,会执行相同类型的下一个模块,如果是failure,则不执行相同类型的模块 |
required | 即使某个模块对用户的验证失败,也要等所有的模块都执行完毕后,PAM才返回错误信息 |
aptional | 只有它是唯一的模块时,模块返回才有意义 |
include | 包括第三个字段中指定的文件 |
模块指定要动态链接和执行文件,主要模块如下表所示:
模块 | 说明 |
pam_unix,so | 通过/etc/passwd和/etc/shadow执行UNIX身份验证 |
pam_ldap.so | 执行LDAP身份验证 |
pam_rootok.so | 允许root用户访问 |
pam_securetty.so | 仅允许从/etc/secureetty文件中注册的设备访问 |
pam_nologin.so | 如果/etc/nologin文件存在,则拒绝非root用户登录 |
pam_wheel.so | 检查用户是否属于wheel组 |
pam_cracklib.so | 检查密码安全性 |
pam_permit.so | 允许访问,始终是success |
pam_deny.so | 拒绝访问,始终是failure |
通过向模块中添加参数可以指定模块的处理和行为,下面是大多数应用程序的配置文件中包含的系统身份验证文件,查看/etc/pam.d/system-auth文件,如下图所示。文件中的第一个字段是类型,第二个字段是控制标志,第三个字段是各种模块,第4个字段是参数。可以和上面表格里介绍的内容对比一下,看看每一行表达什么含义。
在/etc/pam.d目录下,用用于切换用户的su命令的配置文件。我们看一下/etc/pam.d/su文件中的内容,如下图所示:
如果你想更仔细地去了解PAM的相关内容,可以去官网:
了解更多。
<2>在Linux中,http服务器用于客户端身份验证的方法是通过基本身份验证和摘要身份验证来实现的。基本认证中的http密码认证指客户端访问Web服务器时,Web服务器将参考存储用户名和密码文件来认证客户端;摘要认证使用http进行密码身份验证,与基本身份验证相同,但是当服务器和客户端交换密码时,密码将使用md5加密发送,因此不存在窃听密码的风险。基本身份验证和摘要身份验证都是通过http进行密码验证,并且在受到暴力进攻的风险。
对于通过网络传输信息的主机来说,在进行身份验证时可能会受到来自网络的暴力进攻。暴力进攻中所有的密码模式由计算机程序自动测试并且加密。
- 防止暴力进攻的措施:
- 限制输入密码的次数
- 设置两次输入密码的间隔时间
- 如果超过了尝试输入密码的次数限制,需要阻止访问源的IP地址
四:公钥机密
当数据被加密存储在文件中或通过网络传输时,将使用加密密钥传输数据,它们分别称为公用密钥加密和公钥加密。由于很难在发送者和接收者之间传递密钥,因此密钥不会被盗(不会被窃听)。此加密主要由于同一人在同一主机上进行加密时,例如在存储加密文件时,在网络上使用公共密钥加密时,使用密钥交换方法生成共享公用密钥。DES和AES是典型的用于密钥加密的算法,DES(数据加密标准)作为密码安全性较弱,被AES取代。AES(高级加密标准)是一种取代DES的新标准密码,安全性方面有保障,通用密钥加密算法可以大致分为块密码和流密码,DES和AES是块密码。块密码将要加密的文本划分为一块大小的块,并加密每一个块。块密码的主要算法及说明如下表所示:
算法 | 说明 |
AES | AES是取代DES的新标准加密,运算速度快,安全性高 |
CAST-128 | 由两位开发者在1996年开的的快密码CAST5 |
Blowfish | 1993年开发的块密码,可以于ssh密码配合使用 |
DES | 1976年在美国建立的加密标准,安全性弱 |
3DES | 进行三次DES加密 |
在通过网络加密通信时,每个会话都会使用公用密钥,使用加密密钥交换方法生成共享一个公共密钥,并使用该公共密钥对数据进行加密,该公共密钥称为会话密钥。会话密钥是会话中的服务器进程和客户端进程,它仅存在于内存中,并在会话结束时消失。公钥加密算法包括RSA、DSA、ECDSA、Ed25519等,HTTPS/TLS和openSSH通信中率先使用了椭圆曲线的算法并从此开始广泛使用。公钥加密算法及其说明如下表所示:
加密算法 | 说明 |
RSA | 基于素数分解问题的难度而进行的公钥加密,它执行加密合数字签名 |
DSA | 基于离散对数问题难度的电子签名方法 |
ECDSA | 基于椭圆曲线上离散对数问题的电子签名方法 |
EdDSA | 基于椭圆曲线的爱德华兹曲线上离散对数问题的难点的电子签名方法 |
公钥加密不同于加密密钥和解密密钥,它使用公钥加密私钥解密,公钥加密是使用私钥和公钥进行加密、数字签名和身份验证、密钥交换方法的总称。简单来说公钥和私钥是成对的,公钥负责加密,私钥负责解密,它俩相互解密。
五:加密命令
Linux中提供了zip、7zip、openssl、gpf等作为加密命令,用户可以使用这些命令来加密文件。zip命令是一个压缩和存档命令,可以使用密码进行加密,用于多个操作系统中。如果密码强度较弱且安全性很重要,建议使用其他加密程序。
<1>zip命令
zip命令的版本5或更高版本使用了强大的加密算法,例如AES。
命令格式:zip [选项]
存档文件名 文件名
有加密就有解密,解密命令就是unzip,它可以解密也可以解压缩。
格式:unzip [选项] 存档文件名 文件名
使用zip命令对文件进行加密操作,如下图所示。指定-e选项对文件samp.txt进行加密,加密后的文件名为samp.txt.zip,注意要输入两次密码。
然后使用unzip命令进行解密操作,如下图所示:
<2>7zip是一种高压缩率的文件存档创建使用程序,可以通过添加密码进行加密。7zip执行命令的名称是7z,加密方法是块密码256位AES密码,通过指定a子命令从存档中提取文件,指定-e子命令从存档中提取文件。
命令格式:7z {子命令} [切换] 存档文件名 文件名
<3>openssl
openssl命令的功能有生成私钥/公钥、发布证书签名要求、发布数字证书以及使用公钥加密等。openssl命令指定enc子命令进行加密的命令格式如下所示:
openssl enc [选项]
也可以直接指定加密的方法,其格式如下:
openssl 加密方式 [选项]
openssl命令的选项及其说明如下表所示。
选项 | 说明 |
-e | 加密(默认) |
-d | 解密 |
-a、base64 | 加密后,更改位base64 |
-in | 输入文件规范,否则为标准输入 |
-out | 输出文件规范,否则标准输出 |
-rc4 | 流密码rc4,用于加密方法 |
GPG是OpenPGP的GUN实现,OpenPGP是公共密钥码PGP的标准规范,并且是加密和签名的工具。在Linux中GPG还用于签名和验证软件包,这些软件包可以使用公共密钥密码进行加密。
gpg [选项] 文件
在CentOS中,/usr/bin/gpg指向/usr/bin/gpg2文件的符号链接,这些命令可以在gpg和gpg2中使用。gpg命令的选项及其说明如下表所示:
选项 | 说明 |
-c、--symmetric | 使用对称密钥密码加密。CentOS上的默认密码是CAST5,Ubuntu上的默认密码是AES-128 |
--version | 显示gpg版本、许可证、支持的加密算法等信息。支持的加密算法有IDEA、3DES、CAST5等 |
--cipher-algo | 密码算法规范 |
-o、--output | 指定输出文件 |
--pinentry-mode | 指定PIN输入模式,共有5种类型:default、ask、cancel、error、loopback |
-a、--armor | 以ASCII码格式加密 |
当执行gpg命令时,gpg-agent守护进程程序会自动启动.gpg-agent是用于管理gpg私钥的守护程序,它针对每个用户启动,并且执行gpg命令的用户是有效用户。gpg-agent使用gpg命令加密时会将gpg生成的私钥保存在自己的内存中,使用gpg命令解密时会将gpg-agent持有的私钥传递给gpg命令。使用gpg命令显示gpg版本、许可证和算法,如下图所示:
通过gpg -c命令对samp.txt文件加密,设置对称密码加密,输入密码生成gpg加密文件samp.txt.gpg,如下图所示:
注意:执行命令后,会有让你输入密码的对话框。
执行gpg -o命令解密,指定--cipher-algo选项用AES256算法加密,如下图所示。