说明
SSH 的经典用途是登录到远程服务器中执行命令,除此之外 SSH 也支持隧道协议、端口映射和 X11 连接。借助 SFTP 或 SCP 协议还可以传输文件。
一般来说利用 SSH 登录远程服务器需要执行下面指令:
1 | $ ssh user@host |
这里默认通过 SSH 连接远程服务器的 22 端口,如需要指定端口可使用 -p port 。
SSH 提供两种级别的安全验证:
- 基于密码的安全验证。知道帐号和密码,就可以登录到远程主机,并且所有传输的数据都会被加密。但是,可能会有别的服务器在冒充真正的服务器,无法避免被“中间人”攻击。
- 基于密钥的安全验证。需要依靠密钥,也就是你必须为自己创建一对密钥,并把公有密钥放在需要访问的服务器上。客户端软件会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在你在该服务器的用户根目录下寻找你的公有密钥,然后把它和你发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有密钥加密“质询”并把它发送给客户端软件。从而避免被“中间人”攻击。
使用第一种方法进行登录,不但每次都要输入密码同时也有安全隐患。
生成密钥
可以使用 ssh-keygen 生成密钥。默认设置下会在 $HOME/.ssh/ 目录下生成两个文件: id_rsa 和 id_rsa.pub,分别是私钥和公钥。
1 | $ ssh-keygen |
远程服务器将用户的公钥保存在 $HOME/.ssh/authorized_keys 文件中。公钥就是一段字符串,只需要将刚生成的公钥追加到远程服务器的 authorized_keys 文件中即可。
执行下面命令将本地公钥追加到远程服务器 authorized_keys 文件中。
1 | $ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub |
该命令进行了如下操作:
ssh user@host表示登录远程主机。mkdir -p .ssh表示在远程主机的主目录下如果没有.ssh目录则新建一个.ssh目录。cat >> .ssh/authorized_keys表示将输入内容追加到.ssh/authorized_keys中。< ~/.ssh/id_rsa.pub表示将当前用户的目录下的~/.ssh/id_rsa.pub作为输入。
远程主机的 .ssh 目录权限应为 700 ,authorized_keys 文件权限应为 600 。
设置 SSH config
将公钥保存到远程服务器后,省去了输入密码的操作,安全性也更高。但是每次登陆还要输入 user@host ,还是需要记住用户名和主机名还是十分麻烦的。在这里可以通过 ~/.ssh/config 配置文件来实现更方便的 SSH 操作。
编辑 ~/.ssh/config 文件:
1 | Host test |
这里新增了一个 SSH 的配置。
- Host 指定了用于匹配的名称,如果 SSH 匹配上了 test ,就使用接下来的配置进行登录
- HostName 指定了远程服务器的地址
- Port 指定了登录端口
- User 指定了登录用户名
- IdentifyFile 指定了私钥
这时如果执行指令:
1 | $ ssh test |
相当于执行指令
1 | $ ssh user@host |
通过 SSH config 文件不但可以简化 SSH 登录,还可以同时配置多个 Host 。SSH 的 Host 字段还支持通配符,如果有更多需求可以参考文档。
禁止 SSH 密码登录
编辑远程服务器 /etc/ssh/sshd_config 文件。
禁用密码验证,修改 PasswordAuthentication 值为 no :
1 | PasswordAuthentication no |
启用密钥验证:
1 | RSAAuthentication yes |
指定公钥验证文件路径:
1 | AuthorizedKeysFile .ssh/authorized_keys |
之后重启 ssh 服务:
1 | // Ubuntu 系统 |
参考资料: