root权限可以随意更改系统的每一处地方,如果不小心被他人获得了root权限会带来严重的后果。
因此我们可以采取以下措施,如:
- 更改登录密码,使用更多位数和特殊字符混合的密码,避免被轻易撞破;
- 更改默认的ssh端口号,默认的22端口很容易被别人扫到;
- 添加非root用户,并禁用使用root身份通过ssh登录;
- 使用密钥(private key)登录。你可以选择这些方法组合来提升服务器的安全性。
更改SSH端口号
如果你使用的是VPS(虚拟私人服务器,Virtual Private Server),那么初始已经安装了SSH工具。如果你使用的是个人服务器,可能在安装系统后需要手动安装openSSH等工具。
通过MobaXterm,PuTTY,Termius等软件可以让我们较轻松地远程管理服务器,这些软件往往能同时让我们使用sftp直观地查看文件和互相传送文件。
在默认安装了ssh工具的个人系统上,如Windows 10 和 Mac OS,一开始我们甚至可以在终端里,使用服务商给的密码和默认的22端口直接连接上VPS。
命令语法如下:
ssh username@remote_host
你也可以指定使用-p
来指定端口来登录
ssh -p port_number username@remote_host 如:ssh -p 22 [email protected]
使用终端ssh工具在输入登录密码时,你将看不到具体输入的位数。在登录成功后,我们需要更改远程服务器的ssh端口号来提升安全性。
在debian 中与 ssh 相关的配置文件储存在 /etc/ssh/sshd_config
,我们可以通过修改这个文件来实现我们想要的功能。你可以通过上述ssh工具中自带的sftp功能修改配置文件,也可以在远程服务器上使用 nano
, vim
, vi
等文本修改程序。我主要使用nano
来修改文件,它提供了搜索功能。
nano /etc/ssh/sshd_config
在默认的配置文件中提供了许多被 #
注释的功能,你可以根据说明来了解每项具体的功能。
我们在nano
界面中使用快捷键 ctrl+w
进入搜索模式,此时输入 Port
并回车,并删除前面的#
取消注释,将端口改成一个较大的数值,但是需要确保不会与常用的端口冲突,如 80
, 443
, 25
等端口,建议取超过10000,但需要注意的是端口号是16bit, 意味着它的值最大时65535,不能超过这个值。
修改完成后使用快捷键 ctrl+o
来保存,再使用 ctrl+x
来退出,或者你也可以直接使用 ctrl+w
再输入 y
确认修改并退出。
在完成修改后我们需要使用以下命令让ssh程序重新启动加载新的配置文件:
systemctl restart ssh
systemctl
是Systemd服务管理工具的一部分,用于控制Systemd系统和服务管理器。而Systemd是Linux系统上的一个初始化系统和系统管理守护进程,我们可以通过它来实现程序的开机自动启动和手动的重启等功能,而不需要专门输入一长串命令来控制某个程序。
常用的systemctl
命令包括:
- 启动服务:
systemctl start service_name.service
- 停止服务:
systemctl stop service_name.service
- 重启服务:
systemctl restart service_name.service
- 查看服务状态:
systemctl status service_name.service
- 在系统引导时启用服务:
systemctl enable service_name.service
- 在系统引导时禁用服务:
systemctl disable service_name.service
- 查看已启用的服务:
systemctl list-unit-files --type=service --state=enabled
- 重启系统:
systemctl reboot
- 关闭系统:
systemctl poweroff
!使用systemctl
需要管理员权限,但是我们目前就是以 root
管理员身份登录的。
重启ssh程序后,我建议新开一个ssh连接而暂时不关闭目前的连接来进行测试,测试新的连接成功后再关闭原先的连接。
你还可以添加非root用户
禁用root用户远程登录并创建自己的账户后,那么别人需要同时知道登录你的服务器的端口号、账户名称和密码才能成功登录。但是同时,使用非root用户在进行关键系统操作时需要提权成管理员身份。
通过adduser
你可以添加自己想要的用户名称,并设置密码。
adduser user_name
在设置密码时,和输入登录密码一样,你将看不到具体输入的位数。在建立新用户后你可以测试以新用户身份连接主机。
成功建立新的用户后,我们需要安装能够为普通用户提权的工具 sudo
。
在 debian 上,我们通常使用 apt
(高级包装工具,Advanced Package Tool)来安装各种程序。它是Debian及其派生系统(如Ubuntu)上用于程序包管理的工具,简化了从软件仓库编译安装、升级、配置和移除软件包的过程。但是通过apt
安装的程序版本通常受限,如果你需要特定的版本,或是有追加功能模组的版本,需要手动编译安装。在绝大多数情况下,使用apt
命令已经足够。
我们通过以下命令来安装:
apt update && apt install sudo
apt update
命令会从配置的仓库源中同步软件包索引列表,以了解有哪些更新可用。
apt install
则是安装程序的命令。&&
可以将两个命令按顺序一起执行。
还有一些常见的apt
命令,如:
- apt show package_name //显示关于指定软件包的详细信息
- apt remove package_name //卸载指定的软件包,但保留配置文件
- apt purge //卸载指定的软件包,并删除其配置文件
- apt autoremove //自动删除系统上不再需要的依赖软件包
- apt search keyword //搜索关键词获取软件包真实名称
- apt list –installed //列出系统上所有已安装的软件包
- apt list –upgradable //显示所有可升级的软件包
- apt clean //清除本地下载的软件包文件,释放磁盘空间
- apt upgrade //升级系统
键入visudo
回车,配置文件实际在 /etc/sudoers
,但请通过visudo
来修改。
在User Privilege Specification
下方添加 user_name ALL= (ALL:ALL) ALL
,user_name
为你取的用户名,保存并退出。这样设置意味着你可以在命令前加上sudo
获取管理员权限,但在执行指令时需要输入密码。
你也可以设置成 user_nameALL=(ALL) NOPASSWD: ALL
,在提权时不需要再使用密码。
- 第一个括号内的
ALL
:指的是sudo
可以切换到任何用户的身份执行命令 - 冒号后面的
ALL
:这表示user_name
可以模拟任何组身份执行命令。在大多数情况下,用户和组的区别对于使用sudo
来说不是很重要,因此也设置为ALL
- 最后的
ALL
:这表示user_name
可以执行任何命令
禁用root用户远程登录
在确认上述步骤正确执行,你已成功建立了非root用户,能使用新建用户身份连接服务器,并能使用sudo命令成功提权,再执行接下来的步骤,否则你可能需要重新安装系统来重新获得管理员权限。
修改ssh配置文件,禁用root用户远程登录。
nano /etc/ssh/sshd_config
使用 ctrl+w
搜索 PermitRootLogin
将其修改为PermitRootLogin no
,保存文件并退出。
再使用命令让新配置生效。
systemctl restart ssh
使用密钥并禁用使用密码登录
你可以使用密钥来代替密码登录,密钥具有更强大的安全性,只要你的密钥文件不被泄露出去。
你可以在本机的终端中(已经安装了openssh的Windows 10),使用ssh-keygen
来生成密钥,默认会保存在你的C盘用户文件夹下~/.ssh/
,.ssh
可能需要取消隐藏文件夹来查看,生成后将id_rsa.pub
公钥文件上传到服务器你登录的用户名文件夹下/.ssh
内。
- 可以不为密钥添加密码来实现只需密钥登录
- 你可以使用
-t
选项指定密钥类型,常见的类型有rsa
、dsa
、ecdsa
、ed25519
等,ed25519
在更少bit下拥有更好的加密性能。 - 使用
-b
选项指定密钥大小(位数)。 - 如
ssh-keygen -t rsa -b 4096
,创建一个4096位的RSA密钥对 - 使用
-C
选项为密钥对添加一个注释,通常是你的邮箱地址,这有助于识别密钥的用途或所有者 - 你也可以选择在服务器上使用命令生成密钥,再将密钥文件,如
id_rsa
,传回本机 - 你也可以使用其它工具来生成
- 保护私钥:私钥是你身份验证的凭据。不要将私钥泄露给其他人,且避免无密码保护的私钥文件
在服务器拥有与你的密钥对应的公钥后,你可以将放在.ssh
文件夹下公钥文件名修改成authorized_keys
。
我们继续修改/etc/ssh/sshd_config
文件,找到并取消注释AuthorizedKeysFile .ssh/authorized_keys
,并将PubkeyAuthentication
值修改为yes
。
注意此时你需要添加使用sudo提权才能编辑配置文件。
sudo nano /etc/ssh/sshd_config
你也可以将文件名和配置文件内的公钥名称修改成自己想要的。
为什么.ssh/authorized_keys
不使用绝对路径
使用相对路径(如.ssh/authorized_keys
)而不是绝对路径有几个原因:
- 用户隔离:这种方式确保每个用户都有自己的
authorized_keys
文件,位于各自的主目录下。这样,用户就只能添加或删除自己的SSH公钥,而不能访问或修改其他用户的公钥。这对于多用户系统来说是重要的安全考虑。 - 灵活性和便捷性:通过允许每个用户管理自己的
authorized_keys
文件,系统管理员无需为每个用户手动配置或更新SSH公钥,用户可以自行管理自己的公钥。 - 简化配置:相对路径简化了SSH配置。因为如果使用绝对路径,每个用户的
authorized_keys
文件路径都不同,管理员需要为每个用户单独配置,这在管理上非常不方便。
将密钥导入到远程连接工具中,测试能使用密钥成功登录后,我们再禁用密码登录。
在/etc/ssh/sshd_config
文件中找到 PasswordAuthentication
设置为 no
。
sudo systemctl restart ssh
使用命令使得配置文件生效。
Reference: