服务器运维之安全防护篇

服务器运维   2023-11-02 17:25   61   0  

一、外部网络

推荐使用免费的cdn做内容转发,不仅可以提升客户的页面加载速度还有一定的防御作用。针对大规模的攻击需要购买高防的cdn防御。服务器网络的端口需要根据使用需要开放对应的端口,减少端口的暴露,云服务器需要设置对应的安全组策略,本地服务器需要配置NAT做端口转发。

同时需要配置禁止响应ping。

二、服务器登录

我们一般通过密码方式使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,禁用 root 账户登录、禁止密码的方式登录通过密钥方式登录。

1. 制作密钥对

首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:

[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 为公钥。

2. 在服务器上安装公钥

键入以下命令,在服务器上安装公钥:

[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

3. 设置 SSH,打开密钥登录功能

编辑 /etc/ssh/sshd_config 文件,进行如下设置:

RSAAuthentication yes
PubkeyAuthentication yes

禁止 root 用户通过 SSH 登录:

PermitRootLogin no

当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录:

PasswordAuthentication no

最后,重启 SSH 服务:

[root@host .ssh]$ service sshd restart

4. 将私钥下载到客户端,然后转换为 PuTTY 能使用的格式

使用 WinSCP、SFTP 等工具将私钥文件 id_rsa 下载到客户端机器上导入登录工具然后登录。

三、防火墙的策略

1、iptables

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

2、SCF

防火墙有助于过滤出入端口和阻止使用暴力法的登录尝试。我倾向于使用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地址都被屏蔽了,真是眼不见心不烦啊!

3、UFW 和 Firewalld

iptables很强大也很复杂,于是便有UFW和Firewalld。它们的命令简单清晰很多,底层都是调用iptables。

UFW

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

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;
  }
}

五、巡查

1、系统用户巡查

用户是Linux中安全加固的第一关,如果系统中本身就存在有安全隐患的用户,那么再安全策略也无法起到加固的效果。

在Linux系统中可以使用下面的命令查看系统中具有超级权限和登录shell权限的用户信息

cat  /etc/passwd  |  awk  -F:  '$3==0'    // 列出具有超级权限的用户
cat  /etc/passwd  |  grep  '/bin/bash'   // 列出具有登录shell的用户

2、系统服务巡查

一般情况下,系统可能会自动的运行一些不必要的服务,我们可以使用下面的命令查看当前默认开启运行的系统服务:

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
博客评论
还没有人评论,赶紧抢个沙发~
发表评论
说明:请文明发言,共建和谐网络,您的个人信息不会被公开显示。