远程服务器的Linux系统,使用SSH来操作是必不可少的。阿里云ESC默认的服务器默认提供了SSH支持,但是是使用账户密码登录,而且是root用户,相对来说不太安全。所以对SSH进行安全配置必不可少,安全配置清单如下:

  • 禁用root用户密码登录,使用SSH key密钥登录;
  • 修改SSH默认端口;
  • 添加普通用户,拥有SU身份,仅允许SSH Key密钥登录
  • 禁止root用户登录

设置SSH密钥

设置SSH密钥前需要先在服务器创建存储密钥的文件夹:

1
2
3
4
5
# 在root根目录下创建目录
mkdir .ssh
# 设置目录权限
chmod 700 ~/.ssh

密钥生成

Mac环境生成密钥

1
2
3
4
5
6
7
8
9
# 本地执行命令生成 id_rsa(私钥)和 id_rsa.pub(公钥),回车忽略密码。生成后存在于~/.ssh下
# 多个密钥请参考后续章节
ssh-keygen -t rsa
# 拷贝公钥到服务器.ssh目录下,并改名为:authorized_keys。
sudo scp ~/.ssh/id_rsa.pub root@[ip]:~/.ssh/authorized_keys
# 登录服务器设置authorized_keys权限
chmod 600 ~/.ssh/authorized_keys

上面命令中 [ip] 为服务器IP地址

Windows环境生产密钥

windows下生产SSH Key需要安装Git客户端。安装完毕后使用 Git Bash操作:

1
2
## 生成key,回车忽略密码,生产后存于用户目录下.ssh中
ssh-keygen -t rsa -C "[Email地址]"

生成后使用Xshell 5按照上面mac环境中的操作拷贝到服务器下并设置权限即可。

多个密钥管理

一般情况多个服务器应该对应不同公钥,另外还有Github、GitLab这些网站也需要密钥的。所以可能就需要多个密钥了。

那么如何管理多个密钥,并让不同的私玥对应不同的公钥呢?

1
2
3
4
5
6
7
8
9
10
11
# 生成github使用的的密钥: id_rsa.github
ssh-keygen -t rsa -C "hcw2175@163.com" -f id_rsa.github
# 额外将新生成的密钥添加到环境中,切换到.ssh目录操作
ssh-add id_rsa.github
# 如果执行ssh-add时提示"Could not open a connection to your authentication agent",可以现执行命令:
ssh-agent bash
# 查询已生成密钥
ssh-add -l

.ssh目录下即可看见:id_rsa.github 和 id_rsa.github.pub 2个文件

创建好密钥后到.ssh目录下创建一个 config 文件,配置参考:

1
2
3
4
5
# github
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile /c/Users/hucw/.ssh/id_rsa.github

如果有多个则配置多可即可,服务器IP直接在Host及HostName填写IP地址。

当然windows上使用Xshell 5的话不需要以上配置,在Xshell5上配置服务器时引入对应的SSH Key即可。

禁用root用户密码登录

经过上面步骤,SSH 密钥已创建好,接下来就是修改SSH的配置文件了,然后禁止root用户使用密码登录。

服务器上操作:

1
2
3
4
5
6
7
8
9
10
11
# 编辑SSH配置文件,习惯使用nano命令
nano /etc/ssh/sshd_config
# 修改4个属性并去掉#号。
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PasswordAuthentication no
# 重启ssh服务
sudo service ssh restart

修改完毕后,使用密钥登录测试。

注意当前窗口不要关闭,新开一个窗口使用SSH密钥连接到服务器测试正常才允许关闭,否则无法将无法再连接到服务器

修改SSH端口

同样编辑SSH配置文件即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 编辑SSH配置文件,习惯使用nano命令
nano /etc/ssh/sshd_config
# 增加端口3761,并在阿里控制台中开放该端口,
Port 22
Port [新端口]
# 保存后需重启ssh服务
sudo service ssh restart
# 测试ssh端口登录
ssh -p [新端口] root@[ip]
# 测试成功后禁用22端口
# Port 22

这里要说明下:阿里云服务器ESC是自带防火墙功能的,不需要再服务器内部配置防火窗这么麻烦,只需要到阿里云控制台对应的服务器管理下的安全组配置,配置开发对应端口允许外网访问即可。默认所有端口都可以访问,建议只开放特定端口,如80。

配置普通用户SSH登录

使用root用户操作以下命令创建用户:

1
2
3
4
5
6
7
8
# 创建用户,并创建默认目录
useradd -m -s '/bin/bash' [username]
# 修改密码
passwd [username]
# 增加su身份,修改 /etc/sudoers 文件,修改如下
[username] ALL=(ALL:ALL) ALL

设置SSH登录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 切换到用户身份
su - [username]
# 创建目录
mkdir .ssh
# 返回root用户身份
exit
# 拷贝SSH密钥到用户目录下
cp .ssh/authorized_keys /home/[username]/.ssh/
su - [username]
# 更改文件所属
sudo chown [username]:[username] .ssh/authorized_keys
#更改权限
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

本地测试使用新建用户SSH登录到服务器:

1
ssh -p [新端口] [username]@[ip]

若成功则禁用root用户远程登录。

禁用root用户登录

1
2
3
4
nano /etc/ssh/sshd_config
# 禁用root用户登录
PermitRootLogin no

重启SSH服务并测试。

需要注意的是测试过程原窗口都不要关掉,否则失败后可能导致再也连不上服务器了。