获得云主机帐户和密码后,须进行一些配置,提升安全性和使用便捷性:
-
提升安全性 防止暴力破解密码:
- 关闭 root 帐户远程登陆(防暴力破解密码)
- 添加新帐户(降低帐户风险)
- 开启密钥登陆(基于密钥文件验证登陆)
- 添加二次验证登陆(需要输入密码和验证码才能登陆)2FA/MFA
-
增强易用性
- 配置本地
ssh config
文件简化本地登录命令 - 新建帐户
sudo
时无需输入密码
- 配置本地
1 提升安全性
1.1 新建帐户并添加sudo
权限
通常拿到的是 root 帐户,但 root 帐户有两个问题:
- 权限太大,误操作容易让系统崩溃,如删除系统文件
- 帐户名众所周知,只需破解密码即可远程登陆,风险较高
为确保安全,需新建一帐户作为主要帐户:
- 该帐户有
sudo
权限,而且可以 ssh 登陆 - 同时禁止 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 密钥登陆操作
使用密钥登陆,通常需要三步:
-
客户端生成密钥
客户端运行
ssh-keygen
ssh-keygen -t rsa
这个过程中提示输入密码,可以输入密码,也可以直接回车(就是无密码)。运行完成后在客户端的
~/.ssh/
文件夹中生成id_rsa
(私钥)和id_rsa.pub
(公钥)两个文件 -
上传公钥到服务器
将
id_rsa.pub
上传到服务器scp ~/.ssh/id_rsa.pub userA@cloud_linux_ip:~
-
服务器上配置密钥
用 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
常见解决方式:
-
配置
/etc/ssh/sshd_config
,允许密钥登陆:RSAAuthentication yes PubkeyAuthentication yes
-
修改服务器上
.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
不通过,则会验证MethodB
和MethodC
,只有同时通过才能登陆; - 如果上面不通过,则会验证
MethodD
; - 以此类推,如果到
MetchodF
都没有通过,则会验证失败;
如果一种验证方式没有在/etc/ssh/sshd_config
中被允许,强行使用这种方式来验证只会失败。一般服务器支持的验证方式,可以查看redhat 给出的说明。本机配置如下:
AuthenticationMethods publickey keyboard-interactive
keyboard-interactive
包含两个过程,先输入密码,然后输入验证码。这个方式和password
是不同的方式,服务器最终实现效果:
- 客户端有私钥,快速登陆
-
客户端没有私钥,需要先输入帐户密码,再输入验证码登陆
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
的配置,去掉输入密码的过程。
可以按组或用户配置,可以让所有命令或者部分命令免密码。
-
用户 userA 带
sudo
运行所有命令无密码:userA ALL=NOPASSWD: ALL
-
用户 userA 带
sudo
运行部分命令无密码:userA ALL=/usr/bin/ls: ALL
-
某组用户
groupA
带sudo
运行所有命令无密码:%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. 一些实惠云服务
- oracle cloud 真免费,可以选择的地方有东京或者美国。
- google cloud 300 刀的免费体验
- ms azure 免费体验
- cloudflare
总结
本文介绍了获取云计算主机后的相关操作,主要目的在于提升安全性和操作的便捷性。实现了服务器上帐户的添加,密码修改,登陆方式的修改等。