配置云主机

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

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

  1. 提升安全性 防止暴力破解密码:

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

    • 配置本地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(公钥)两个文件

  2. 上传公钥到服务器

    id_rsa.pub上传到服务器

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

    用 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
    
  2. 修改服务器上.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
    
  2. 用户 userA 带sudo运行部分命令无密码:

    userA ALL=/usr/bin/ls: ALL
    
  3. 某组用户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就可以直接登陆了。

3. 一些实惠云服务

  1. oracle cloud 真免费,可以选择的地方有东京或者美国。
  2. google cloud 300 刀的免费体验
  3. ms azure 免费体验
  4. cloudflare

总结

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