ssh 服务的配置

2019/08/13 ssh Linux

ssh 服务的配置

有了 ssh 服务的介绍以及原理之后,我们就可以做到 可以用很短的指令就登陆,并且不用输密码,最重要的就是要学会修改 ssh_config 文件。我们先介绍配置文件的一些可配置项,再针对免密登陆做操作。

配置文件

ssh程序可以从以下途径获取配置参数:

  • 命令行选项
  • 用户配置文件 (~/.ssh/config)
  • 系统配置文件 (/etc/ssh/ssh_config)

配置文件可分为多个配置区段,每个配置区段使用 Host 来区分。我们可以在命令行中输入不同的host 来加载不同的配置段。

对每一个配置项来说,首次获取的参数值将被采用,因此通用的设置应该放到文件的后面,特定host相关的配置项应放到文件的前面。

常用配置项

下面介绍一些常用的SSH配置项:

Host

Host 配置项标识了一个配置区段。

ssh 配置项参数值可以使用通配符:* 代表0~n个非空白字符,? 代表一个非空白字符,! 表示例外通配。

我们可以在系统配置文件中看到一个匹配所有 host 的默认配置区段:

$ cat /etc/ssh/ssh_config | grep '^Host'
Host *

这里有一些默认配置项,我们可以在用户配置文件中覆盖这些默认配置。

GlobalKnownHostsFile

指定一个或多个全局认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔。默认缓存文件为:/etc/ssh/ssh_known_hosts, /etc/ssh/ssh_known_hosts2.

HostName

指定远程主机名,可以直接使用数字IP地址。如果主机名中包含 %h ,则实际使用时会被命令行中的主机名替换。

IdentityFile

指定密钥认证使用的私钥文件路径。默认为 ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 或 ~/.ssh/id_rsa 中的一个。文件名称可以使用以下转义符:

'%d' 本地用户目录
'%u' 本地用户名称
'%l' 本地主机名
'%h' 远程主机名
'%r' 远程用户名

可以指定多个密钥文件,在连接的过程中会依次尝试这些密钥文件。

Port

指定远程主机端口号,默认为 22 。

User

指定登录用户名。不指定默认是当前用户名。

UserKnownHostsFile

指定一个或多个用户认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔。默认缓存文件为: ~/.ssh/known_hosts, ~/.ssh/known_hosts2.

还有更多参数的介绍,可以参看用户手册:

$ man ssh config

示例

以下连接为例:

SSH 服务器: ssh.test.com
端口号: 2200
账户: user
密钥文件: ~/.ssh/id_rsa_test

密码认证登录方式为

$ ssh -p 2200 -i ~/.ssh/id_rsa_test user@ssh.test.com
user@ssh.test.com's password:

密钥认证登录方式

  • 将 id_rsa_test.pub 发送到远端节点
$ ssh-copy-id -i ~/.ssh/id_rsa_test user@ssh.test.com
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user@ssh.test.com's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user@ssh.test.com'"
and check to make sure that only the key(s) you wanted were added.
  • 本地默认会检查 ~/.ssh 下的密钥文件,然后正确登陆,尝试的过程,可以通过指定 -v 参数来观看。
$ ssh -v user@ssh.test.com

使用配置文件方式

  • 实用配置文件之前,需要先用 ssh-copy-id 把自己的公钥上传到远程主机的 authorized_keys 文件中
  • 有如下配置文件:
$ vim ~/.ssh/config
Host sshtest
    HostName ssh.test.com
    User user
    Port 2200
    IdentityFile ~/.ssh/id_rsa_test

Host ssttest2
    HostName ssh.test2.com
    User user2
    Port 2345
    IdentityFile ~/.ssh/id_rsa_test2
  • 由于已经在配置文件里制定了 Host 参数,并且在它下面有足够的登陆信息(用户名,端口,主机名和密钥文件),所以可以直接指定 Host 登陆
$ ssh sshtest

免密登陆

其实想要免密登陆并且简化登录过程,三步即可:

  • 生成一份个人主机独一无二的密钥对
  • ssh-copy-id -i /path/to/key username@hostname 第一个参数是你的密钥位置,第二个参数是想要免密登陆的远端主机信息
  • 修改 ~/.ssh/config,针对网段的指定密钥文件,并输入足够的参数即可

关于第三点,可以有种通用的配置如下:

# 匹配192.168.1网段
Host 1.*
    Hostname 192.168.%h
    User root
    IdentityFile /path/to/key

像上面的配置后,就可以通过 ssh 1.1 这种方式登陆 192.168.1.1%h 会将输入的信息替换进来。

一般有种推荐的思想,就是一个网段指定一个密钥,我们可以信任整个网段内是安全的。

这是常规使用 ssh 的免密登陆方式,但假设我们需要用 bash 命令在不修改 ssh 相关文件的情况下,做到集群内免密登陆,这时候就需要一个新的工具–sshpass

Search

    Table of Contents