最近总结了一下linux服务器的安全加固问题,主要针对web服务器,centos系统和ubuntu系统,下面是我罗列的比较常规的安全设置项目,大家不一定每项都进行设置,但是要清楚原理,理论上来讲 都设置后服务器会非常安全,如果存在挂马的问题,基本是程序漏洞导致。由于linux系统上设置非常繁琐,不清楚的人可能会改错配置文件,所以写了一个shell脚本来方便在服务器上自定义设置,可以下载:
服务器上可直接运行:
wget http://www.gaoshan.me/download/shell/linux_safe.sh && chmod +x linux_safe.sh && bash linux_safe.sh
以下是安全加固的流程
1、 帐号安全设置:
(1) 配置/etc/login.defs,修改PASS_MIN_LEN,设置帐号密码的最小长度值,建议在6位以上
(2) 启用安全的密码策略,设置密码不能和旧密码一样,同时包含大小写字幕,数字,特殊字符
a、Ubuntu系统需要安装libpam-cracklib
$ sudo apt-get install libpam-cracklib –y
然后修改/etc/pam.d/common-password
添加
password
requisite pam_cracklib.so
retry=3 minlen=密码长度 difok=3 ucredit=-1
lcredit=-1 dcredit=-1 ocredit=-1
b、centos系统将规则添加到/etc/pam.d/system-auth中
password
requisite pam_cracklib.so
retry=3 minlen=密码长度 difok=3 ucredit=-1
lcredit=-1 dcredit=-1 ocredit=-1
(3) 对账户登录失败做安全限制,比如登录失败三次锁定60秒
添加配置
auth required pam_tally2.so deny=3
unlock_time=60
到文件/etc/pam.d/sshd
(4) 创建普通用户,禁止root登录,使用普通用户sudo或者su切换为root进行管理(可选)
(5) 检查服务器内的帐号,
A、 锁定不需要的有登录权限的用户
B、 检查/etc/passwd 第三列UID为0的用户(会自动切换成root),建议删除
C、 检查/etc/shadow第二列,将空密码的用户设置密码
2、 网络安全设置
(1) 设置主机禁止icmp包,禁ping
(2) 通过在/etc/sysctl.conf中添加配置,进行网络安全防护,该配置可在网上搜索相应的配置项,常见的可设置:
net.ipv4.tcp_syncookies 1 syn_flood启用cookie
net.ipv4.tcp_fin_timeout 2 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接“
net.ipv4.tcp_synack_retries 3 减少发送syn+ack包时重试次数(缓解SYN攻击)“
net.ipv4.tcp_syn_retries 3 减少发送syn包时重试次数(缓解SYN攻击)“
net.ipv4.tcp_max_syv_backlog 4096 增加backlog队列(缓解SYN攻击)
3、 系统安全设置
(1)锁定核心配置文件,使用chattr +i /etc/passwd
/etc/shadow /etc/group /etc/gshadow /etc/gshadow /etc/fstab
(2)增加系统文件描述符(可以避免因为这个值太小而引起的Too many open
files 的错误)
用户描述符,可通过ulimit –n查看,如需修改可将配置写入/etc/security/limits.conf
系统总文件描述符fs.file-max=1048575 >> /etc/sysctl.conf
(3) 设置默认的umask值,增强安全性
目前系统默认值一般是0022,我们可调整为0027,修改/etc/profile实现
(4) 记录所有用户的登录和操作日志
将如下代码写入/etc/profile文件底部
history 2. USER=`whoami` 3. USER_IP=`who -u am i 2>/dev/null| awk '{print $NF}'|sed -e 's/[()]//g'` 4. if [ "$USER_IP" = "" ]; then 5. USER_IP=`hostname` 6. fi 7. if [ ! -d /var/log/history ]; then 8. mkdir /var/log/history 9. chmod 777 /var/log/history 10. fi 11. if [ ! -d /var/log/history/${LOGNAME} ]; then 12. mkdir /var/log/history/${LOGNAME} 13. chmod 300 /var/log/history/${LOGNAME} 14. fi 15. export HISTSIZE=4096 16. DT=`date +"%Y%m%d_%H:%M:%S"` 17. export HISTFILE="/var/log/history/${LOGNAME}/${USER}@${USER_IP}_$DT" 18. chmod 600 /var/log/history/${LOGNAME}/*history* 2>/dev/null
保存后的效果是会记录每个登录用户的操作命令,登录时间,日志存放在/var/log/history/用户名 的目录下,每次用户退出登陆后会生成日志。增加操作系统操作的安全性。
4、 时间同步设置
Ubuntu系统可设置
timedatectl set-timezone Asia/Shanghai 可将配置加入计划任务
echo “*/5 * * * * root timedatectl
set-timezone Asia/Shanghai” >> /etc/crontab
centos系统可设置
ntpdate time.windows.com || timedatectl set-timezone
Asia/Shanghai
echo “*/5 * * * * /usr/sbin/ntpdate
time.windows.com” >> /etc/crontab
5、 端口安全设置
(1)屏蔽所有udp端口
只开放时间同步的123和dns的53端口,也可根据用户使用情况屏蔽部分tcp端口
(2)修改远程端口(可选)
如果用户是默认的配置,可以修改一个远程端口,告知他以增强安全性
6、 安全软件安装
安装云锁,保留默认设置即可,开启操作系统安全加固
参考文章:
https://help.aliyun.com/knowledge_detail/49809.html
https://www.cnblogs.com/doublexi/p/9720122.html
安全加固脚本下载(点击下载):http://www.gaoshan.me/download/shell/linux_safe.sh
脚本使用说明:
服务器上执行:
wget http://www.gaoshan.me/download/shell/linux_safe.sh && chmod +x linux_safe.sh && bash linux_safe.sh
目前脚本经过我在实际网站运行环境测试,支持centos6,7、ubuntu系统,下载后执行脚本
# bash safe.sh
1、 帐号安全设置
(1) 设置帐号密码最小长度(输入数字,建议6位以上):
说明:需要输入至少6位以上纯数字作为密码长度
写入配置文件:
/etc/login.defs
参数:
PASS_MIN_LEN
(2) 是否启用密码强度策略? ( y设置 n跳过)
说明:这里会要求设置帐号最小长度位(以上面设置默认一致),新密码不能和旧密码相同,同时包含大字母、小写字母和数字
Centos写入配置:
/etc/pam.d/system-auth
参数:
password
requisite pam_pwquality.so
try_first_pass local_users_only retry=3 authtok_type= difok=3 minlen=’$len’ ucredit=-1 lcredit=-1
dcredit=-1
Ubuntu写入配置:
/etc/pam.d/common-password
参数:
password
requisite pam_cracklib.so
retry=3 minlen=’$len’ difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1
(3) 是否对账户登录失败做限制?[y继续n跳过]
选y会询问是否针对root也这样设置[y继续n跳过]
说明:登录失败3次锁定60秒
写入配置:
/etc/pam.d/sshd
参数:
auth required pam_tally2.so deny=3
unlock_time=60 (如果是对root限制,再增加配置even_deny_root root_unlock_time60)
(4) 是否禁止root账户ssh登录?[y继续n跳过]
如果设置y,禁止root登录后需要创建普通用户登录管理[y继续n跳过]
N跳过设置
写入配置:
/etc/ssh/sshd_config
参数:
PermitRootLogin No
A、这里在新建用户的同时,会将新建的用户分配到wheel组中,这样只有这个新建的用户才能su到root账号下
写入配置:
/etc/login.defs
参数:SU_WHEEL_ONLY yes
写入配置:
/etc/pam.d/su
参数:
Ubuntu:auth required
pam_wheel.so
Centos:auth required pam_wheel.so use_uid
B、新建的用户允许使用基本的命令:
写入配置:
/etc/sudoers
参数:
Ubuntu:%sudo ALL=(ALL:ALL) ALL
Centos: %wheel ALL=(ALL) ALL
(5) 服务器帐号安全检测
这里会检测三项
A、 系统中具备登录权限的帐号,如果存在会要求选择是否禁用该帐号
检查存在的可登录的帐号:
awk -F: ‘($7==”/bin/bash”){print
$1}’ /etc/passwd
禁用
passwd –l 帐号名
usermod -s /usr/sbin/nologin 账号名
Root帐号被限制不能锁定:
B、 系统UID为0的用户有(正常应该只有root,uid为0的用户会自动切换为root,危害很大)
检测使用:
awk -F: ‘($3==0)’ /etc/passwd
C、 检查存在空密码的用户,如果有,则需要设置密码
检测使用:
awk -F: ‘($2==””)’ /etc/shadow
2、 网络安全设置
(1) 设置禁止ping
禁止:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
允许:echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
写入配置文件
/etc/rc.local
(2) 配置一些tcp优化参数(主要防护syn攻击,增大服务器处理能力)
脚本中使用函数来进行控制,可以写入参数,值和提示信息
写入配置:
/etc/sysctl.conf
参数优化可参考:
https://www.cnblogs.com/doublexi/p/9720122.html
3、 系统及文件安全
(1) 使用chattr锁定一些核心配置文件
这里执行了
chattr +i /etc/passwd /etc/shadow
/etc/group /etc/gshadow /etc/gshadow /etc/fstab
lsattr /etc/passwd /etc/shadow /etc/group
/etc/gshadow /etc/gshadow /etc/fstab
如果选择n,则会有解锁文件的选项
(2) 文件描述符扩充(可以避免因为这个值太小而引起的Too many open files 的错误)
包含两个控制:
A、 单个用户描述符
查看ulimit -n
B、 系统总的文件描述符
查看cat /proc/sys/fs/file-max
修改
(3) 设置默认的umask值,增强安全性
修改/etc/profile 中umask的默认值(默认为022),修改为027
(4) 记录所有用户的登录和操作日志
写入配置:
/etc/profile
内容可参考:
https://help.aliyun.com/knowledge_detail/49809.html
文章最后的配置
这个执行需要等待服务器重启,或者脚本执行完后手工执行source /etc/profile
4、时间准确的设置
将时间同步写入计划任务:
Centos
echo “*/5 * * * * /usr/sbin/ntpdate
time.windows.com” >> /etc/crontab
Ubuntu
echo “*/5 * * * * root timedatectl
set-timezone Asia/Shanghai” >> /etc/crontab
5、 端口安全设置
(1) 禁用所有udp端口,只开放53和123
A、ubuntu使用ufw来配置(ubuntu的iptables规则有点问题,暂时没用)
ufw default deny
ufw allow 53/udp
ufw allow 123/udp
B、centos使用iptables来控制,先写入
iptables -A OUTPUT -m udp -p udp –dport 53 -j ACCEPT
iptables -A OUTPUT -m udp -p udp –dport 123 -j ACCEPT
iptables -A OUTPUT -p udp -j DROP
iptables-save > /etc/sysconfig/iptables
重启对应服务
(2) 修改远程端口(可选)
6、安全软件安装
服务器安全软件建议使用云锁,目前测试下来效果不错,脚本中我已将安装进行自动化判断,只需要选择安装与否即可。安装云锁后很多文件都将会被限制写入。
———————-
安全加固脚本下载(点击下载):http://www.gaoshan.me/download/shell/linux_safe.sh
———————-
2019年3月6日 16:56:24 更新v1.01
(1)centos下判定udp端口已存在 53和123的情况,将已存在规则清除再导入iptables表,导入后列出规则
(2)增加文件描述符最大判定,系统描述符大于100w用户描述符大于6w则跳过扩容设置
(3)增加脚本部分注释
2019年5月9日 11:48:17 更新v1.02
修复了脚本加固后可能导致部分应用不监听ipv4的端口,只监听ipv6地址的问题