书名:数字化系统安全加固技术
ISBN:978-7-115-62867-1
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 白婧婧 田 康 李 博 高尉峰 朱 康
责任编辑 郭 媛
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
安全加固是配置信息系统的过程,它可以降低信息系统安全风险。本书系统介绍操作系统、数据库、中间件、容器四大板块的相关安全配置,通过强化账号安全、加固服务、修改安全配置、优化访问控制策略、增加安全机制等方法,从风险分析、加固详情、加固步骤3个维度讲解每条安全配置项,有助于读者充分了解每条安全配置项潜在的风险及如何进行加固,并在功能性与安全性之间寻求平衡,合理加强安全性。
本书适用于指导产品研发人员研制默认配置安全的产品,规范技术人员在各类系统上的日常操作,让运维人员获得检查默认安全风险的标准,避免人为因素的失误带来的安全风险。
随着数字化建设的发展,IT设备种类和数据量不断增加,其安全管理问题日渐突出。为了维护信息系统的安全并方便管理,必须从入网测试、工程验收和运行运维等设备全生命周期的各个阶段落实安全要求,同时需要设立满足系统安全要求的安全基准点。人为疏忽引发的系统安全配置不当,如账号、密码、授权、日志、IP通信等方面的配置不当,直接反映了系统自身的安全脆弱性。系统安全配置不当会带来重大安全隐患,是攻击者攻击得手的关键因素,因此提前对系统进行安全加固和优化是实现数字化系统安全的关键。
现如今,数字化系统不断融入大数据、云计算、人工智能等技术,数字化建设的前提,就是开发基于互联网的应用系统,打造高速网络和建设安全的网络环境。针对数字化系统,本书提供了安全基准点,并制定了相关的安全加固技术指南,主要内容围绕数字化系统的安全加固技术展开讲述。其中,操作系统、数据库、中间件、容器等作为构成数字化系统的必备技术,其底层技术的安全性直接影响到整个数字化系统的安全性。
安全加固对于数字化系统意义重大,如下所述。
● 通过最佳实践增强系统功能,减少程序和不必要端点的漏洞,减少操作问题和不兼容的地方,降低错误配置的风险并减少“摩擦”或“阻力”。
● 通过缩小攻击面来提高安全等级,降低数据泄露、恶意软件、未经授权的账户访问及其他恶意活动的风险。
● 降低环境复杂性,简化合规与审计,消除冗余或不必要的系统、账户和程序,从而获得更稳定的配置和更透明的环境。
笔者在研究和数字化系统业务安全相关的基准安全标准体系基础上,充分考虑行业现状和行业最佳实践,继承、吸收网络安全等级保护和风险评估的经验成果,提炼完善的安全配置检查及加固项,最终完成本书。
读者朋友在阅读本书前,需要完成几项任务。首先,我们需要对数字化系统和安全有基本的理解。其次,我们需要对数字化系统的构成要素有初步的认识,如操作系统、数据库、中间件和容器等。本书的各篇章是独立的,这就意味着读者可以有针对性地去获取需要的信息。相信认真读完本书后,您会发现本书带给自己的不仅仅是安全加固技术水平的提升,更是对数字化系统的深入理解。期待本书能够引导读者发现数字化系统内的漏洞,提高运行运维的工作质量,进而实现数字化系统安全系数的整体提升,避免出现安全事件造成的经济、社会形象损失,切实提高数字化系统的安全防护水平。
作者
本书由异步社区出品,社区(https://www.epubit.com)为您提供相关资源和后续服务。
本书提供如下资源。
● 思维导图。
要获得以上配套资源,您可以扫描右侧的二维码,根据指引领取。
您也可以在异步社区本书页面中单击,跳转到下载界面,按提示进行操作。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
如果您是用书教师,希望获得教学配套资源,请在异步社区本书页面中直接联系本书的责任编辑。
作者和编辑尽最大努力确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“发表勘误”,输入勘误信息,单击“提交勘误”按钮(见下图)即可。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或其他奖品。
我们的联系邮箱是contact@epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/selfpublish/ submission即可)。
如果您是学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是由人民邮电出版社创办的IT专业图书社区。异步社区于2015年8月上线运营,致力于优质学习内容的出版和分享,为读者提供优质学习内容,为作译者提供优质出版服务,实现作译者与读者的在线交流互动,实现传统出版与数字出版的融合发展。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社计算机图书出版经验积累和专业编辑团队,相关图书在封面上印有异步图书的 LOGO。异步图书的出版领域包括软件开发、大数据、AI、测试、前端、网络技术等。
操作系统是计算机系统的资源管理者,有序地管理着计算机的硬件、软件、服务等资源,并作为用户与计算机硬件之间的接口,帮助用户方便、快捷、安全、可靠地控制计算机硬件和软件的运行。操作系统的安全是网络信息安全的基石,它直接关系到应用系统的安全。
常见的操作系统有Windows、macOS、Linux、UNIX、纯DOS(Disk Operating System,磁盘操作系统)等,本篇将针对主流的Linux和Windows两种操作系统展开介绍,主要的安全加固内容如表P-1所示。
表P-1 操作系统主要的安全加固内容
序号 |
分类 |
项目 |
---|---|---|
1 |
账号管理和认证授权 |
账号、密码、认证 |
2 |
日志安全 |
日志服务安全、日志审计、日志文件权限 |
3 |
其他安全配置 |
令牌保护、域安全 |
4 |
数据安全 |
数据传输安全、签名完整性、数据共享 |
5 |
网络安全 |
Defender防火墙安全、iptables配置、SELinux配置、NTML安全 |
6 |
本地安全策略 |
安全启动、安全编译、主机和路由器配置 |
目前很多企业的产品都在Linux系统中进行服务部署。CentOS 7作为一个企业级的Linux发行版被广泛使用,本章就以CentOS 7为例,讲述Linux在配置安全方面的重点。
Linux系统的安全性主要取决于用户账号的安全性。每个进入Linux系统的用户都会被分配唯一的账号,用户对系统中各种对象的访问权限取决于他们登录系统时的账号权限。
风险分析 对可登录账号进行控制,可以大大降低攻击者获取Shell的概率,让系统更加安全。
加固详情 系统账号默认存放在/etc/passwd中,可以手动查询账号信息,将除需要登录的账号以外的其他账号全部设置为禁止登录,即将其Shell设置为/sbin/nologin。
[root@centos7 ~]# cat /etc/passwd|grep -i test1
test1:x:1003:1004::/home/test1:/bin/bash
[root@centos7 ~]# usermod -L -s /sbin/nologin test1
[root@centos7 ~]# cat /etc/passwd|grep -i test1
test1:x:1003:1004::/home/test1:/sbin/nologin
加固步骤 使用usermod -L -s /sbin/nologin username锁定账号登录。
风险分析 root 用户作为超级管理员,拥有操作系统资源的所有访问权限,因此日常使用中不建议直接使用root用户登录系统,以防重要的文件或文件夹被删除,造成系统崩溃。
加固详情 创建一个普通用户并给予sudo权限,然后禁止root用户直接登录系统。
加固步骤
(1)首先创建一个普通用户test。
[root@centos7 ~]# useradd test
[root@centos7 ~]# passwd test
Changing password for user test.
New password:
passwd: all authentication tokens updated successfully.
(2)根据业务场景,在/etc/sudoers中给普通用户添加适当的sudo权限。
(3)编辑文件/etc/ssh/sshd_config,将PermitRootLogin设置为no,禁止root用户登录,如图1-1所示。
图1-1 禁止root用户登录
风险分析 非活动用户可能对系统安全造成威胁,例如对系统进行暴力破解、撞库攻击等。
加固详情 对于密码过期30天后仍未登录使用的用户,进行强制禁用。
加固步骤 执行命令useradd -D -f 30,将默认密码不活动期限设置为30天。
风险分析 防止非root用户访问root用户权限文件。
加固详情 确保root用户的GID为0。
加固步骤 执行命令usermod -g 0 root。
风险分析 防止非root用户访问root用户权限文件。
加固详情 确保仅root用户的UID为0。
加固步骤 执行命令awk -F: '($3 == 0) { print $1 }' /etc/passwd,返回UID为0的用户,确保返回的只有root用户,如果返回非root用户,则执行usermod命令修改用户的UID为非0数字。以下示例修改用户test的UID为1234。
[root@centos7 ~]# cat /etc/passwd|grep -i test
test:x:1004:1005::/home/test:/bin/bash
[root@centos7 ~]# usermod -u 1234 test
[root@centos7 ~]# cat /etc/passwd|grep -i test
test:x:1234:1005::/home/test:/bin/bash
密码是Linux用来校验用户身份的首要方法。因此保护密码的安全对于用户、局域网以及整个网络来说都非常重要。近几年来,弱密码导致的安全事件越来越多,密码安全变得愈加重要。
风险分析 如果用户的密码被破解且经常用于登录,那么该用户的个人隐私就有被泄露的风险;若该用户经常修改密码,这种风险就会相应降低很多,可以起到及时止损的作用。
加固详情 设置密码生存期,可以对密码的有效期、到期提示天数、最小密码长度等进行设置。
加固步骤 编辑文件/etc/login.defs,密码生存期参数如表1-1所示。
表1-1 密码生存期参数
参数名称 |
参数值 |
参数说明 |
---|---|---|
PASS_MAX_DAYS |
90 |
新建用户密码最长使用天数 |
PASS_MIN_DAYS |
1 |
新建用户密码最短使用天数 |
PASS_MIN_LEN |
7 |
最小密码长度 |
PASS_WARN_AGE |
8 |
新建用户密码到期提示天数 |
风险分析 简单的密码很容易被攻击者使用数据字典破解,加大密码的复杂度,可以增加攻击者破解的难度。想要从根本上防范暴力破解,还需要结合其他的防御手段。
加固详情 对密码的复杂度进行设置。
加固步骤 编辑文件/etc/pam.d/system-auth,在文件中增加以下内容,密码复杂度参数如表1-2所示。
password requisite pam_pwquality.so try_first_pass retry=5 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minlen=8
表1-2 密码复杂度参数
参数名称 |
参数说明 |
---|---|
retry |
定义登录/修改密码失败时,可以重试的次数 |
difok |
定义新密码中必须有几个字符与旧密码不同。但是如果新密码中有1/2以上的字符与旧密码不同,该新密码将被接受 |
minlen |
定义用户密码的最小长度 |
dcredit |
定义用户密码中必须包含多少个数字 |
ucredit |
定义用户密码中必须包含多少个大写字母 |
lcredit |
定义用户密码中必须包含多少个小写字母 |
ocredit |
定义用户密码中必须包含多少个特殊字符(除数字、字母之外) |
风险分析 使用弱加密算法加密的密码被拦截或者泄露后很容易被破解,所以使用安全的加密算法非常有必要,常见的不安全的加密算法有MD5、SHA-1等,为保证安全,推荐使用SHA-512。
加固详情 使用安全的加密算法。
加固步骤 编辑文件/etc/pam.d/password-auth和/etc/pam.d/system-auth,并添加以下内容。
password sufficient pam_unix.so sha512
配置加密算法为SHA-512,如图1-2所示。
图1-2 配置加密算法为SHA-512
风险分析 空密码登录系统是非常危险的,可导致绕过认证鉴权访问系统。
加固详情 确保/etc/shadow密码字段不为空。
加固步骤 执行命令awk -F: '($2 == "" ) { print $1 " does not have a password "}' /etc/shadow,返回值即密码字段为空的用户,然后执行命令 passwd username为空密码用户设置密码。相关示例如下。
检查发现用户test的密码字段为空;
[root@centos7 ~]# awk -F: '($2 == "" ) { print $1 " does not have a password "}' /etc/shadow #查询空密码用户
test does not have a password
给test用户设置密码。(如果用户不使用密码,可以直接删除。)
[root@centos7 ~]# passwd test
Changing password for user test.
New password:
passwd: all authentication tokens updated successfully.
Linux 本身是有一套认证鉴权机制的,但是默认情况下,我们认为它是不安全的,存在很多问题。本节将对Linux的认证鉴权机制进行修改,使它的安全性进一步加强,让我们的系统更加安全。
风险分析 /etc/ssh/sshd_config是SSH服务的配置文件,若未授权用户具有该文件的操作权限,则可能给系统造成巨大的损失。
加固详情 确保/etc/ssh/sshd_config仅root用户可操作。
加固步骤 在主机执行以下命令。
chmod 600 /etc/ssh/sshd_config
find /etc/ssh/ -xdev -type f -name 'ssh_host_*_key' -exec chown root:root {} \;
find /etc/ssh/ -xdev -type f -name 'ssh_host_*_key' -exec chmod u-x,go-rwx {} \;
find /etc/ssh/ -xdev -type f -name 'ssh_host_*_key.pub' -exec chmod u-x,go-wx {} \;
find /etc/ssh/ -xdev -type f -name 'ssh_host_*_key.pub' -exec chown root:root {} \;
风险分析 当前所有的攻击手段都对端口进行攻击,使用默认的22端口更容易受到外部攻击,比如DoS(Denial of Service,拒绝服务)攻击、暴力破解等。
加固详情 对默认的22端口进行修改,使用高位端口。这样可以更好地规避工具扫描,毕竟Nmap扫描器默认也只扫描0~1024端口。
加固步骤 编辑/etc/ssh/sshd_config文件,设置Port为高位端口50000(40000~65534均可),如图1-3所示。
图1-3 设置Port为高位端口50000
风险分析 启用端口转发会使组织面临安全风险和后门攻击,攻击者可以利用SSH服务隐藏其未经授权的通信,或者从目标网络中过滤被盗数据。
加固详情 禁止端口转发。
加固步骤 编辑 /etc/ssh/sshd_config文件,将AllowTcpForwarding参数设置为no。
风险分析 MaxStartups参数指定SSH守护进程的未经验证的并发连接的最大数量,如果不对其做限制,则会造成DoS攻击。
加固详情 配置MaxStartups参数。
加固步骤 编辑/etc/ssh/sshd_config文件,将MaxStartups参数设置为maxstartups 10:30:60。
风险分析 构造大量并发会话可能导致系统遭受DoS攻击。
加固详情 配置最大打开会话数。
加固步骤 编辑 /etc/ssh/sshd_config文件,将MaxSessions参数设置为10。
风险分析 配置指定用户,可以将连接权限最小化,防止未知用户连接到系统,将风险降到最低。
加固详情 配置可通过SSH服务连接到系统的用户。
加固步骤 编辑/etc/ssh/sshd_config文件,配置AllowUsers参数,配置形式为AllowUsers <userlist>。图1-4表示仅允许root用户可通过SSH服务连接到系统。
图1-4 表示仅允许root用户可通过SSH服务连接到系统
风险分析 MaxAuthTries参数指定尝试身份验证的最大次数,配置它可以防止暴力破解。
加固详情 配置鉴权失败次数。
加固步骤 编辑/etc/ssh/sshd_config文件,配置MaxAuthTries参数为3。
风险分析 不输入密码等于失去系统的一部分鉴权,使系统的防护更加薄弱。
加固详情 配置强制输入密码。
加固步骤 编辑 /etc/ssh/sshd_config文件,配置IgnoreRhosts参数为yes。设置此参数会强制用户在使用SSH服务进行身份验证时输入密码。
风险分析 当用户名泄露或者被破解时,如果允许空密码登录,那么攻击者可以很轻易地进入系统。
加固详情 配置禁止空密码登录。
加固步骤 编辑 /etc/ssh/sshd_config文件,配置PermitEmptyPasswords参数为no。
注意
本小节主要介绍对SSH服务的配置文件进行修改,修改完后需要重启SSH服务才能使配置生效。重启命令为:service ssh restart。
风险分析 登录超时是指终端在没有任何操作连接时中断。超过一定时间,终端中断,这个时间就是登录超时时间。当登录超时时间很长且用户终端暴露给攻击者时,攻击者就可以直接获取用户权限。
加固详情 设置登录超时时间。
加固步骤
(1)编辑文件/etc/profile,在最后一行添加以下内容。
export TMOUT=300 #设置登录超时时间为300s
(2)执行命令sh etc/profile使其生效,再执行命令echo $TMOUT确认结果,成功设置登录超时时间如图1-5所示。
图1-5 成功设置登录超时时间
风险分析 当用户被允许不断尝试登录时,系统密码就存在被暴力破解的风险,所以应该设置密码锁定策略,防止攻击者暴力破解密码从而登录系统的情况发生。
加固详情 设置密码锁定策略。
加固步骤 编辑文件/etc/pam.d/system-auth和/etc/pam.d/password-auth并添加以下内容。
auth required pam_tally2.so deny=5 onerr=fail unlock_time=900
密码锁定策略参数如表1-3所示。
表1-3 密码锁定策略参数
参数名称 |
参数值 |
参数说明 |
---|---|---|
deny |
5 |
表示用户可尝试登录次数为5次,超过5次则锁定用户 |
onerr |
fail |
设置当出现错误之后的返回值 |
unlock_time |
900 |
表示普通用户锁定之后的解锁时间 |
风险分析 匿名登录,即用户尚未登录系统时,系统会为所有未登录的用户分配一个匿名用户。这个用户拥有自己的权限,不过他不能访问所有被保护的资源。但是这也留下了安全隐患,一些攻击者通过这种手段可以无声无息地在系统中留下后门。
加固详情 禁止匿名用户登录系统。
加固步骤
(1)编辑文件/etc/vsftpd/vsftpd.conf,将anonymous_enable设置为no,表示不允许匿名用户登录,必须输入账号密码才能登录。
(2)修改完成之后重启服务,执行命令systemctl restart vsftpd。
风险分析 目前很多服务是不安全的,比如Telnet(远程上机)协议不安全且未加密、FTP(File Transfer Protocol,文件传送协议)不保护数据或身份验证凭据的机密性,所以我们应该禁用不安全服务,防止被攻击者恶意利用。
加固详情 禁用不安全服务。
加固步骤
(1)使用rpm命令验证是否安装不安全服务。
依次执行以下命令。
rpm -qa xorg-x11-server*
rpm -q avahi-autoipd avahi
rpm -q cups
rpm -q dhcp
rpm -q openldap-servers
rpm -q bind
rpm -q vsftpd
rpm -q httpd
rpm -q dovecot
rpm -q samba
rpm -q squid
rpm -q net-snmp
rpm -q ypserv
rpm -q telnet-server
rpm -q nfs-utils
rpm -q rpcbind
rpm -q rsync
rpm -q telnet
服务已安装则返回服务版本号,如图1-6所示。
图1-6 服务已安装示例
服务未安装则返回未安装提示,如图1-7所示。
图1-7 服务未安装示例
(2)如果已安装不安全服务,则在系统中执行以下命令进行禁用。
rpm -e vsftpd
风险分析 不安全服务存在于不安全的客户端中,所以应该彻底禁用不安全的客户端。
加固详情 禁用不安全的客户端。
加固步骤
(1)使用rpm命令验证是否安装不安全客户端。
依次执行以下命令:
rpm -q openldap-clients
rpm -q talk
rpm -q rsh
rpm -q ypbind
(2)如果已安装不安全的客户端,则执行yum命令进行禁用,如yum remove rsh。
风险分析 /etc/crontab文件是系统定时任务配置文件,里面的定时任务均由root用户执行,如果配置其属主为非root用户,就存在提权风险,所以需要控制该文件仅root用户可操作。
加固详情 配置/etc/crontab文件权限为600。
加固步骤 在系统中执行以下命令修改文件权限。
chmod 600 /etc/crontab
风险分析 在登录终端之前,系统通常会向用户显示/etc/issue(本地登录)、/etc/issue.net(远程登录)文件的内容。基于UNIX的系统通常会显示有关操作系统版本和补丁的信息,这些信息对开发人员有用,但同时给试图攻击系统特定漏洞的攻击者提供了便利。这些信息对外提供,大大提高了安全风险。
加固详情 配置登录警告横幅,避免敏感信息泄露。
加固步骤 在系统中执行以下命令。
echo "Authorized only. All activity will be monitored and reported" > /etc/issue
echo "Authorized only. All activity will be monitored and reported" >/etc/issue.net
加固完成之后,登录时会显示提示,如图1-8所示。
图1-8 登录时显示提示
日志审计是系统安全管理的需要,因为日志审计是日常安全管理中最为重要的环节之一,它可以帮助运维人员快速评估系统的健壮性、安全性。
风险分析 当系统遭受攻击时,将系统的操作记录到日志中是非常有必要的。日志可以帮助我们了解系统进行了哪些操作,可以让我们很快地发现漏洞点并及时进行修复,同时为事后审计、事件追溯提供重要的依据。
加固详情 配置auditd服务,auditd是记录Linux审计信息的内核模块。它记录系统中的各种动作和事件,比如系统调用、文件修改、执行的程序、系统登录及退出登录。auditd 会将审计记录写入日志文件,系统管理员可以通过它们来确定是否存在对系统的未经授权的访问等安全问题。
加固步骤
(1)安装auditd服务。
使用命令rpm -q audit audit-libs查询是否已安装auditd服务。
如果已安装则返回相关信息,如图1-9所示。
图1-9 查看auditd服务信息
如果未安装,则执行以下命令进行安装。
yum install audit audit-libs
(2)启动auditd服务。
systemctl status auditd | grep 'Active: active (running) '
如果已启动则返回auditd服务状态,如图1-10所示。
图1-10 查看auditd服务状态
如果未启动auditd服务,则执行命令systemctl --now enable auditd启动服务。
(3)确保日志记录不会被自动删除,确保在审核日志已满时禁用系统。
编辑文件/etc/audit/rules.d/*.rules(*代表任意字符,每个系统值不同,所以用*表示),添加表1-4所示的auditd配置参数,并在系统中重启auditd服务使配置生效。
service auditd restart #重启auditd服务
表1-4 auditd配置参数
参数名称 |
参数值 |
参数说明 |
---|---|---|
max_log_file_action |
keep_logs |
当达到max_log_file指定的日志文件大小时采取的动作 |
space_left_action |
电子邮件地址(自定义) |
当磁盘空间达到space_left指定的值时,从action_mail_acct指定的电子邮件地址向space_left_action指定的电子邮件地址发送一封电子邮件,并在/var/log/messages中写一条警告消息 |
action_mail_acct |
root |
负责维护审计守护进程和日志的管理员的电子邮件地址 |
admin_space_left_action |
halt |
当自由磁盘空间达到admin_space_left指定的值时,系统关闭 |
(4)确保收集修改日期和时间信息的事件。
编辑文件/etc/audit/rules.d/*.rules,执行以下命令添加配置项。
echo '-a always,exit -F arch=b32 -S adjtimex -S settimeofday -S stime -k time-change'>>/etc/ audit/rules.d/audit.rules
echo '-a always,exit -F arch=b32 -S clock_settime -k time-change'>>/etc/audit/ rules.d/audit.rules
echo '-w /etc/localtime -p wa -k time-chang'>>/etc/audit/rules.d/audit.rules
(5)确保收集修改用户/组信息的事件。
编辑文件/etc/audit/rules.d/*.rules,执行以下命令添加配置项。
echo '-w /etc/group -p wa -k identity'>>/etc/audit/rules.d/audit.rules
echo '-w /etc/passwd -p wa -k identity'>>/etc/audit/rules.d/audit.rules
echo '-w /etc/gshadow -p wa -k identity'>>/etc/audit/rules.d/audit.rules
echo '-w /etc/shadow -p wa -k identity'>>/etc/audit/rules.d/audit.rules
echo '-w /etc/security/opasswd -p wa -k identity'>>/etc/audit/rules.d/audit.rules
(6)登录及退出登录日志配置。
编辑文件/etc/audit/rules.d/*.rules,执行以下命令添加配置项。
echo '-w /var/log/lastlog -p wa -k logins'>>/etc/audit/rules.d/audit.rules
echo '-w /var/run/faillock/ -p wa -k logins'>>/etc/audit/rules.d/audit.rules
注意
如果对auditd服务的配置文件/etc/audit/rules.d/*.rules进行修改,那么必须重启服务才可以使配置生效。重启命令为:service auditd restart。
风险分析 当系统遭受攻击时,将系统的操作记录到日志中是非常有必要的。日志可以帮助我们了解系统进行了哪些操作,可以让我们很快地发现漏洞点并及时进行修复,同时为事后审计、事件追溯提供重要的依据。
加固详情 配置rsyslog服务,rsyslog是Linux系统中用来实现日志功能的服务。该服务默认已经安装,并且自动启用,主要用来采集日志,不生成日志。
加固步骤
(1)安装rsyslog服务。
执行命令rpm -q rsyslog,如果已安装则返回rsyslog版本信息;如果未安装,则执行命令yum install rsyslog进行安装。
(2)启动rsyslog服务。
在系统中执行命令systemctl status rsyslog,查看rsyslog服务状态,如果已启动则返回相关信息,如图1-11所示。
图1-11 查看rsyslog服务状态
如果服务未启动则执行以下命令启动服务。
systemctl start rsyslog
(3)配置rsyslog默认文件权限。
执行命令grep ^\$FileCreateMode /etc/rsyslog.conf /etc/rsyslog.d/*.conf,如果无返回值则表示未配置默认文件权限。
执行以下命令,进行默认文件权限配置。
echo "\$FileCreateMode 0640" >> /etc/rsyslog.d/*.conf
echo "\$FileCreateMode 0640" >> /etc/rsyslog.conf
systemctl restart rsyslog
风险分析 当系统遭受攻击时,将系统的操作记录到日志中是非常有必要的。日志可以帮助我们了解系统进行了哪些操作,可以让我们很快地发现漏洞点并及时进行修复,同时为事后审计、事件追溯提供重要的依据。
加固详情 配置journald服务,journald是一个改进型日志管理服务,可以收集来自内核、系统早期启动阶段的日志,系统守护进程在启动和运行中的标准输出和错误信息,以及syslog的日志。
加固步骤
(1)配置日志为将日志发送到rsyslog。
在系统中执行以下命令,如果返回ForwardToSyslog=yes,则表示已配置将日志发送到rsyslog。
grep -E ^\s*ForwardToSyslog /etc/systemd/journald.conf
如果未配置则执行以下命令,进行加固项配置。
echo "ForwardToSyslog=yes">>/etc/systemd/journald.conf
systemctl restart journald
(2)配置压缩大文件的功能。
在系统中执行以下命令,如果返回Compress=yes,则表示已配置压缩大文件的功能。
grep -E ^\s*Compress /etc/systemd/journald.conf
如果未配置则执行以下命令,进行加固项配置。
echo "Compress=yes">>/etc/systemd/journald.conf
systemctl restart journald
风险分析 系统路径/var/log 中的日志文件包含系统中许多服务的日志信息,如果日志文件为所有人可见则会存在敏感信息泄露的风险,所以应该配置最小权限。
加固详情 配置日志文件最小权限。
加固步骤 在系统中执行以下命令对日志文件进行权限配置,这条命令的意思是将路径/var/log下的所有文件的群组用户和其他用户权限最小化。
find /var/log -type f -exec chmod g-wx,o-rwx "{}" +
Linux系统存在很多安全漏洞,这些漏洞大部分是配置不当造成的。我们可以通过适当的安全配置来防止漏洞的出现。本节将介绍一些强化 Linux 系统安全配置的操作。
风险分析 历史命令中保存了一些之前的操作命令,如果里面存在创建用户时的密码等敏感信息,就会给攻击者带来可乘之机。
加固详情 限制可查看历史命令条数。
加固步骤 编辑/etc/profile文件,设置HISTSIZE变量并使其持久化。以下示例是限制用户只能查看最近的20条命令。
(1)编辑文件/etc/profile,在最后一行添加以下内容。
export HISTSIZE=20
(2)执行以下命令使配置生效。
sh /etc/profile
设置成功后,HISTSIZE变量信息如图1-12所示。
图1-12 HISTSIZE变量信息
风险分析 我们需要对日志文件进行一定的权限控制,因为一旦系统被入侵,日志文件对我们进行追本溯源非常有帮助。系统被入侵后,攻击者首先会想办法清除入侵痕迹,所以我们需要给日志文件设置不能删除的属性,以防止日志文件被恶意删除。
加固详情 对日志文件进行权限控制,防止日志文件被恶意删除。
加固步骤 Linux提供了文件权限配置,当对文件加a权限(+a)后,任何人都不能通过vim编辑文件里的内容,不能更改、不能删除、不能重命名。所以我们只需要对日志文件加a权限,就可以达到加固的目的。
执行以下命令对日志文件进行加a权限操作。
cd /var/log/
chattr +a dmesg cron lastlog messages secure wtmp
进行删除验证,结果如图1-13所示,表示成功对日志文件加a权限。
图1-13 成功对日志文件加a权限
风险分析 系统防火墙可以拦截大部分外部攻击,但是如果防火墙放行所有端口,那么会使端口可以和外部通信,从而制造极大的攻击面。
加固详情 安装iptables服务,最小化防火墙的规则,只向外部开放业务必需端口。
加固步骤
(1)安装iptables,执行以下命令。
rpm -q iptables iptables-services
(2)启动iptables,执行以下命令。
systemctl --now enable iptables
(3)查看本机关于iptables的设置情况。
iptables -L -n
(4)控制流入数据包,执行以下命令。
iptables -p INPUT DROP
(5)添加规则,执行以下命令。
iptables -A INPUT -p tcp --dport 端口号 -j ACCEPT
(6)保存配置,执行以下命令。
iptables-save
注意
iptables不能与firewall和nftables服务一起运行。
风险分析 对于一个安全的系统来说,获取准确的时间是至关重要的,特别是对于一些和系统时间相关联的应用,比如Kerberos、NFS(Network File System,网络文件系统)等。
加固详情 配置系统时间同步。
加固步骤
(1)安装服务。
在系统中直接使用yum命令安装服务,依次执行以下命令。
yum install chrony
yum install ntp
(2)配置chrony服务。
在文件/etc/chrony.conf中添加或者编辑参数server,形式如下。
server <remote-server>
在文件/etc/sysconfig/chronyd中添加或者编辑参数OPTIONS,添加-u chrony,形式如下。
OPTIONS="-u chrony"
配置完成信息如图1-14所示。
图1-14 配置chrony服务
(3)配置ntp服务。
在文件/etc/ntp.conf中添加或者编辑以下内容。
restrict -4 default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery
在文件/etc/ntp.conf中添加或者编辑参数server,形式如下。
server <remote-server>
在文件/etc/sysconfig/ntpd中添加或者编辑参数OPTIONS,添加 -u ntp:ntp,形式如下。
OPTIONS="-u ntp:ntp"
配置完成信息如图1-15所示。
图1-15 配置ntp服务
在系统执行以下命令,重启服务使配置生效。
systemctl daemon-reload
systemctl --now enable ntpd
风险分析 umask值被用于设置文件的默认属性。系统默认的umask值是0022,在这种配置下,当新建文件时,任意文件的权限为755,相当于赋予了文件可被任意用户执行的权限。当系统被攻击时,攻击者上传木马文件至系统后台,木马文件会被轻易地执行,从而获取Shell或者留下后门。
加固详情 限制umask值为0027。
加固步骤 修改/etc/profile文件,设置umask的值,在系统中执行以下命令。
echo "umask 0027" >> /etc/profile
sh /etc/profile
风险分析 su命令用于切换登录用户,如果不对其进行限制,则存在权限绕过风险。
加固详情 限制su命令的访问。
加固步骤 创建su命令专属群组,当用户需要使用su命令时,添加该用户到su命令专属群组。如下所示,创建su命令专属群组 sugroup,且给test用户添加su命令的访问权限。
(1)创建su命令专属群组sugroup,并将test用户添加到群组sugroup。
[root@centos7 ~]# groupadd sugroup
[root@centos7~]# usermod -G sugroup test
[root@centos7~]# getent group sugroup
sugroup:x:1001:test
(2)给sugroup群组添加su命令的访问权限,即编辑文件/etc/pam.d/su,添加以下内容。
auth required pam_wheel.so use_uid group=sugroup
风险分析 SELinux(Security-Enhanced Linux,安全增强型Linux)是Linux的一个安全子系统。缺少SELinux,系统更容易遭受攻击者的攻击,相当于失去了一道防御机制。SELinux默认安装在Fedora和Red Hat Enterprise Linux上,而其他的发行版则需要自行安装。
加固详情 安装和配置SELinux。
加固步骤
(1)在引导加载程序配置中启用SELinux,执行以下命令。
cat /etc/default/grub|grep -i 'selinux=0'|grep -i 'enforcing=0'
如果有返回值,则编辑文件/etc/default/grub,删除文件中的selinux=0和enforcing=0并执行以下命令。
grub2-mkconfig -o /boot/grub2/grub.cfg
(2)配置SELinux策略。
编辑文件/etc/selinux/config,设置以下参数。
SELINUXTYPE=targeted
风险分析 系统文件权限如果配置不当,很容易造成越权问题,特别是系统敏感文件(如/etc/shadow等)的权限一定要进行合理配置,否则会造成不可预知的灾难。
加固详情 对系统文件的权限进行合理配置。
加固步骤
(1)系统中不能存在任何用户都拥有写入权限的文件。
执行命令find / -type f \( -perm -o+w \),如果存在返回值则对返回的文件进行权限最小化处理。
(2)系统中不能存在没有属主和属组的文件。
执行命令find / -xdev -nogroup和find / -xdev -nouser,如果存在返回值则对返回的文件指定属主和属组。
(3)对系统中的重要文件进行权限配置,在系统中执行以下命令。
chown root:root /etc/passwd /etc/passwd- /etc/shadow /etc/shadow- /etc/gshadow- /etc/gshadow /etc/group /etc/group-
chmod u-x,g-wx,o-wx /etc/passwd
chmod u-x,go-wx /etc/passwd-
chmod 0000 /etc/shadow
chmod 0000 /etc/shadow-
chmod 0000 /etc/gshadow-
chmod 0000 /etc/gshadow
chmod u-x,g-wx,o-wx /etc/group
chmod u-x,go-wx /etc/group-
对于系统来说,如果启动过程可控,则会引发一系列问题,如恶意植入、敏感信息泄露等。对于系统启动过程中的一些行为需要采取措施进行约束,让我们的系统安全启动。
风险分析 设置引导加载程序密码,可防止未经授权的用户执行引导加载程序,恶意输入引导参数或更改引导分区。
加固详情 设置引导加载程序密码。
加固步骤
(1)判断当前系统版本,并设置引导加载程序密码,相关示例如下。
[root@centos7 ~]# uname -a
Linux centos7.4-108.240-maoping 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
可以看出当前系统版本是7.4。
当系统版本大于或等于7.2时,执行以下命令设置密码。
[root@centos7 ~]# grub2-setpassword
Enter password: <password>
Confirm password: <password>
当系统版本小于7.2时,执行以下命令设置密码。
[root@centos7 ~]# grub2-mkpasswd-pbkdf2
Enter password: <password>
Reenter password: <password>
(2)在文件/etc/grub.d/01_users中添加以下内容。
cat <<EOF
set superusers="<username>"
password_pbkdf2 <username> <encrypted-password>
EOF
(3)执行以下命令更新grub2配置。
[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
风险分析 仅为root用户设置读写权限可以防止非root用户查看或更改引导参数。
加固详情 配置引导加载程序权限。
加固步骤 在系统中执行以下命令。
chown root:root /boot/grub2/grub.cfg
test -f /boot/grub2/user.cfg && chown root:root /boot/grub2/user.cfg
chmod og-rwx /boot/grub2/grub.cfg
test -f /boot/grub2/user.cfg && chmod og-rwx /boot/grub2/user.cfg
风险分析 在单用户模式(救援模式)下进行身份验证,可以防止未经授权的用户重新启动系统进入单用户模式,进而在没有凭据的情况下获得根权限。
加固详情 配置单用户模式需要身份验证。
加固步骤 在文件/usr/lib/systemd/system/rescue.service和/usr/lib/systemd/system/emergency. service中,添加或者编辑ExecStart参数,参数值如下。
ExecStart=-/bin/sh -c "/sbin/sulogin; /usr/bin/systemctl --fail --no-block default"
配置成功信息如图1-16所示。
图1-16 配置单用户模式需要身份验证
Linux的安全编译可以带来很多好处,因为它能够增强程序的安全性,防止遭受某些攻击,如缓冲区溢出攻击等。本节将描述安全编译在程序方面的具体加固措施。
风险分析 对堆芯转储设置限制可以防止用户重写软变量。
加固详情 限制堆芯转储。
加固步骤
(1)在文件/etc/security/limits.conf或/etc/security/limits.d/*(*代表任意文件)中添加以下内容。
* hard core 0
(2)在文件/etc/sysctl.conf或/etc/sysctl.d/*中添加以下内容。
fs.suid_dumpable = 0
(3)执行以下命令。
[root@centos7 ~]# sysctl -w fs.suid_dumpable=0
(4)编辑文件/etc/systemd/coredump.conf,添加或者修改以下内容。
Storage=none
ProcessSizeMax=0
(5)执行以下命令。
[root@centos7 ~]# systemctl daemon-reload
风险分析 启用XD/NX(Execute Distable/No Execute,禁止执行位)支持可以防御缓冲区溢出攻击。
加固详情 启用XD/NX支持。
加固步骤 在BIOS(Basic Input/Output System,基本输入输出系统)中启用XD/NX支持。
风险分析 随机化地址空间可以防止攻击者对固定地址进行网络攻击。
加固详情 启用地址空间布局随机化(Address Space Layout Randomization,ASLR)。
加固步骤
(1)在文件/etc/sysctl.conf 或 /etc/sysctl.d/*中添加以下内容。
kernel.randomize_va_space = 2
(2)执行以下命令。
[root@centos7 ~]# sysctl -w kernel.randomize_va_space=2
风险分析 prelink可能会干扰AIDE(Advanced Intrusion Detetion Environment,高级入侵检测环境,主要用途是检查文档的完整性)的操作。
加固详情 禁止安装prelink。
加固步骤 执行命令rpm -q prelink,如果返回版本信息,则执行卸载命令yum remove prelink进行卸载。相关示例如下。
未安装prelink:
[root@centos7 ~]# rpm -q prelink
package prelink is not installed
卸载prelink:
[root@centos7 ~]# yum remove prelink
系统的路由用于系统数据包的接收和转发。比如系统接收到报文的时候需要进行路由,判断此报文是发送到本机还是需要转发到其他设备。系统发送报文的时候也需要进行路由,判断此报文是发往本机还是发往外部设备。如果是发往外部设备,并且当前对于路由配置没有严格的安全策略时,就会引发一系列外部攻击,如中间人攻击。
风险分析 源路由允许部分或全部发送方的数据包通过网络的路由,可能存在被恶意攻击的风险。
加固详情 禁止接收源路由数据包。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
修改完成后如图1-17所示。
图1-17 配置禁止接收源路由数据包
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.conf.all.accept_source_route=0
[root@centos7 ~]# sysctl -w net.ipv4.conf.default.accept_source_route=0
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
[root@centos7 ~]# sysctl -w net.ipv6.conf.all.accept_source_route=0
[root@centos7 ~]# sysctl -w net.ipv6.conf.default.accept_source_route=0
[root@centos7 ~]# sysctl -w net.ipv6.route.flush=1
风险分析 如果允许数据包转发,那么系统就相当于路由器,存在安全风险。
加固详情 禁止数据包转发。
加固步骤 编辑文件/etc/sysctl.conf、/etc/sysctl.d/*.conf、/usr/lib/sysctl.d/*.conf和/run/sysctl.d/ *.conf,使得文件中包含以下参数。
net.ipv4.ip_forward=0
net.ipv6.conf.all.forwarding=0
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.ip_forward=0
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
[root@centos7 ~]# sysctl -w net.ipv6.conf.all.forwarding=0
[root@centos7 ~]# sysctl -w net.ipv6.route.flush=1
风险分析 如果打开ICMP(Internet Control Message Protocol,互联网控制报文协议)重定向,攻击者可以使用虚假的ICMP重定向消息恶意更改系统路由表,使其将数据包发送到不正确的网络,从而拦截系统数据包。
加固详情 关闭ICMP重定向。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.conf.all.accept_redirects=0
[root@centos7 ~]# sysctl -w net.ipv4.conf.default.accept_redirects=0
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
[root@centos7 ~]# sysctl -w net.ipv6.conf.all.accept_redirects=0
[root@centos7 ~]# sysctl -w net.ipv6.conf.default.accept_redirects=0
[root@centos7 ~]# sysctl -w net.ipv6.route.flush=1
风险分析 即使是已知的网关也有可能存在安全隐患,所以应该关闭安全ICMP重定向。
加固详情 关闭安全ICMP重定向。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.conf.all.secure_redirects=0
[root@centos7 ~]# sysctl -w net.ipv4.conf.default.secure_redirects=0
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
风险分析 记录发送的数据包,当被恶意攻击时可以第一时间进行定位并清除威胁。
加固详情 记录可疑数据包。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.conf.all.log_martians=1
[root@centos7 ~]# sysctl -w net.ipv4.conf.default.log_martians=1
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
风险分析 忽略广播ICMP请求可以防止外部的Smurf攻击。
加固详情 忽略广播ICMP请求。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.icmp_echo_ignore_broadcasts = 1
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
风险分析 主机会接收很多无用消息,从而使日志文件系统内存爆满。
加固详情 忽略虚假ICMP响应。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.icmp_ignore_bogus_error_responses = 1
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
风险分析 阻止攻击者发送无法响应的系统虚假数据包,可以防止DDoS(Distributed Denial of Service,分布式拒绝服务)攻击。
加固详情 启用反向路径转发。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.conf.all.rp_filter=1
[root@centos7 ~]# sysctl -w net.ipv4.conf.default.rp_filter=1
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
风险分析 启用TCP(Transmission Control Protocol,传输控制协议)SYN Cookie,可以防止泛洪攻击造成的DDoS攻击。
加固详情 启用TCP SYN Cookie。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv4.tcp_syncookies = 1
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv4.tcp_syncookies=1
[root@centos7 ~]# sysctl -w net.ipv4.route.flush=1
风险分析 路由器广告是不可信的,可能会将流量路由到受损机器。
加固详情 禁止接收IPv6(Internet Protocol version 6,第6版互联网协议)路由器广告。
加固步骤 编辑文件/etc/sysctl.conf和/etc/sysctl.d/*,使得文件中包含以下参数。
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
执行以下命令。
[root@centos7 ~]# sysctl -w net.ipv6.conf.all.accept_ra=0
[root@centos7 ~]# sysctl -w net.ipv6.conf.default.accept_ra=0
[root@centos7 ~]# sysctl -w net.ipv6.route.flush=1