Linux中ssh
ssh原理
SSH(Secure Shell)是一种用于安全访问远程计算机的网络协议。SSH使用加密技术来确保通信的安全性,其中包括使用公钥加密和私钥解密的方法。下面是SSH公钥传输的基本原理:
-
生成密钥对:在使用SSH进行通信之前,首先需要在客户端生成一对密钥,包括公钥和私钥。通常使用RSA或DSA算法生成密钥对。
-
发送公钥:生成密钥对后,客户端将公钥发送给服务器。这通常是通过将公钥添加到服务器上的
authorized_keys
文件中来完成的。公钥是一个长字符串,用于加密数据。 -
验证身份:当客户端连接到服务器时,服务器会向客户端发送一个随机的挑战字符串。
-
加密挑战:客户端收到挑战后,使用自己的私钥对挑战字符串进行加密,并将加密后的结果发送回服务器。
-
验证签名:服务器收到加密后的挑战字符串后,使用客户端之前发送的公钥进行解密,得到原始的挑战字符串。然后,服务器将此字符串与自己之前发送的挑战字符串进行比较。如果两者匹配,则客户端被验证为合法用户。
总之,ssh采用非对称加密,在A向B发送消息时,使用B的公钥加密,B收到后使用B的私钥解密。
ssh客户端登录
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port ssh -l [远程主机用户名] [远程服务器主机名或IP 地址] -p port
如果不指定登录用户则使用root用户登录,ssh的默认端口为22,如果服务器的ssh端口没有修改,则可以不写端口号。
~/.ssh/known_hosts
在登录后,对端的公钥信息会保存在上面这个文件中。
ssh服务端配置
ssh的客户端和服务的的配置文件不同:
vim /etc/ssh/ssh_config #客户端配置文件 vim /etc/ssh/sshd_config #服务端配置文件
[root@ky15-1 ~]# vim /etc/ssh/sshd_config 17 Port 22 #生产建议修改 ListenAddress ip #监听地址设置SSHD服务器绑定的IP 地址,0.0.0.0 表示侦听所有地址安全建议:如果主机不需要从公网ssh访问,可以把监听地址改为内网地址 这个值可以写成本地IP地址,也可以写成所有地址,即0.0.0.0 表示所有IP。 LoginGraceTime 2m #用来设定如果用户登录失败,在切断连接前服务器需要等待的时间,单位为秒 PermitRootLogin yes #默认 ubuntu不允许root远程ssh登录 StrictModes yes #检查.ssh/文件的所有者,权限等 MaxAuthTries #用来设置最大失败尝试登陆次数为6 MaxSessions 10 #同一个连接最大会话 PubkeyAuthentication yes #基于key验证 PermitEmptyPasswords no #密码验证当然是需要的!所以这里写 yes,也可以设置为 no,在真实的生产服务器上,根据不同安全级别要求,有的是设置不需要密码登陆的,通过认证的秘钥来登陆。 PasswordAuthentication yes #基于用户名和密码连接 GatewayPorts no ClientAliveInterval 10 #单位:秒 ClientAliveCountMax 3 #默认3 UseDNS yes #提高速度可改为no 内网改为no 禁用反向解析 GSSAPIAuthentication yes #提高速度可改为no MaxStartups #未认证连接最大值,默认值10 Banner /path/file #以下可以限制可登录用户的办法:白名单 黑名单 AllowUsers user1 user2 user3@ip(限制主机) DenyUsers user1 user2 user3 AllowGroups g1 g2 DenyGroups g1 g2
实际操作
修改完配置文件后记得重启服务sshd。
1、修改默认端口
修改端口后需要在防火墙上放通端口;不能只放通ssh服务,因为ssh默认端口为22,这样新端口不会放通。
2、禁止root登录
这样修改后不能直接使用root登录:
但是使用普通用户登陆后可以切换到root用户:
所以我们需要修改pam认证模块:
vim /etc/pam.d/su
开启第六行,这样之后只有root用户和wheel组内的用户可以切换用户,普通用户不能切换用户。
可以将用户添加到附加组wheel,这样该用户可以切换用户:
3、白名单黑名单列表
AllowUsers zhangsan@192.168.91.101 lisi #允许所有有的主机访问我的lisi用户 #只允许 zhangsan 从192.168.91.101上访问
4、输错密码限制
40 MaxAuthTries 2 [root@localhost ~]#ssh zhangsan@192.168.91.100 -p 9527 #默认次数3 zhangsan@192.168.91.100's password: Permission denied, please try again. zhangsan@192.168.91.100's password: Received disconnect from 192.168.91.100 port 9527:2: Too many authentication failures Authentication failed. [root@localhost ~]# ssh -o NumberOfPasswordPrompts=8 root@192.168.91.100 #设置尝试次数为8 root@192.168.91.100's password:
ssh免密登录
-
-
并将客户端的公钥ssh-copy-id 拷贝到服务端
-
当客户端再次发送一个连接请求,包括ip、用户名
-
服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc
-
服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
-
得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
-
可以通过-q选项选择加密方式。不选择则使用默认的rsa加密。
将公钥文件发给服务端:
[root@localhost ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.146.150
去服务端查看公钥文件:
与客户端公钥文件相同:
免密登录成功:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了