云主机服务器系统加固
系统版本信息
命令:
lsb_release -a
执行结果:

结论:系统版本为CentOS 7.3 64位。
创建影子口令
命令:
ll /etc/shadow
cat /etc/shadow
执行结果:

结论:已存在影子口令文件。
建立多帐户组,将用户账号分配到相应的帐户组
此步骤需要对应应用名称才可创建。
删除或锁定可能无用的帐户
命令:
cat /etc/passwd
执行结果:

结论:系统中只有root、系统用户、伪用户,没有其他用户存在,后续大数据平台应用使用账号名为cbdp,拥有sudo权限。
删除可能无用的用户组
同上。
检查是否存在空密码的账户
命令:
awk -F: '($2 == "") { print $1 }' /etc/shadow
执行结果:

结论:无空口令用户存在。
设置口令策略满足复杂度要求
执行历史:
#最小密码长度为8位
[root@Server-i-fzbwivul78 pam.d]# authconfig --passminlen=8 --update
[root@Server-i-fzbwivul78 pam.d]# grep "^minlen" /etc/security/pwquality.conf
minlen = 8
#在新密码中设置同一类的允许连续字符的最大数目4位
[root@Server-i-fzbwivul78 pam.d]# authconfig --passmaxclassrepeat=4 --update
[root@Server-i-fzbwivul78 pam.d]# grep "^maxclassrepeat" /etc/security/pwquality.conf
maxclassrepeat = 4
#在新密码中至少需要一个小写字符。
[root@Server-i-fzbwivul78 pam.d]# authconfig --enablereqlower --update
[root@Server-i-fzbwivul78 pam.d]# grep "^lcredit" /etc/security/pwquality.conf
lcredit = -1
#在新密码中至少需要一个大写字符
[root@Server-i-fzbwivul78 pam.d]# authconfig --enablerequpper --update
[root@Server-i-fzbwivul78 pam.d]# grep "^ucredit" /etc/security/pwquality.conf
ucredit = -1
#在新密码中至少需要一个数字
[root@Server-i-fzbwivul78 pam.d]# authconfig --enablereqdigit --update
[root@Server-i-fzbwivul78 pam.d]# grep "^dcredit" /etc/security/pwquality.conf
dcredit = -1
#密码包括至少一个特殊字符
[root@Server-i-fzbwivul78 pam.d]# authconfig --enablereqother --update
[root@Server-i-fzbwivul78 pam.d]# grep "^ocredit" /etc/security/pwquality.conf
ocredit = -1
[root@Server-i-fzbwivul78 pam.d]#
设置默认用户密码使用天数,编辑配置文件/etc/login.defs:
vi /etc/login.defs
修改PASS_MAX_DAYS
为90天数,PASS_MIN_LEN
修改为8位数。
修改如下:

设置账号口令生存周期
命令:
#$DAYS为过期时间
chage -M $DAYS root
执行结果:

注意:修改密码过期时间需要慎重。
设定密码历史,不能重复使用最近5次口令
编辑/etc/pam.d/system-auth
,找到下面一行
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok
修改为:
password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember=5
限制ROOT用户远程登陆
vi /etc/ssh/sshd_config
修改PermitRootLogin
选项为:
PermitRootLogin no
检查passwd、group文件权限设置
执行如下命令:

结论:符合安全标准。
删除帐户目录下的.netrc/.rhosts/.shosts文件
命令:
rm ~/.netrc ~/.rhosts ~/.shosts
执行结果:

检查是否存在除root之外UID为0的用户
检查命令:
awk -F: '($3 == 0) { print $1 }' /etc/passwd
执行结果:

结论:系统中无root以外的UID为0的账号。
设置账户权限
需根据实际情况,针对性的做账户权限设置。后续大数据平台应用使用账号名为cbdp,拥有sudo权限。
设置命令:usermod
。
账号锁定
需根据实际情况,针对指定账户锁定。后续大数据平台应用使用账号名为cbdp,拥有sudo权限
命令如下:
#锁定命令
passwd -l $account
#解锁账号命令
passwd -u $account
#禁止所有非root用户登录
touch /etc/nologin
root用户环境变量的安全性
命令:
#检查变量中是否含有父目录
echo $PATH | egrep '(^|:)(\.|:|$)'
#检查变量中的是否包含组目录权限为777的目录
find `echo $PATH | tr ':' ' '` -type d \( -perm -002 -o -perm -020 \) -ls
执行结果:

远程连接的安全性配置
远程登录取消telnet采用ssh
检查/etc/securetty
中是否包含pts/0
字样:
grep "pts/0" /etc/securetty
执行结果:

结论:系统已禁用telnet登录。
限制ssh连接的IP配置
需要根据实际情况配置,配置文件为:/etc/hosts.allow
,/etc/hosts.deny
。
限制系统帐户FTP登录
命令:
cat /etc/passwd|grep ftp
执行结果:

如果含有ftp字段的用户,并且登陆shell为/sbin/nologin
或者/usr/sbin/nologin
,说明FTP用户无法登陆。如果登陆shell为非nologin
,执行如下命令:
#$account 为要修改的ftp用户名称
usermod -s $account
结论:此镜像中,已禁用ftp账号登录。
配置允许访问inetd服务的IP范围或主机名
此基础镜像系统中无inetd服务:

设定连续认证失败次数超过6次锁定该账号
编辑文件/etc/pam.d/sshd
,在#%PAM-1.0
的下面,即第二行,添加内容,一定要写在前面,如果写在后面,虽然用户被锁定,但是只要用户输入正确的密码,还是可以登录的!,添加内容如下:
auth required pam_tally2.so deny=6 unlock_time=300 even_deny_root root_unlock_time=10
执行结果如下:

参数详解如下:
even_deny_root 也限制root用户;
deny 设置普通用户和root用户连续错误登陆的最大次数,超过最大次数,则锁定该用户;
unlock_time 设定普通用户锁定后,多少时间后解锁,单位是秒;
root_unlock_time 设定root用户锁定后,多少时间后解锁,单位是秒;
此处使用的是 pam_tally2 模块,如果不支持 pam_tally2 可以使用 pam_tally 模块。另外,不同的pam版本,设置可能有所不同,具体使用方法,可以参照相关模块的使用规则。
查看用户登录失败次数:
pam_tally2 --user root
解锁指定用户:
# $account为被锁定的账号账号
pam_tally2 -r -u $account
用户的umask安全配置
查看当年状态的umask,执行命令:
umask
执行结果:

需要将其修改为077,并永久生效,修改/etc/profile
文件,将umask修改为077:
vi /etc/profile
修改如下:

测试结果:

查找并删除未授权的SUID/SGID文件
命令:
for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'`; do find $PART \( -perm -04000 -o -perm -02000 \) -type f -xdev -print ; done
若存在未授权的文件,则低于安全要求,需要将其删除。建议经常性的对比suid/sgid文件列表,以便能够及时发现可疑的后门程序。
执行结果:

结论:此基础镜像中无未授权的SUID/SGID文件。
检查是否任何人都有写权限的文件
命令:
for PART in `awk '($3 == "ext2" || $3 == "ext3") \
{ print $2 }' /etc/fstab`; do find $PART -xdev -type d \( -perm -0002 -a ! -perm -1000 \) -print; done
若返回值非空,则低于安全要求。
执行结果:

结论:结果为空,此基础镜像不存在任何人都有写权限的文件。
检查异常隐含文件
命令:
find / -xdev -name "..*" -print
find / -xdev -name "...*" -print |cat -v
执行结果:

结论:镜像中不存在异常隐含文件。
重要目录和文件的权限设置
命令:
ls -l /etc/ls -l /etc/rc.d/init.d/ls -l /tmpls -l /etc/inetd.confls -l /etc/passwdls -l /etc/shadowls -l /etc/groupls -l /etc/securityls -l /etc/servicesls -l /etc/rc*.d
若权限过低,则低于安全要求。
对于重要目录,建议执行如下类似操作:
这样只有root可以读、写和执行这个目录下的脚本。
检查没有所有者的文件或目录
定位系统中没有属主的文件用下面的命令:
for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'`; do find $PART -nouser -o -nogroup -print; done
执行结果:

发现没有属主的文件往往就意味着有黑客入侵你的系统了。不能允许没有属主的文件存在。如果在系统中发现了没有主人的文件或目录,先查看它的完整性,如果一切正常,给它一个属主。有时候卸载程序可能会出现一些没有主人的文件或目录,在这种情况下可以把这些文件和目录删除掉。
禁用不必要的服务
查看自动启动服务的命令:
systemctl list-unit-files |grep enabled
需要根据实际情况进行调整。禁用命令:
#$service为服务名称
systemctl disable $service
禁用不必要的inetd服务
基础镜像中不存在inetd服务。

关闭IP转发
编辑文件/etc/sysctl.conf
,添加如下内容:
net.ipv4.ip_forward=0
然后执行:
sysctl -p
关闭转发源路由包
同上步操作。
增大最大半连接数防范SYN攻击
编辑文件/etc/sysctl.conf
,添加如下内容:
net.ipv4.tcp_max_syn_backlog = 2048
然后执行:
sysctl -p
关闭ICMP重定向
编辑文件/etc/sysctl.conf
,添加如下内容:
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
然后执行:
sysctl -p
关闭响应echo广播
命令:
sysctl -a |grep echo_ignore_broadcasts
执行结果:

已经关闭echo广播相应,如果未关闭,修改/etc/sysctl.conf
文件,添加如下内容:
net.ipv4.icmp_echo_ignore_broadcasts = 1
关闭响应地址掩码和时间戳广播
CentOS系统中不存在,只有少数操作系统会进行响应的回应,这些系统包括ULTRIX OpenVMS, Windows 95/98/98 SE/ME, NT below SP 4, 和 SUN Solaris机器。
启用inetd日志记录
此基础镜像中无inetd服务。
syslog登录事件记录
命令:
cat /etc/rsyslog.conf |grep "authpriv.*"
执行结果:

结论:基础镜像已存在登陆日志审核记录规则。
Linux日志增强配置以及syslog系统事件审计
基础镜像已存在,执行cat /etc/rsyslog.conf
,基础镜像配置如下:
# rsyslog configuration file
# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
#### MODULES ####
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark # provides --MARK-- message capability
# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
#### GLOBAL DIRECTIVES ####
# Where to place auxiliary files
$WorkDirectory /var/lib/rsyslog
# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on
# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf
# Turn off message reception via local log socket;
# local messages are retrieved through imjournal now.
$OmitLocalLogging on
# File to store the position in the journal
$IMJournalStateFile imjournal.state
#### RULES ####
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
# ### begin forwarding rule ###
# The statement between the begin ... end define a SINGLE forwarding
# rule. They belong together, do NOT split them. If you create multiple
# forwarding rules, duplicate the whole block!
# Remote Logging (we use TCP for reliable delivery)
#
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#$ActionQueueFileName fwdRule1 # unique name prefix for spool files
#$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible)
#$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
#$ActionQueueType LinkedList # run asynchronously
#$ActionResumeRetryCount -1 # infinite retries if host is down
# remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
#*.* @@remote-host:514
记录FTP日志
基础镜像中没有FTP应用服务。
设置远程日志服务器
根据实际情况部署,修改文件为/etc/rsyslog.conf
。
检查系统日志文件权限
命令:
cd /var/log && ll messages secure maillog cron spooler boot.log
执行结果:

禁用图形界面登录
云主机中默认已禁用图形界面。客户服务器安装系统时请取消安装图形界面。
字符交互界面帐户超时自动退出及系统超时注销
编辑/etc/profile
文件,追加如下内容:
export TMOUT=180
设置自动锁定时间为180秒。
系统漏洞补丁
根据公有云主机安全漏洞扫描的结果,对漏洞进行补丁升级:

升级历史命令如下:
yum update libnl3 sudo wget dnsmasq gnutls libtasn1 openssh kernel curl bash -y