ssh 入门

429 阅读5分钟

生命在于折腾, 不论是自己折腾, 还是公司办公, ssh都是绕不过去的一个砍. 趁着休息, 总结一下最基础的东西.

SSH密钥对

OpenSSHRSA的认证协议的基础是使用一对专门生成的密钥,分别叫做私有密钥公用密钥

RSA密钥工作原理

公用密钥用来对消息进行加密,只有配对的私有密钥能够对该消息进行解密。

初始配置RSA,需要生成一对密钥。将公用密钥复制到远程服务器上的正确位置。由于公用密钥只能用于消息加密,所以不太需要担心被落入他人之手。一旦公用密钥被复制到远程服务器的专门文件(~/.ssh/authorized_keys),就能使用RSA认证登陆到远程服务器(不用再输入密码了)。

如何使用这对密钥进行验证?

登陆时,远程服务器sshd首先生成一个随机数,然后用登陆用户帐号中的公用密钥进行加密后发送给客户端。由于客户端有配对的私有密钥,则可以对这个随机数进行解密然后再发回给服务器, 如果随机数正确, 则验证通过。这样服务器能够验证是授权用户登陆。

密钥使用注意事项

只需要生成一对密钥就可以,把公用密钥复制到需要访问的服务器上就能够实现对服务器的授权访问。 私有密钥不应落入他人之手。因为拥有私有密钥就会被授权完全相同的权限。

为加上保护措施,应该在使用 ssh-keygen 创建公用/私有密钥对的时候,输入密钥密码来保护密钥(一般大家都不会设置, 不是好习惯)。这样不知道密钥密码的人即使拿到了密钥也不能使用。虽然这样导致使用密钥的时候需要输入密码,但实际上可以通过配合使用ssh-agent来实现只输入一次密钥密码就可以缓存并重复调用密钥。

RSA密钥对生成方式

使用 ssh-keygen 命令生成密钥对:

ssh-keygen -t rsa -C "youremail" # 一般使用email, 也尅是别的字符串

邮箱在创建密钥对的时候,会要求输入密钥的保护密码。虽然可以连续输入两次回车去除密码保护,但是降低了安全性。

默认情况下会在用户目录下的 .ssh 目录下生成私有密钥 id_rsa 和 公用密钥 id_rsa.pub。 (名字也是可以自定义的, 这个在同一个远程服务器上有多个账户的时候, 就会有用: 在本机创建多个秘钥对, 用于不同的用户远程登录)

公钥放在那里?

公钥 id_rsa.pub复制到需要以某个身份登陆的用户目录下的 .ssh 目录下,以下为服务器上的用户帐号 jerry (注意在创建账户时指定组,并加上注释-c)

创建一个 jerry 帐号

useradd -g wheel -u 1919 -d /home/jerry -m -c "I'am jerry, a mouse." jerry

wheel组是Unix用来记录可以拥有部分root权限的用户. Linux下Wheel用户组介绍

将公共密钥复制到服务器上jerry用户的.ssh目录下,改名为 authorized_keys.

ssh相关文件属性

远程服务器端

远程 .ssh 目录和 authorized_keys 文件权限要求:

.ssh 目录的属性是 700
.ssh目录下的authorized_keys私有密钥的属性是600

使用如下命令确保.ssh目录属性和authorized_keys文件属性正确

chown -R jerry:wheel .ssh # 递归的更改.ssh文件夹的所属组为wheel, owner为jerry
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

检查本地主机.ssh的属性

本地 .ssh 目录和 id_rsa 文件权限要求:

.ssh 目录的属性是 ''700''
.ssh 目录下的 id_rsa 私有密钥的属性是 600
.ssh 目录下的 id_rsa.pub 公用密钥的属性是 644

密钥属性和.ssh目录属性是密钥认证成功的关键:.ssh密钥对的属性必须严格按照以上要求设置,否则ssh会拒绝使用密钥认证。

ssh agent

ssh-agent是OpenSSH发布包中的一个针对RSA和DSA密钥设计的特殊程序。ssh-agent是一个长时间运行的守护进程(daemon),用途是对解密的私有密钥进行高速缓存。

ssh内建和ssh-agent通讯的机制,这样ssh不需要每次连接都提示保护密码才能使用解密的专用密钥。对于ssh-agent,只要使用 ssh-add 命令把专用密钥添加到ssh-agent的高速缓存中。当使用过 ssh-add 之后,ssh将从ssh-agent获取专用密钥,就不需要每次提示必须输入密钥保护密码才能使用专用密钥了。

如何使用ssh-agent

启动ssh-agent

ssh-agent在启用之前会输出一些提示信息

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-XX4LkMJS/agent.26916; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26917; export SSH_AGENT_PID;
echo Agent pid 26917;

但是这只是表示打印输出。要让ssh-agent在shell后台运行,使用

eval `ssh-agent` # 注意使用反引号。
# 或者
ssh-agent bash

启动ssh-agent的最佳方式是将上述命令添加到~/.bash_profile中(如果你使用的是zsh, 现在mac默认就是zsh了, 你可以添加完后, 在.zshrc文件中, 添加source ~/.bash_profile).

这样登陆shell的所有启动程序都能够使用。尤其重要的环境变量是 SSH_AUTH_SOCK。SSH_AUTH_SOCK 包含有 ssh 和 scp 可以用来同 ssh-agent 建立对话的 UNIX 域套接字的路径。

添加私钥

启动完ssh-agent后,高速缓存中是空的,并没有解密的专用密钥。在能够使用ssh-agent之前,首先需要使用ssh-add命令把自己的专用密钥添加到ssh-agent的高速缓存中。

注意,由于前面生成密钥的时候使用了保护密码,所以在使用ssh-add的时候会提示输入保护密码。

ssh-add ~/my_key  # e.g. ~/.ssh/id_rsa

参考文献

How To Reuse SSH Connection To Speed Up Remote Login Process Using Multiplexing

ssh