SSH简述
1、SSH
1.1 简单介绍
SSH协议(secure shell)
-
是一种安全通道协议
-
对数据进行加密处理,用于远程管理
OpenSSH(安装包名,centos7自带)
-
服务名称:sshd
-
服务端主程序:/usr/sbin/sshd
-
-
客户端配置文件:/etc/ssh/ssh_config
优点:
-
数据传输是加密的,可以防止信息泄漏
-
数据传输是压缩的,可以提高传输速度
使用
ssh服务端主要包括两个服务功能 ssh远程链接和sftp服务(文件传输功能)
作用:SSHD 服务使用 SSH 协议可以用来进行远程控制,或在计算机之间传送文件。 相比较之前用 Telnet 方式来传输文件要安全很多,因为 Telnet 使用明文传输,SSH 是加密传输。
1.2 传输原理
第一次连接时,客户端发起请求
服务端生成会话id,会将会话id和服务端的公钥交给客户端
客户端得到服务端的公钥和会话id
客户端用户通过会话id与自己的公钥生成一个值,再将这个值通过服务端的公钥加密
客户端将加密后的值传给服务端,服务端利用自己的私钥解密得到客户端的公钥和客户端的会话id

免密登录 第一步生成密钥 ssh-keygen -t指定加密方式,默认rsa Enter file in which to save the key (/home/lisi/.ssh/id_ecdsa): #选择密钥文件存放位置,默认在当前用户家目录下 .ssh文件夹中 会生成两个文件,带.pub是公钥,要传给服务器 Enter passphrase (empty for no passphrase): #对密钥文件进行加密,如果设置了密码,只是对文件进行加密,打开需要密码 ssh-copy-id -i服务器地址#将密钥传给服务器
登录

#登录 方法一: ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port 命令 端口号 vim /etc/hosts 192.168.91.101 node2 当在 Linux 主机上远程连接另一台 Linux 主机时,如当前所登录的用户是 root 的话,当连接另一台主机时也是用 root 用户登录时,可以直接使用 ssh IP,端口默认即可,如果端口不是默认的情况下,需要使用-p 指定端口。 jAdnvemeML+z00Zmk/SL5PWDVEvJqwPFID3iae+Xf4g. jAdnvemeML+z00Zmk/SL5PWDVEvJqwPFID3iae+Xf4g. 例子: #默认使用22端口 root(登录对方的用户)加IP 地址,首次登录会询问,并要求输入密码 [root@31yml /]#ssh 192.168.177.200 The authenticity of host '192.168.177.200 (192.168.177.200)' can't be established. ECDSA key fingerprint is SHA256:n6/OvgUhDi1cUlAFBjSt5QMt68EYA5fwnPZRQxHBR+c. ECDSA key fingerprint is MD5:dc:49:1d:d0:21:f2:4f:79:3f:e6:e6:29:a8:4e:33:c4. Are you sure you want to continue connecting (yes/no)? y Please type 'yes' or 'no': yes Warning: Permanently added '192.168.177.200' (ECDSA) to the list of known hosts. root@192.168.177.200's password: Last login: Fri Aug 4 00:46:23 2023 ########方便编写脚本##################### [root@31yml ~]#vim /etc/ssh/ssh_config #修改客户端配置文件 无需验证,有安全隐患 35 StrictHostKeyChecking no #登录方法二 ssh -l [远程主机用户名] [远程服务器主机名或IP 地址] -p port -l :-l 选项,指定登录名称。 -p: -p 选项,指定登录端口(当服务端的端口非默认时,需要使用-p 指定端口进行登录) -t 例子: [root@31yml ~]#ssh -l root 192.168.91.101 root@192.168.91.101's password: Last login: Tue Sep 28 22:25:40 2021 from 192.168.91.100
1.3 服务端配置
1.3.1常用项配置

[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
1.3.2 实际操作
修改默认端口

#修改默认端口 [root@localhost ssh]#vim /etc/ssh/sshd_config #17 行修改自己默认的端口 17 Port 8848
禁止root用户登录

[root@localhost ssh]#vim /etc/ssh/sshd_config #开启38 行 并改为 no,默认注释并写的yes 38 PermitRootLogin no #注意虽然阻止了root 但是普通用户可以使用su [root@localhost1 ~]#ssh zhangsan@192.168.177.100 -p 8848 zhangsan@192.168.177.100's password: Last login: Fri Aug 27 16:50:35 2021 [zhangsan@localhost2 ~]$ [zhangsan@localhost2 ~]$ su root 密码: [root@localhost2 zhangsan]# 修改 pam认证模块 [root@localhost ssh]#vim /etc/pam.d/su #开启第6行,默认注释 6 auth required pam_wheel.so use_uid
白名单黑名单列表

[root@localhost ssh]#vim /etc/ssh/sshd_config #手动添加 AllowUsers zhangsan@192.168.177.200 lisi #允许所有有的主机访问我的lisi用户 #只允许 zhangsan 从192.168.177.200上访问 DenyUsers liwu
输错密码限制(验证此处)

[root@localhost ssh]#vim /etc/ssh/sshd_config #取消注释 默认注释了 40 MaxAuthTries 2 [root@localhost ~]#ssh zhangsan@192.168.177.100 -p 8848 #默认次数3 zhangsan@192.168.177.100's password: Permission denied, please try again. zhangsan@192.168.177.100's password: Received disconnect from 192.168.177.100 port 8848:2: Too many authentication failures Authentication failed. [root@localhost ~]# ssh -o NumberOfPasswordPrompts=8 root@192.168.177.100 #设置尝试次数为8 root@192.168.177.100's password:
1.3.3 使用秘钥对及免交互验证登录
-
客户端发起ssh请求,服务器会把自己的公钥发送给用户
-
用户会根据服务器发来的公钥对密码进行加密
-
加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
-
首先在客户端生成一对密钥(ssh-keygen)
-
并将客户端的公钥ssh-copy-id 拷贝到服务端
-
当客户端再次发送一个连接请求,包括ip、用户名
-
服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc
-
服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
-
得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
-
服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

[root@31yml .ssh]#ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:LLWeS+q61pZv8xkco6lxU0w+l/DRfiw2feIsVNyLgQM root@31yml The key's randomart image is: +---[RSA 2048]----+ | E | | . .o . | | . oo..+ .| | o = o.=oo.| | . S B =.*.=| | o * * + =.| | ...O o . o | | . +*oo o . | | .o=+oooo | [root@31yml .ssh]#ssh-copy-id -i 192.168.177.200 /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub" /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /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 root@192.168.177.200's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh '192.168.177.200'" and check to make sure that only the key(s) you wanted were added. [root@31yml .ssh]#ssh 192.168.177.200 Last login: Mon Aug 7 21:56:41 2023 from 192.168.177.100 [root@yml-2 ~]#
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了