ssh使用密钥登录linux服务器

2017-12-09


之前一直使用ip+密码登录,但是每次登录都能看到这个:

1
Last failed login: Fri Mar 2 20:02:55 CST 2018 from xx.xx.xx.xx on ssh:notty There were 230 failed login attempts since the last successful login.

后来发现failed前面的数字越来越大,到后来每隔几十分钟就跳到三位数了,一天没登录直接四位数,简直胆(sang)战(xin)心(bing)惊(kuang),毕竟强密码用起来不方便,弱密码又很容易被破,那么就只有使用密钥+密码登录才放心了。

概要

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 创建密钥
ssh-keygen -b 4096 -t rsa
ssh-copy-id [email protected]

# .ssh目录权限
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

# 编辑ssh配置文件
vim /etc/ssh/sshd_config

RSAAuthentication yes
PubkeyAuthentication yes
AuthorsizedKeysFile .ssh/authorized_keys
Port 2333
PermitRootLogin no
StrictModes no
PasswordAuthentication no

# 用密钥连接ssh
ssh -i .ssh/id_rsa -p 2333 [email protected]

本地客户端

首先使用ssh-keygen来生成RSA密钥和公钥.-t即type,rsa是一种密码算法,还有一种是dsa,证书登录常用的是rsa。

1
ssh-keygen -t rsa

当然,ssh-keygen默认的加密类型就是RSA.所以也可以只输入ssh-keygen

1
ssh-keygen

默认的RSA长度是2048位.如果要加大密码强度,那么可以指定4096位的长度.

1
ssh-keygen -b 4096 -t rsa

生成密钥过程中会要求指定保存密钥的路径,按Enter键使用默认的文件.

1
2
# 直接按Enter
Enter file in which to save the key (/root/.ssh/id_rsa):

之后是输入密码来加密密钥,也就是在使用密钥登录的同时还需要输入密码

1
2
3
4
5
# 输入密码,可以直接Enter跳过,即只是用密钥,不用密码
Enter passphrase (empty for no passphrase):

# 再次输入,确认密码,直接enter
Enter same passphrase again:

最后生成密钥,包含:

密钥默认会保存在root目录下的.ssh文件夹下,上图中我改成了自己用户目录下。

之后需要把公钥上传到服务器,并命名为’authorized_keys’,保存在服务器端的~/.ssh/authorized_keys,可以使用scp复制之后重命名,也可以直接使用工具ssh-copy-id,如果使用这个工具,在上传密钥的时候会同时重命名和设置权限,如果用scp的话也需要手动重命名和改权限,这个工具linux自带

1
ssh-copy-id [email protected]

虽然工具更方便,不过还是建议使用scp,然后自己走一遍存放文件和设置权限,这样下次遇到密钥文件权限问题而不能登录就不会手足无措了

服务器端操作

使用ssh-copy-id之后一般是自动设置好authorized_keys的权限的,但如果是使用scp方式的话,就需要更改authorized_keys文件和.ssh文件夹的权限,分别是600和700权限

1
2
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys

ssh对密钥的权限要求很严苛,如果没有设置好权限的话,ssh会拒绝密钥登录,毕竟其他用户如果对密钥文件有操作权限的话也是很危险的。

然后就是修改ssh的配置文件,以便ssh使用密钥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 打开ssh配置文件
vim /etc/ssh/sshd_config

# 将以下这项去掉注释并改为yes,以启用密钥验证
PubkeyAuthentication yes

# 指定公钥数据库文件
AuthorsizedKeysFile .ssh/authorized_keys

# 为了减少被扫描端口的次数,把端口从22改为其他端口,如2333
Port 2333

# 需要使用root用户登录,要确保这一行为yes
PermitRootLogin yes

# StrictModes修改为no,默认为yes.
# 如果不修改用key登陆是出现server refused our key.
# 如果StrictModes为yes必需保证存放公钥的文件夹的拥有与登陆用户名是相同的.
# “StrictModes”设置ssh在接收登录请求之前是否检查用户家目录和rhosts文件的权限和所有权。
# 很有有必要这样做,因为新手经常会把自己的目录和文件设成任何人都有写权限。
StrictModes no

之后需要重启一下ssh以便修改的配置生效

1
2
3
4
5
6
7
8
#ubuntu系统
service ssh restart

#debian系统
/etc/init.d/ssh restart

# CentOS 使用以下命令
systemctl restart sshd.service

然后就可以在本地试一下使用密钥登录了

1
ssh -i .ssh/id_rsa -p 2333 [email protected]

在可以正常登录之后,就可以禁用ip+密码登录服务器了

1
2
3
4
vim /etc/ssh/sshd_config

# 禁用密码验证
PasswordAuthentication no

另外

当然,每次输入一长串的命令登录比较麻烦,所以可以通过设置别称,从而简化登录命令,命令别称可以在主目录文件.bashrc中添加,例如服务器在纽约,可以使用别称ny

1
2
3
4
5
# 编辑配置文件
vim ~/.bashrc

# 添加别称
alias ny='ssh -p 23 -i ~/.ssh/id_rsa [email protected]'

这样,以后就可以直接输入ny就可以登录服务器了。

题外话
别称还是很有用的,对于经常需要输入一长串命令的情况来说,别称就可以做的很简单,比如linux上的“任务管理器”:top,这个命令可以查看当前运行的程序还有设备运行情况,但是默认刷新时间是3秒,要调快成每1秒刷新就可以输入top -d 1,把这个作为别称,则可以在.bashrc文件中插入alias top='top -d 1',这样子以后每次输入top都是每1秒刷新一次了,当然,top刷新时间也支持小数,如每0.5秒刷新一次:top -d 0.5

使用其他用户登录

直接使用root用户登录服务器比较危险,毕竟root权限真的可以为所欲为,所以还是新建一个普通用户用于登录服务器,如果需要root权限的时候再用sudo就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 新建用户wenjinyu
adduser wenjinyu

# 设置用户密码
passwd wenjinyu

# 把用户wenjinyu添加进wheel用户组,用于给予wenjinyu用户sudo权限
gpasswd -a wenjinyu wheel

# 查询wheel用户组里是否有刚添加的用户
lid -g wheel

# 删除用户和相应目录
userdel -r wenjinyu

创建用户有两个命令:useraddadduseruseradd 只是添加用户,但是这样的用户没有/home家目录,也没有提示设置密码,而 adduser 则家目录和密码都有。此时新增了用户 wenjinyu ,要用此用户登录服务器还需要复制公钥文件到 wenjinyu 用户目录下:

1
2
3
4
5
# 复制公钥所在文件夹 /root/.ssh 到 wenjinyu 用户目录下
cp -r /root/.ssh /home/wenjinyu

# 因为是用 root 用户复制的文件,所以还需要将 wenjinyu 用户目录下的 .ssh 文件夹和其中的文件所有者设置为 wenjinyu
chown -R wenjinyu:wenjinyu .ssh

此时可以尝试用 wenjinyu 用户登录,如果能登录成功,那么就在服务器禁用root用户登录

1
2
3
4
5
# 编辑ssh配置文件
sudo vim /etc/ssh/sshd_config

# 将允许root用户登录一行中的yes改为no
PermitRootLogin no

改完记得重启sshd

1
systemctl restart sshd


评论