CentOS 7 安全加固
身份鉴别
口令策略
介绍
/etc/pam.d/system-auth
文件是Linux系统中Pluggable Authentication Modules(PAM)
的配置文件之一。PAM允许系统管理员在不修改应用程序的情况下配置认证方式,包括密码验证、账户管理、会话管理等。
system-auth
文件的作用是定义系统范围内的默认身份验证策略和配置。当用户尝试登录或执行需要身份验证的操作时,PAM将根据system-auth文件中的配置来执行相关的身份验证模块,例如验证用户密码、检查账户状态、设置会话限制等。
密码口令
1 | vim /etc/pam.d/system-auth |
修改system-auth
配置文件设定密码强度,如下
1 | # 要求口令长度至少8位,至少包含一个数字、大写字母、小写字母、特殊字符,且不能包含用户名,root用户同样使用 |
password
: 这表示该配置适用于密码验证阶段。requisite
: 表示如果这个模块验证失败,将会立即拒绝用户的访问,且不会再执行后续的模块。pam_pwquality.so
: 这是进行密码质量检查的模块。try_first_pass
: 尝试首先使用之前通过身份验证模块获得的身份验证令牌。local_users_only
: 仅对本地用户应用此规则,不适用于远程用户。minlen=8
: 密码的最小长度要求为8个字符。ucredit=-1
: 至少需要一个大写字母。dcredit=-1
: 至少需要一个小写字母。lcredit=-1
: 至少需要一个数字。ocredit=-1
: 至少需要一个特殊字符。enforce_for_root
: 即使是root用户也要强制遵循这些规则。
测试
我们试试修改密码测试一下
1 | passwd |
由下图可以看到,我们设置的密码缺少大写或者非字母或数字字符也会提示强度不够。
配置口令历史
/etc/pam.d/system-auth
配置密码历史记录
1 | password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5 |
password
: 这表示该配置适用于密码验证阶段。sufficient
: 表示如果这个模块成功验证了用户身份,那么将不再继续向后执行其他模块,就算其他模块返回失败也是如此。pam_unix.so
: 这是实际进行密码验证的模块,使用的是UNIX系统的密码验证方式。sha512
: 表示使用SHA-512算法对密码进行哈希加密。shadow
: 表示使用系统的shadow密码文件来进行验证。nullok
: 表示空密码是被允许的。try_first_pass
: 尝试首先使用之前通过身份验证模块获得的身份验证令牌。use_authtok
: 使用经过身份验证的口令(token)。remember=5
: 记住前面5次使用的密码,避免用户频繁切换密码时重复使用相同的密码。
登录失败处理
在/etc/pam.d/system-auth
的account区段
1 | auth required pam_faillock.so preauth audit deny=5 even_deny_root unlock_time=600 |
- 行 1:
pam_faillock.so
模块被用于在用户进行身份验证前(preauth)执行账户锁定检查。如果失败次数达到指定的阈值,则会拒绝用户的登录请求,并记录审计日志。即使是root用户也会受到相同的限制。 - 行 2:
pam_unix.so
模块在本地用户身份验证时起到必要的作用,nullok
参数表示允许空密码,并且尝试使用之前通过身份验证模块获得的身份验证令牌。 - 行 3:
pam_faillock.so
模块在用户身份验证失败时执行账户锁定操作,并记录审计日志。如果失败次数达到指定的阈值,则会拒绝用户的登录请求,并即使是root用户也会受到相同的限制。 - 行 4:
pam_faillock.so
模块在用户身份验证成功时执行账户锁定操作,并记录审计日志。即使是root用户也会受到相同的限制。
口令使用周期
/etc/login.defs
文件包含了许多与用户账户和密码策略相关的配置项。比如口令使用周期
PASS_MAX_DAYS
:用户密码的最大有效期,超过该时间未更改密码将会失效PASS_MIN_DAYS
:用户更改密码之间的最小间隔天数PASS_WARN_AGE
:在密码过期前提供警告的天数
设置这些参数,可以强制用户行为,定期修改密码,提高系统安全性
1 | PASS_MAX_DAYS 90 |
补充
/etc/login.defs
还有其他很多的配置项,比如以下常用的配置项:
MAIL_DIR
:指定用户的邮件存储目录PASS_MIN_LEN
:用户密码的最小长度要求LOGIN_RETRIES
:允许的登录尝试次数LOGIN_TIMEOUT
:登录超时限制
空闲超时自动退出
在/etc/profile
添加如下设置300秒后自动断开SSH远程
1 | export TMOUT=300 |
关闭telnet和ftp服务
telnet
查看telnet端口(默认为23)
1 | cat /etc/services | grep telnet |
查看端口是否存在进程
1 | ps -ef | grep 23 |
ftp
1 | ps -ef | grep vsftpd |
SSH1和SSH2
SSH1和SSH2是两个不同版本的安全外壳协议,用于在计算机网络上加密通信和实现远程登录。它们之间的主要区别包括安全性、加密算法、性能和功能方面的改进。
- 安全性:
SSH2
相对于SSH1
有更强的安全性。SSH1使用的是基于RSA的加密算法,而SSH2支持更多种类的加密算法,包括RSA
、DSA
、ECDSA
和Diffie-Hellman
等。SSH2还修复了SSH1中存在的一些安全漏洞。 - 加密算法:SSH2支持更多种类型的加密算法和哈希算法,从而提高了通信数据的安全性。
- 性能:SSH2相对于SSH1有更好的性能表现,包括连接速度和数据传输速度。
- 功能:SSH2相对于SSH1增加了许多新的功能,包括端口转发、X11转发、SFTP(Secure File Transfer Protocol)等功能。
目前主流的Linux系统默认使用的是SSH2
版本,因为SSH2相对于SSH1更安全、更灵活,并且具有更好的性能和功能。在实际应用中,SSH2已经成为了远程登录和安全通信的标准选择。
查看SSH协议
显示SSH客户端和服务器之间的详细连接信息,包括使用的协议版本
1 | ssh -v localhost |
访问控制
分配合理权限
针对以下文件,文件权限数不能超过644
一、系统配置文件:
/etc/shadow
/etc/passwd
/etc/profile
/etc/group
二、系统日志
/etc/rsyslog.conf
/etc/audit/audit.conf
/var/log/secure
(包括轮转后的日志)/var/log/messages
(包括轮转后的日志)/var/log/cron
(包括轮转后的日志)/var/log/audit/audit.log
(包括轮转后的日志)
安全审计
系统日志进程rsyslog、审计日志进程auditd两个日志均必须开启
rsyslog
rsyslog
(全称是rocket-fast system for log)是一个强大的日志处理工具,通常用于Linux系统中,它可以帮助用户收集、处理和传输日志信息。
1 | # 启动 rsyslog 日志进程 |
日志规则
对于rsyslog守护进程接收到消息,并且根据伴随消息的备常量和/etc/rsyslog.conf
配置文件定义的日志规则进行匹配。
1 | authpriv.* /var/log/secure |
这条规则的意思就是匹配authpriv.
类型的消息,并将该消息写入到/var/log/secure
这个日志文件中。
规则左侧authpriv.*
称为选择器
(Selector),右侧日志路径称为动作
(Action)
- 选择器:匹配消息的类型,由
设备
和消息等级
以点.
隔开 - 动作:如何处理选择器匹配的信息。要么写入日志文件、要么转发到远程日志服务器、要么丢弃
消息等级
消息等级
在选择器中是日志等级
由高到低排列如下:
- emerg: 表示系统无法使用
- alert: 必须立即采取措施
- crit: 致命级别
- err: 错误级别
- warning: 警告级别
- notice: 通知级别
- info: 正常级别
- debug: 调试消息
- none : 不记录任何东西
选择器
rsyslog
的审计配置文件在/etc/rsyslog.conf
,下面是配置中的一部分
案例一
1 | *.info;mail.none;authpriv.none;cron.none /var/log/messages |
这条规则,有三个;
,有4个选择器,他们是并集的关系。
*.info
:匹配所有任何设备,但消息等级是info
mail.none
:消息等级是none
,意味着不会匹配mail类型任何等级消息authpriv.none
:消息等级是none
,同理意味着不会匹配authpriv
类型任何等级消息cron.none
:消息等级是none
,同理,意味着不会匹配cron
类型任何等级消息
总结:任何设备类型且仅当消息等级为info
的消息会被写入到action
字段指向/var/log/message
文件中
案例二
1 | authpriv.* /var/log/secure |
这条命令比较短,容易理解,即匹配类型为authpriv
,且任何等级消息都会被写入到/var/log/secure
文件
案例三
1 | mail.* -/var/log/mail.log |
这条规则和案例二差不多。匹配类型为mail
,且任何消息等级都会被写入到/var/log/mail.log
文件。
注意:这里有一个-
号,代表延迟action
。即不会马上实现action,这里动作是写入/var/log/mail.log
文件,则先写入到Linux缓存区,等一段时间后才会写入到/var/log/mail.log
文件
案例四(重点)
1 | *.emerg :omusrmsg:* |
匹配了任何消息类型,且emerg
是消息等级中最高的(致命性),action
是会被发送到系统所有用户的登录终端。字段中的**:omusrmsg:*** 就表达了这个意思。
动作(Action)
我们了解了选择器和简单的动作,但动作应该不只是写入到文件,还可以有其他的动作,我们下面学习一下其他的动作。
通过网络发送rsyslog消息
将消息转发到远程服务器语法格式如下:
1 | <selector> @[compress_level][remote_server]:[port] |
- 使用
@
将指定UDP
传输协议 - 使用
@@
将指定TCP
传输协议 - 可选的
compress_level
字段启动用从1~9
的zlib压缩级别 remote_server
字段指定接收主机- 可选的
port
字段指定接收主机端口
案例一:转发主机
1 | *.* @ 10.10.1.2 |
该规则将匹配任何类型
且不限等级
的消息,使用UDP协议
将消息转发到10.10.1.2
案例二:转发主机端口
1 | *.* @@host.hikki.site:45 |
该规则表示匹配任何类型且不限等级的消息,使用TCP协议将消息转发到host.hikki.site
主机的45端口上
案例三:多用户
1 | mail.* jack,mary,john |
指定用于发送rsyslog
消息的用户名,用户名之间使用逗号,
分隔开以指定多个用户,。使用星号将消息发送给当前登录的每个用户。
以上规则表示将匹配所有邮件相关的消息发送给用户jack,mary,john用户
案例四(重点)执行程序
你还可以选定的rsyslog消息执行程序。在动作(action)前加上^
符号,指定用于格式化接收到的消息并将其作为单行参数传递给指定的可执行文件的模板。
1 | # 模板:<设备>.<优先级> <^发送消息的程序;日志模板> |
auditd
auditd
工具可以帮助运维人员审计Linux,分析发生在系统中的发生的事情。Linux内核有种日志记录事情的能力,包括记录系统调用和文件访问。管理员可以检查这些日志,确认是否存在安全漏洞(如多次失败的尝试,或者用户对系统文件不成功的访问)
auditd每次更改配置规则需要重启auditd进程
service auditd restart
,通过auditd -l
验证是否生效
audit启动、停止、重启
CentOS 7默认安装了audit
,检查auditd
的状态
1 | # 查看 auditd 的运行状态 |
auditd服务的启动与停止
1 | # 启动 auditd 服务 |
配置文件
audit.conf
文件:审计工具的配置文件
audit.rules
文件:审计的规则,该文件由/etc/audit/rules.d
产生
audit-stop.rules
文件:审计停止规则,该文件定义了定制检测
rules.d
目录:定义需要审计的规则,写到文件之后会永久有效
添加审计规则
添加有效的审计规则,编辑/rules.d
目录下的配置文件,添加规则进去
1 | vim /etc/audit/rules.d/audit.rules |
添加如下内容到audit.rules
里面
1 | # 监视系统文件 |
添加完规则需要重启auditd
进程
1 | # 重启 auditd 进程 |
使用auditctl -l
命令可用查看到刚添加的规则,如果能看到说明审计规则添加成功了,如果没有看到,说明添加规则写错了
auditd工具
auditctl
:auditd默认操作命令
aureport
:生成和查看审计规则的文件
ausearch
:是一个搜索各种事件的工具
autrce
:用于跟踪进程的命令
常用的 auditctl 命令
1 | # 添加一条审计规则(仅临时有效,永久生效需要添加到配置文件中) |
查看 auditd 服务状态
1 | auditctl -s |
1 | # 设置使能标志 |
-
设置为0,关闭audit
-
设置为1,开启audit
-
设置为2时,表示锁定
一般在设置完其他规则后最后设置,防止其他人修改规则;任何修改规则的行为都会被拒绝,并且记录审计日志,只有当重启系统后
,这个使能标志才可以被修改。
auditd日志
开启auditd日志输出到rsyslog,同时开启输出local0等级
1 | active = yes |
logrotate日志切割
使用logrotate指令,可让你轻松管理系统所产生的记录文件。它提供自动替换,压缩,删除和邮寄记录文件,每个记录文件都可被设置成每日,每周或每月处理,也能在文件太大时立即处理。
语法
1 | logrotate [-?dfv][-s <状态文件>][--usage][配置文件] |
参数说明
-?或--help
:在线帮助。-d或--debug
:详细显示指令执行过程,便于排错或了解程序执行的情况。-f或--force
:强行启动记录文件维护操作,纵使logrotate指令认为没有需要亦然。-s<状态文件>或--state=<状态文件>
:使用指定的状态文件。-v或--version
:显示指令执行过程。-usage
:显示指令基本用法。
logrotate相关文件
执行文件:/usr/sbin/logrotate
主配置文件:/etc/logrotate.conf
自定义配置文件:/etc/logrotate.d/*
配置格式
1 | /var/log/log_file { |
配置参数
- daily :指定转储周期为每天
- weekly :指定转储周期为每周
- monthly :指定转储周期为每月
- rotate count :指定日志文件删除之前转储的次数,0 指没有备份,5 指保留 5 个备份
- tabooext [+] list:让 logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和~
- missingok:在日志轮循期间,任何错误将被忽略,例如 “文件无法找到” 之类的错误。
- size size:当日志文件到达指定的大小时才转储,bytes (缺省) 及 KB (sizek) 或 MB (sizem)
- compress: 通过 gzip 压缩转储以后的日志
- nocompress: 不压缩
- copytruncate:用于还在打开中的日志文件,把当前日志备份并截断
- nocopytruncate: 备份日志文件但是不截断
- create mode owner group : 转储文件,使用指定的文件模式创建新的日志文件
- nocreate: 不建立新的日志文件
- delaycompress: 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
- nodelaycompress: 覆盖 delaycompress 选项,转储同时压缩。
- errors address : 专储时的错误信息发送到指定的 Email 地址
- ifempty :即使是空文件也转储,这个是 logrotate 的缺省选项。
- notifempty :如果是空文件的话,不转储
- mail address : 把转储的日志文件发送到指定的 E-mail 地址
- nomail : 转储时不发送日志文件
- olddir directory:储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
- noolddir: 转储后的日志文件和当前日志文件放在同一个目录下
- prerotate/endscript: 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
案例演示
案例一:nginx
在/etc/logrotate.d
目录下创建一个配置文件,后缀可有可无
1 | # 创建配置项 |
创建完后检验一下配置是否有写错,使用debug测试一下
1 | logrotate -d /etc/logrotate.d/nginx.log |
案例二:日志切割(未完成)
新建一个配置项
1 | vim /etc/logrotate.d/audit |
写入以下内容
1 | /var/log/audit/*.log { |
取消默认的anacrontab日志轮转,使用自定义的cron自定义轮转时间
1 | mv /etc/anacrontab /etc/anacrontab.bak |
使用crontab定义轮转触发器
编辑/etc/crontab
1 | SHELL=/bin/bash |
重启crond服务
1 | systemctl restart crond |
但未见日志切割(结果待续)
强制执行
1 | logrotate -f /etc/logrotate.conf |
入侵防范
软件与端口
删除不必要的软件
使用yum或rpm方式安装
查看全部安装软件
1 | rpm -qa |
筛选软件
1 | rpm -qa | grep **name** |
使用源码安装
1 | ps -aux | grep **name |
关闭高危端口
防火墙使用firewall或者iptables,二者选其一就好
firewalld防火墙
查看firewall防火墙状态
1 | service firewalld status |
若未启动则启动防火墙
1 | systemctl start firewalld |
关闭常见的防火墙端口
1 | firewall-cmd --zone=public --remove-port=20/tcp --permanent |
查看iptables进程状态
1 | systemctl status iptables |
iptales
启动方式
1 | systemctl start iptables |
限制接入方式或范围
严格限制远程终端的接入方式或网络地址范围
- 限制了
仅
通过VPN、堡垒机等运维方式才能登陆系统 - 通过firewalld或iptables限制22端口仅特定网段或IP才能访问
- 通过
/etc/hosts.allow
和/etc/hosts.deny
配置,类似如下
1 | # 设置允许通过规则 |
杀毒软件
可以在主机上安装一些入侵检测软件,如一些收费的信服EDR、卡巴斯基等,也有免费开源的ClamAV等,下面使用ClamAV演示常见使用方法。
安装ClamAV
1 | # 更新 epel 仓库源 |
更新病毒库
1 | freshclam |
设置开机自启
1 | # 启动 |
扫描
扫描全部.rar
压缩包
1 | clamscan --unrar |
参数介绍
选项 | 适用的文件类型 | 执行命令示例 |
---|---|---|
-r | 所有文件 | /usr/local/clamav/bin/clamscan -r |
--unrar | .rar 文件 | /usr/local/clamav/bin/clamscan --unrar |
--arj | .arj 文件 | /usr/local/clamav/bin/clamscan --arj |
--unzoo | .zoo 文件 | /usr/local/clamav/bin/clamscan --unzoo |
--lha | .lzh 文件 | /usr/local/clamav/bin/clamscan --lha |
--jar | .jar 文件 | /usr/local/clamav/bin/clamscan --jar |
--deb | .deb 安装包 | /usr/local/clamav/bin/clamscan --deb |
--tar | .tar 文件 | /usr/local/clamav/bin/clamscan --tar |
--tgz | .tar.gz | /usr/local/clamav/bin/clamscan --tgz |
--log=FILE/-l FILE | 增加扫描日志 | /usr/local/clamav/bin/clamscan -l /var/log/clamscan.log |
--move=directory | 把病毒文件移动到目录directory下 | /usr/local/clamav/bin/clamscan --move /root |
--copy=directory | 把病毒文件复制到目录directory下 | /usr/local/clamav/bin/clamscan --copy /root |
--remove | 删除病毒文件 | /usr/local/clamav/bin/clamscan --move /abc |
--quiet | 输出错误消息 | /usr/local/clamav/bin/clamscan --quiet |
--infected/-i | 输出感染文件 | /usr/local/clamav/bin/clamscan -i |
--suppress-ok-results/-o | 跳过扫描OK的文件 | /usr/local/clamav/bin/clamscan -o |
设置定时任务
1 | vim /etc/crontab |
完整性和保密性
AIDE
AIDE:Advanced Intrusion Detection Environment,是一款入侵检测工具,主要用途是检查文档的完整性。AIDE在本地构造了一个基准的数据库,一旦操作系统被入侵,可以通过对比基准数据库而获取文件变更记录,使用aide.conf作为其配置文档。
安装
1 | # 更新软件列表 |
创建新的数据库
1 | # 生成包含文件系统中所有文件的数据库 |
磁盘检查
1 | aide --check |
测试效果
我在/opt
新添加一个文件
1 | # 在/opt新添加一个文件 |
检查后可以看到新添加了一个文件
AIDE数据库更新
1 | aide --update |
配置定时任务
定时备份AIDE的数据,保证数据的完整性
1 | # 使用cron定时任务 |
添加如下内容:
1 | 0 8 * * * /usr/sbin/aide --check -V4 --report=file:/var/log/aide/aide-report-`date +%Y%m%d`.txt |
信息加密存储
对密码使用加密存储,比如使用SHA-512
1 | # 添加 sha512 表示使用sha512算法存储密码 |
本文章来源于我的博客:https://blog.hikki.site