【基线】关于Debian的一些简单安全配置及验证

0x01 背景

最近在研究Linux的一些安全配置检查,增强自己对安全领域的防范意识,也能够提供我对Linux系统的操作熟练度,系统也没有使用其他的系统,依旧是我之前装的Debian 6.1.27,主要是为了简单了解下基线检查都包含哪些方面,也不至于对此一无所知,下面将从五个方面进行阐述。

0x02 账户

检查是否存在其他uid=0的用户

众所周知,linux系统最高管理员账户为root账户,其uid=0,当存在其他为uid=0的账户,那说明存在"隐形root"账户,这样就存在安全隐患,如操作无法追溯、攻击目标增加等。

0x03 口令

1、用户口令的设置

按照三级等保的要求,账户口令长度至少8位且需包含大小写字母、数字、特殊符号中的三种或以上组合,口令有效期不超过90天,近三次历史口令不得重复使用,连续登录失败次数达到5次账户锁定。

(1)账户口令有效期不超过90天

/etc/login.defs是为linux系统提供密码时效的全局默认规则

PASS_MAX_DAYS:密码最长使用期限,超过则密码失效,需修改才能登录

PASS_MIN_DAYS:密码修改时间间隔,0则表示密码修改无时间间隔限制

PASS_WARN_AGE:密码过期快要过期前的提醒天数,用户登录时会"弹出密码即将过期"的提醒

修改以上密码参数策略仅对新建用户应用,对已历史创建的用户不会应用

PASS_MIN_DAYS配置为1,则密码修改间隔需要等待1天,作用于普通用户,root用户不受该配置影响

(2)口令强度

弱口令容易被爆破,账户复杂度需要满足:账户口令长度至少8位且需包含大小写字母、数字、特殊符号中的三种或以上组合,近三次历史口令不得重复使用。

口令密码强度主要由PAM模块负责,具体在/etc/pam.d/common-passwd文件配置

复制代码
# 安装依赖包
apt install libpam-pwquality.so
# 备份默认策略
cp /etc/pam.d/common-password /etc/pam.d/common-password.bak
# 按照密码复杂度要求进行编辑
vi /etc/pam.d/common-password
# 密码复杂度强制校验
password        requisite       pam_pwquality.so minlen=8 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 minclass=3 enforce_for_root retry=3
# 历史密码限制
password        requisite        pam_pwhistory.so remember=3 enforce_for_root use_authtok
# 密码加密存储
password        [success=1 default=ignore]      pam_unix.so obscure try_first_pass yescrypt
# 保底拒绝处理(防流程绕过)
password        requisite                       pam_deny.so
# 保底允许处理
password        required                        pam_permit.so
# 图形界面密钥环
password        optional        pam_gnome_keyring.so 

相关字段说明:

pam_pwquality.so PAM密码质量校验模块

pam_pwhistory.so PAM历史密码记录与防复用模块

minlen=8 密码最小长度强制为8位

ucredit=-1 密码至少包含一个大写字母

lcredit=-1 密码至少包含一个小写字母

dcredit=-1 密码至少包含一个数字

ocredit=-1 密码至少包含一个特殊字符

minclass=3 密码至少包含3类字符

enforce_for_root 强制root用户修改密码也必须经过该校验

retry=3 密码输入错误时,最多允许重试3次,超过则直接退出

remember=3 记录用户最近3次的密码哈希,新密码与这3次重复则拒绝修改

配置完以上策略后,即使使用root用户也无法将口令修改为不符合复杂度要求的口令

修改为口令为近三次的重复口令则报错

2、账户锁定策略

pam_faillock.so模块默认账户口令输错三次锁定,锁定时长600s,这里设置为账户连续登录失败次数达到5次账户锁定,锁定时间为300秒。

bash 复制代码
# 修改登陆失败锁定账户配置文件
vi /etc/security/faillock.conf
# 失败尝试次数
deny = 5
# 锁定时间
unlock_time = 300
# 日志审计开启
audit
# 静默模式开启
silent

模块应用规则在common-auth及common-account文件里配置

bash 复制代码
vi /etc/pam.d/common-auth

# 检查当前用户是否已达到失败次数上限被锁定,如锁定则后续认证直接失败
auth    required    pam_faillock.so preauth silent audit
# 验证密码是否正确,成功则跳过失败记录,失败则继续记录
auth    [success=1 default=ignore] pam_unix.so
# 记录本次密码失败次数,且直接终止认证
auth    [default=die]    pam_faillock.so authfail silent audit
# 若密码验证成功,清空该用户的失败次数记录,直接返回认证成功
auth    sufficient    pam_faillock.so authsucc silent audit
auth    requisite    pam_deny.so
auth    required    pam_permit.so

vi /etc/pam.d/common-account

#基础的账户合法性校验,如账户是否存在、是否过期、是否禁用等

account    [success=1 new_authtok_reqd=done default=ignore]    pam_unix.so
account    requisite    pam_deny.so
account    required    pam_permit.so
#最终确定用户未被faillock锁定,若锁定则账户环节失败,即使密码正确也无法登录
account    required    pam_faillock.so

配置完以上配置后,使用su进行测试,发现锁定策略已生效,账户锁定后即使输入正确密码也无法登录成功。

3、登录超时设置

设置所有登录用户的终端会话超时时间为120s,若终端在该时长内无任何交互操作,会话会自动退出(注销)。

在/etc/profile文件添加以下配置:

TMOUT=120

export TMOUT

readonly TMOUT

重启或者执行source /etc/profile在当前shell生效

实际应用中,通常建议设置5-15分钟,最长不超过30分钟。

注意,若是采用ssh登录,则超时时间取决于sshd.config配置文件的ClientAliveInterval参数,并不受/etc/profile配置的超时时间影响。

4、Root账户限制远程登录

禁止root用户远程登录,从安全角度来看,可以避免攻击者通过爆破获得root密码,在/etc/ssh/sshd_config配置文件里参数PermitRootLogin进行配置,默认参数为prohibit-password,表示禁止密码登录,仅允许密钥登录。

ssh密钥登录需要在本地机器生成密钥对

并将公钥上传到服务器上root账户下

注意authorized_keys权限配置为600,否则ssh会拒绝,这时ssh登录可不用输入口令

实际生产业务直接禁用root直接登录,将PermitRootLogin参数配置为no

0x04 认证授权

1、远程连接安全配置

检查主机是否存在.netrc和.rhosts文件,.netrc文件用于存储FTP、FTPS、SFTP客户端的远程登录凭证,实现免密码自动登录,常见于ftp、lftp等工具;.rhosts文件是基于主机名/IP的信任认证,主要配合rlogin、rsh、rcp等早期远程工具,实现免密码登录。

bash 复制代码
find / -name .netrc
find / -name .rhosts

如存在这两个文件,建议删除。

这里以netrc文件为例,创建该文件实现ftp免密码自动登录

bash 复制代码
cat > .netrc <<EOF
machine localhost
login guest
password guest@123
EOF

systemctl start vsftpd

ftp连接本地机器后,自动免密登陆,跟上面ssh登录root配置了密钥认证类似,无需输入口令。

2、重要目录文件权限设置

重要目录应设置只有root用户可读可写可执行,等保2.0访问控制要求应限制默认账户的访问权限,配置文件应采取保护措施,防止非授权修改。

查询以下重要目录的文件权限(包括但不限于)

bash 复制代码
ls -l /etc #系统核心配置目录
ls -l /var/log #存放系统日志
ls -l /etc/sudoers #控制sudo权限分配
ls -l /etc/ssh/sshd_config #SSH服务配置文件
ls -l /etc/fstab #系统挂载配置文件
ls -l /etc/group #存放用户组信息
ls -l /etc/shadow #存放密码哈希
ls -l /etc/passwd #存放用户名、UID等基础信息
ls -l /etc/security #系统安全策略配置
ls -l /etc/init.d #系统服务初始化和管理

重要目录文件权限应按照最小权限原则去分配,降低信息泄露及篡改的风险。

例如核查/etc下权限过高的文件(>644)

bash 复制代码
find /etc -type f -perm /022 -name "*.conf" -o -name "*.d"

3、查询未授权的SIUD/SGID文件

SUID:当一个可执行文件设置了SUID权限时,普通用户执行这个文件的瞬间,会临时获得该文件所有者的权限,执行结束后权限恢复。

SGID:当一个可执行文件设置了SGID权限时,普通用户执行这个文件的瞬间,会临时获得该文件所属用户组的权限,执行解释后权限恢复;当一个目录设置了SGID权限时,任何用户在该目录下创建的文件/子目录,其所属用户组会自动集成该目录的用户组,而不是创建者所属用户组。

SUID/SGID配置是提权漏洞防范的重要区域,在等保2.0测评中会重点核查系统中异常的SUID/SGID文件。

查找系统中所有SUID/SGID文件,排查异常项

bash 复制代码
# 查找所有SUID文件
find / -perm -4000 -type f 2>/dev/null
# 查找所有SGID文件
find / -perm -2000 -type f 2>/dev/null

可以导出核查无误的结果,然后下次检查时再做比对,这样可以更清晰发现SUID/SGID文件是否存在变更。

bash 复制代码
# 导出当前SUID基线
find / -perm -4000 -type f 2>/dev/null > /root/suid_baseline.txt
# 后续审计对比
find / -perm -4000 -type f 2>/dev/null | diff /root/suid_baseline.txt -

#导出当前SGID基线
find / -perm -2000 -type f 2>/dev/null > /root/sgid_baseline.txt
# 后续审计对比
find / -perm -2000 -type f 2>/dev/null > /root/sgid_baseline.txt

4、关闭不必要的服务

开放的服务越多,那被攻击的风险也就越大,故要尽可能地关闭不需要的服务。

查看所有服务的自启情况

bash 复制代码
systemctl list-unit-files --type=service --state=enabled

区分哪些服务是需要的,哪些服务不需要的,可进行关闭

0x05 日志

1、严控日志权限

日志文件仅允许root及审计人员组可读,防止非授权用户查看或篡改,权限建议设为640

检查日志目录权限、检查日志文件权限

权限640:仅root用户可读可写,systemd-journald服务进程默认用systemd-journal组身份写入日志的,若后续需要让adm组用户(审计人员)查看日志,可将日志文件属组变更为adm组,并将systemd-journald服务的进程加入adm组。

bash 复制代码
mkdir -p /etc/systemd/system/systemd-journald.service.d/
vi /etc/systemd/system/systemd-journald.service.d/override.conf

[Service]
SupplementaryGroups=adm

chgrp -R adm /var/log/journal/
chgrp adm /var/log/journal/*/*

systemctl daemon-reload
systemctl restart systemd-journald

2、配置日志留存与容量

服务器若一直运行,则日志文件持续增长占满磁盘,需保证一定的留存周期定期清理,按照三级等保要求,日志留存至少需要保留6个月的时间,在/etc/systemd/journald.conf中设置参数

bash 复制代码
vi /etc/systemd/journald.conf

SystemMaxUse=5G #日志最大占用5G
MaxRetentionSec=180day #日志留存180天
SystemKeepFree=10G #预留10G磁盘空间

3、防日志篡改

启用日志落盘与完整性校验,配合文件监控工具,防止日志被删除或篡改

/etc/systemd/journald.conf文件中Storage参数默认值是auto,只要检测到/var/log/journal/目录存在,就自动将日志持久化存储到该目录下,且systemd-journald默认不会主动丢弃日志,除非磁盘满了或者达到容量限制。

使用AIDE工具监控日志目录

bash 复制代码
apt install aide
vi /etc/aide/aide.conf
# 定义校验规则(检查哈希、权限、属主等)
LOG_CHECK = p+i+n+u+g+s+md5+sha256
# 仅监控/var/log/journal目录
/var/log/journal/ LOG_CHECK
# 排除临时文件(可选)
!/var/log/journal/*/system.journal~
# 基线文件路径
database_in=file:/var/lib/aide/aide.db
database_out=file:/var/lib/aide/aide.db.new
database_new=file:/var/lib/aide/aide.db.new

初始化基线
aide --config=/etc/aide/aide.conf --init
mv /var/lib/aide/aide.db.new /var/lib/aide/aide.db

执行aide --check校验日志完整性

添加定时任务

bash 复制代码
crontab -e 
0 0 * * * /usr/bin/aide --config=/etc/aide/aide.conf --check >> /var/log/aide_check.log 2>&1

0x06 系统状态

Core dump状态

core dump时程序奔溃时生成的内存镜像文件,可能包含密码、密钥等敏感信息,若被攻击者获取会造成信息泄露。

关闭"程序奔溃时生成内存文件"的功能,避免敏感信息泄露。

bash 复制代码
# 限制用户/程序的配置文件
vi /etc/security/limits.conf 
# 在文件末尾添加
*    soft    core    0
*    hard    core    0

* soft core 0:"软限制",系统会提醒但不强制阻止,对所有用户来说,程序最多能生成的core dump文件大小是0,即不能生成;* hard core 0:"硬限制",是软限制的上限,系统强制阻止,彻底禁止生成core dump文件。

0x07 总结

安全策略的配置部署,需要反复验证测试,过程相对来说比较枯燥乏味,也耗费较多时间。验证过程也是问题一个接着一个来,挺让人头疼的,光口令复杂度及锁定就耗费了比较多的时间,主要体现在pam模块应用及修改,ssh&图形化登陆校验,还有faillock.conf全局配置文件的修改,faillock.so模块策略的顺序调整。虽然Debian许多配置跟Redhat/Centos不同,但是我觉得前篇一律,懂了相关的一些思路,其它的命令也是触类旁通。还有就是日志那块AIDE监控日志防篡改的,还要安装源包,我之前以为可以用Auditd平替,其实两者不同,AIDE倾向于静态哈希校验数据完整性,而Auditd则是倾向于操作溯源,记录who when do what,还是老老实实安装,整自定义监控规则,简单实操下。

总而言之,还是有收获的,以上就是我对Linux基线的简单配置,如果有啥错误的地方,也欢迎评论区大佬指出,我再加以改正。当然Linux基线安全检查当然不止这些,如果有大佬愿意分享下较为全面的基线安全检查内容的话,那我也不甚感激!

相关推荐
理人综艺好会5 小时前
Redis学习之go-redis
redis·学习·golang
kali-Myon5 小时前
快速解决 Docker 环境中无法打开 gdb 调试窗口以及 tmux 中无法滚动页面内容和无法选中复制的问题
运维·安全·docker·容器·gdb·pwn·tmux
黑客思维者5 小时前
为什么Linux常被提权操作?
linux·网络·安全
石像鬼₧魂石5 小时前
Fail2Ban核心架构学习
linux·学习·ubuntu
逑之5 小时前
学习使用typora
学习
wanhengidc6 小时前
云手机存在哪些技术瓶颈
运维·服务器·安全·智能手机·生活
走在路上的菜鸟6 小时前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
sszdlbw6 小时前
后端springboot框架入门学习--第一篇
java·spring boot·学习
秋深枫叶红6 小时前
嵌入式第三十五篇——linux系统编程——exec族函数
linux·前端·学习