推荐使用免费的cdn做内容转发,不仅可以提升客户的页面加载速度还有一定的防御作用。针对大规模的攻击需要购买高防的cdn防御。服务器网络的端口需要根据使用需要开放对应的端口,减少端口的暴露,云服务器需要设置对应的安全组策略,本地服务器需要配置NAT做端口转发。
同时需要配置禁止响应ping。
我们一般通过密码方式使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,禁用 root 账户登录、禁止密码的方式登录通过密钥方式登录。
首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:
[root@host ~]$ ssh-keygen <== 建立密钥对 Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): <== 按 Enter Created directory '/root/.ssh'. Enter passphrase (empty for no passphrase): <== 输入密钥锁码,或直接按 Enter 留空 Enter same passphrase again: <== 再输入一遍密钥锁码 Your identification has been saved in /root/.ssh/id_rsa. <== 私钥 Your public key has been saved in /root/.ssh/id_rsa.pub. <== 公钥 The key fingerprint is: 0f:d3:e7:1a:1c:bd:5c:03:f1:19:f1:22:df:9b:cc:08 root@host
密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。
现在,在 root 用户的家目录中生成了一个 .ssh 的隐藏目录,内含两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。
键入以下命令,在服务器上安装公钥:
[root@host ~]$ cd .ssh [root@host .ssh]$ cat id_rsa.pub >> authorized_keys
如此便完成了公钥的安装。为了确保连接成功,请保证以下文件权限正确:
[root@host .ssh]$ chmod 600 authorized_keys [root@host .ssh]$ chmod 700 ~/.ssh
编辑 /etc/ssh/sshd_config 文件,进行如下设置:
RSAAuthentication yes PubkeyAuthentication yes
禁止 root 用户通过 SSH 登录:
PermitRootLogin no
当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录:
PasswordAuthentication no
最后,重启 SSH 服务:
[root@host .ssh]$ service sshd restart
使用 WinSCP、SFTP 等工具将私钥文件 id_rsa 下载到客户端机器上导入登录工具然后登录。
Linux的防火墙那肯定是iptables。
最高的防火墙策略是:全部关闭,逐个开启。
但这对于大多数人来说太复杂了,所以一般情况下我们只需要关注INPUT链即可。
(1)首先,清除原有的iptables规则。
在保证iptables所有链的默认规则为ACCEPT的前提下,使用以下命令:
iptables -F iptables -X iptabels -Z
(2)配置INPUT链规则
iptables -A INPUT -p tcp -m tcp --dport 28536 -j ACCEPT // 允许 ssh 的端口通过 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT // 允许已建立的和服务器发起的数据包通过 iptables -L INPUT // 列出 INPUT 表中规则 iptables -I INPUT -p tcp --dport 3306 -j ACCEPT // 允许3306端口TCP协议访问 iptables -I INPUT -p udp --dport 500 -s xxx.xxx.xxx.xxx -j ACCEPT // 允许IP为xxx.xxx.xxx.xxx通过udp访问本地500端口 iptables -P INPUT DROP // 丢弃所有未允许通过的数据包
效果:除了28536也就是ssh,任何访问服务器的数据包都将被拒绝。
注意:
在你配置了上述3条命令后,尝试从一个新的ssh连接登录服务器,如果登录成功。可以保存iptables规则:
service iptables save
如果出现任何意外你还可以通过重启服务器来返回iptables原来的状态,所以在测试iptables可以正确满足需求后再保存是一个好习惯。
最后:保证所有必须的服务器是开机自启的
chkconfig sshd on chkconfig iptables on
防火墙有助于过滤出入端口和阻止使用暴力法的登录尝试。我倾向于使用SCF(Config Server Firewall)这个强力防火墙。它使用了iptables,易于管理,而且对于不擅于输入命令的用户提供了web界面。
要安装CSF,先登录到服务器,切换到这个目录下:
cd /usr/local/src/
然后以root权限执行下面命令:
wget https://download.configserver.com/csf.tgztar -xzf csf.tgzcd csfsh install.sh
只需等待安装程序完成,然后编辑CSF的配置文件:
vim /etc/csf/csf.conf
默认情况下CSF是以测试模式运行。通过将“TESTING”的值设置成0,切换到product模式。
TESTING = "0"
下面要设置的就是服务器上允许通过的端口。在csf.conf中定位到下面的部分,根据需要修改端口:
# 允许入站的 TCP 端口 TCP_IN = "20,21,25,53,80,110,143,443,465,587,993,995,16543" # 允许出站的 TCP 端口 TCP_OUT = "20,21,22,25,53,80,110,113,443,587,993,995,16543" # 允许入站的 UDP 端口 UDP_IN = "20,21,53" # 允许出站的 UDP 端口# 要允许发出 traceroute 请求,请加 33434:33523 端口范围到该列表 UDP_OUT = "20,21,53,113,123"
请根据需要逐一设置,推荐只使用那些需要的端口,避免设置对端口进行大范围设置。此外,也要避免使用不安全服务的不安全端口。比如只允许端口465和587来发送电子邮件,取代默认的SMTP端口25。(LCTT 译注:前提是你的邮件服务器支持 SMTPS)
重要:千万不要忘记允许自定义的 ssh 端口。
允许你的IP地址通过防火墙,而绝不被屏蔽,这一点很重要。IP地址定义在下面的文件中:
vim /etc/csf/csf.ignore
被屏蔽了的IP地址会出现在这个文件中:
more /etc/csf/csf.deny
一旦完成更改,使用这个命令重启csf:
systemctl restart csf
下面是在某台服务器上的csf.deny文件的部分内容,来说明CSF是很有用的:
211.216.48.205 # lfd: (sshd) Failed SSH login from 211.216.48.205 (KR/Korea, Republic of/-): 5 in the last 3600 secs - Fri Mar 6 00:30:35 2015 103.41.124.53 # lfd: (sshd) Failed SSH login from 103.41.124.53 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:06:46 2015 103.41.124.42 # lfd: (sshd) Failed SSH login from 103.41.124.42 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 01:59:04 2015 103.41.124.26 # lfd: (sshd) Failed SSH login from 103.41.124.26 (HK/Hong Kong/-): 5 in the last 3600 secs - Fri Mar 6 02:48:26 2015 109.169.74.58 # lfd: (sshd) Failed SSH login from 109.169.74.58 (GB/United Kingdom/mail2.algeos.com): 5 in the last 3600 secs - Fri Mar 6 03:49:03 2015
可以看到,尝试通过暴力法登录的IP地址都被屏蔽了,真是眼不见心不烦啊!
iptables很强大也很复杂,于是便有UFW和Firewalld。它们的命令简单清晰很多,底层都是调用iptables。
UFW是Ubuntu下防火墙:
// 启动ufw systemctl start ufw // 停用ufw systemctl stop ufw
以下是常用命令:
// 查询ufw开启状态,打印规则 ufw status // 允许80端口访问 ufw allow 80 // 拒绝8000端口访问 ufw deny 9000 // 拒绝ip为xxx.xxx.xxx.xxx访问 ufw deny from xxx.xxx.xxx.xxx // 允许通过tcp协议,9000-9002访问 ufw allow 9000:9002/tcp // 删除规则 ufw delete allow http
Firewalld是Fedora/CentOS 8之后版本自带的防火墙:
// 启动firewalld systemctl start firewalld // 停用firewalld systemctl stop firewalld
以下是常用命令:
// 允许tcp协议8161端口访问,--zone(作用域),--permanent(永久生效) firewall-cmd --zone=public --add-port=8161/tcp --permanent //重新载入一下防火墙设置,使设置生效 firewall-cmd --reload //可通过如下命令查看是否生效 firewall-cmd --zone=public --query-port=8161/tcp //如下命令可查看当前系统打开的所有端口 firewall-cmd --zone=public --list-ports // 重新加载规则firewall-cmd --reload// 将80端口的流量转发至8080 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 // 将80端口的流量转发至192.168.0.1 firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.0.1 // 将80端口的流量转发至192.168.0.1的8080端口 firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080 //比如我们现在需要关掉刚刚打开的22端口 firewall-cmd --zone=public --remove-port=22/tcp --permanent 批量开放端口,如从100到500这之间的端口我们全部要打开 firewall-cmd --zone=public --add-port=100-500/tcp --permanent 批量限制端口为 firewall-cmd --zone=public --remove-port=100-500/tcp --permanent firewall-cmd --reload 限制IP为192.168.0.200的地址禁止访问80端口即禁止访问机器 firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.200" port protocol="tcp" port="80" reject" 解除刚才被限制的192.168.0.200 firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.0.200" port protocol="tcp" port="80" accept" 限制10.0.0.0-10.0.0.255这一整个段的IP,禁止他们访问 firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="80" reject" 打开限制为 firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="10.0.0.0/24" port protocol="tcp" port="80" accept"
1、业务IP和端口隐藏
通过反向代理来隐藏真实的IP和端口,降低了DDoS攻击的风险,也进一步提升了服务器的安全性。
server { listen 80; listen [::]:80; listen 443 ssl http2; listen [::]:443 ssl http2; server_name nas.yuyue2017.cn 192.168.0.175; index index.php index.html index.htm default.php default.htm default.html; root /www/blog.yuyue2017.cn; location /edu/ { proxy_pass http://127.0.0.1:8080 } location /vod/ { proxy_pass http://192.168.17.129:8081 } }
2、Nginx内配置SSL证书
SSL证书对客户端与网站、应用之间的传输数据加密,防止数据中途被窃取,维护数据完整性,防止被篡改。
if ($server_port !~ 443){ rewrite ^(/.*)$ https://$host$1 permanent; } ssl_certificate /www/blog.yuyue2017.cn/fullchain.pem; ssl_certificate_key /www/blog.yuyue2017.cn/privkey.pem; ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; add_header Strict-Transport-Security "max-age=31536000"; error_page 497 https://$host$request_uri;
3、设置负载均衡代理
反向代理服务器可以充当“流量指挥官”,它位于后端服务器的前面,负责将客户端请求分发到一组服务器,并最大限度地提高速度和容量利用率,同时确保无任何服务器过载,以免出现性能下降的情况。如果某台服务器发生故障,则负载均衡器会将流量重定向到其它在线的服务器。
upstream backend_servers { ip_hash; server 192.168.1.1:8080 weight=1; server 192.168.1.2:9090 weight=1; } server { listen 80; server_name example.com; location / { proxy_pass http://backend_servers; } }
用户是Linux中安全加固的第一关,如果系统中本身就存在有安全隐患的用户,那么再安全策略也无法起到加固的效果。
在Linux系统中可以使用下面的命令查看系统中具有超级权限和登录shell权限的用户信息
cat /etc/passwd | awk -F: '$3==0' // 列出具有超级权限的用户 cat /etc/passwd | grep '/bin/bash' // 列出具有登录shell的用户
一般情况下,系统可能会自动的运行一些不必要的服务,我们可以使用下面的命令查看当前默认开启运行的系统服务:
chkconfig --list | grep "3:on"
如果我们只是提供web服务,那么对于sendmail、nfs、postfix、ftp等不需要的服务就可以关闭了,关闭的命令是:
chkconfig <servername> off
为防止不能预料的系统故障或用户不小心的非法操作,必须对系统进行安全备份。除了对全系统进行每月一次的备份外,还应对修改过的数据进行每周一次的备份。同时,应该将修改过的重要系统文件存放在不同服务器上,以便出现系统崩溃时(通常是硬盘出错),可以及时地将系统恢复到正常状态。
vim mysql_backup.sh
#!/bin/bash # 数据库名称 database_name="mydb" mysql_password="" # 备份文件保存地址 backup_dir="/mydata/backup/mydb" # 备份文件名前缀 backup_prefix="demo" # 备份文件的有效期,单位为day backup_days="15" dd=`date +%Y-%m-%d-%H-%M-%S` backup_file="$backup_dir/$backup_prefix-$dd.sql" if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi mysqldump -u root -p$mysql_password $database_name > $backup_file # 压缩sql文件 gzip -f $backup_file # 写创建备份日志 echo "create $backup_dir/$database_name-$dd.dupm" >> $backup_dir/log.txt # 清除过期的文件 find $backup_dir -name "$backup_prefix*.sql.gz" -mtime +$backup_days -exec rm {} \;
每日自动备份【添加计划性任务】
[root@localhost cron]# chmod +x backup.sh #每天早上3:30自动执行脚本进行数据库备 [root@localhost cron]# crontab -e 30 3 * * * /bin/bash /yuyue/cron/mysql_backup.sh >> /dev/null 2>&1 检查定时任务 [root@localhost cron]# crontab -l