阅读 153

[Linux][转+] 设置 SSH 安全通过密钥/免密码登录服务器或拉取 git 代码

我们一般使用 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] 可能是无法找到匹配的方法,不安全的密钥已经不支持了

# 使用给定的 email 注释 public/private rsa 密钥
# 需要配置 .ssh/config
cd ~/
ssh-keygen
# or
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
复制代码

密钥锁码在使用私钥时必须输入,这样就可以保护私钥不被盗用。当然,也可以留空,实现无密码登录。

现在,在指定的目录中生成了一个有两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。

2) 在服务器上安装公钥

(推荐)方法一 : 使用 ssh-copy-id 命令安装

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

$ ssh-copy-id -i {dir-of-keys}/rsa2.pub user@host
复制代码

(不推荐) 进入服务器手动设定文件和目录的权限

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

$ cd .ssh
$ cat id_rsa.pub >> authorized_keys
复制代码

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

$ chmod 600 authorized_keys
$ chmod 700 ~/.ssh
复制代码

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

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

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

PubkeyAuthentication yes
复制代码

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

PermitRootLogin yes
复制代码

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

PasswordAuthentication no
复制代码

最后,重启 SSH 服务:

$ systemctl restart sshd
复制代码

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

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

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

Host github.com
    User jaychen
    IdentityFile ~/.ssh/id_rsa.github
Host 192.168.1.1
    User ubuntu
    IdentityFile ~/.ssh/id_rsa.xxx
复制代码

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

Host test-liexiang
    HostName 192.168.1.21
    User liexiang
    IdentityFile ~/.ssh/test-liexiang
复制代码

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

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

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

参考文章:

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

所谓部署, 我的理解就是在用户保证代码质量的前提下, 将代码能够快速的自动部署到目标服务器上的一种手段.

具体步骤参照 配置SSH公钥

主机配置同上

1). 在 coding 中添加公钥

输出部署公玥

$ cat coding.pub
复制代码

在git 管理端部分部署公钥

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

# 注意 git.coding.net 接入到 CDN 上所以会解析多个不同的 host ip 
$ ssh -T git@coding
The authenticity of host 'git.coding.net (123.59.85.184)' can't be established.

RSA key fingerprint is 98:ab:2b:30:60:00:82:86:bb:85:db:87:22:c4:4f:b1.

Are you sure you want to continue connecting (yes/no)? 

# 这里我们根据提示输入 yes
Warning: Permanently added 'git.coding.net,123.59.85.184' (RSA) to the list of known hosts.

Coding 提示: Hello duoli, You've connected to Coding.net via SSH. This is a deploy key.

duoli,你好,你已经通过 SSH 协议认证 Coding.net 服务,这是一个部署公钥
复制代码

这样便算是连接成功

3). 克隆代码

在 coding 网站找到 ssh 对应地址(忽略地址, 最近tencent 和 coding 正在合并)

image.png

$ git clone git@git.coding.com:user/project.git
复制代码

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

4. QA:

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

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

ssh server_name -vvv
复制代码

开启 sshd_config 的debug 模式 可以查看服务器的详细的错误信息

$ vim /etc/ssh/sshd_config

# 之前
# LogLevel INFO
# 更改为
LogLevel DEBUG

$ tail -20f /var/log/secure

Jun  9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_RHOST to "192.168.1.101"
Jun  9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_TTY to "ssh"
... 
复制代码

查看服务器的登录日志

$ tail -20f /var/log/secure

Jun  9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_RHOST to "192.168.1.101"
Jun  9 12:05:11 23 sshd[26890]: debug1: PAM: setting PAM_TTY to "ssh"
Jun  9 12:05:11 23 sshd[26890]: debug1: userauth-request for user liexiang service ssh-connection method publickey [preauth]
Jun  9 12:05:11 23 sshd[26890]: debug1: attempt 1 failures 0 [preauth]
Jun  9 12:05:11 23 sshd[26890]: debug1: temporarily_use_uid: 1000/1000 (e=0/0)
Jun  9 12:05:11 23 sshd[26890]: debug1: trying public key file /home/user/.ssh/authorized_keys
Jun  9 12:05:11 23 sshd[26890]: debug1: Could not open authorized keys '/home/user/.ssh/authorized_keys': Permission denied
Jun  9 12:05:11 23 sshd[26890]: debug1: restore_uid: 0/0
复制代码
文章分类
后端
文章标签