(9)让你的服务器更安全
上一篇文章介绍了使用秘钥对登录服务器的好处。
本文使用服务器为Centos 7.6
除了使用密钥对之外,只能确保我们的服务器是安全的,但是并不能确保我们的应用是安全的。
为什么这么说?
以MySQL来说,我们希望在我的电脑可以连接我服务器的MySQL服务,那必然需要我的服务器开放3306端口,那么这个端口是暴露在公网的,如果你的密码简单,很容易就会被攻击。
类似的还有Redis 6389这些端口。
如果要使服务安全,最好的方法就是不暴露公网的端口,只允许本地的服务访问。那这样也不现实,业务上还需要连接数据库查询。
还有就是服务器的权限问题,root用户权限过大,密码过于简单。
可以查看一下本地的/var/log/secure
文件,记录了外界尝试登录你服务器的IP、用户名、端口:
如果你的密码过于简单,服务器就很容易被黑了。
以下介绍几种方法让你的服务更安全。
# 一、后台配置安全组规则
安全组规则是云厂商提供的访问规则。
安全组可以设置允许登录服务器的IP和端口,还有暴露到公网的允许端口。
安全组一共有两个:
- 入站规则
表示登入服务器的允许,如果我常用的IP是 192.168.0.12
,协议端口为 22
,那么我设置了这个入站规则,就只能允许这个IP和端口登录服务器。
如果你要搭建了一个网站,就需要放通 Web 服务 HTTP 或 HTTPS 访问,即 80 和 443 端口,否则外部就不能访问。
可以设置多个允许登录的IP,支持IP段:
- 出站规则
表示服务器不可以访问外部特定的 IP 地址。
这种场景一般比较少。
安全组是一种虚拟防火墙。
如果打开了防火墙,又打开了安全组,如果防火墙未放开端口,安全组放开了,这种情况下端口也是无法访问的。
# 二、防火墙
# 1、firewall
你在服务商后台配置了安全组,其最终也是修改了防火墙。
但并不是所有的云厂商提供的服务器都有安全组的概念,如果没有,就需要我们自行配置服务器的防火墙了。
# 1、防火墙状态
两种方法查看防火墙状态:(显示 running 表示已开启)
systemctl status firewalld
firewall-cmd --state
以下表示防火墙开启:
如果显示 -bash: firewall: command not found
表示防火墙没有安装。
需要手动安装:
yum install firewalld systemd -y
启动:
systemctl start firewalld.service
关闭:
systemctl stop firewalld.service
重启:
systemctl reload firewalld.service
查看指定防火墙端口是否开放:
firewall-cmd --query-port=8080/tcp
提示 yes 或者 no
查询所有打开的端口:
firewall-cmd --zone=dmz --list-ports
开放防火墙端口:
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6666" accept"
firewall-cmd --zone=public --add-port=8080/tcp --permanent
--permanent
表示永久生效,如果没有加表示防火墙重启失效。
关闭/移除服务器端口:
firewall-cmd --remove-port=8080/tcp --permanent
在RHEL7里有几种防火墙共存:firewalld、iptables、ebtables,默认是使用firewalld来管理netfilter子系统,不过底层调用的命令仍然是iptables等。
# 2、iptables
firewalld跟iptables比起来至少有两大好处:
1、firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效;
2、firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
转自 —— https://www.cnblogs.com/grimm/p/10345693.html
如果你本地开启了防火墙,未开放80端口,而在云厂商后台开放了该端口,这种情况也是不能访问80端口的。
现在Centos7默认使用的是firewall
作为防火墙,而不是iptables
,如果要使用iptables
,先把firewall
停用,再安装iptables
即可。
查看本地是否存在iptables
:
vi /etc/sysconfig/iptables
查看发现是个空文件,表示还没有安装。
iptables
安装:
yum install iptables-services
执行:
service iptables save
再查看一下/etc/sysconfig/iptables
文件
可以看到文件存在了,而且默认只开放了22端口。
查看iptables
状态:
service iptables status
绿色的active表示 iptables 是已经运行:
启动/停止/重启 iptables
:
service iptables start/stop/restart
如果执行命令的时候提示:
Redirecting to /bin/systemctl status firewalld.service
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
因为centos7 大部分命令都需要 systemctl ,而不是 service,例如
service firewalld status
改成systemctl status firewalld
即可
# 三、修改sshd_config
ssh是linux远程登录的安全协议,是 C/S 模式的架构,配置文件分为服务器端配置文件 [/etc/ssh/sshd_config]
与 用户配置文件[~/.ssh/config]
上一章节使用SSH密钥对就是通过修改
~/.ssh/config
sshd_config
是服务端主配置文件,定义了一系列的安全访问规则。
打开 /etc/ssh/sshd_config
vi /etc/ssh/sshd_config
# 1、修改端口、协议
默认的SSH端口是22,入侵者常用22端口暴力撞库。
#更改SSH端口,最好改为五位数以上,攻击者扫描到端口的机率也会下降。
Port 10000
#禁用版本1协议, 因为其设计缺陷, 很容易使密码被黑掉。
Protocol 2
# 2、设置特定 用户、IP 登录
允许特定ip、用户登录
AllowUsers aliyun test@192.168.1.1,root@192.168.*
# 拒绝 zhangsan、aliyun 帐户通过 SSH 登录系统
DenyUsers zhangsan aliyun #Linux系统账户
如果没有开启防火墙,强烈推荐这种方法,以免被第三方暴力破解
# 3、禁止root用户登录
#尝试任何情况先都不允许 Root 登录. 生效后我们就不能直接以root的方式登录了,我们需要用一个普通的帐号来登录,然后用su来切换到root帐号
PermitRootLogin no
# 4、禁用空密码登录
#禁止空密码登陆
PermitEmptyPasswords no
修改完sshd文件,最后记得重启sshd服务
service sshd restart
以上就是一些简单的安全设置方法。
最后的效果就是自从我设置后,服务器超过1年也没被侵入过。