浅谈Linux主机加固

发布于 2022-07-25  674 次阅读


浅谈Linux主机加固

前言

Linux系统被应用于大部分企业的服务器上,因此在等保测评中主机加固也是必须要完成的一项环节。Linux的主机加固主要分为:账号安全、认证授权、协议安全、审计安全。简而言之,就是4A(统一安全管理平台解决方案),这里使用CentOS虚拟机进行演示。

账户安全

口令生存周期

cat /etc/login.defs

image-20220723115047366

此处对密码的长度、时间、过期警告进行修改,如果修改设置有最小长度也要修改(PASS_MIN_LEN    8   #密码最小长度)
PASS_MAX_DAYS   90  #密码最长过期天数
PASS_MIN_DAYS   10   #密码最小过期天数
PASS_WARN_AGE   7   #密码过期警告天数

口令复杂度(很重要)

  • /etc/login.defs:只控制了账号密码的有效期和最小长度。修改完/etc/login.defs文件后,会立即生效,但是它只对修改后创建的用户生效。
  • pam_cracklib.so:该模块实现了账户密码的复杂度控制。早期用的是pam_cracklib.so模块,后来改成用pam_pwquality.so了,该模块完全兼容旧的pam_cracklib.so模块。该模块对应的配置文件路径在/etc/pam.d/目录下。

可执行【man pam_cracklib】命令,查看pam_cracklib的相关控制参数说明:

minlen=N    #新密码最小长度
difok=3     #允许的新、旧密码存在相同字符的个数,默认为5。
dcredit=-3  #新密码中至少包含3个数字
lcredit=-3  #新密码中至少包含3个小写字母
ucredit=-1  #新密码中至少包含1个大写字母
ocredit=-1  #新密码中至少包含1个其他符合

通常会在下面4个文件中配置策略:

/etc/pam.d/system-auth:全局限制,会对所有登录方式做限制
/etc/pam.d/login:只对本地终端用户登录做限制
/etc/pam.d/remote:只对远程telnet做限制
/etc/pam.d/sshd:只对ssh登录做限制

根据不同的登录方式修改相应的文件即可,控制参数都是一样的

#找到包含pam_pwquality.so模块的行,将原有行注释并修改为如下的新配置(要放在文件的第二行,也就是在#%PAM-1.0下面的一行,否则可能会不起作用)
修改为:
password requisite  pam_cracklib.so try_first_pass retry=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minlen=8
(至少包含一个数字、一个小写字母、一个大写字母、一个特殊字符、且密码长度>=8)

image-20220724105639029

版本信息

cat /proc/version

image-20220724105849452

限制XX用户登陆

vim /etc/hosts.deny

image-20220724110140469

检查是否有其他UID=0的用户

awk -F “:” '($3==0)  {print  $1} ' /etc/passwd
这里主要是用过查询passwd文件中第三列的值进行查看,如果存在UID=0的其他用户,将其删除或更改其权限
删除用户:userdel user
修改用户UID:usermod -u 2005 user

登陆超时限制

cp -p /etc/profile /etc/profile_bak(通过复制进行备份)

vim /etc/profile

这里有两种方法进行规则的添加

  • /etc/profile文件的最后增加
TMOUT=300
export TMOUT
  • 通过命令添加
echo 'export TMOUT=300'>>/etc/profile
echo 'readonly TMOUT' >>/etc/profile

以上两种方法完成后都需要使用一下命令来使配置文件生效

source /etc/profile

检查是否使用PAM认证模块禁止wheel组之外的用户su为root

vim /etc/pam.d/su

新增

auth          sufficient     pam_rootok.so
auth          required     pam_wheel.so use_uid

备注:auth与sufficient之间由两个tab建隔开,sufficient与动态库路径之间使用一个tab建隔开

禁用无用账户

cat /etc/passwd #查看口令文件,确认不必要的账号

image-20220724151219983

passwd -l user # 锁定不必要的账号

账户锁定

vim /etc/pam.d/system-auth

在文件中修改或者添加

使用pam_tally.so模块限制登录失败锁定时间

auth required pam_tally.so onerr=fail deny=3 unlock_time=7200

AUTH选项
deny=n              失败登录次数超过n次后拒绝访问
lock_time=n         失败登录后锁定的时间(秒数)
unlock_time=n       超出失败登录次数限制后,解锁的时间
no_lock_time        不在日志文件/var/log/faillog 中记录.fail_locktime字段
magic_root          root用户(uid=0)调用该模块时,计数器不会递增
even_deny_root      root用户失败登录次数超过deny=n次后拒绝访问
root_unlock_time=n  与even_deny_root相对应的选项,如果配置该选项,则root用户在登录失败次数超出限制后被锁定指定时间

锁定账户举例

passwd -l bin
passwd -l sys
passwd -l adm

检查系统弱口令

这里的john是kail系统中的暴力破解工具
john /etc/shadow --single
john /etc/shadow --wordlist=pass.dic

若检查出弱口令使用以下命令来修改密码
passwd 用户

协议安全

openssh升级(按需进行升级)

yum update  openssh

定时任务(防止病毒感染)

定时任务检查:
crontab -l

一次性任务检查:
at -l

image-20220724152159495

我的本地环境未开启定时任务和一次性任务所以显示为空

限制ssh登陆(看是否需要)

image-20220724152844327

Protocol 2 修改ssh使用的协议版本

限制su为root用户

vim /etc/pam.d/su

在头部添加 auth required /lib/security/pam_wheel.so group=wheel

禁止root用户登陆ftp

cat /etc/pam.d/vsftpd
Auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed

其中file=/etc/vsftpd/ftpusers即为当前系统上的ftpusers文件.

echo  “root”   >>   /etc/vsftpd/ftpusersv

root商户登陆ftp后可以下载一些系统内的敏感文件

防止flood攻击

vim /etc/sysctl.conf

image-20220724153421250

增加net.ipv4.tcp_syncookies = 1
然后sysctl  -p

禁用ping

echo 0 > /proc/sys/net/ipv4/icmp_echo_igore_all

检查异常进程

#检查cpu占用前10
ps aux | sort -k3nr | head -n 10
#检查内存占用前10
ps -aux | sort -k4nr|head -10

例如挖矿木马会占用大量CPU资源

image-20220724153713724

image-20220724153737168

杀死进程
kill 12345
强制杀死进程
kill -KILL 123456
发送SIGHUP信号,可以使用一下信号
kill -HUP pid
彻底杀死进程
kill -9 123456

关闭无效的服务及端口

比如邮箱

service postfix status
chkconfig --del postfix
chkconfig postfix off

比如cpus

service cups status
chkconfig --del cups
chkconfig cups off

一些端口存在的威胁详见:http://danielw.top/index.php/daniel/226/

设置防火墙策略

iptables(Centos6)

 防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。
  一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用

  • 基础命令
启动: service iptables start
关闭: service iptables stop
查看状态: iptables -V
重启 : service iptables restart

查看防火墙设置

主要分为5种规则类型数据包:
   进行路由选择前处理数据包(PREROUTING);
   处理流入的数据包(INPUT);
   处理流出的数据包(OUTPUT);
   处理转发的数据包(FORWARD);
   进行路由选择后处理数据包(POSTROUTING)

使用命令查看防火墙设置

iptables -L

使用命令清除防火墙

iptables -F
  • 设置防火墙策略

使用iptables命令进行添加删减

开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT   #允许本地回环接口(即运行本机访问本机)
 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT   #允许已建立的或相关连的通行
 iptables -A OUTPUT -j ACCEPT   #允许所有本机向外的访问
 iptables -A INPUT -p tcp --dport 22 -j ACCEPT   #允许访问22端口
 iptables -A INPUT -p tcp --dport 80 -j ACCEPT   #允许访问80端口
 iptables -A INPUT -p tcp --dport 21 -j ACCEPT   #允许ftp服务的21端口
 iptables -A INPUT -p tcp --dport 20 -j ACCEPT   #允许FTP服务的20端口
 iptables -A INPUT -j reject   #禁止其他未允许的规则访问
 iptables -A FORWARD -j REJECT   #禁止其他未允许的规则访问
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP   #屏蔽单个IP的命令
 iptables -I INPUT -s 123.0.0.0/8 -j DROP   #封整个段即从123.0.0.1到123.255.255.254的命令
 iptables -I INPUT -s 124.45.0.0/16 -j DROP   #封IP段即从123.45.0.1到123.45.255.254的命令
 iptables -I INPUT -s 123.45.6.0/24 -j DROP   #封IP段即从123.45.6.1到123.45.6.254的命令

或者直接在路径/etc/sysconfig下,对文件iptables编辑。

配置完成记得重启防火墙命令

firewalled(Centos7)

  • 基础命令
启动: systemctl start firewalld
重启: systemctl restart firewalld
关闭: systemctl stop firewalld
查看状态: systemctl status firewalld
开机禁用 : systemctl disable firewalld
开机启用 : systemctl enable firewalld

前台可视化界面-防火墙设置也可以设置

开启SELinux服务(Centos7)

 SELinux(Security-Enhanced Linux)是美国国家安全局在Linux开源社区的帮助下开发的一个强制访问控制(MAC,Mandatory Access Control)的安全子系统。RHEL7系统使用SELinux技术的目的是为了让各个服务进程都受到约束,使其仅获取到本应获取的资源。

简单概述下基本的三种安全访问控制类型
   MAC(强制访问控制类型)
   DAC(自主访问控制类型) --通常就是ACL策略居多
   RABC(基于角色访问控制类型)

安全性MAC>RABC>DAC

  • SELinux 有三种工作模式,分别是
  1. enforcing:强制模式。违反 SELinux 规则的行为将被阻止并记录到日志中,并且自动拦截
  2. permissive:宽容模式。违反 SELinux 规则的行为只会记录到日志中,只告警不拦截。一般为调试用。
  3. disabled:关闭 SELinux。不拦截不告警。

配置文件路径:/etc/selinux,通过查看config,了解目前运行状态

  • 查看命令
cat config

或者使用命令进行查询

[root@localhost selinux]# getenforce 
Enforcing
  • 临时修改命令(不用重启机器):
[root@localhost selinux]# setenforce 0  --0设为宽容莫斯
[root@localhost selinux]# getenforce 
Permissive
[root@localhost selinux]# setenforce 1  --1设为强制模式
[root@localhost selinux]# getenforce 
Enforcing
[root@localhost selinux]# 

设置历史记录数量

cp /etc/profile /etc/profile_xu_bak(备份)
sed -i s/'HISTSIZE=1000'/'HISTSIZE=5000'/g /etc/profile(修改)
cat /etc/profile |grep HISTSIZE|grep -v export(检查)

认证权限

配置用户最小权限

chmod 644 /etc/passwd
chmod 400 /etc/shadow
chmod 644 /etc/group

文件与目录缺省权限控制

cp /etc/profile /etc/profile.bak(备份)
vim /etc/profile
umask 027
umask是表示反码的意思,而022是代表你在建文件时候,系统自动用777去跟022相减得到750,你的文件就是750的权限,显示出来就是rxwr-x---(所有者全部权限,属组读写,其它人无)
使修改后的文件生效
source  /etc/profile

日志审计

syslogd日志

启用日志功能,并配置日志记录。

操作步骤

Linux系统默认启用以下类型日志:

  • 系统日志(默认)/var/log/messages
  • cron日志(默认)/var/log/cron
  • 安全日志(默认)/var/log/secure

注意:部分系统可能使用syslog-ng日志,配置文件为:/etc/syslog-ng/syslog-ng.conf

根据需求配置详细日志

记录所有用户的登录和操作日志

通过脚本代码实现记录所有用户的登录操作日志,防止出现安全事件后无据可查。

操作步骤

  1. 运行 [root@xxx /]# vim /etc/profile打开配置文件。

  2. 在配置文件中输入以下内容:

    history
    USER=whoami
    USER_IP=who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'
    if [ "$USER_IP" = "" ]; then
    USER_IP=hostname
    fi
    if [ ! -d /var/log/history ]; then
    mkdir /var/log/history
    chmod 777 /var/log/history
    fi
    if [ ! -d /var/log/history/${LOGNAME} ]; then
    mkdir /var/log/history/${LOGNAME}
    chmod 300 /var/log/history/${LOGNAME}
    fi
    export HISTSIZE=4096
    DT=date +"%Y%m%d_%H:%M:%S"
    export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT"
    chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null
  3. 运行 [root@xxx /]# source /etc/profile 加载配置生效。

    注意: /var/log/history 是记录日志的存放位置,可以自定义

通过上述步骤,可以在 /var/log/history 目录下以每个用户为名新建一个文件夹,每次用户退出后都会产生以用户名、登录IP、时间的日志文件,包含此用户本次的所有操作(root用户除外)

Linux中日志管理有两种服务(syslogd、rsyslogd),不同版本采用不同服务,详细内容将有独立文档进行介绍

Daniel_WRF
最后更新于 2023-09-22