ssh 服务的原理

Linux SSH ssh 服务的原理 读者大可以直接就自己的问题去 Google 解决方案,但是不理解这个过程,那么每次遇到都要去 search,自己只是‘工具人’,遇到了问题也不知道如何是好。这时候需要看下原理,有原理做基础,才能理解做配置的每一步的意义。 两种安全验证 SSH(即 Secure Shell),是一项创建在应用层和传输层基础上的安全协议,为计算机 Shell 提供安全的传输和使用环境。 所以为了安全,SSH 提供了两种级别的安全认证,基于密码的安全认证和基于密钥的安全认证。 基于密码的安全认证 基于密码的安全认证,登录的时候需要提供账号和密码;远程主机将自己的公钥分发给登录客户端,客户端访问主机使用该公钥加密;远程主机使用自己的私钥解密数据。 登录的流程如下: 远程主机收到用户登录请求,将自己的公钥发给用户 用户通过远程主机公钥的指纹确认主机的真实性,然后使用远程主机公钥将登录密码加密后,发送回远程主机 远程主机使用自己的私钥解码登录密码,验证密码正确后,允许用户登录 这种就是最常用的直接登录,需要输入密码,而传入过程中,明文密码会被加密,所以很安全。 基于密钥文件的安全认证 基于密钥的安全认证,客户端将将公钥上传到服务器。登录的时候,客户端向服务器发送登录请求;服务器收到请求后,向用户发送一段随机字符串;用户用自己的私钥加密后,再发送回服务器;服务器使用事先存储的公钥进行解密,如果解密成功,证明用户可信,允许登录。 这种方式,在登录服务器的过程中,不需要上传密码,增加了安全性。 known_hosts 文件 当第一次登陆远程主机时,不管是用密码还是密钥,都会有个提示: $ ssh user@host The authenticity of host 'host (***.***.***.***)' can't be established. RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d. Are you sure you want to continue connecting (yes/no)? 这段话提示用户无法确认远程主机的真实性,只知道 RSA 公钥的指纹,询问用户是否继续。 我们使用 ssh-keygen 工具可以生成 SSH 密钥对,其中公钥的长度可以很长,对用户来说不方便直接对比验证,因此对其进行了 MD5 计算,生成了一个128的指纹,这样再进行比较就比较容易了。 那么这里就要求我们事先知道远程主机的公钥指纹,才可以确认主机的真实性。 用户确认主机的真实性,输入 yes 继续连接: Warning: Permanently added 'host,***.***.***.***' (RSA) to the list of known hosts. 然后输入密码: ...

ssh 服务的配置

Linux SSH 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 。 ...

ssh-keygen 基本用法

Linux SSH ssh-keygen 基本用法 ssh 公钥认证是 ssh 认证的方式之一。通过公钥认证可实现 ssh 免密码登陆,git 的 ssh 方式也是通过公钥进行认证的。 在用户目录的 home 目录下,有一个 .ssh 的目录,和当前用户 ssh 配置认证相关的文件,几乎都在这个目录下。 ssh-keygen 可用来生成 ssh 公钥认证所需的公钥和私钥文件。 使用 ssh-keygen 时,请先进入到 ~/.ssh 目录,不存在的话,请先创建。并且保证 ~/.ssh 以及所有父目录的权限不能大于 711。 生成的文件名和文件位置 使用 ssh-kengen 会在 ~/.ssh/ 目录下生成两个文件,不指定文件名和密钥类型的时候,默认生成的两个文件是: id_rsa id_rsa.pub 第一个是私钥文件,第二个是公钥文件。 生成 ssh key 的时候,可以通过 -f 选项指定生成文件的文件名,如下: [huqiu@101 .ssh]$ ssh-keygen -f test -C "test key" ~~文件名 ~~~~ 备注 如果没有指定文件名,会询问你输入文件名: [huqiu@101 .ssh]$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/huqiu/.ssh/id_rsa): /home/huqiu/.ssh/test 你可以输入你想要的文件名,这里我们输入test。 ...

SSHPASS 的使用

Linux SSH SSHPASS 的使用 如果是常规使用 ssh 登陆到服务器上,要么是通过密码,要么是通过配置公密钥的适配来做到免密登陆。现在有个新的场景,你想通过 ssh 登陆到某台节点并执行一条指令,但不想因为这么简单的事而将公钥上传过去,同时也不想通过 expect 或者 EOF 的方式来模拟操作(我们假定在一个脚本中),这时候就需要 sshpass 的帮助了。 sshpass 是一个简单、轻量级的命令行工具,通过它我们能够向命令提示符本身提供密码(非交互式密码验证),它直接使用 TTY 访问,以确保密码是用户键盘输入的。 sshpass 在专门的 tty 中运行 ssh,以误导 ssh 相信它是从用户接收到的密码。 重要:使用 sshpass 是不安全的,但新版本的 sshpass 做得足够好了。 安装 RedHat/CentOS 安装 $ yum install sshpass $ dnf install sshpass [Fedora 22 及以上版本] Debian/Ubuntu 和它的衍生版 $ sudo apt-get install sshpass MacOSX 安装 截止 2019.8.13 日,最新版是 1.06,未来可能更新,下面的指令,Cellar位置可能不确定。 $ brew install https://raw.githubusercontent.com/kadwanev/bigboybrew/master/Library/Formula/sshpass.rb $ cd /usr/local/bin $ ln -s sshpass ../Cellar/sshpass/1.06/bin/sshpass 源码安装 $ wget http://sourceforge.net/projects/sshpass/files/latest/download -O sshpass.tar.gz $ tar -xvf sshpass.tar.gz $ cd sshpass-1.06 $ ./configure $ sudo make install 使用 sshpass 与 ssh 一起使用。先通过 -h 参数看下 sshpass 能做什么。 ...