分享个人 Full-Stack JavaScript 项目开发经验
SSH(Secure Shell)是建立在应用层和传输层基础上的安全协议,可以在非安全网络环境下提供安全的远程登录、远程命令执行、远程文件传输等功能。
SSH 提供基于口令和基于密钥的两种级别的用户安全验证。基于口令的身份验证与一般的密钥交换协议一样,会受到"中间人攻击"的威胁。
CentOS 7 默认安装的 OpenSSH 是实现 SSH 协议的免费开源软件包。它默认支持 SSH2 协议和使用 RSA 密钥认证。本文将介绍如何配置基于用户密钥的安全认证。
SSH 的简单工作过程如下:
版本号协商
目前 SSH 包括 SSH1、SSH2 两个版本。
密钥和算法协商
SSH 协议中常见的密钥加密算法有 RSA、DSA 等。
身份认证
基于密钥的的身份认证中,客户端向服务器请求使用用户密钥进行安全验证。服务器收到请求后,会在用户家目录中找到公钥,并与客户端发送过来的公钥进行比较。一致的话,则会使用公钥生成加密"质询"返回给客户端。客户端收到"质询",并用私钥解密后再送回给服务器验证。
会话请求
身份认证通过后,客户端向服务器端发送会话请求。
信息交互
会话请求通过后,客户端和服务器端进行加密的信息交互。
Linux/Mac 系统可以使用 ssh-keygen 命令生成公私钥,Windows 系统需要先安装OpenSSH。
使用下面命令生成默认 2048 位的 RSA 算法的公私钥。密钥名称使用 id_rsa,并设置密钥密码。
ssh-keygen -t rsa -b 2048
在实践中,明确指定密钥的位数为 2048 可以避免一些"怪异"现象。
在用户家目录创建 .ssh 目录并设置权限:
mkdir ~/.ssh
chmod 700 ~/.ssh
创建用于存放所有已知用户公钥的文件:
touch ~/.ssh/authorized_keys
追加生成的公钥到 authorized_keys 文件中:
cat id_rsa.pub >> ~/.ssh/authorized_keys
设置 authorized_keys 文件的权限:
chmod 600 ~/.ssh/authorized_keys
恢复 .ssh 目录下所有文件的安全上下文:
restorecon -Rv ~/.ssh
openssh-server 守护进程 sshd 启动时会读取 /etc/ssh/sshd_config 配置文件,下面介绍如何加强 SSH 服务的安全配置。
sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' sshd_config
sed -i 's/^#ClientAliveInterval 0/ClientAliveInterval 300/' sshd_config
echo 'Protocol 2' >> sshd_config
sed -i 's/^#Port 22/Port 2223/' sshd_config
cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-custom.xml
在 ssh-custom.xml 中修改端口行:
<port protocol =“tcp” port =“2223”/>
更新防火墙服务:
firewall-cmd --remove-service=ssh --permanent
firewall-cmd --add-service=ssh-custom --permanent
firewall-cmd --reload
使用 yum 安装 policycoreutils-python 以提供 semanage 命令:
yum install policycoreutils-python
使用 semanage 命令更新 selinux 配置,使 sshd 守护进程可以访问新端口:
semanage port -a -t ssh_port_t -p tcp 2223
检查 sshd_config 的配置:
grep -v '#' sshd_config
重新启动 sshd 服务:
systemctl reload sshd
基于安全考虑,应该每隔一段时间修改一次私钥密码。使用如下命令修改:
ssh-keygen -f ~/.ssh/id_rsa -p
对于客户端界面工具,Windows 系统中可以使用 xshell 和 xftp,MacOS 系统中可以使用 FileZilla Pro(它会提示需要把私钥自动转换为 ppk 格式)等。
在专业版/企业版 Windows 系统的命令行提示符工具中或者 MacOS 系统的终端中也可以直接使用 ssh 和 sftp 命令进行登录。下面分别为 ssh 和 sftp 的登录命令示例:
ssh -p 2223 -i /run/id_rsa sing@192.168.43.150
sftp -P 2223 -i /run/id_rsa sing@192.168.43.150
可以注意到,ssh 和 sftp 指定端口的可选参数名 p 一个为小写一个为大写。要查看更多可选参数,可使用 man 命令查看:
man ssh
man sftp
要了解更多 OpenSSH 的使用介绍,可以参阅OpenSSH 手册。要了解更多 sshd_config 的配置说明,请点解这里。要了解更多 OpenSSH 安全配置,请点击这里。