远程访问及控制(下)

简介: 远程访问及控制(下)

构建秘钥对验证的SSH体系

       正如前面所提及的,密钥对验证方式可以为远程登录提供更好的安全性。下面将介绍在linux服务器、客户端中构建秘钥对验证SSH体系的基本过程。整个过程包括四步,首先要在SSH客户端以zhangsan用户身份登录创建密钥对,并且要将创建的公钥文件上传至ssh服务器端,然后要将公钥信息导入服务器端的目标用户lisi的公钥数据库,最后以服务器端用户lisi的身份登录验证。图示如下。

在客户端创建密钥对

       在Linux客户端中,通过ssh-keygen工具为当前用户创建密钥对文件。可用的加密算法为ECDSA或DSA(ssh-keygen命令的“-t”选项用于指定算法类型)。例如,以zhangsan用户登录客户端,并生成基于ECDSA算法的SSH密钥对(公钥、私钥)文件。

1.  [zhangsan@localhost ~]$ ssh-keygen -t ecdsa
2.  Generating public/private ecdsa key pair.
3.  Enter file in which to save the key (/home/zhangsan/.ssh/id_ecdsa):             //指定私钥位置
4.  Created directory '/home/zhangsan/.ssh'.
5.  Enter passphrase (empty for no passphrase):                                     //设置私钥短语
6.  Enter same passphrase again:                                                    //确认所设置的短语
7.  Your identification has been saved in /home/zhangsan/.ssh/id_ecdsa.
8.  Your public key has been saved in /home/zhangsan/.ssh/id_ecdsa.pub.
9.  The key fingerprint is:
10.  4d:e5:c6:54:e4:b1:db:21:a9:9d:86:17:38:af:d6:03 zhangsan@localhost.localdomain
11.  The key's randomart image is:
12.  +--[ECDSA  256]---+
13.  |            oo+  |
14.  |           =...o |
15.  |          .o++o. |
16.  |         o .* +o.|
17.  |        S .E *. .|
18.  |            *    |
19.  |           o o   |
20.  |          .   .  |
21.  |                 |
22.  +-----------------+

       上述操作过程中,提示指定私钥文件的存放位置时,一般直接按Enter键即可,最后生成的私钥,公钥文件默认存放在宿主目录中的隐藏文件夹.ssh下。私钥短语用来对私钥文件进行保护,当使用该私钥登录时必须正确提供此处所设置的短语。尽管不设置私钥短语也是可行的。(实现无口令登录),但在生产环境中不建议这样子。

1.  [zhangsan@localhost ~]$ ls -lh ~/.ssh/id_ecdsa*
2.  -rw------- 1 zhangsan zhangsan 314 Jun  7 17:06 /home/zhangsan/.ssh/id_ecdsa
3.  -rw-r--r-- 1 zhangsan zhangsan 192 Jun  7 17:06 /home/zhangsan/.ssh/id_ecdsa.pub

       新生成的密钥对文件中,id_ecdsa是私钥文件,权限默认是600,对于私钥文件必须妥善保管,不能透漏给他人;id_ecdsa.pub是公钥文件,用来提供给SSH服务器。

将公钥文件上传至服务器

       将上一步生成的公钥文件上传至服务器,并部署到服务器端用户的公钥数据库中。上传公钥文件是可以选择SCP,FTP,Samba,HTTP甚至可以发送E-mail等任何方式。例如,可以通过scp方式将文件上传至服务器的/tmp目录下。

1.  [zhangsan@localhost ~]$ scp ~/.ssh/id_ecdsa.pub zhangsan@192.168.1.10:/tmp
2.  zhangsan@192.168.1.10's password: 
3.  id_ecdsa.pub                                    100%  192     0.2KB/s   00:00

在服务器中导入公钥文本

       在服务器中,目标用户(指用来远程登录的账号lisi)的公钥数据库位于~/.ssh目录。默认的文件名是"authorized_keys"。如果目录不存在,需要手动创建。当获得客户端发送过来的公钥文件以后,可以通过重定向将公钥文本内容追加到目标用户的公钥数据库。

1.  [root@localhost ~]# mkdir /home/lisi/.ssh
2.  [root@localhost ~]# cat /tmp/id_ecdsa.pub >> /home/lisi/.ssh/authorized_keys
3.  [root@localhost ~]# tail -1 /home/lisi/.ssh/authorized_keys 
4.  ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBDXyjipAU16fQfUtAjCvqSs8oCfAeIrW9vi36zUBdftmbgwA87dK1JJUaYqRXDo7tpKs6JUGDivmD83ZsPK96w= zhangsan@localhost.localdomain

       在公钥库authorized_keys文件中,最关键的内容是"ecdsa-sha2-nistp256加密字串"部分,当导入非ssh-keygen工具创建的公钥文本时,应确保此部分信息完整,最后的"zhangsan@localhost"是注释信息。由于sshd服务默认采用严格的权限检测模式(StrictModes yes),因此还需要注意公钥库文件authorized_keys的权限——要求除了登录的目标用户或root用户,同组或其他与用户对该文件不能有写入权限,否则可能无法成功使用密钥对验证。

1.  [root@localhost ~]# ls -l /home/lisi/.ssh/authorized_keys 
2.  -rw-r--r-- 1 root root 192 Jun  8 10:13 /home/lisi/.ssh/authorized_keys

除此之外,应确认sshd服务是否支持密钥对验证方式。

在客户端使用密钥对验证

       当私钥文件(客户端),公钥文件(服务器)均部署到位后,就可以在客户端中进行测试了。首先确认客户端中当前的用户为zhangsan,然后ssh命令以服务器端用户lisi的身份进行远程登录。如果密钥对验证方式配置成功,则在客户端将会要求输入私钥短语,以便调用私钥文件进行匹配(若未设置私钥短语,则直接登入目标服务器)。

1.  [zhangsan@localhost ~]$ ssh lisi@192.168.1.10
2.  Enter passphrase for key '/home/zhangsan/.ssh/id_ecdsa': 
3.  Last login: Fri May 11 01:15:34 2018
4.  [lisi@localhost ~]$ whoami
5.  lisi                                                                                //成功登录服务器

       经过“客户端创建密钥对”、“将公钥上传至服务器”、“在服务器中导入公钥文本”与“在客户端使用密钥对验证”四个步骤,ssh密钥对验证体系已经构建完成。

       而上所述步骤中,第二步和第三步其实可以采用另外一种方法实现,即使用"ssh-copy-id -i 公钥文件 user@host"格式“-i”选项指定公钥文件,“user”是指目标主机的用户。验证密码后,会将公钥自动添加到目标主机user宿主目录下的.ssh/authorized_keys文件结尾。

1.  [root@localhost ~]# ssh-copy-id -i ~/.ssh/id_ecdsa.pub lisi@192.168.1.10
2.  The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
3.  ECDSA key fingerprint is 68:df:0f:ac:c7:75:df:02:88:7d:36:6a:1a:ae:27:23.
4.  Are you sure you want to continue connecting (yes/no)? yes
5.  /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
6.  /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
7.  lisi@192.168.1.10's password:                                   //输入lisi密码
8.  
9.  Number of key(s) added: 1
10.  
11.  Now try logging into the machine, with:   "ssh 'lisi@192.168.1.10'"
12.  and check to make sure that only the key(s) you wanted were added.

查看服务器中目标用户lisi的公钥数据库如下。

1.  [root@localhost ~]# ls -l /home/lisi/.ssh/authorized_keys 
2.  -rw------- 1 lisi lisi 188 Jun  8 10:53 /home/lisi/.ssh/authorized_keys
3.  [root@localhost ~]# tail -l /home/lisi/.ssh/authorized_keys 
4.  ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJe/THiMONgPK5VlqjM/ZSKgaHzRrxPyCld1EFMLRcPwXN74r7K4/GUaEKV33TrVRg/fh7T0ETdZ9tnbnKm+BAo= root@localhost.localdomain

       使用密钥对验证的方式登录时,不需要知道目标用户的密码,而是验证客户端用户的私钥短语并检查私钥、公钥是否配对,这样安全性更好。

TCP Wrappers访问控制

       在Linux系统中,很多网络服务针对客户端提供了访问控制机制,如Samba,BIND,HTTPD,OpenSSH等,本节将介绍另一种防护机制—TCP Wrappers(TCP封套),以作为应用服务与网络之间的一道特殊防线,提供额外的安全保障。

TCP Wrappers概述

       TCP Wrappers将TCP服务程序“包裹”起来,代为监听TCP服务程序的端口,增加了一个安全检测过程,外来的连接请求必须通过这层安全检测,获得许可后才能访问真正服务程序,TCP Wrappers还可以记录所有企图访问被保护服务的行为,为管理员提供丰富的安全分析资料。TCP Wrappers保护机制的两种实现方式,直接使用tcpd程序对其他服务程序进行保护,需要运行tcpd;由其他网络服务程序调用libwrap.so.*链接库,不需要运行tcpd程序。

       通常,链接库方式的应用要更加广泛,也更加有效率。例如,vsftpd,sshd及超级服务器xinetd等,都调用了libwrap共享库(使用ldd命令可以查看程序的共享库)。

1.  [root@localhost ~]# ldd /usr/sbin/sshd | grep "libwrap"
2.      libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f72f37ef000)

       xinetd是一个特殊的服务管理程序,通常被称为超级服务器。xinetd通过在/etc/xinetd.d目录下为每个被保护的程序建立一个配置文件,调用TCP Wrappers机制来提供额外的访问控制保护。

TCP Wrappers的访问策略

       TCP Wrappers机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制。对应的两个策略文件为/etc/hosts.allow和/etc/hosts.deny,分别用来设置允许和拒绝的策略。

策略的配置格式

       两个策略文件的作用相反,但配置记录的格式相同

<服务程序列表>: <客户端地址列表>

       服务程序列表,客户端地址列表之间以冒号分隔,两个列表内的多个项之间以逗号分隔。

1. 服务程序列表

       服务程序列表分为以下几类。

ALL:代表所有的服务。

单个服务程序:如“vsftpd”。

多个服务程序组成的列表,如"vsftrpd,sshd"

2. 客户端地址列表

ALL:代表任何客户端地址。

LOCAL:代表本机地址。

单个IP地址:如“192.168.1.1”

网络段地址:如“192.168.1.0/255.255.255.0”。

以"."开始的域名:如“.123.com”匹配123.com域中的所有主机。

以"."结束的网络地址:如“192.168.1.”匹配整个192.168.1.0/24网段。

嵌入通配符"*","?":前者代表任意长度字符,后者仅代表一个字符,如“10.0.8.2 *”匹配以10.0.8.2开头的所有IP地址,不可与以"."开始或结束的模式混用。

多个客户端地址组成的列表:如"192.168.1. ,172.16.16. ,.123.com "。

访问控制的基本原则

       关于TCP Wrappers机制的访问策略,应用时遵循以下顺序和原则:首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问;否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;如果检查上述两个文件都找不到相匹配的策略,则允许访问。

TCP Wrappers配置实例

       实际使用TCP Wrappers机制时,较宽松的策略可以是”允许所有,拒绝个别“,较严格的策略时“允许个别,拒绝所有”。前者只需要在hosts.deny文件中添加相应的拒绝策略就可以了;后者则除了在hosts.allow中添加允许策略之外,还需要在hosts.deny文件中设置“ALL:ALL”的拒绝策略。

       例如,只希望从IP地址为61.63.65.67的主机或位于192.168.1.0/24网段的主机访问sshd服务,其他地址被拒绝,可以执行以下操作。

1.  [root@localhost ~]# vim /etc/hosts.allow 
2.  sshd:61.63.65.67,192.168.1.*
3.  [root@localhost ~]# vim /etc/hosts.deny
4.  sshd:ALL


相关文章
|
Kubernetes 安全 数据安全/隐私保护
在K8S上部署可扩展的基于Occlum的安全推理实例
机密计算是指通过在基于硬件的可信执行环境(TEE)中执行计算来保护数据应用中的隐私安全,是目前最火热的隐私保护技术之一。在云上运行TEE应用也得到了云厂商的广泛支持,包括阿里云,微软Azure云,都提供了基于SGX技术的机密安全实例服务。用户可以在这些云上申请带SGX支持的安全实例,然后部署自己的机密安全服务,既可以避免隐私数据泄露,也无需操心繁琐的基础架构层的配置。无论哪种云,最流行的分布式部署
在K8S上部署可扩展的基于Occlum的安全推理实例
|
2月前
|
存储 机器学习/深度学习 编解码
阿里云服务器计算型c7/c8a/c8i/c8y/c9i实例性能、适用场景及价格对比与选择参考
阿里云服务器计算型c7、计算型c8a、计算型c8i、计算型c8y和计算型c9i同属于计算型实例,是目前计算型实例规格中的热门实例规格,通常在阿里云的活动中,计算型实例也主要以这几个实例规格为主,本文为大家介绍c7/c8a/c8i/c8y/c9i实例各自的实例性能、适用场景及价格对比,以供选择参考。
|
4月前
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
543 2
|
4月前
|
自然语言处理 数据可视化 API
解锁 Qwen3 的Agent能力,CookBook来咯!
Qwen3系列模型具备强大Agent能力,但从模型到Agent仍存技术难题。为此,我们推出基于Qwen-Agent框架的3个CookBook示例,展示如何让Qwen3丝滑调用MCP Server全过程。不论是本地部署还是API调用模型,开发者均可通过Qwen-Agent完成复杂任务。CookBook包括自然语言驱动数据库操作、云端高德API地理服务及文档转思维导图等功能。Qwen-Agent封装了工具调用模板和解析器,原生支持MCP协议,大幅降低开发成本。欢迎体验并反馈。
520 0
可以制作微信自导自演的聊天记录
Python实现制作自导自演微信聊天记录
|
存储 安全 数据安全/隐私保护
探索安卓与iOS的隐私保护机制####
【10月更文挑战第15天】 本文深入剖析了安卓和iOS两大操作系统在隐私保护方面的策略与技术实现,旨在揭示两者如何通过不同的技术手段来保障用户数据的安全与隐私。文章将逐一探讨各自的隐私控制功能、加密措施以及用户权限管理,为读者提供一个全面而深入的理解。 ####
668 1
|
移动开发 前端开发 JavaScript
原生JavaScript+canvas实现五子棋游戏_值得一看
本文介绍了如何使用原生JavaScript和HTML5的Canvas API实现五子棋游戏,包括棋盘的绘制、棋子的生成和落子、以及判断胜负的逻辑,提供了详细的代码和注释。
269 0
原生JavaScript+canvas实现五子棋游戏_值得一看
|
关系型数据库 数据库 数据库管理
关系型数据库数据唯一性保证
【5月更文挑战第17天】
321 1
|
监控 安全 数据安全/隐私保护
如何通过手机设置苹果账户的双重认证
如何通过手机设置苹果账户的双重认证
317 1