VPS装机记录(1):SSH篇

前段时间趁黑五折扣,买了个小鸡1来玩,由于是什么都没有的centos系统,因此一切装机都要靠自己来,也顺便记录一下自己的心得。

首先,开启一台VPS后,第一步肯定是登录上去,才能进行后续的操作,而我们的VPS平时放在网上,肯定有一堆无聊的人会去扫端口,密码爆破这种无聊的事情,所以我们第一步是保证服务器的登录安全。

我想要达到的目的是这样的,以下方法均是在centos7上:

  1. 修改SSH默认的22端口
  2. 使用fail2ban去屏蔽多次尝试密码的IP
  3. 禁止root用户直接登录
  4. 使用密码加 Google Authenticator 2步验证进行登录
  5. 或使用有密码的SSH密钥进行登录

1. 修改SSH端口

修改ssh端口需要修改ssh配置、修改firewall配置、修改SElinux配置三个文件,以下均是使用管理员权限执行。

1.1 修改/etc/ssh/sshd_config文件

vi /etc/ssh/sshd_config进入该文件,找到Port 22这一行,然后在下面添加一行如Port 43作为新的端口,注意在确定可以使用新端口登录前,不要注释Port 22这一行,以免无法登录。

1.2 修改firewall配置

firewall-cmd --zone=public --add-port=43/tcp --permanent # firewall添加你选择的ssh端口,--permanent是保存设置,否则下次重启后不生效
systemctl start firewalld # 若firewall未启动,则先启动
firewall-cmd --reload # 重新加载firewall
firewall-cmd --zone=public --query-port=43/tcp # 查看端口是否添加成功,yes表示成功,no表示未添加成功

1.3 修改SELinux配置

这一步有的VPS可能是关闭SELinux的,就不需要修改;但是默认应该是打开了SELinux的,因此推荐修改。

semanage port -l | grep ssh # 查看当前SELinux允许的ssh端口

如果显示semanage command not found,则

yum provides semanage # 或 yum whatprovides semanage
yum -y install policycoreutils-python # 安装
/usr/sbin/sestatus -v # 查看SELinux状态,enabled即为开启状态

若未开启,则vi /etc/selinux/config,将SELINUX=disabled修改为SELINUX=enforcing,需要重启。

semanage port -a -t ssh_port_t -p tcp 443 # 添加ssh端口
semanage port -l | grep ssh # 再执行一次查看是否添加成功

1.4 重启服务,并测试是否成功

systemctl restart sshd  
systemctl restart firewalld.service  
shutdown -r now # 重启机器,最好重启一下

重启后使用新端口进行ssh登录,测试是否添加成功。

ssh [email protected] -p 43 # 使用-p指定端口

登录成功后vi /etc/ssh/sshd_configPort 22这一行注释,并继续重启服务以生效。

2. 使用fail2ban去屏蔽多次尝试密码的IP

修改默认ssh端口后已经可以防御很多只扫描特定端口的脚本,但是还是有被密码爆破的风险,因此我们安装fail2ban来屏蔽多次尝试密码的坏人。

yum -y install epel-release # CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install fail2ban # 安装fail2ban

vi /etc/fail2ban/jail.local来新建fail2ban的配置,复制以下配置作为默认规则:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 43
# 这里的43为你修改后的端口
action = %(action_mwl)s
logpath = /var/log/secure

上面的配置为十分钟内,如果连续错误超过5次,就ban掉这个IP。

输入systemctl start fail2ban启动fail2ban。fail2ban-client status sshd显示fail2ban的状态,查看是否有被攻击的记录。

3. 禁止root用户直接登录

前面由于要修改、安装各种服务,因此使用root账户比较方便。但在VPS的实际使用中,首先我们要避免被坏人攻陷,直接root登录;其次我们要避免使用root用户执行危险的操作,发生意外,所以我们禁止root用户直接登录,新建一个拥有sudo权限的用户,平时使用其来登录和执行操作,减低风险。

useradd newone # 新建名为newone的用户
passwd newone # 设置newone的密码

注意!!!该步骤非常重要,否则新用户可能无法登录。输入vi /etc/ssh/sshd_config,使用AllowUsers newone添加可以ssh登录的用户,systemctl restart sshd重启ssh服务。

修改上一步后,保留一个终端窗口,测试新用户是否能成功登录,如果能成功登录,则禁用root用户登录。vi /etc/ssh/sshd_config修改其中PermitRootLogin yesPermitRootLogin nosystemctl restart sshd重启ssh服务。此时root账户已经无法登录。

4. 使用密码加 Google Authenticator 2步验证进行登录

比较安全的SSH登录方式,一种是禁止密码且只允许密钥登录,只要保证密钥的安全,就能保证登录的安全;而另外一种2步验证的方法了。这里我们会用到Google Authentication,其实很多网站/App已经运用到2步验证了。

4.1 安装Google Authenticator

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install google-authenticator

切换到要使用Google Authenticator的用户,然后输入google-authenticator,屏幕会显示一个超大的二维码,你需要使用支持Google Authenticator的软件,扫描该二维码或者输入“secret key”以生成动态的验证码。

红色方框就是“secret key”,而绿色方框中是临时密码,这几个密码使用一次就会失效;后面的选择可以参考我的设置;另外,Google Authenticator会在当前用户的home目录生成.google_authenticator文件,如果你需要更换,删掉该文件,然后重新生成即可。

4.2 修改配置

修改pam配置文件,vi /etc/pam.d/sshd,在首行加入auth required pam_google_authenticator.so,这样子在输入密码登录之前,会先要求输入Google Authentication的验证码,如果是希望反过来,则将这行代码写入到pam配置文件的最后则可;

修改ssh配置文件,vi /etc/ssh/sshd_configChallengeResponseAuthentication no修改为ChallengeResponseAuthentication yes

检查系统时间,

#查看下服务器时间
date
#如果时区不一样,再使用命令修改为本地时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

最后,在保留一个活动的终端窗口的前提下,重启ssh服务,systemctl restart sshd,然后重新登录该用户测试是否成功(登录失败也有可能是因为终端软件的问题,比如,尝试更换软件)。

5. 使用有密码的SSH密钥进行登录

其实,使用密钥进行登录已经算非常安全了,但是为了更加安全,我们还可以给密钥文件添加密码。建议在自己的常用工作电脑上使用密钥登录服务器,而在其他电脑上则保留使用密码登录的方式。

使用密钥登录,我们会生成非对称加密的一对密钥(不清楚非对称加密是什么?看看阮一峰老师的这篇文章),分别称之为“私钥”和“公钥”。如果公钥加密的信息只有私钥才能解开,那么只要私钥不泄露,通信就是安全的。

(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。

(2)甲方获取乙方的公钥,然后用它对信息加密。

(3)乙方得到加密后的信息,用私钥解密。

而我们使用密钥来进行登录也是这样,将公钥放在远程要登录的服务器上,从远程发送过来的数据,只有我们在本地的私钥才能解读,从而保证两者之间的通信是安全的。

5.1 生成密钥对

在终端输入ssh-keygen来生成密钥,默认会保存在~/.ssh/id_rsa,可以自定义该文件的地址和名称,例如~/.ssh/remote_server。然后会询问是否添加密钥,默认是不设置密码的,这里我输入了设定的密码。然后会生成密钥文件,其中你指定的路径就是私钥文件,而.pub结尾的就是公钥文件。

然后在本地的~/.ssh/config中添加以下代码,用于指定密钥

Host RemoteServer # 随意自己起,但是要用到
    HostName 102.133.250.111 # 修改为服务器的地址,域名或IP
    User newone # 指定登录的用户
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/remote_server # 指定私钥的地址
    Port 43 # 默认端口为22,如果你修改了端口,则修改为对应的端口

5.2 将公钥存放到目标服务器上

打开目标服务器的目标用户的~/.ssh路径,然后将.ssh/remote_server.pub文件的内容复制到~/.ssh/authorized_keys里,如果没有~/.ssh文件夹则参考以下代码,先localhost登录一次。

$ ssh localhost # 输入密码登录
The authenticity of host 'localhost (::1)' can't be established.
ECDSA key fingerprint is SHA256:DYd7538oOsqpIIDTs01C3G4S6PRE7msA91yUgk9Dzxk.
ECDSA key fingerprint is MD5:88:80:21:03:b2:52:6b:06:ff:c7:3b:d5:2d:47:c9:ad.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
[email protected]'s password: 
Last login: Sat Dec 14 19:49:07 2019 from localhost
$ exit

登录过后就会生成~/.ssh文件夹了。注意~/.ssh目录权限必须为700,~/.ssh/authorized_keys权限必须为600。

5.3 修改配置文件

又来到熟悉的配置文件,输入vi /etc/ssh/sshd_config,将该文件添加以下3行,如果已有则改成一样的。

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

然后systemctl restart sshd重启ssh服务。

在本地使用类似ssh [email protected]的命令进行登录,如果登录成功则说明设置生效了。

至此,我们所希望的5个目标已经完全实现了。

Reference

  1. 1台独立服务器开出来的多台虚拟机,叫作小鸡