配置云主机

对云主机进行一些增强安全性和便捷性的配置:创建新账户,本地通过密钥免密码登录,关闭root登录,去掉sudo的密码,以及2FA验证登录。 Modified: 2023-07-04 20:24:23 Created: 2021-06-26 07:32:50 Tags: #cloud #linux

获得云主机帐户和密码后,须进行一些配置,提升安全性和使用便捷性:

  1. 提升安全性

目的是防止暴力破解密码:

  • 关闭 root 帐户远程登陆(防暴力破解密码)
  • 添加新帐户(降低帐户风险)
  • 开启密钥登陆(基于密钥文件验证登陆)
  • 添加二次验证登陆(需要输入密码和验证码才能登陆)2FA/MFA
  1. 增强易用性

目的是增加使用的方便,主要有:

  • 配置本地ssh config文件简化本地登录命令
  • 新建帐户sudo时无需输入密码

1 提升安全性

1.1 新建帐户并添加sudo权限

通常拿到的是 root 帐户,但 root 帐户有两个问题:

  1. 权限太大,误操作容易让系统崩溃,如删除系统文件
  2. 帐户名众所周知,只需破解密码即可远程登陆,风险较高

为确保安全,需新建一帐户作为主要帐户:

  1. 该帐户有sudo权限,而且可以 ssh 登陆
  2. 同时禁止 root 帐户 ssh 登陆

新帐户执行其它权限操作时候需要添加sudo和输入密码,会在一定程度上减小误操作。关闭 root 帐户 ssh 登陆之后,若要获得系统权限,须同时破解帐户名和密码,安全性大大提升。

禁用 root 帐户登陆之前,必须确保新建帐户能够 ssh 登陆。否则禁用 root 帐户 ssh 登陆之后就无法用 ssh 登陆机器了。

1.1.1 添加新用户

sudo useradd userA # add a new account
sudo passwd userA # set password for userA

其中passwd命令也可修改其它已知帐户密码。

1.1.2 添加sudo权限

userA 需要添加sudo权限才能进行sudo dnf upgrade等操作。有两种方式:

sudo vim /etc/sudoers
sudo visudo

两种方式本质都是修改/etc/sudoers文件,在文件最后添加一行:

userA ALL = ALL : ALL

这里添加到配置文件最后一行添加,原因是/etc/sudoers配置文件后面项目会覆盖前面项目

1.1.3 测试新帐户登陆和sudo权限

此时 userA 可以远程登陆,且可以sudo操作。此时进行测试:

先不要关闭 root 帐户的登陆,客户端新开终端,用 userA 帐户登陆并执行sudo操作(如sudo cat /etc/sudoers),查看是否成功。

如果失败,则登陆 root 账户重新操作。后面还有其它操作,需要 root 账户保底,暂时先不要关闭 root 账户 ssh 登陆。

1.2 配置密钥验证登陆

1.2.1 密钥登陆原理

登陆远程服务器有多种验证方式,可参考redhat 给出的说明。除密码验证之外,另一种常见方式是密钥验证。登陆过程中服务器会验证客户端上密钥(一个文件),验证通过则登陆。

要通过伪造密钥的方式来伪造登陆,通常是不可能的。通常使用的 rsa 加密算法,密码长度有 1024 位,几乎不可能破解。

1.2.2 密钥登陆操作

使用密钥登陆,通常需要三步:

  1. 客户端生成密钥

客户端运行ssh-keygen

ssh-keygen -t rsa

这个过程中提示输入密码,可以输入密码,也可以直接回车(就是无密码)。运行完成后在客户端的~/.ssh/文件夹中生成id_rsa(私钥)和id_rsa.pub(公钥)两个文件

  1. 上传公钥到服务器

id_rsa.pub上传到服务器

scp ~/.ssh/id_rsa.pub userA@cloud_linux_ip:~
  1. 服务器上配置密钥

用 userA 帐户登陆服务器,将公钥配置到固定位置

mkdir ~/.ssh
cat ~/id_rsa.pub ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 删除公钥

通常情况下,密钥登陆就实现了。私有密钥id_rsa一定不能泄漏,否则其他人可以使用私钥登陆。

1.2.3 密钥登陆失败 debug

如果上面操作后,依旧不能密钥登陆,可以客户端上如下操作获得详细 log:

ssh -vvv usrA@cloud_linux_ip

常见解决方式:

  1. 配置/etc/ssh/sshd_config,允许密钥登陆:
RSAAuthentication yes
PubkeyAuthentication yes
  1. 修改服务器上.ssh文件夹和authorized_keys文件的权限:
    sudo chmod 744 ~/.ssh
    sudo chmod 600 ~/.ssh/authorized_keys
    

1.3 二次验证登陆

在没有密钥的客户端上,若确实有登陆服务器的需求,应该用密码验证。此时可添加二次验证,登陆时不仅要输入密码,而且要输入验证码。

二次验证码来自手机 app,可以使用Microsoft Authenticator或者 Google Authenticator。

可参考redhat 的说明在服务器上配置二次登陆。在/etc/ssh/sshd_config中配置AuthenticationMethods的方式需要特别说明一下。假定配置如下:

AuthenticationMethods MethodA MethodB,MethodC MetchodD MetchodE,MethodF
  • 这里用空格作为分隔;
  • 如果验证方式MethodA通过,则停止验证,登陆成功;
  • 如果MetchodA不通过,则会验证MethodBMethodC,只有同时通过才能登陆;
  • 如果上面不通过,则会验证MethodD
  • 以此类推,如果到MetchodF都没有通过,则会验证失败;

如果一种验证方式没有在/etc/ssh/sshd_config中被允许,强行使用这种方式来验证只会失败。一般服务器支持的验证方式,可以查看redhat 给出的说明。本机配置如下:

AuthenticationMethods publickey keyboard-interactive

keyboard-interactive包含两个过程,先输入密码,然后输入验证码。这个方式和password是不同的方式,服务器最终实现效果:

  1. 客户端有私钥,快速登陆
  2. 客户端没有私钥,需要先输入帐户密码,再输入验证码登陆

二次验证

1.4 关闭 root 远程登陆

关闭 root 远程登陆之前,一定要保证有其他有用sudo权限的账户可以远程登陆。

修改/etc/ssh/sshd_config关闭 root 账户登陆:

PermitRootLogin no

确保可以密钥登陆后,可同时关闭密码登陆:

PasswordAuthentication no

若由于其它原因无法关闭 root 帐户登陆,一定要给 root 帐户设定复杂密码,可以openssl生成随机密码,提升安全性:

openssl rand -base64 32 #生成一个长度为32的密码

2 易用性配置

2.1 去掉sudo密码

通常并不以 root 身份登录,但有些操作又要用到 root 权限,则在命令前添加sudo来实现,后面需要输入密码。每次输入密码,会比较麻烦。可以修改/etc/sudoers的配置,去掉输入密码的过程。

可以按组或用户配置,可以让所有命令或者部分命令免密码。

  1. 用户 userA 带sudo运行所有命令无密码:
userA ALL=NOPASSWD: ALL
  1. 用户 userA 带sudo运行部分命令无密码:
userA ALL=/usr/bin/ls: ALL
  1. 某组用户groupAsudo运行所有命令无密码:
    %groupA ALL=NOPASSWD: ALL
    

可能配置后并不生效。此时查看当前配置是否被覆盖,如配置文件后面内容覆盖了前面的内容,组帐户配置覆盖了个人帐户配置。将当前用户的设定移动到配置文件最后面,退出后再登陆。

2.2 客户端配置 config 别名

在客户端上登陆,需要输入ssh userA@cloud_linux_ip等各种参数,十分繁琐,通过修改客户端~/.ssh/config来减少登陆时输入信息:

Host name
    HostName server_ip
    User userA
    ForwardAgent yes
    ServerAliveInterval 20
    ServerAliveCountMax 999
    Port 22

运行ssh name就可以直接登陆了。

总结

本文介绍了获取云计算主机后的相关操作,主要目的在于提升安全性和操作的便捷性。实现了服务器上帐户的添加,密码修改,登陆方式的修改等。