文档:
- man ssh, ssh_config sshd, sshd_config
简介
ssh 为 secure shell 的英文缩写,是一种加密的网络传输协议。常用于登录远程服务器与在远程服务器上执行命令。
SSH 使用客户端-服务器模型,标准端口为 22。服务器端需要开启 SSH 守护进程接受远端的连接,而用户需要使用 SSH 客户端与服务端连接。
最常见的开源实现是 OpenSSH
基本用法:
登录:
$ ssh user@host # 如果不指明 user,默认使用当前用户。
在远程机器上执行 command,把 stdout,stderr 送回来然后断开连接:
$ ssh user@host [command]
常用参数:
-
-F configfile
:指定配置文件,默认 ssh 会使用~/.ssh/config
中的配置。 -
-p port
:指定端口号,默认使用标准端口号 22。
scp 远程传输文件
scp 是一个命令行工具,是英文 secure copy 的缩写,用于在服务器和客户端之间传输文件,操作类似cp。
使用注意点:远程主机名后要加个冒号再跟路径。如:
$ scp <path> <username>@<host>:/home/valleygtc # copy local file -> remote
$ scp <username>@<host>:/path <path> # copy remote file -> local
SSH 免密登录:
SSH 以非对称加密实现身份验证。身份验证有多种途径,可以使用密码来认证,也可以通过实现配置好的密钥文件来认证。
通过密钥认证登录的条件:
- 公钥(public key)储存在服务端的
~/.ssh/authorized_keys
文件中。 - 私钥(private key)储存在客户端的
~/.ssh/id_rsa
文件中即可。
我们通常使用 ssh-keygen 这个工具来生成公钥和私钥,如下:
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh # 仅允许自己读写此目录。
$ ssh-keygen -t rsa -b 4096 # RSA 算法。
这会生成两个文件 ~/.ssh/id_rsa
和 ~/.ssh/id_rsa.pub
,前者是私钥,我们应该小心保护,后者是公钥,应当将其放到服务端的 ~/.ssh/authorized_keys
中去,我们可以使用 ssh-copy-id
这个工具来完成:
$ ssh-copy-id -i .ssh/id_rsa.pub <username>@<host>
或者手动将其复制粘贴过去。
也可以使用如下命令:
$ ssh user@host 'mkdir .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
通过跳板机来 ssh 连接服务器
跳板机,又常叫做“Bastion host”。
在企业中,业务服务器通常有 ip 限制,不允许直接从办公机登录,而是需要先登录一个跳板机,通过跳板机来登录业务服务器。
这样做的目的是:隔离内部网络,只允许从跳板机访问,那么我们只需要特别关注跳板机的安全配置就可以了,便于更好的进行安全控制。
我们可以配置 ssh 客户端,让 ssh 替我们处理跳板机的登录,避免多次输入命令的负担。
假设我们有跳板机 jumpserver 和 目标服务器 targetserver。
方法一、使用命令行的 -J
参数
$ ssh -J user@jumpserver:22 -p 22 root@targetserver
方法二、配置文件:~/.ssh/config
Host targetserver
ProxyJump user@jumpserver:22
然后就可以直接:
$ ssh -p 22 root@targetserver
sshd 安全配置
sshd 的配置文件:/etc/ssh/sshd_config
。
我们可以修改 sshd 的默认配置来增强系统的安全性,以下是一些需要注意的配置项:
Port 22 # sshd 监听端口。我们通常不希望使用 22 这一标准端口,以减少恶意登录尝试。
PasswordAuthentication yes|no # 是否允许使用密码登录,默认为yes。出于安全考虑,最好禁用密码登录,仅允许通过密钥文件的方式登录,以降低密码被暴力破解的可能性。