服务器安全篇之三【系统安全】
设计者:普金
服务器安全全篇含:
服务器安全篇之一【网络安全】
服务器安全篇之二【ssh安全】
服务器安全篇之三【系统安全】
服务器安全篇之四【数据库灾备与恢复】
服务器安全篇之五【入侵检测】
服务器安全篇之六【入侵处理】
上篇讲解了Linux系统安全中最重要的一块ssh安全,接下来我们讲解一下Linux系统安全的加固和防御。
1、 用户帐号和环境
a) 将root管理员名称修改为rootadmin
useradd -u 0 -g 0 -o rootadmin
useradd pso
b) 清除除root用户外其他所有用户的登录权限
#cat /etc/passwd | grep -v ^root | grep ‘/bin/bash’ | awk -F : ‘{print $1}’
c) 验证是否有账号存在空口令的情况
#awk -F: ‘($2 == “”){print $1}’ /etc/shadow
d) 检查除了root以外是否还有其它账号的UID为0
#awk -F: ‘($3 == 0) { print $1 }’ /etc/passwd
e) 用户的home目录许可权限设置为700
用户home目录的许可权限限制不严可能会导致恶意用户读/修改/删除其它用户的数据或取得其它用户的系统权限
f) 为用户设置合适的缺省umask值
为用户设置缺省的umask值有助于防止用户建立所有用户可写的文件而危及用户的数据
g) 限制能够su为root 的用户
只有wheel组的用户可以su到root
h) 设置自动注销时间
vi /etc/profile TMOUT=600无操作600秒后自动退出
i) 防止IP欺骗
#vi /etc/host.conf 添加:nospoof on 不允许服务器对IP地址进行欺骗
2、 系统访问认证和授权
a) 限制普通用户一些命令不可用
如 shutdown kill rm –rf 等关键命令
b) 更改登录banner
/etc/mot
改变登录banner可以隐藏操作系统类型和版本号和其它系统信息,这些信息可以会对攻击者有用
c) 限制root用户登录或最好用密钥登录
通常应该以普通用户身份访问系统,然后通过其它授权机制(比如su命令和sudo)来获得更高权限,这样做至少可以对登录事件进行跟踪
d) 设置守护进程掩码
/etc/rc.d/init.d/functions
系统缺省的umask 值应该设定为022以避免守护进程创建所有用户可写的文件
3、 核心调整
主要调整优化一些系统参数和网络参数,提升系统整体性能,及实现轻量的DDOS syn flood防御等
fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 75
net.ipv4.tcp_keepalive_time = 75
net.ipv4.ip_local_port_range = 1024 65000
4、 关闭不必要的服务
关系多余或不需要用到的服务
systemctl list-unit-files | grep enable 过滤查看启动项如下
abrt-ccpp.service enabled abrt为auto bug report的缩写 用于bug报告 关闭
abrt-oops.service enabled ----------------------
abrt-vmcore.service enabled ----------------------
abrt-xorg.service enabled ----------------------
abrtd.service enabled ----------------------
auditd.service enabled 安全审计 保留
autovt@.service enabled 登陆相关 保留
crond.service enabled 定时任务 保留
dbus-org.freedesktop.NetworkManager.service enabled 桌面网卡管理 关闭
dbus-org.freedesktop.nm-dispatcher.service enabled ----------------------
getty@.service enabled tty控制台相关 保留
irqbalance.service enabled 优化系统中断分配 保留
kdump.service enabled 内核崩溃信息捕获 自定
microcode.service enabled 处理器稳定性增强 保留
NetworkManager-dispatcher.service enabled 网卡守护进程 关闭
NetworkManager.service enabled ----------------------
postfix.service enabled 邮件服务 关闭
rsyslog.service enabled 日志服务 保留
snmpd.service enabled snmp监控 数据抓取 保留
sshd.service enabled ssh登陆 保留
systemd-readahead-collect.service enabled 内核调用–预读取 保留
systemd-readahead-drop.service enabled ----------------------
systemd-readahead-replay.service enabled ----------------------
tuned.service enabled
default.target enabled 默认启动项 multi-user.target的软连接 保留
multi-user.target enabled 启动用户命令环境 保留
remote-fs.target enabled 集合远程文件挂载点 自定
runlevel2.target enabled 运行级别 用于兼容6的SysV 保留
runlevel3.target enabled ----------------------
runlevel4.target enabled ----------------------
5、 开启系统审计服务
审计内容包括:系统调用、文件访问、用户登录等。编辑/etc/audit/audit.rules,在文中添加如下内容:
-w /var/log/audit/ -k LOG_audit
-w /etc/audit/ -p wa -k CFG_audit
-w /etc/sysconfig/auditd -p wa -k CFG_auditd.conf
-w /etc/libaudit.conf -p wa -k CFG_libaudit.conf
-w /etc/audisp/ -p wa -k CFG_audisp
-w /etc/cups/ -p wa -k CFG_cups
-w /etc/init.d/cups -p wa -k CFG_initd_cups
-w /etc/netlabel.rules -p wa -k CFG_netlabel.rules
-w /etc/selinux/mls/ -p wa -k CFG_MAC_policy
-w /usr/share/selinux/mls/ -p wa -k CFG_MAC_policy
-w /etc/selinux/semanage.conf -p wa -k CFG_MAC_policy
-w /usr/sbin/stunnel -p x
-w /etc/security/rbac-self-test.conf -p wa -k CFG_RBAC_self_test
-w /etc/aide.conf -p wa -k CFG_aide.conf
-w /etc/cron.allow -p wa -k CFG_cron.allow
-w /etc/cron.deny -p wa -k CFG_cron.deny
-w /etc/cron.d/ -p wa -k CFG_cron.d
-w /etc/cron.daily/ -p wa -k CFG_cron.daily
-w /etc/cron.hourly/ -p wa -k CFG_cron.hourly
-w /etc/cron.monthly/ -p wa -k CFG_cron.monthly
-w /etc/cron.weekly/ -p wa -k CFG_cron.weekly
-w /etc/crontab -p wa -k CFG_crontab
-w /var/spool/cron/root -k CFG_crontab_root
-w /etc/group -p wa -k CFG_group
-w /etc/passwd -p wa -k CFG_passwd
-w /etc/gshadow -k CFG_gshadow
-w /etc/shadow -k CFG_shadow
-w /etc/security/opasswd -k CFG_opasswd
-w /etc/login.defs -p wa -k CFG_login.defs
-w /etc/securetty -p wa -k CFG_securetty
-w /var/log/faillog -p wa -k LOG_faillog
-w /var/log/lastlog -p wa -k LOG_lastlog
-w /var/log/tallylog -p wa -k LOG_tallylog
-w /etc/hosts -p wa -k CFG_hosts
-w /etc/sysconfig/network-scripts/ -p wa -k CFG_network
-w /etc/inittab -p wa -k CFG_inittab
-w /etc/rc.d/init.d/ -p wa -k CFG_initscripts
-w /etc/ld.so.conf -p wa -k CFG_ld.so.conf
-w /etc/localtime -p wa -k CFG_localtime
-w /etc/sysctl.conf -p wa -k CFG_sysctl.conf
-w /etc/modprobe.conf -p wa -k CFG_modprobe.conf
-w /etc/pam.d/ -p wa -k CFG_pam
-w /etc/security/limits.conf -p wa -k CFG_pam
-w /etc/security/pam_env.conf -p wa -k CFG_pam
-w /etc/security/namespace.conf -p wa -k CFG_pam
-w /etc/security/namespace.init -p wa -k CFG_pam
-w /etc/aliases -p wa -k CFG_aliases
-w /etc/postfix/ -p wa -k CFG_postfix
-w /etc/ssh/sshd_config -k CFG_sshd_config
-w /etc/vsftpd.ftpusers -k CFG_vsftpd.ftpusers
-a exit,always -F arch=b32 -S sethostname
-w /etc/issue -p wa -k CFG_issue
-w /etc/issue.net -p wa -k CFG_issue.net
重启服务
开启审计后可用aureport定期生成升级报告并发送到运维人员检测
6、 禁止Control-Alt-Delete 键盘重启系统命令
默认配置:
ls /usr/lib/systemd/system/ctrl-alt-del.target
加固方案:
1.备份配置文件
cp -a /usr/lib/systemd/system/ctrl-alt-del.target /usr/lib/systemd/system/ctrl-alt-del.target.default
2.移除该原源文件
rm -rf /usr/lib/systemd/system/ctrl-alt-del.target
7、 最大文件打开数
默认配置:
ulimit –n
1024
加固方案:
1.备份配置文件
cp -a /etc/security/limits.conf /etc/security/limits.conf.default
2.添加以下两行配置到该文件最后
- soft nofile 65535
- hard nofile 65535
8、 用户最大进程数
默认配置
cat /etc/security/limits.d/20-nproc.conf
#Default limit for number of user’s processes to prevent
#accidental fork bombs.
#See rhbz #432903 for reasoning.
-
soft nproc 4096
root soft nproc unlimited
加固方案:
1.备份配置文件
cp -a /etc/security/limits.d/20-nproc.conf /etc/security/limits.d/20-nproc.conf.default
2.修改配置文件vim /etc/security/limits.d/20-nproc.conf
-
soft nproc 65535
-
hard nproc 65535
9、 开启防火墙
我习惯使用iptables,就以iptables来做防火墙吧,默认centos7之后是用firewalld。我们要先关闭firewalld并安装iptables服务
Systemctl stop firewalld;systemctl disable firewalld;yum install iptables-services
iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。在日常Linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全。
iptables基础
iptables的规则表和链
表(tables):提供特定的功能,iptables内置了4个表,即
filter表(实现包过滤)
nat表(网络地址转换)
mangle表(修改数据标记位规则表)
raw表(跟踪数据表规则表)
链(chains):当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
INPUT(入站数据过滤)
OUTPUT(出站数据过滤)
FORWARD(转发数据过滤)
PREROUTING(路由前过滤)
POSTROUTING(路由后过滤)
–>PREROUTING–>路由决定----->FORWARD------------->POSTROUTING
| ^
| |
INPUT--->LOCAL PRECESS-->OUTPUT
语法格式 :
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作
常用命令:
-A 追加规则–>iptables -A INPUT
-D 删除规则–>iptables -D INPUT 1(编号)
-R 修改规则–>iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则–>iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则–>iptables -L INPUT 列出规则链中的所有规则,默认是filter表,如果列出nat表的规则需要添加-t,即iptables -t nat -L
-N 新的规则–>iptables -N allowed 定义新的规则
通用参数:
-p 协议 例:iptables -A INPUT -p tcp
-s源地址 例:iptables -A INPUT -s 192.168.1.1
-d目的地址 例:iptables -A INPUT -d 192.168.12.1
-sport源端口 例:iptables -A INPUT -p tcp --sport 22
-dport目的端口 例:iptables -A INPUT -p tcp --dport 22
-i指定入口网卡 例:iptables -A INPUT -i eth0
-o指定出口网卡 例:iptables -A FORWARD -o eth0
-j 指定要进行的处理动作
常用的ACTION:
DROP:丢弃
REJECT:明示拒绝
ACCEPT:接受
SNAT基于原地址的转换
source–指定原地址
MASQUERADE:源地址伪装
REDIRECT:重定向:主要用于实现端口重定向
MARK:打防火墙标记的
RETURN:返回 在自定义链执行完毕后使用返回,来返回原规则链
示例:
1 空当前的所有规则和计数:
iptables -F
iptables -X
iptables -Z
2 允许ssh远程
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
3 允许本地环回
iptables -A INPUT -i lo -j ACCEPT
4 设置默认规则
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
5 配置黑白名单
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT/DROP
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT/DROP
6 开启端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已经建立的连接得让它进来
7 保存规则
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改动之前先备份,请保持这一优秀的习惯
iptables-save > /etc/sysconfig/iptables
iptables高级
屏蔽IP
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP #屏蔽单个IP
iptables -I INPUT -s 123.45.6.0/24 -j DRO #屏蔽IP端
指定转发接口
iptables -A FORWARD -o eth0
启动转发
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 1.1.1.1 #内网上网
端口映射
iptables -t nat -A PREROUTING -d 1.1.1.1 -p tcp --dport 2222 -j DNAT --to-dest 192.168.1.101:22
#本机2222端口映射到192.168.1.101的22端口
字符串匹配
iptables -A INPUT -p tcp -m string --algo kmp --string “weidaima” -j REJECT --reject-with tcp-reset
#收到tcp协议含weidaima的字符串则丢弃
Iptables延伸
防windows蠕虫攻击
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string “cmd.exe”
防DDOS攻击
#防御syn洪水攻击
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
#防止DOS大量连接
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#抵御DDOS攻击
iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
防CC攻击
当web站点受到严重的cc攻击,我们可以用iptables来防止web服务器被CC攻击,实现自动屏蔽IP的功能。Iptables版本大于1.3.7,iptables需要安装kernel-smp-modules-connlimit模块。
配置规则示例:
(1) 控制单个IP的最大并发连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
(2) 控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
验证:
1模拟攻击 ab命令
2 实时查看攻击机与80端口连接数
watch ‘netstat -tunap | grep 80 | grep<模拟攻击客户机的IP>| wc -l’
3 查看iptables DROP的攻击机包数
watch 'iptables -L -n -v | grep<模拟攻击客户机的IP>'