CentOS 7.9安全加固

        在众多Linux中,CentOS 7.9是一个比较稳定的版本。我在空间里发布的前一篇文章已经过去半年多,因为工作原因没有及时写后续安全加固,今天趁着周末一点时间来完成它。本文将基于CentOS 7.9最小化安装的系统为基础,参考《等级保护2.0》测评指导书——二级测评指导书的通用部分,从“身份鉴别”、“访问控制”、“安全审计”、“入侵防御”、“恶意代码防范”、“剩余信息保护”方面来介绍Linux安全加固。如有不足,欢迎评论区指正!

        首先,为了后续操作方便,我们先安装好必要必要的工具包。对于selinux不是很熟的话,还需要关闭selinux。具体操作如下:

i)命令补全包

c9b5b0e41e1d45d79987ff5a51d79546.png

        注意,安装后需要重启系统方可生效!!!

ii)基础网络工具包

88b2b858f68b4746b1d4e530677ee308.png

       *特别提示:假如不清楚具体工具包名称,我们可以使用yum search命令搜索安装包名称,然后再用yum安装:

ac643021565245b1acac8b96e7dec568.png

iii)防火墙开放SSH端口,便于使用SSH工具远程操作

615e500cfdba4957b363aed24ec0afcb.png

iv)关闭selinux

.604ec39a5c5245e484a26a3537c92d66.pnge1ddbfe4f35c4a73885b952b52bd2025.png

        *关闭selinux设置后,可以重启系统使之生效,也可以使用setenforcie 0来临时开放selinux。

b57578c825774f37bb344762e7dcdd59.png

        在完成上述准备后,我们就可以通过ssh工具远程连接服务器进行安全加固了。我这里使用是xshell。

796a288d87344680a287242c1bc8222b.png

干货开始===>

一、身份鉴别加固

 1.密码安全策略

       操作系统和数据库系统管理用户身份鉴别信息应具有不易被冒用的特点,口令应有复杂度要求并定期更换。

1)设置强密码

       查看是否存在空密码帐号,如果命令结果为空则无,如果有则为空口令帐号,必须为其设置强密码。

# awk -F: '($2 == ""){print $1}' /etc/shadow

       与系统用户沟通,确保密码非弱口令。一般强口令为大写字母、小写字母、数字、特殊符号四种中两种以上组合,且不能有连续重复或有规律的字符组合。

2)配置口令生存期

       修改/etc/login.defs配置密码周期策略。注意,此策略只对策略实施后所创建的帐号生效, 以前的帐号还是按99999天周期时间来算。

       修改策略设置,编辑文件/etc/login.defs,在文件中加入或修改成如下内容:

# vi /etc/login.defs

94565586738c49e88bb49897f0491e5a.png

解释:

PASS_MAX_DAYS 90                #口令有效期90天

PASS_MIN_DAYS 0                   #口令设置后限制修改的天数,0天表示不限制

PASS_MIN_LEN 8                     #口令最小长度8位

PASS_WARN_AGE 14              #口令过期提醒14天

3)配置密码安全策略

        a)启用密码策略-1

# cp  /etc/pam.d/passwd  /root/passwd.bak           #备份文件

# vi /etc/pam.d/passwd

在/etc/pam.d/passwd末尾增加

1

password   required pam_pwquality.so retry=3

# cp  /etc/pam.d/system-auth /root/system-auth.bak

# vi /etc/pam.d/system-auth

在/etc/pam.d/system-auth末尾增加

1

password    requisite     pam_pwquality.so  try_first_pass local_users_only retry=3 enforce_for_root authtok_type=

启用配置文件/etc/security/pwquality.conf。

# vi /etc/security/pwquality.conf

difok = 3 #本次密码与上次密码至少不同字符数

minlen = 8 #密码最小长度8

dcredit = -1 #至少1个数字,注意是-1

ucredit = -1 #至少1个大写字母

lcredit = -1 #至少1个小写字母

b)启用密码策略-2

        修改system-auth中pam_unix.so模块password sufficient参数,在末尾增加remember=3,含义为:记录3个历史密码,新密码不能与他们相似。

# vi /etc/pam.d/system-auth

1

password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=3

4)设置登录失败策略

# find /lib*/* -iname "pam_tally2.so"

查找模块是否存在,如果存在可以继续下面的策略配置

# vi /etc/pam.d/system-auth

在unix行“auth sufficient pam_unix.so nullok try_first_pass”下面增加,配置服务器终端登录口令失败锁定策略

1

auth        required      pam_tally2.so onerr=fail lock_time=60 deny=5 unlock_time=600 even_deny_root root_unlock_time=600

# cp /etc/pam.d/sshd /root/sshd.bak

# vim /etc/pam.d/sshd

在#%PAM-1.0行下面增加,配置SSH登录口令失败锁定策略

1

auth        required      pam_tally2.so onerr=fail lock_time=60 deny=5 unlock_time=600 even_deny_root root_unlock_time=600

# cp /etc/pam.d/login /root/login.bak

# vim /etc/pam.d/login

在#%PAM-1.0行下面增加,配置本地终端口令失败锁定策略

1

auth        required      pam_tally2.so onerr=fail lock_time=60 deny=5 unlock_time=600 even_deny_root root_unlock_time=600

各参数含义:

onerr=fail 密码持续输入错误

lock_time=60 密码错误锁定时间60秒

deny=5 允许密码连续输入错误5次

unlock_time=600 普通账号连续错误超过5次将禁用600秒

even_deny_root root账号连续错误超过5次也将禁用

root_unlock_time=600 root账号解禁所需时间600秒

2、安全的远程管理方式

        当对服务器进行远程管理时,应采取必要措施,防止鉴别信息在网络传输过程中被窃听。

         主要是检查telnet服务是否开启,telnet是明文传输,远程管理过程中,密码等敏感信息很容易被窃听,非常不安全。检查最直接的方法就是用命令netstat -atln|grep 23看看23端口是否处于监听状态。本文最小化安装的OS是没有安装telnet.service服务的。

1)停止telnet服务,检查23端口监听,并禁止开机启动,如下图

2)修改新用户默认umask值,修改root远程登录权限

# cp -p /etc/profile /etc/profile.bak

# vi /etc/profile

1

2

3

4

5

……

if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then

    umask 002 #将此处改为umask 027

else

    umask 022 #将此处改为umask 027

……

# source /etc/profile #使配置生效

3)禁止root远程登陆(测试环境可以不做,生产环境必须做)
# cp -p /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

UsePAM yes 启用Pam认证

# sed -i "/#UsePAM yes/c UsePAM yes" /etc/ssh/sshd_config

# grep UsePAM /etc/ssh/sshd_config

PermitRootLogin no 禁止root远程登陆,以下4行注释#去掉修改配置如下,

1

2

3

4

LoginGraceTime 2m

PermitRootLogin no #是否允许root远程ssh登录,默认yes

StrictModes yes

MaxAuthTries 5

4)禁止服务用户登录shell
# chsh -s /sbin/nologin mysql
比如nginx、mysql登录用户。
解除禁止服务用户登陆
# chsh -s /bin/bash mysql

二、访问控制

1.禁用不必要的用户

usermod -L <用户名>

应及时删除多余的、过期的帐户,避免共享帐户的存在。

删除或禁用临时、过期及可疑的帐号,防止被非法利用。

主要是管理员创建的普通帐号,如这里添加一个用户:user

#useradd user               #添加用户

# usermod -L user        #锁定用户,/etc/shadow密码密文列开头为“!”

# userdel -U user         #解锁user用户

# userdel -r user          #将用户user及家目录/home/user一并删除,家目录有数据的话慎用。

2.检查SSH安全配置

# grep Protocol /etc/ssh/sshd_config         #协议应为Protocol  2

# cat /.rhosts         #无此文件则安全,有此文件需删除。

# cat /etc/hosts.equiv         #无此文件则安全,有此文件需删除。

3.应用访问控制

(*测试环境不做,生产环境建议做。生产环境设置时,请测试有效性)

应通过设定终端接入方式、网络地址范围等条件限制终端登录。

对接入服务器的IP、方式等进行限制,可以阻止非法入侵。

1) 在/etc/hosts.allow和/etc/hosts.deny文件中配置接入限制

最好的策略就是阻止所有的主机,在“/etc/hosts.deny”文件中加入“ ALL:ALL@ALL, PARANOID ”,然后再在“/etc/hosts.allow” 文件中加入所有允许访问的主机列表。如下操作:

编辑 hosts.deny文件,加入下面该行:

#vi /etc/hosts.deny

1

2

# Deny access to everyone. 

ALL: ALL@ALL, PARANOID

编辑hosts.allow 文件(vi /etc/hosts.allow),加入允许访问的主机列表,比如:

ftp: 183.54.15.66 foo.com

183.54.15.66是允许访问 ftp 服务的 IP 地址

foo.com 是允许访问 ftp 服务的主机名称。

01cda46594a74f77953f7509e5824ee0.png

可以通过以下命令在hosts.allow和hosts.deny里追加策略

# echo "sshd:10.166.214.65,10.166.214.66,10.166.214.67" >>/etc/hosts.allow

# echo "sshd:all" >>/etc/hosts.deny

2) 也可以用防火墙进行更加精细的访问控制。(具体做法待有时间再进行补充,亦可自行百度)

4.关键文件权限

# ls -dl /etc/security/

# ls -l /etc/passwd

# ls -l /etc/group

# ls -l /etc/shadow

应确保上述关键文件的权限符合最小化原则。

5.超时锁定

        应根据安全策略设置登录终端的操作超时锁定。

1)设置登录超时时间,释放系统资源,也提高服务器的安全性。

执行以下命令在/etc/profile中添加配置,单位是秒。

# echo "export  TMOUT=1800" >>/etc/profile

# source /etc/profile

# echo $TMOUT

改变这项设置后,必须注销再登录方可生效。

2)如果运行了图形桌面系统,则需要开启屏幕保护功能

设置屏幕保护:设置 -> 系统设置 -> 屏幕保护程序进行设置。

三、安全审计

1.审核策略设置​

        审计范围应覆盖到服务器和重要客户端上的每个操作系统用户和数据库用户。

        开启审核策略后,当系统出现故障、安全事故则可以查看系统日志文件,排除故障、追查入侵者信息等。

检查rsyslog、auditd服务状态:

# systemctl status rsyslog.service

# systemctl status auditd.service

状态应该为:Active: active (running)……

2.​​​​​日志属性设置

        应保护审计记录,避免受到未预期的删除、修改或覆盖等。

查看/etc/rsyslog.conf文件中所配置对应的日志文件权限是否为特定用户只读权限-rw-------

防止重要日志信息被覆盖

让日志文件转储一个月,保留6个月的信息,先查看目前配置,

# more /etc/logrotate.conf | grep -v "^#\|^$"

需要修改配置为下图所示:

# vi /etc/logrotate.conf

aadf0a735cf04511b3889bca75f11844.png

重启后执行以下命令重启日志服务。

# systemctl restart rsyslog.service

3.历史命令

为历史的命令增加登录的IP地址、执行命令时间等

1)保存5000条命令

# sed -i 's/^HISTSIZE=1000/HISTSIZE=5000/g' /etc/profile

2)在/etc/profile的文件尾部添加如下行数配置信息:

1

2

3

4

5

6

7

8

USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}' |sed -e 's/[()]//g'`

if [ "$USER_IP" = "" ]

  then

   USER_IP=`hostname`

fi

export HISTTIMEFORMAT="%F %T $USER_IP `whoami` # "

shopt -s histappend

export PROMPT_COMMAND="history -a"

# source /etc/profile         #让配置生效

5517df83054a474c9d83cc537af3af91.png

3)用户退出时备份历史命令

#vi ~/.bash_logout

增加以下两行,每次退出备份当前登录命令记录,同时清除本地历史命令记录文件内容:

1

2

history >/$HOME/.`whoami`_history_`date +'%y-%m-%d_%H-%M-%S'`.log

echo " " > /$HOME/.bash_history

四、入侵防御

        操作系统遵循最小安装的原则,仅安装需要的组件和应用程序,并通过设置升级服务器等方式保持系统补丁及时得到更新。

1.系统服务开启情况检查

CentOS7使用以下命令查看服务开启状况

# systemctl list-unit-files |grep enabled

7f7f15d0ff4f442f824b657e43d9a598.png

2.升级SSL和SSH

        通过编译安装方式分别升级OpenSSL和OpenSSH,具体步骤可参考互联网上相关升级方案,后期我会发布ssh升级文章。在测试环境中测试正常再在生产环境中升级,升级前做好备份。如果服务器不在本地,建议要安装telnet服务作为备用远程方式,防止升级失败导致无法远程。

3.DOS攻击防御

防止拒绝服务攻击

TCP SYN保护机制等设置

1)打开 syncookie:

# echo“1”>/proc/sys/net/ipv4/tcp_syncookies          #默认为1,一般不用设置

        表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

2)防syn 攻击优化

编辑/etc/sysctl.conf,添加如下行:

1

net.ipv4.tcp_max_syn_backlog = 2048

        进入SYN包的最大请求队列,默认1024。对重负载服务器,增加该值有好处,可调整到2048。

d09fde7e2e894cf0add572cb398ea715.png

3)防攻击优化,修改默认TTL值

        编辑/etc/sysctl.conf,在末尾增加如下内容,伪装成Windows,迷惑攻击者。

1

net.ipv4.ip_default_ttl = 128

说明:ip_default_ttl取值范围:64-255

五、恶意代码防范

        安装必要的杀毒软件,Linux系统虽然不易感染病毒,但是生产环境最好也要安装防病毒软件,并且通过防火墙仅开放必须的端口服务,也可以起到较好的防护作用。

        防火墙配置和防病毒此处不做介绍,读者可以自行寻找相关方法。

六、剩余信息保护

1.修改系统banner信息

清空相关banner信息,防止泄露系统内核等重要信息

# echo  "" >/etc/issue

# echo  "" >/etc/issue.net

# echo  "" >/etc/motd

添加个性化banner信息

# echo 'Welcome to My Cloud Elastic Compute Service !' >>/etc/issue

# echo 'Welcome to My Cloud Elastic Compute Service !' >>/etc/issue.net

# echo 'Welcome to My Cloud Elastic Compute Service !' >>/etc/motd

连接服务器会显示个性化banner信息,而不是内核版本等信息:

2.检查FTP服务安全(如有)

# ps -ef |grep ftp         #无进程,再看看端口监听情况

# netstat -atln |grep 21|grep LISTEN         #如无输出则无需加固

        如果存在FTP服务,需要禁用匿名登录,禁止ROOT登录FTP,修改FTP配置文件/etc/vsftpd.conf,在default小节

手动增加或修改如下内容:

ftpd_banner= "ATTENTION:You have logged onto a secured server.All accesses logged.\n\nlogin:"

1

ftpd_banner= "ATTENTION:You have logged onto a secured server.All accesses logged.\n\nlogin:"

其它应用可以参考,自行百度进行加固。

至此,Linux基本的安全加固方法已介绍完毕,也欢迎广大Linux爱好者来评论区交流心得。

==============记录我和Linux、信息安全的点点滴滴!==============