某公司的电子商务站点由专门的网站管理员进行配置和维护,并需要随时从Internet进行远程管理,考虑到易用性和灵活性,在Web服务器上启用OpenSSH服务,同时基于安全性考虑,需要对 SSH登录进行严格的控制,如图10.4所示。
需求描述
> 允许网站管理员wzadm通过笔记本电脑远程登录Web服务器,笔记本电脑的IP地址并不是固定的,采用密钥对验证方式以提高安全性。
> 允许用户jacky远程登录Web服务器,但仅限于从网管工作站192.168.3.110访问。
> 禁止其他用户通过SSH方式远程登录Web服务器。
创建用户
[root@node01 ~]# useradd wzadm
[root@node01 ~]# passwd wzadm
[root@node01 ~]# useradd jacky
[root@node01 ~]# passwd jacky
1.在客户端创建密钥对(一下操作为客户端操作,非root用户也可操作)
在Linux客户端中,通过ssh-keygen工具为当前用户创建密钥对文件。可用的加密算法为ECDSA 或DSA (ssh-keygen命令的“-t”选项用于指定算法类型)。例如,以 root 用户登录客户端,并生成基于ECDSA算法的SSH密钥对(公钥、私钥)文件,操作如下所示。
[root@node02 ~]# ssh-keygen -t ecdsa
上述操作过程中,提示指定私钥文件的存放位置时,一般直接按Enter键即可,最后生成的私钥、公钥文件默认存放在宿主目录中的隐藏文件夹.ssh下。
[root@node02 ~]# ls -lh /root/.ssh/id_ecdsa* //确认生成的密钥对
新生成的密钥对文件中,id_ecdsa是私钥文件,权限默认为600。对于私钥文件必须妥善保管, 不能泄露给他人;id_ecdsa.pub是公钥文件,用来提供给SSH服务器。
2. 将公钥文件上传至服务器
将上一步生成的公钥文件上传至服务器,并部署到服务器端用户的公钥数据库中,上传公钥文 件时可以选择SCP、FTP、Samba、HTTP甚至发送E-mail等任何方式。例如,可以通过SCP方式将文件上传至服务器的/tmp目录下。
[root@node02 ~]# scp /root/.ssh/id_ecdsa.pub [email protected]:/tmp
3.在服务器中导入公钥文本(以下操作为服务端root操作)
在服务器中,目标用户(指用来远程登录的账号wzadm)的公钥数据库位于~/.ssh目录,默认的 文件名是‘authorized_keys"。如果目录不存在,需要手动创建。当获得客户端发送过来的公钥文件以 后,可以通过重定向将公钥文本内容追加到目标用户的公钥数据库。
[root@node01 ~]# mkdir /home/wzadm/.ssh/
[root@node01 ~]# cat /tmp/id_ecdsa.pub >> /home/wzadm/.ssh/authorized_keys
[root@node01 ~]# tail -l /home/wzadm/.ssh/authorized_keys
在公钥库authorized_keys文件中,最关键的内容是“ecdsa-sha2-nistp256加密字串”部分,当 导入非 ssh-keygen 工具创建的公钥文本时,应确保此部分信息完整,最后“root@node02” 是注释信息。
由于 sshd 服务默认采用严格的权限检测模式(StrictModes yes),因此还需注意公钥库文件 authorized_keys的权限——要求除了登录的目标用户或root用户,同组或其他用户对该文件不能有写入权限,否则可能无法成功使用密钥对验证。
[root@node01 ~]# ls -l /home/wzadm/.ssh/authorized_keys
登录验证方式
对于服务器的远程管理,除了用户账号的安全控制以外,登录验证的方式也非常重要。sshd服 务支持两种验证方式——密码验证、密钥对验证,可以设置只使用其中一种方式,也可以两种方式 都启用。
密码验证:对服务器中本地系统用户的登录名称,密码进行验证,这种方式使用最为简便, 但从客户端角度来看,正在连接的服务器有可能被假冒:从服务器角度来看,当遭遇密码 穷举(暴力破解)攻击时防御能力比较弱。
密钥对验证:要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥 文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用 公钥,私钥进行加密/解密关联验证,大大增强了远程管理的安全性,该方式不易被假冒,且可以免交互登录,在Shell 中被广泛使用。
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。对于安全性要求较高的服 务器,建议将密码验证方式禁用,只允许启用密钥对验证方式:若没有特殊要求,则两种方式都可 启用。
[root@node01 ~]# vim /etc/ssh/sshd_config
//启用密码认证
//43 启用密钥对认证
//45 将wzadm、jacky用户加入白名单,jacky用户只能在IP为192.168.222.1的主机ssh远程到服务端node01
//49 指定公钥库文件
[root@node01 ~]# systemctl restart sshd //重启sshd服务
4. 在客户端使用密钥对验证(以下为客户端操作,非root也可操作)
当私钥文件(客户端)、公钥文件(服务器)均部署到位以后,就可以在客户端中进行测试了。 首先确认客户端中当前的用户为root,然后通过ssh命令以服务器端用户wzadm的身份进行远程登录。如果密钥对验证方式配置成功,则在客户端将会要求输入私钥短语,以便调用私钥文件进行匹配(若未设置私钥短语,则直接登入目标服务器)。
验证实验结果
(1)使用jacky的用户名/密码,可以从主机192.168.222.1远程登录网站服务器。
(2)使用wzadm的用户名/密码,在任何主机中均无法远程登录网站服务器。
(3)在生成密钥对的主机中,使用wzadm的用户名、验证私钥短语后可以远程登录网站服务器。
(4)使用root 用户或其他用户(如wangwu)无法远程登录网站服务器。
[root@node02 ~]# ssh [email protected]
[wzadm@node01 ~]$ whoami
验证结果,只有wzadm用户可以ssh到服务端弄node01,root和其他人都没有权限ssh到服务端
jacky用户在IP为192.168.222.1的主机成功ssh远程到服务端node01