从零开始的VPS生活 Vol1-2:初见CentOS7——基础安全

建立一台新的虚拟机,兴致勃勃地登上去,结果发现已经有几十上百次错误密码登录的记录…没办法,总有一些人想借这种手段,完成他们不可告人的目的,我们只能通过一些防御措施,尽可能地减少明显地安全问题,让服务器稳定运行。

用户和sudo

供应商的面板通常提供了root用户和它对应的密码,但是直接用root是不太好的,它太强了,操作的风险更大,一旦泄露也更加危险。所以可以建立一个普通用户,并且给它sudo的权限(这样类似于Windows的“管理员”),是一种有效的折衷手段。

建立一个用户,假设用户名是noobear

adduser noobear

修改密码

passwd noobear

Vultr为了安全,对密码的复杂度检查进行了一些改写,让非复杂密码完全不能被设置,如果希望设置不那么复杂的密码,需要把> /etc/pam.d/system-auth中:

 password requisite pam_pwquality.so try_first_pass > local_users_only retry=3 authtok_type= > enforce_for_root

改为

 password requisite pam_pwquality.so try_first_pass > local_users_only retry=3 > authtok_type=enforce_for_root

就是去掉一个空格,这样密码安全策略就变成只限root生效的了。虽说这样才是CentOS的默认配置,不过密码还是复杂点好~

为用户添加sudo权限,只需要执行以下命令

gpasswd -a noobear wheel

这个命令的意思是把用户添加到wheel用户组,这个组是CentOS定义的特权组,别的系统可能会叫sudo组之类的。这种方法可以避免直接修改对root都只读的/etc/sudoers。

之后,就可以使用自己的用户登录,在需要执行高权限操作的时候,使用sudo+命令,这样可以避免很多误操作的产生。

这个系列是以root用户执行操作为前提的,如果用普通用户,注意在高权限操作前加sudo。


SSH安全

SSH是登录服务器大门,一些简单的设置,就可以提升它的安全性。

具体包括:使用密钥对登录、修改连接端口、阻止root登录*等

使用密钥对登录

可以使用Vultr的控制面板添加ssh的公钥,这样它会出现在/home/.ssh,为root用户使用。你可以将它移动或者复制到想要进行密钥对登录的用户目录下。

同时,在用户目录下建立.ssh/authorized_keys文件,权限为700,也可以配置ssh登录。

配置和生成密钥对可以在Xshell的“用户身份验证”页面,方法选择Public Key并进行进一步操作。

配置好key之后,修改/etc/ssh/sshd_config文件

RSAAuthentication yes
PubkeyAuthentication yes

你也可以彻底禁用密码登录。同样修改上面的文件。但是并不推荐这样,强密码配密钥对更合理一些。

PasswordAuthentication no

修改连接端口

SSH的端口就好比锁眼的位置,黑客知道固定的端口,所以会批量进行实验,寻找密码薄弱的机器。所以修改它能减少很多被大范围攻击波及的分险。

修改/etc/ssh/sshd_config文件

# 假设端口使用666,可以选择任意端口,不跟常用端口重复即可
# 要去掉前面的#注释
Port 666

阻止root登录

同样修改/etc/ssh/sshd_config文件

PermitRootLogin no

这样就可以禁止root用户的直接远程登录了(sudo su命令依旧可以切换到root用户)

要注意,禁止root用户直接登录在某些奇葩情况下会造成一些烦恼(比如某人遇到不小心移走了/usr导致没sudo命令最终移不回去的情况),设置前请注意。

最后,重启ssh服务(如果提前开启了防火墙,请务必先开放端口)。

如果换了端口,记得去掉原来的22端口。

firewall-cmd --permanent --remove-service=ssh

firewalld防火墙

注意:防火墙设置可能会导致连不上SSH端口,务必先开放端口再重新连接。已经连接上的SSH并不会因为防火墙改变而中断,所以调整完毕务必开启新的终端测试,保留原连接以防万一。

firewalld防火墙本质上还是iptable的一个前端,但是命令变得更灵活(比如支持reload),命令也更长了…

虽说他支持网卡分区(zone),rich-rule等等高端功能,其实我们最初用到的功能只有开关端口而已,所以,先要知道如何进行这最简单的操作。

如果习惯了iptables,禁用firewalld重新使用回iptables非常容易,也不会出现兼容问题。

举个例子:

systemctl start firewalld
firewall-cmd --permanent --add-port=666/tcp
firewall-cmd --reload

以上是永久开启666端口的TCP协议(但没有开启UDP),重载让它生效。firewalld的命令虽长,但是非常好懂,毕竟它就是英文嘛~

不加permanent的话,规则就会在下一次firewalld服务重启的时候消失。

按照上面的写法举一反三,就能知道如何开放和关闭需要的端口了。要开放的比如http的80/tcp,https的443/tcp,(如果有)ftp的20/tcp、21/tcp端口等,可以按需调整。

记得启用firewalld服务,它不是默认启用的…可以考虑在初始设置完成后再启动它。

systemctl enable firewalld

还有尽可能减少服务…

emm…暂时先关闭一个邮件发送服务。

systemctl stop  postfix
systemctl disable postfix

如果发现了其他不想要的服务,照此关闭即可。