作为一个程序员我们经常需要和Linux服务器打交道。无论是部署网站还是运行应用Linux服务器都是我们最常用的环境。但是很多程序员对Linux服务器的安全加固了解不多导致服务器存在各种安全隐患容易被黑客攻击。

今天就来分享一下Linux服务器安全加固的实战教程包括系统加固网络安全服务安全文件安全监控告警等希望能帮到大家。

1. 系统加固

1.1 系统更新

首先要确保系统是最新的及时安装安全补丁。

# CentOS/RHEL
yum update -y

# Ubuntu/Debian
apt-get update && apt-get upgrade -y

建议开启自动安全更新避免因为忘记更新而存在安全漏洞。

1.2 关闭不必要的服务

关闭不需要的服务减少攻击面。

# 查看所有运行的服务
systemctl list-units --type=service --state=running

# 关闭不需要的服务
systemctl stop service-name
systemctl disable service-name

常见不需要的服务包括:cups(打印),avahi-daemon(网络发现),postfix(邮件如不需要),等。

1.3 禁用不必要的用户

禁用不需要的系统用户减少风险。

# 查看所有用户
cat /etc/passwd

# 禁用用户
usermod -L username
# 或者删除用户
userdel -r username

1.4 密码策略

设置强密码策略避免弱密码被暴力破解。

编辑,/etc/security/pwquality.conf(CentOS 7+)或,/etc/pam.d/common-password(Ubuntu/Debian):

# 密码最小长度
minlen = 12
# 密码复杂度
dcredit = -1  # 至少1个数字
ucredit = -1  # 至少1个大写字母
lcredit = -1  # 至少1个小写字母
ocredit = -1  # 至少1个特殊字符

同时设置密码过期时间编辑,/etc/login.defs

PASS_MAX_DAYS 90    # 密码最大有效期90天
PASS_MIN_DAYS 7     # 密码最小修改间隔7天
PASS_WARN_AGE 7     # 密码过期前7天提醒

1.5 登录失败锁定

设置登录失败锁定防止暴力破解。

编辑,/etc/pam.d/sshd,添加:

auth required pam_tally2.so deny=5 unlock_time=300 even_deny_root root_unlock_time=600

这表示连续5次登录失败就锁定用户300秒root用户锁定600秒。

2. SSH安全

2.1 修改SSH默认端口

SSH默认端口是22很容易被扫描和攻击。修改为其他端口能减少被攻击的概率。

编辑,/etc/ssh/sshd_config

Port 22222

然后重启SSH服务:

systemctl restart sshd

注意:修改端口后要在防火墙中开放新端口避免自己也登不上去。

2.2 禁止root登录

禁止root用户直接登录使用普通用户登录后再su或sudo切换到root。

编辑,/etc/ssh/sshd_config

PermitRootLogin no

2.3 使用密钥登录

使用SSH密钥登录代替密码登录更安全也更方便。

首先在本地生成密钥,对:

ssh-keygen -t rsa -b 4096

然后把公钥上传到服务器:

ssh-copy-id -i ~/.ssh/id_rsa.pub user@server-ip

最后在服务器上禁用密码登录编辑,/etc/ssh/sshd_config

PasswordAuthentication no

2.4 限制登录用户

只允许指定用户登录SSH减少风险。

编辑,/etc/ssh/sshd_config

AllowUsers user1 user2

2.5 其他SSH安全设置

编辑,/etc/ssh/sshd_config

# 禁用空密码
PermitEmptyPasswords no
# 最大认证尝试次数
MaxAuthTries 3
# 登录超时时间
LoginGraceTime 30
# 禁用X11转发
X11Forwarding no
# 禁用TCP转发
AllowTcpForwarding no

3. 防火墙配置

3.1 启用防火墙

启用系统防火墙只开放需要的端口。

firewalld(CentOS 7+)

# 启动防火墙
systemctl start firewalld
systemctl enable firewalld

# 查看开放的端口
firewall-cmd --list-ports

# 开放端口
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=22222/tcp

# 移除端口
firewall-cmd --permanent --remove-port=22/tcp

# 重新加载配置
firewall-cmd --reload

ufw(Ubuntu/Debian)

# 启用防火墙
ufw enable

# 开放端口
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 22222/tcp

# 拒绝端口
ufw deny 22/tcp

# 查看状态
ufw status

3.2 只开放必要端口

原则上只开放必须的端口其他端口全部关闭。常见需要开放的端口:

  • 80:HTTP
  • 443:HTTPS
  • 22222:SSH(修改后的端口)

不需要开放的端口比如3306(MySQL),6379(Redis),等应该只允许本地访问或者通过内网访问不要暴露在公网。

4. 数据库安全

4.1 MySQL安全

禁止远程登录root:MySQL,root用户只允许本地登录禁止远程登录。

DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
FLUSH PRIVILEGES;

删除匿名用户

DELETE FROM mysql.user WHERE User='';
FLUSH PRIVILEGES;

删除测试数据库

DROP DATABASE IF EXISTS test;

设置强密码:确保所有数据库用户都有强密码。

绑定本地地址:编辑,/etc/my.cnf,让MySQL只监听本地:

bind-address = 127.0.0.1

4.2 Redis安全

绑定本地地址:编辑,/etc/redis.conf

bind 127.0.0.1

设置密码

requirepass your-strong-password

禁用危险命令

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS ""

5. Web服务安全

5.1 Nginx安全

隐藏版本号:编辑,nginx.conf

server_tokens off;

禁止访问敏感文件

location ~ /\.(ht|git|svn) {
    deny all;
}

限制请求大小

client_max_body_size 10m;

配置安全头

add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";

5.2 PHP安全

编辑,php.ini

# 禁用危险函数
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

# 关闭错误显示
display_errors = Off
log_errors = On

# 限制文件上传
upload_max_filesize = 10M
post_max_size = 10M

# 关闭远程文件包含
allow_url_include = Off
allow_url_fopen = Off

6. 文件权限安全

6.1 合理设置文件权限

# 目录权限
find /path/to/web -type d -exec chmod 755 {} \;

# 文件权限
find /path/to/web -type f -exec chmod 644 {} \;

# 上传目录设置为不可执行
chmod 755 /path/to/uploads
# 在Nginx中禁止上传目录执行PHP
location ~* ^/uploads/.*\.php$ {
    deny all;
}

6.2 设置不可变属性

对重要的配置文件设置不可变属性防止被篡改:

chattr +i /etc/passwd
chattr +i /etc/shadow
chattr +i /etc/group
chattr +i /etc/gshadow

7. 监控与告警

7.1 登录监控

监控SSH登录记录异常登录告警。

可以使用,/var/log/secure(CentOS)或,/var/log/auth.log(Ubuntu)查看登录日志。

也可以安装fail2ban自动封禁暴力破解的IP:

# CentOS
yum install fail2ban -y

# Ubuntu
apt-get install fail2ban -y

# 启动
systemctl start fail2ban
systemctl enable fail2ban

7.2 系统资源监控

监控CPU内存磁盘网络等资源使用情况异常时告警。

可以使用工具比如Zabbix,Prometheus,Grafana等也可以写简单的脚本监控。

7.3 日志审计

定期检查系统日志Web日志数据库日志等发现异常行为及时处理。

可以使用工具比如ELK(Elasticsearch + Logstash + Kibana),来集中管理和分析日志。

8. 定期备份

安全加固再好也不能保证100%,安全所以定期备份很重要。

8.1 数据备份

定期备份网站文件和数据库:

# 备份文件
tar -zcvf /backup/web-$(date +%Y%m%d).tar.gz /path/to/web

# 备份数据库
mysqldump -u root -p database_name > /backup/db-$(date +%Y%m%d).sql

8.2 异地备份

备份文件不要只存在服务器本地要同步到其他地方比如对象存储其他服务器等避免服务器故障导致备份也丢失。

8.3 定期恢复测试

定期做恢复测试确保备份是可用,的。很多人只备份不测试等到需要恢复的时候才发现备份损坏了就晚,了。

写在最后

以上就是Linux服务器安全加固的实战教程。服务器安全是一个系统工程需要从多个方面进行加固不能只靠某一个措施。

同时安全也不是一劳永逸的需要持续关注和维护。要及时更新系统和软件定期检查安全日志关注安全漏洞和威胁及时采取措施。

当然安全加固也要适度不要为了安全而影响正常的使用和性能。要根据自己的实际情况选择合适的安全措施。

最后提醒大家几句:

  1. 最小权限原则:只给予必要的权限不要给过多权限。
  2. 及时更新补丁:及时安装安全补丁修复已知漏洞。
  3. 定期备份数据:定期备份重要数据并且做恢复测试。
  4. 持续监控告警:持续监控系统状态异常时及时告警和处理。
  5. 学习安全知识:持续学习安全知识关注安全动态提升安全意识。

希望这篇教程能帮到大家让大家的服务器更加安全。如果有什么问题或者建议欢迎在评论区留言和我一起讨论。