我们一般使用 PuTTY 等 SSH 客户端来远程管理 Linux 服务器。但是,一般的密码方式登录,容易有密码被暴力破解的问题。所以,一般我们会将 SSH 的端口设置为默认的 22 以外的端口,或者禁用 root 账户登录。其实,有一个更好的办法来保证安全,而且让你可以放心地用 root 账户从远程登录——那就是通过密钥方式登录。

密钥形式登录的原理是:利用密钥生成器制作一对密钥——一只公钥和一只私钥。将公钥添加到服务器的某个账户上,然后在客户端利用私钥即可完成认证并登录。这样一来,没有私钥,任何人都无法通过 SSH 暴力破解你的密码来远程登录到系统。此外,如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。

这个方式同样可以拉取 git 代码, 后续会附上如何在 coding 中配置公钥

1. 制作密钥

下面来讲解如何在 Linux 服务器上制作密钥对,将公钥添加给账户,设置 SSH,最后通过客户端登录。

1) 制作密钥对

首先在服务器上制作密钥对。首先用密码登录到你打算使用密钥登录的账户,然后执行以下命令:

对于 Centos 版本比较高的系统, 需要使用长度较长的密钥, 可能比较弱的密钥在高版本系统中根本无法通过授权 userauth-request for user liexiang service ssh-connection method none [preauth] 可能是无法找到匹配的方法,不安全的密钥已经不支持了

  1. # 使用给定的 email 注释 public/private rsa 密钥
  2. # 需要配置 .ssh/config
  3. cd ~/
  4. ssh-keygen
  5. # or
  6. ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。
现在,在指定的目录中生成了一个有两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。

2) 在服务器上安装公钥

方法一 : 使用 **ssh-copy-id** 命令安装

公钥复制到远程机器, 并自动配置好权限密钥

  1. $ ssh-copy-id -i {dir-of-keys}/rsa2.pub user@host

方法二 : 进入服务器手动设定文件和目录的权限

键入以下命令,在服务器上安装公钥:

  1. $ cd .ssh
  2. $ cat id_rsa.pub >> authorized_keys

如此便完成了公钥的安装。为了确保连接成功,请保证以下文件权限正确:

  1. $ chmod 600 authorized_keys
  2. $ chmod 700 ~/.ssh

3) 设置 SSH,打开密钥登录功能

编辑 /etc/ssh/sshd_config 文件,进行如下设置:

RSAAuthentication yes 这个选项在 centos 7.4 以后已经废弃, 无需配置此选项

  1. PubkeyAuthentication yes

另外,请留意 root 用户能否通过 SSH 登录:

  1. PermitRootLogin yes

当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录:

  1. PasswordAuthentication no

最后,重启 SSH 服务:

  1. $ systemctl restart sshd

2. 客户端配置私钥 config 配置

很多时候,我们开发可能需要连接多台远程服务器,并且需要配置 git 服务器的私钥。那么这么多的服务器不能共用一套私钥,不同的服务器应该使用不同的私钥。但是我们从上面的连接流程可以看到,ssh 默认是去读取 $HOME/.ssh/id_rsa 文件作为私钥登录的。如果想要不同的服务器使用不同的私钥进行登录,那么需要在 .ssh 目录下编写 config 文件来进行配置。

config 的配置很简单,只要指明哪个用户登录哪台远程服务器需要使用哪个私钥即可。下面给出一个配置示例。

  1. Host github.com
  2. User duoli
  3. IdentityFile ~/.ssh/id_rsa.github
  4. Host 192.168.1.1
  5. User ubuntu
  6. IdentityFile ~/.ssh/id_rsa.xxx

另一种方式 支持名字的映射

  1. Host test
  2. HostName 192.168.1.21
  3. User liexiang
  4. IdentityFile ~/.ssh/liexiang

上面 config 文件字段含义如下:

  • Host 指明了远程主机的 ip,除了使用 ip 地址,也可以直接使用网址。
  • HostName 主机真实名称, ip 或者网址
  • User 指的是登录远程主机的用户。
  • IdentityFile 指明使用哪个私钥文件。

编写好 config 文件之后,需要把 config 文件的权限改为 rw-r--r-- 。如果权限过大,ssh 会禁止登录。

参考文章:

3. Git 无密码进行拉取或者代码推送

所谓部署, 我的理解就是在用户保证代码质量的前提下, 将代码能够快速的自动部署到目标服务器上的一种手段.
具体步骤参照 配置 SSH 公钥

主机配置同上

1). 在 coding 中添加公钥

输出部署公玥

  1. $ cat coding.pub

在 git 管理端部分部署公钥

设置 SSH 安全通过密钥,免密码登录服务器或拉取代码 - 图1

2). 测试是否可以链接到 git@e.coding.net 服务器

注意 e.coding.net 接入到 CDN 上所以会解析多个不同的 host ip

  1. $ ssh -T git@e.coding.net
  2. CODING 提示: Hello ***, You've connected to coding.net via SSH. This is a Deploy Key.
  3. III,你好,你已经通过 SSH 协议认证 coding.net 服务,这是一个部署公钥.
  4. 公钥指纹:75:0a:63:d4:6a:6b:16:aa:22:35:80:d4:36:dc:60:c5

这样便算是连接成功

3). 克隆代码

在 coding 网站找到 ssh 对应地址

  1. $ git clone git@e.coding.com:user/project.git

这样便可以进行代码的无密码更新了

4. QA:

在配置登录的时候如果遇到了登录问题可以以下几个方式跟踪下

1) 使用 ssh 登录服务器的时候可以使用 verbose 模式调试

  1. ssh server_name -vvv

开启 sshd_config 的 debug 模式

可以查看服务器的详细的错误信息

  1. $ vim /etc/ssh/sshd_config
  2. # 之前
  3. # LogLevel INFO
  4. # 更改为LogLevel DEBUG
  5. $ tail -20f /var/log/secure
  6. Jun 9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_RHOST to "192.168.1.101"
  7. Jun 9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_TTY to "ssh"...

查看服务器的登录日志

  1. $ tail -20f /var/log/secure
  2. Jun 9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_RHOST to "192.168.1.101"
  3. Jun 9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_TTY to "ssh"
  4. Jun 9 12:05:11 23 sshd[26890]: debug1: userauth-request for user duoli service ssh-connection method publickey [preauth]
  5. Jun 9 12:05:11 23 sshd[26890]: debug1: attempt 1 failures 0 [preauth]
  6. Jun 9 12:05:11 23 sshd[26890]: debug1: temporarily_use_uid: 1000/1000 (e=0/0)
  7. Jun 9 12:05:11 23 sshd[26890]: debug1: trying public key file /home/user/.ssh/authorized_keys
  8. Jun 9 12:05:11 23 sshd[26890]: debug1: Could not open authorized keys '/home/user/.ssh/authorized_keys': Permission denied
  9. Jun 9 12:05:11 23 sshd[26890]: debug1: restore_uid: 0/0

2) ssh 登录慢,卡顿在 pledge: network 之后

当 ssh 登录缓慢的时候我们需要 使用

  1. $ ssh -v user@host

来查看问题出现的原因, 根据出现的问题来进行处理
我这里出现的问题是在 pledge: network 之后出现卡顿
处理结果

  1. # echo "" > /var/log/btmp

主要原因是 22 端口对外暴露,导致大量的爆破扫描,因此导致 btmp 这个文件巨大

参考地址 : ssh connection takes forever to initiate, stuck at “pledge: network”

设置 SSH 安全通过密钥,免密码登录服务器或拉取代码 - 图2

我们可以通过如下命令查看恶意 ip 试图登录次数:

  1. lastb | awk ‘{ print $3}’ | sort | uniq -c | sort -n

3) 修改 ssh 默认登录的端口

用编辑器打开 SSH 配置文件,修改端口:

  1. # vi /etc/ssh/sshd_config

找到行 #Port 22 (默认端口为 22),修改端口为其他端口, 不要出现端口冲突

  1. Port 5022

重启 SSH 服务:

  1. # systemctl restart sshd

修改防火墙,允许访问 5022 的端口,并且重启防火墙服务:

  1. # 配置 5022
  2. $ firewall-cmd --permanent --zone=public --add-port=5022/tcp
  3. # 重启
  4. $ firewall-cmd --reload

如果是 Aliyun 主机, 则需要在对应的安全组打开端口访问权限, 否则一样无法访问主机

参考