更新于 

安全加固(Linux加固)

为不同的管理员分配不同的账号
  • 目的:根据不同用途设置不同账户账号,提高安全层级

  • 实施方法:

    • 创建多用途账号
      • useradd username
      • passwd username
    • 修改目录权限
      • chmod 750 directory
      • chown username:groupname directory
      • 普通账户使用特定授权命令:
        • sudo ifconfig
  • 修改sudo的提权应用

    • username
    • host=shell
  • 例如jerry可以在本地使用useradd命令

    • jerry localhost=/usr/sbin/useradd
      • 多个命令用“,”隔开
检查高权限文件
  • 目的:过高的权限或在不应该时间段创建或修的文件
  • 修改配置文件 etc/sudoer sudo 命令的配置文件
  • find / -type f \( -perm -00007 \) -a -ctime -1 | xargs -I {} ls -lh {}
    • ctime:属性变更
    • mtime:内容修改
    • atime:被访问
去除不需要的账号、修改默认账号shell环境
  • 目的:删除系统不需要的默认账号、更改危险账号的默认shell变量,降低被利用的可能性。
  • 实施方法
  • 删除/锁定多余用户与组
    • userdel -r username
    • groupdel groupname
    • passwd -l username
  • 修改程序账户的登录shell
    • usermod -s /sbin/nologin username
      将该账户变为程序账户/系统账户/伪账户

/etc/ssh/sshd_config ssh 配置文件
systemctl restart sshd 修改配置后重启ssh服务生效变更

限制超级管理员远程登录
  • 目的:限制具备超级权限的用户远程登录
    • 修改远程管理程序ssh的配置文件
    • vi /etc/ssh/sshd_config
    • PermitRootLogin yes
      • 修改为->permitRootLogin no
    • 启动服务
      • systemctl restart sshd
删除root以外UID为0的用户
  • 目的:减少被越权使用的可能性
  • 实施方法
    • 检查哪些账户的UID为0
      awk -F: '($3 == 0) { print $1 }' /etc/passwd
      /etc/passwd 文件进行逐行查找,以":"为分隔符对于第三列($3)为0 的行,显示第一列的值(print 0$1),即查找所有UID等于0的账户
    • 删除账户
      • userdel -r username
      • 或者编辑passwdshadow文件
不应存在位于高权组的账户
  • 目的:检查是否有账户获取过高权限
  • 实施方法
    • 检查哪些账户属于其他组
      • grep -v ^# /etc/login.defs |grep "^GID_MIN"|awk '{print $2}'
      • awk -F: '$3>500{print $1}' /etc/passwd | xargs -I {} grep {} /etc/group
      • grep -v "/sbin/nologin" /etc/passwd | awk -F : '{print $1}' | xargs -I {} grep {} /etc/group
      • 进行查找,显示不含 "/sbin/nologin"的账户,普通账户及root账户。对login.defs文件进行查找,反向筛选(-v),排除以"#"开头 (^#) 的行,实现过滤掉注释行的使用管道符号“|”上述结果传递给grep再次筛选查找,显示以"GID_MIN"开头的行(^GID_MIN)使用管道符 "|" 将上述结果传递给awk,显示第二列的值(print$2),最终实现显示GID_MIN的值。
缩短默认密码生存周期
  • 目的:对于采用静态密码认证的设备,
  • 账户密码的生存周期不长于90天
  • 实施方法
    • 修改文件密码策略文件

    • /etc/login.defs 密码策略文件

    • /etc/pam.d/system-auth pam 认证文件

    • /etc/security/pwquality.conf 新版本CentOs密码策略

    • /etc/pam.dsshd ssh登录策略文件

    • /etc/pam.d/login Linux登录策略文件

    • /etc/pam.dsshd ssh 登录策略文件

    • /etc/pam.d/login Linux登录策略文件

    • vi /etc/login.defs 密码策略文件

    • PASS_MAX_DAYS 90 最长使用期限

    • PASS_MIN_DAYS 0 最短使用期限

    • PASS_MIN_LEN 8 密码最小长度

    • PASS_WARN_AGE 7 最长期限到期前7天提醒更改密码

设置密码强度策略
  • 目的:规范使用高强度密码,延长被爆破的时间
  • 实施方法
    • 修改pam认证文件
    • /etc/pam.d/system-auth
  • 添加/修改内容
    • password requisite pam_cracklib.so try_first_pass retry=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1 minclass=3 minlen=8
centos 7 后设置密码复杂性
  • authconfig --passminlen=8 --update 密码最短8位
  • authconfig --enablereqlower --update 包含一个小写
  • authconfig --enablerequpper --update 包含一个大写
  • authconfig --enablereqdigit --update 包含一个数字
  • authconfig --enablereqother --update 包含一个字符

在文件/etc/security/pwquality.conf

设置强制密码历史
  • 目的:防止被社工字典破解
  • 实施方法
  • 修改pam认证文件
    • /etc/pam.d/system-auth
  • 添加/修改内容
    • password sufficient pam_unix.so sha512 shadow nullok try_first_pass use_authtok remember = 5
设置账户锁定策略
  • 目的:防止被连续试探密码,降低爆破可能性
  • 实施方法
    • 修改pam认证文件
      • /etc/pam.d/system-auth
      • /etc/pam.d/sshd
      • /etc/pam.d/login
  • 添加/修改内容
    • auth required pam_tally2.so deny=6 unlock_time=300 even_deny_root root_unlock_time=60
设置关键目录权限
  • 目的:在设备权限配置能力内,根据用户的企业需要,配置其所需的最小权限,以减少被非法访问的可能性
  • 实施方法
    • 更改账户主文件的权限设置
      • chmod 644 /etc/passwd
      • chmod 600 /etc/shadow
      • chmod 644 /etc/group
    • 去除多余的写入操作,例如
      • chmod -R go-w /etc
        • 作用: 将组成员(g)其他用户(o)可写权限移除(-w)
修改umask
  • 目的:修改创建文件或目录时候的默认权限,防止属于该组其他用户级别组的用户修改该用户的文件。
  • 实施方法
    • 修改启动脚本文件
      • /etc/profile
      • /etc/csh.login
      • /etc/csh.cshrc
      • /etc/bashrc
  • 启动脚本文件
  • umask 027 反码(值为027
  • 即生成的文件默认权限为777~027
    在文件末尾加入umask值
  • umask 027
限制硬件资源

目的:限制用户对系统资源的使用,避免DDOS等攻击

  • 实施方法

    • 修改限制文件
      • vi /etc/security/limits.conf
        • ps -aux 查看当前进程
        • ps -aux | grep httpd | wc -l 统计当前httpd的进程数
      • ~ /.bashrc 当前用户的登录启动脚本
      • alias ls = "ls -alh""ls -alh"命令重命名(设置别名)为"ls"
      • /etc/pam.d/su su 命令配置文件
      • gpasswd -a username wheel 将某用户加入wheel组
    • 加入以下内容
      • .*soft core 0
      • .* hard core 0
      • .* hard rss 5000
      • .* hard nproc 20
        image.png
  • 修改pam的本地登录文件

    • vi /etc/pam.d/login
  • 在文件末尾加入信息

    • session required /lib64/security/pam_limits.so
  • 日常收集进程数使用

    • ps aux | grep httpd | wc -l
对用户使用 ls rm 设置别名
  • 目的:让ls随时看清文件属性,让rm需要确认后删除目标实施方法
  • 实施方法:
    • 修改当前用户的登录启动脚本
      • vi ~/.bashrc
    • 追加别名命令
      • alias ls=“ls -alh”
      • alias rm=“rm -i
禁止任何人su为root账户

目的:避免任何人使用su切换到root,减少提权风险

  • 实施办法
    • 修改su的配置文件
      • /etc/pam.d/su
      • auth sufficient /lib.security/pam_rootok.so
  • 如果需要su 切换,将用户加入到wheel
    • gpasswd -a username wheel
去掉所有SUID和SGID

目的:防止被利用提权
全盘查找具有SUIDSGID的对象:

  • (-perm -0400 -o -perm -02000) 的对象
    • chmod ugo-s xxx
  • xxxSUIDSGID 属性
    • 全部 (ugo:user,group,others) 移除(-s)
  • find / -type f \( -perm -04000 -o -perm -02000 \) -exec ls -lg {} \;
    chmod ugo-s 对象
对开放目录设置粘滞位
  • 目的:允许小规模开放目录,用户作为暂存目录使用
  • 实施办法
    • 为/tmp目录添加粘滞位
    • chmod +t /tmp/
    • /tmp 目录添加粘滞位 (+t)
启用日志记录功能,使用日志服务器

image.png

  • 目的:增加审计功能,分布保存日志
  • 实施方法:
    • 修改应用服务器日志配置文件
      • vi /etc/rsyslog.conf
    • /etc/rsyslog.conf 日志统计程序 rsyslog配置文件
    • 确认关键日志审计是否存在
      • *.info;mail.none;authpriv.none;cron.none /var/log/message
      • authpriv.* /var/log/secure
    • 并添加两行转发日志信息
      • *.info;mail.none;authpriv.none;cron.none @ip地址
      • authpriv.* @ip地址
        image.png
  • 重启服务
    • systemctl restart rsyslog
  • 设置日志服务器的配置文件
    • vi /etc/rsyslog.conf
  • 开启接收日志功能
    • $ModLoad imudp
    • $UDPServerRun 514
    • $template Remote, "/var/log/%$YEAR%-%$MONTH%-%$DAV%/%fromhost-ip%.log" ` 远程日志路径
  • :fromhost-ip, !isequal, “127.0.0.1°?Remote 本地日志不存储远程服务
  • 重启服务
重要日志权限不应该高于640
  • 防止日志泄露敏感信息
    • ls -la /var/log/
    • chmod -R 640 /var/log
    • chattr +a /var/log/messages
      • /var/log/messages 增加底层属性a
    • chattr +i /var/log/message.**
      • /var/log/message 增加底层属性i
    • lsattr 查看文件的底层属性
设置关键文件底层属性
  • 目的:增强关键文件的底层属性,降低篡改风险
  • 语法:chattr [-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]
  • 实施方法:
    • 修改关键文件和日志的底层属性
    • chattr +a /var/log.messags
    • chattr +i /var/log.messages.*
    • chattr +i /var/shadow
    • chattr +i /var/passwd
    • chattr +i /var/group
    • 不只限于上述文件,可用lsattr查看更改结果
      • 不可修改,可追加
    • chattr +i
      • 锁死
      • chattr -i 解锁
    • 模式:
      • a:让文件或目录仅供附加用途。
      • b:不更新文件或目录的最后存取时间。
      • c:将文件或目录压缩后存放。
      • d:将文件或目录排除在倾倒操作之外。
      • i:不得任意更动文件或目录。
      • s:保密性删除文件或目录。
      • S:即时更新文件或目录。
      • u:预防意外删除。
关闭非机密远程管理telnet
  • 目的:降低被抓包后获取系统关键信息
  • 实施方法:
    • 修改telnet配置文件
      • `vi /etc/xinetd.d/telnet
      • /etc/xinetd.d/telnet telnet 配置文件
        • telnet
          • 作用:是一种明文传输的远程管理工具,应被淘汰
    • 确认/修改内容为
      • disable = yes
使用加密的远程管理ssh
  • 目的:使用安全套接字层加密传输信息,避免被`侦听``敏感信息。
  • 实施方法
    • 安装ssh软件
      • www.openssh.com下载
    • 修改配置文件
      • vi /etc/ssh/sshd_config
    • 禁止root登录,修改默认端口,开启v2版本
      • PermitRootLogin no
      • Port 20202
      • Protocol 2
    • 重启服务
      • systemctl restart sshd
设置访问控制列表
  • 目的:设置访问控制白名单,减少被入侵的风险
  • 实施方法
  • 修改拒绝策略
    • vi /etc/hosts.deny
  • 加入信息
    • ALL:ALL
  • 修改允许策略
    • vi /etc/hosts.allow
      • 主机访问白名单
    • vi /etc/hosts.deny
      • 主机访问黑名单
  • 加入信息
    • sshd:来访者IP地址
固化常用DNS解析
  • 目的:降低被DNS劫持的可能性
  • 作用:绕过浏览器拦截
  • 实施方法
  • 修改hosts文件
    • vi /etc/hosts
      • /etc/hosts DNS 解析配置文件
      • /etc/sysctl.conf 系统控制文件
      • sysctl -n net.ipv4.conf.all.accept_source_route
      • 查看sysctl中的该配置的参数(是否开启了路由
      • echo 0 > /proc/sys/net/ipv4/conf/all/accept_source 之后讲该参数修改为0

加入解析信息
61.59.123.22 www.baidu.com
访问IP 服务器域名

打开syncookie(TCP SYN)
  • 目的:缓解syn flood攻击
  • 实施方法:
    • 修改系统控制文件
      • vi /etc/sysctl.conf
      • net.ipv4.tcp_syncookies = 1
    • 配置生效
      • sysctl -p
不响应ICMP请求
  • 目的:不对ICMP请求作出响应,避免泄露信息
  • 实施方法:
  • 修改网络策略布尔值
    echo 1>/proc/sys/net/ipv3/icmp_echo_ignore_all
禁止处理无源路由
  • 目的:
    防止被无源数据包利用
  • 实施方法
    • 检查是否开启了路由功能
      • sysctl -n net.ipv4.conf.all.accept_source_route
      • echo 0>/proc/sys/net/ipv4/conf/all/accept_source_route
防御syn lood攻击优化
  • 目的:修改半连接上线,缓解syn flood攻击
  • 实施方法:
    • 查询当前半连接上限:
      sysctl net.ipv4.tcp_max_syn_backlog
      image.png
    • 修改半连接上限
      • sysctl -w
      • net.ipv4.tcp_max_syn_backlog=“2048"
FTP使用黑白名单限制
  • 目的:防止非法账户访问ftp

  • 实施方法

    • 检查黑名单文件是否包含高危账户
      • /etc/ftpusers
        • FTP用户配置`文件
      • root daemon bin sys adm lp uucp nuucp listen nobody noaccess nobody4
    • 使用白名单文件
      • /etc/user_list
        • 用户配置``文件
    • 配置文件中是否存在
      • userlist_deny=NO
      • userlist_enable=YES
FTP设置上传文件后的默认权限
  • 目的:防止被上传执行脚本
  • 实施方法
    • FTP 配置文件
    • 检查主配置文件/etc/vsftpd.conf是否存在如下内容
      • write_enable=YES
      • local_umask=022
      • anon_umask=022
FTP设置banner信息
  • 目的:防止泄露服务信息

  • 实施方法

    • 检查主配置文件/etc/vsftpd.conf是否存在如下内容

    • ftpd_banner=” Authorized users only. All activity may be monitored and reported.”

配置可信任的NTP服务器,并确保服务开启
  • 目的:保持时间同步,防止某些服务错误
  • 实施方法
    • /etc/ntp.conf NTP配置`文件
    • 检查主配置文件/etc/ntp.conf是否存在如下内容
      • server X.X.X.X
    • 确保服务被启用
      • systemctl enable ntpd
      • systemctl status ntpd
检查账户目录中是否存在高危文件
  • .netrc、.rhosts
  • ~/.netrc 远程登录配置文件
  • 目的:防止被使用远程登录漏洞
    • ps -aux | grep -E "lockd|nfsd|statd|mountd"
  • 实施方法
    • 检查账户家目录中是否存在远程主机文件
    • for DIR in cut -d":" -f6 /etc/passwd do if [ -e $DIR/.netrc ]; then echo "$DIR/.netrc" fi done 无返回值则表示正常
打补丁,装补丁
  • 可以使系统版本为最新并解决安全问题
  • 实施方法
    • 使用yum更新
    • yum update
      • 使用rpm安装
      • 访问http://www.redhat.com/corp/support/errata下载补丁
      • rpm -Fvh rpm
    • 所有补丁需要在测试环境测试不影响业务服务后才可更新,下载补丁时,一定对文件进行签名核实
关闭NFS服务
  • 目的:防止被外挂文件系统,导致入侵

  • 实施方法

    • 检查是否存在敏感进程
      • ps aux | grep -E "lockd|nfsd|statd|mountd"
  • 检查关闭NFS相关服务

    • systemctl list-unit-files | grep nfs
    • systemctl disable nfs-client.target
关闭无用服务
  • 目的:关闭无用服务,提高系统性能,减低漏洞风险
  • 实施方法
    • 检查有哪些自启动服务,并记录列表
      • systemctl list-unit-files | grep enabled
    • 禁用无用服务
      • systemctl stop 服务名
      • systemctl disabled 服务名
        查看当前进程,是否有名为 lockdnfsdstatdmountd 的进程正在运行。
  • systemctl list -unit-files | grep nfs
  • 查看所有服务,筛选出名为nfs的服务
  • systemctl disable nfs-client.target
  • 关闭nfs服务
    systemctl list-unit-files | grep enabled
  • 查看所有服务,并筛选出所有自启动服务
    systemctl stop xxx
  • 停用xxx服务(立即终止该服务,但不影响下次系统使用)
    systemctl disable xxx
  • 禁用xxx服务(下次系统启动不再自动启动该服务)
建议关闭的服务
  • 建议:如无需要,建议关闭或者卸载功能
  • 服务列表
    • rpm -qa | grep -E "^amanda|^chargen|^chargen-udp|^cups|^cups-lpd|^daytime|^daytime-udp|^echo|^echo-udp|^eklogin|^ekrb5-telnet|^finger|^gssftp|^imap|^imaps|^ipop2|^ipop3|^klogin|^krb5- telnet|^kshell|^ktalk|^ntalk|^rexec|^rlogin|^rsh|^rsync|^talk|^tc pmux-server|^telnet|^tftp|^time-dgram|^time-stream|^uucp
隐藏系统提示信息
  • 目的:避免通过系统提示信息获取系统状态

  • 实施方法

    • 查看登录banner信息
      • cat /etc/issue
    • 清空banner文件
      • echo > /etc/issue
设置登录超时注销
  • 目的:防止疏忽导致命令行被他人使用
  • 实施方法
    • 修改/etc/profile
    • vi /etc/profile
      • 在HISTFILESIZE下面加入
      • TMOUT=180
    • 生效
      • source /etc/profile
减少history历史数量
  • 目的:降低之前操作被窃取的风险

  • 实施方法

    • 修改/etc/profile
    • vi /etc/profile
    • 修改信息
      • HISTFILESIZE=50
        生效
    • source /etc/profile
跳过grup菜单
  • 目的:防止在grup菜单对引导过程进行修改
  • 实施方法
    • 修改grup配置文件
      • vi /boot/grup2/grup.cfg
    • 修改等时
      • set timeout=0
关闭ctrl+alt+del重启功能
  • 目的:防止误操作重启服务器

  • 实施方法

    • 修改配置文件

      • vi /usr/lib/systemd/system/ctrl-alt-del.target
    • 注释所有内容

挖矿病毒需要排查/etc/profile todo

其他终端设备
  • 天擎 (奇安信/360)

    • 企业终端安全防护软件 ≈ 360杀毒企业版
  • EDR = Endpoint Detect &Respones 终端检测响应

  • rpm -qa 显示当前所有通过rpm安装的软件包

  • cat /etc/issue 查看登录banner信息

  • echo > /etc/issue 清空banner文件

  • /boot/grub2/grub.cfg 系统启动引导配置文件

  • /usr/lib/systemd/system/ctrl-alt-del.target

  • ctrl + alt +del 快捷键的配置文件