ssh 远程登录协议

一、SSH 服务

        1.1 SSH 基础

        SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。

        优点:

  • 数据传输是加密的,可以防止信息泄漏

  • 数据传输是压缩的,可以提高传输速度

        注意:需要区分什么是 ssh软件包 ,什么是ssh协议。

ssh    闭源
openssh    开源  centos7  上自带的软件 帮助我们实现远程连接

客户端都要哪些远程登录软件:

Linux Client: ssh, scp, sftp,slogin

Windows Client:xshell, MobaXterm,putty, securecrt, sshsecureshellclient

OpenSSH 是实现SSH协议的开源软件项目,适用于各种UNIX、 Linux 操作系统。

Centos 7系统默认已安装openssh相关软件包,并将sshd 服务添加为开机自启动。

执行"systemctl start sshd"命令即可启动sshd 服务

sshd 服务默认使用的是TCP的22端口,安全协议版本sshv2,出来2之外还有1(有漏洞)ftp  20 21

sshd服务的默认配置文件是/etc/ssh/sshd_config
ssh_config和sshd_config都是ssh服务器的配置文件,二者区别在于前者是针对客户端的配置文件,后者则是针对服务端的配置文件。

ssh服务端主要包括两个服务功能 ssh远程链接和sftp服务(文件传输功能)

作用:SSHD 服务使用 SSH 协议可以用来进行远程控制,或在计算机之间传送文件。 相比较之前用 Telnet 方式来传输文件要安全很多,因为 Telnet 使用明文传输,SSH 是加密传输。

服务名称:sshd
服务端主程序:/usr/sbin/sshd  
服务端配置文件:/etc/ssh/sshd_config 
客户端配置文件:/etc/ssh/ssh_config

远程管理linux系统基本上都要使用到ssh,原因很简单:telnet、FTP等传输方式是?以明文传送用户认证信息,本质上是不安全的,存在被网络窃听的危险。SSH(Secure Shell)目前较可靠,是专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题,透过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。

OpenSSH 常用配置文件有两个  /etc/ssh/ssh_config 和  /etc/sshd_config。
ssh_config:为客户端配置文件,设置与客户端相关的应用可通过此文件实现
sshd_config:为服务器端配置文件,设置与服务端相关的应用可通过此文件实现

/etc/ssh/ssh_host_ecdsa_key.pub

ecdsa  代表加密算法    pub代表公钥

1.2 ssh原理

1.2.1公钥传输原理

ssh 远程登录协议_第1张图片

  • 客户端发起链接请求

  • 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)

  • 客户端生成密钥对

  • 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密

  • 客户端发送加密值到服务端,服务端用私钥解密,得到Res

  • 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)

  • 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

ssh加密通讯原理

ssh 远程登录协议_第2张图片

(1)对称加密 1、概念 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用

2、常用算法 在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。

3、特点 1、加密方和解密方使用同一个密钥; 2、加密解密的速度比较快,适合数据比较长时的使用; 3、密钥传输的过程不安全,且容易被破解,密钥管理也比较麻烦;

4、优缺点 对称加密算法的优点是算法公开、计算量小、加密速度快、加密效率高。 对称加密算法的缺点是在数据传送前,发送方和接收方必须商定好秘钥,然后使双方都能保存好秘钥。其次如果一方的秘钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的独一秘钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担

(2)非对称加密 1、概念 非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

2、常用算法

  • RSA(RSA algorithm):目前使用最广泛的算法

  • DSA(Digital Signature Algorithm):数字签名算法,和 RSA 不同的是 DSA仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快

  • ECC(Elliptic curve cryptography,椭圆曲线加密算法)

  • ECDSA:Elliptic Curve Digital Signature Algorithm,椭圆曲线签名算法,是ECC和 DSA的结合,相比于RSA算法,ECC 可以使用更小的秘钥,更高的效率,提供更高的安全保障

3、原理 首先ssh通过加密算法在客户端产生密钥对(公钥和私钥),公钥发送给服务器端,自己保留私钥,如果要想连接到带有公钥的SSH服务器,客户端SSH软件就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下

5、优缺点 相比于对称加密技术,非对称加密技术安全性更好,但性能更慢。

此本次实验中,我们用非对称加密算法ECDSA进行加密,为了方便用root用户,也可给其他普通用户配置

1.2.2 ssh登录

#登录 方法一:
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p port
命令                                          端口号                       

vim /etc/hosts
192.168.91.101 node2

当在 Linux 主机上远程连接另一台 Linux 主机时,如当前所登录的用户是 root 的话,当连接另一台主机时也是用 root 用户登录时,可以直接使用 ssh   IP,端口默认即可,如果端口不是默认的情况下,需要使用-p 指定端口。

例子:
[root@ky15 ~]#ssh [email protected]
#默认使用22端口   root(登录对方的用户)加IP 地址,首次登录会询问,并要求输入密码
The authenticity of host '192.168.80.7 (192.168.80.7)' can't be established.
ECDSA key fingerprint is SHA256:hUK+PQ5Kvm85sQ13EjMqf8M9NSQJPwcfjfCHwLD7sEc.
ECDSA key fingerprint is MD5:55:1e:08:95:2d:40:2f:90:7b:91:0f:d2:38:99:d8:8c.
Are you sure you want to continue connecting (yes/no)?
[email protected]'s password: 
Last login: Sun Jan 14 18:58:57 2024 from 192.168.80.4



如何在远程登录时 无需验证(无询问)远程登录?
[root@localhost .ssh]#vim /etc/ssh/ssh_config
#修改客户端配置文件 远程登录别的主机时无需验证,有安全隐患
35    StrictHostKeyChecking no
#登录方法二
ssh -l [远程主机用户名] [远程服务器主机名或IP 地址] -p port
-l :-l 选项,指定登录名称。
-p: -p 选项,指定登录端口(当服务端的端口非默认时,需要使用-p 指定端口进行登录)
-t
例子:
[root@ky15 ~]#ssh -l root 192.168.91.101
[email protected]'s password: 
Last login: Tue Sep 28 22:25:40 2021 from 192.168.91.100


#####-t############
[root@localhost .ssh]#iptables -A INPUT -s 192.168.91.102 -j REJECT 
#模拟防火墙
[root@localhost ~]# ssh -t 192.168.91.101  ssh -t 192.168.91.102  ssh 192.168.91.103
#方便跳板连接

-t 使用于特殊情况  你无法直接远程连接想要访问的主机,你连接特定的一台主机后再用这台主机连接其它主机最后访问真正想要访问的主机。(每访问一台都要输入密码)


###############
[root@localhost ~]#ssh 192.168.80.7 ifconfig
#可以直接跟上命令
[email protected]'s password: 
ens33: flags=4163  mtu 1500
        inet 192.168.80.7  netmask 255.255.255.0  broadcast 192.168.80.255
        inet6 fe80::28e7:ea21:9eb9:4a47  prefixlen 64  scopeid 0x20
        ether 00:0c:29:9c:b6:eb  txqueuelen 1000  (Ethernet)
        RX packets 408461  bytes 588613721 (561.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 42033  bytes 2646405 (2.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tips :在远程登录时 ,如何确定此时连接的是否是我们需要连的服务器?

cat /etc/ssh/ssh_host_ecdsa_key.pub

ecdsa-sha2-nistp256
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBx/j7aIjmxdsjXPb6if70C/owkPXhw5Rl7xg26KYk6U5iY0uAw5pVlavljDAOKHzJ1XAp21JNAuCdPfQCYayJg=

查看公钥即可。

1.3服务端配置

1.3.1常用配置项:
[root@ky15-1 ~]# vim /etc/ssh/sshd_config 
17  Port    22   
#生产建议修改,别人想攻击就逮着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 修改默认端口

#修改默认端口
[root@localhost ssh]#vim  /etc/ssh/sshd_config
#17 行修改自己默认的端口
17 Port 9527

2 禁止root用户登录

[root@localhost ssh]#vim  /etc/ssh/sshd_config
#开启38 行 并改为 no,默认注释并写的yes
38 PermitRootLogin no
#注意虽然阻止了root 但是普通用户可以使用su
[root@localhost1 ~]#ssh [email protected] -p 9527
[email protected]'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
                                  #只允许 wheel 组中的 用户使用su

3.白名单黑名单列表

白名单 :默认拒绝所有 ,只有允许的用户可以访问
黑名单 :默认允许所有,只名单上的不允许。


[root@localhost ssh]#vim /etc/ssh/sshd_config
#手动添加 白名单
AllowUsers [email protected]      lisi   
#允许所有有的主机访问我的lisi用户
#只允许192.168.91.101 访问 我的 zhangsan 用户


[root@localhost ssh]#vim /etc/ssh/sshd_config
#手动添加 黑名单
DenyUsers    zhangsan lisi    #Linux系统账户        
# 拒绝 zhangsan  lisi 帐户通过 SSH 登录系统



systemctl  restart  sshd
(配置完成需要重启 SSHD 服务)
注意白名单 默认 拒绝所有的 ,加了白名单后,再加黑名单,需要注意白名单的设置。

4 输错密码限制(验证此处)

[root@localhost ssh]#vim /etc/ssh/sshd_config
#取消注释 默认注释了
40 MaxAuthTries 2

[root@localhost ~]#ssh [email protected] -p 9527
#默认次数3
[email protected]'s password: 
Permission denied, please try again.
[email protected]'s password: 
Received disconnect from 192.168.91.100 port 9527:2: Too many authentication failures
Authentication failed.
[root@localhost ~]# ssh -o NumberOfPasswordPrompts=8  [email protected]
#设置尝试次数为8 
[email protected]'s password:

5 .限制 IP SSH 登录

除了可以禁止某个用户登录,我们还可以针对固定的IP进行禁止登录,linux 服务器通过设置 /etc/hosts.allow 和 /etc/hosts.deny 这个两个文件,

hosts.allow许可大于hosts.deny可以限制或者允许某个或者某段IP地址远程 SSH 登录服务器.方法比较简单,具体如下:

1. vim /etc/hosts.allow, 添加

sshd:192.168.0.1:allow  #允许 192.168.0.1 这个 IP 地址 ssh 登录
sshd:192.168.0.1/24:allow #允许 192.168.0.1/24 这段 IP 地址的用户登录


2.vim /etc/hosts.allow,添加

sshd:ALL # 允许全部的 ssh 登录



hosts.allow 和hosts.deny 两个文件同时设置规则的时候,hosts.allow 文件中的规则优先级高,
按照此方法设置后服务器只允许 192.168.0.1 这个 IP 地址的 ssh 登录,其它的 IP 都会拒绝。

ssh服务的最佳实践

  1. 建议使用非默认端口 22

  2. 禁止使用protocol version 1

  3. 限制可登录用户 白名单

  4. 设定空闲会话超时时长

  5. 利用防火墙设置ssh访问策略

  6. 仅监听特定的IP地址 公网 内网

  7. 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs

  8. 使用基于密钥的认证

  9. 禁止使用空密码

  10. 禁止root用户直接登录

  11. 限制ssh的访问频度和并发在线数

  12. 经常分析日志 分离

全部配置项详细解释:
#############1. 关于 SSH Server 的整体设定##############
#Port 22    
##port用来设置sshd监听的端口,为了安全起见,建议更改默认的22端口为5位以上陌生端口
#Protocol 2,1
Protocol 2
##设置协议版本为SSH1或SSH2,SSH1存在漏洞与缺陷,选择SSH2
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress用来设置sshd服务器绑定的IP地址
##监听的主机适配卡,举个例子来说,如果您有两个 IP, 分别是 192.168.0.11 及 192.168.2.20 ,那么只想要
###开放 192.168.0.11 时,就可以设置为:ListenAddress 192.168.0.11
####表示只监听来自 192.168.0.11 这个 IP 的SSH联机。如果不使用设定的话,则预设所有接口均接受 SSH

#############2. 说明主机的 Private Key 放置的档案##########                 
#ListenAddress ::
##HostKey用来设置服务器秘钥文件的路径
# HostKey for protocol version 1
#HostKey /etc/ssh/ssh_host_key
##设置SSH version 1 使用的私钥

# HostKeys for protocol version 2
#HostKey /etc/ssh/ssh_host_rsa_key
##设置SSH version 2 使用的 RSA 私钥

#HostKey /etc/ssh/ssh_host_dsa_key
##设置SSH version 2 使用的 DSA 私钥


#Compression yes      
##设置是否可以使用压缩指令

# Lifetime and size of ephemeral version 1 server key
#KeyRegenerationInterval 1h
##KeyRegenerationInterval用来设置多长时间后系统自动重新生成服务器的秘钥,
###(如果使用密钥)。重新生成秘钥是为了防止利用盗用的密钥解密被截获的信息。

#ServerKeyBits 768
##ServerKeyBits用来定义服务器密钥的长度
###指定临时服务器密钥的长度。仅用于SSH-1。默认值是 768(位)。最小值是 512 。


# Logging
# obsoletes QuietMode and FascistLogging
#SyslogFacility AUTH
SyslogFacility AUTHPRIV
##SyslogFacility用来设定在记录来自sshd的消息的时候,是否给出“facility code”
当有人使用 SSH 登入系统的时候,SSH 会记录信息,这个信息要记录的类型为AUTHPRIV,sshd 服务日志存放在:/var/log/secure。
#LogLevel INFO
##LogLevel用来设定sshd日志消息的级别
定义登录记录的等级

#################3.安全认证方面的设定################
#############3.1、有关安全登录的设定###############
# Authentication:
限制用户必须在指定的时限内认证成功,0 表示无限制。默认值是 120 秒。

#LoginGraceTime 2m
LoginGraceTime用来设定如果用户登录失败,在切断连接前服务器需要等待的时间,单位为妙

#PermitRootLogin yes
PermitRootLogin用来设置能不能直接以超级用户ssh登录,root远程登录Linux很危险,建议注销或设置为no

#StrictModes yes
StrictModes用来设置ssh在接收登录请求之前是否检查用户根目录和rhosts文件的权限和所有权,建议开启
建议使用默认值"yes"来预防可能出现的低级错误。

#RSAAuthentication yes
##RSAAuthentication用来设置是否开启RSA密钥验证,只针对SSH1

#PubkeyAuthentication yes
##PubkeyAuthentication用来设置是否开启公钥验证,如果使用公钥验证的方式登录时,则设置为yes

#AuthorizedKeysFile     .ssh/authorized_keys
AuthorizedKeysFile用来设置公钥验证文件的路径,与PubkeyAuthentication配合使用,默认值是".ssh/authorized_keys"。
该指令中可以使用下列根据连接时的实际情况进行展开的符号: %% 表示'%'、%h 表示用户的主目录、%u 表示该用户的用户名
经过扩展之后的值必须要么是绝对路径,要么是相对于用户主目录的相对路径。

 

#############3.2、安全验证的设定###############
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#RhostsRSAAuthentication no
是否使用强可信主机认证(通过检查远程主机名和关联的用户名进行认证)。仅用于SSH-1。
这是通过在RSA认证成功后再检查 ~/.rhosts 或 /etc/hosts.equiv 进行认证的。出于安全考虑,建议使用默认值"no"。

# similar for protocol version 2
HostbasedAuthentication no
这个指令与 RhostsRSAAuthentication 类似,但是仅可以用于SSH-2。

# Change to yes if you don't trust ~/.ssh/known_hosts for
 RhostsRSAAuthentication and HostbasedAuthentication

#IgnoreUserKnownHosts no
IgnoreUserKnownHosts用来设置ssh在进行RhostsRSAAuthentication安全验证时是否忽略用户的“/$HOME/.ssh/known_hosts”文件
Don't read the user's ~/.rhosts and ~/.shosts files

#IgnoreRhosts yes
IgnoreRhosts用来设置验证的时候是否使用“~/.rhosts”和“~/.shosts”文件

# To disable tunneled clear text passwords, change to no here!
PasswordAuthentication yes
PasswordAuthentication用来设置是否开启密码验证机制,如果用密码登录系统,则设置yes

#PermitEmptyPasswords no
PermitEmptyPasswords用来设置是否允许用口令为空的账号登录系统,设置no

#PasswordAuthentication yes
是否允许使用基于密码的认证。默认为"yes"。
PasswordAuthentication yes

# Change to no to disable s/key passwords
设置禁用s/key密码
ChallengeResponseAuthentication yes
ChallengeResponseAuthentication 是否允许质疑-应答(challenge-response)认证
ChallengeResponseAuthentication no

 

########3.3、与 Kerberos 有关的参数设定,指定是否允许基于Kerberos的用户认证########
#Kerberos options
KerberosAuthentication no
是否要求用户为PasswdAuthentication提供的密码必须通过Kerberos KDC认证,要使用Kerberos认证,
服务器必须提供一个可以校验KDC identity的Kerberos servtab。默认值为no

KerberosOrLocalPasswd yes
如果Kerberos密码认证失败,那么该密码还将要通过其他的的认证机制,如/etc/passwd
在启用此项后,如果无法通过Kerberos验证,则密码的正确性将由本地的机制来决定,如/etc/passwd,默认为yes

KerberosTicketCleanup yes
设置是否在用户退出登录是自动销毁用户的ticket

KerberosGetAFSToken no
如果使用AFS并且该用户有一个Kerberos 5 TGT,那么开启该指令后,
将会在访问用户的家目录前尝试获取一个AFS token,并尝试传送 AFS token 给 Server 端,默认为no

 

3.4、与 GSSAPI 有关的参数设定,指定是否允许基于GSSAPI的用户认证,仅适用于SSH2####
GSSAPI 是一套类似 Kerberos 5 的通用网络安全系统接口。
如果你拥有一套 GSSAPI库,就可以通过 tcp 连接直接建立 cvs 连接,由 GSSAPI 进行安全鉴别。

GSSAPI options
GSSAPIAuthentication no
GSSAPIAuthentication 指定是否允许基于GSSAPI的用户认证,默认为no

GSSAPIAuthentication yes
GSSAPICleanupCredentials yes
GSSAPICleanupCredentials 设置是否在用户退出登录是自动销毁用户的凭证缓存
GSSAPICleanupCredentials yes

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication mechanism.
# Depending on your PAM configuration, this may bypass the setting of
# PasswordAuthentication, PermitEmptyPasswords, and
# "PermitRootLogin without-password". If you just want the PAM account and
# session checks to run without PAM authentication, then enable this but set
# ChallengeResponseAuthentication=no
#UsePAM no
##设置是否通过PAM验证
UsePAM yes

# Accept locale-related environment variables
##AcceptEnv 指定客户端发送的哪些环境变量将会被传递到会话环境中。
###[注意]只有SSH-2协议支持环境变量的传递。指令的值是空格分隔的变量名列表(其中可以使用'*'和'?'作为通配符)。
####也可以使用多个 AcceptEnv 达到同样的目的。需要注意的是,有些环境变量可能会被用于绕过禁止用户使用的环境变量。
#####由于这个原因,该指令应当小心使用。默认是不传递任何环境变量。

AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL
AllowTcpForwarding yes

##AllowTcpForwarding设置是否允许允许tcp端口转发,保护其他的tcp连接

#GatewayPorts no
##GatewayPorts 设置是否允许远程客户端使用本地主机的端口转发功能,出于安全考虑,建议禁止

 

#############3.5、X-Window下使用的相关设定###############

#X11Forwarding no
##X11Forwarding 用来设置是否允许X11转发
X11Forwarding yes

#X11DisplayOffset 10
##指定X11 转发的第一个可用的显示区(display)数字。默认值是 10 。
###可以用于防止 sshd 占用了真实的 X11 服务器显示区,从而发生混淆。
X11DisplayOffset 10

#X11UseLocalhost yes

 

#################3.6、登入后的相关设定#################

#PrintMotd yes
##PrintMotd用来设置sshd是否在用户登录时显示“/etc/motd”中的信息,可以选在在“/etc/motd”中加入警告的信息

#PrintLastLog yes
#PrintLastLog 是否显示上次登录信息

#TCPKeepAlive yes
##TCPKeepAlive 是否持续连接,设置yes可以防止死连接
###一般而言,如果设定这项目的话,那么 SSH Server 会传送 KeepAlive 的讯息给 Client 端,以确保两者的联机正常!
####这种消息可以检测到死连接、连接不当关闭、客户端崩溃等异常。在这个情况下,任何一端死掉后, SSH 可以立刻知道,而不会有僵尸程序的发生!

#UseLogin no
##UseLogin 设置是否在交互式会话的登录过程中使用。默认值是"no"。
###如果开启此指令,那么X11Forwarding 将会被禁止,因为login不知道如何处理 xauth cookies 。
####需要注意的是,在SSH底下本来就不接受 login 这个程序的登入,如果指UsePrivilegeSeparation ,那么它将在认证完成后被禁用。
UserLogin no       

#UsePrivilegeSeparation yes
##UsePrivilegeSeparation 设置使用者的权限
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no

#UseDNS yes
##UseDNS是否使用dns反向解析

#PidFile /var/run/sshd.pid

#MaxStartups 10
##MaxStartups 设置同时允许几个尚未登入的联机,当用户连上ssh但并未输入密码即为所谓的联机,
###在这个联机中,为了保护主机,所以需要设置最大值,预设为10个,而已经建立联机的不计算入内,
####所以一般5个即可,这个设置可以防止恶意对服务器进行连接

#MaxAuthTries 6
##MaxAuthTries 用来设置最大失败尝试登陆次数为6,合理设置辞职,可以防止攻击者穷举登录服务器
#PermitTunnel no

 

############3.7、开放禁止用户设定############

#AllowUsers<用户名1> <用户名2> <用户名3> ...
##指定允许通过远程访问的用户,多个用户以空格隔开

#AllowGroups<组名1> <组名2> <组名3> ...
##指定允许通过远程访问的组,多个组以空格隔开。当多个用户需要通过ssh登录系统时,可将所有用户加入一个组中。

#DenyUsers<用户名1> <用户名2> <用户名3> ...
##指定禁止通过远程访问的用户,多个用户以空格隔开

#DenyGroups<组名1> <组名2> <组名3> ...
##指定禁止通过远程访问的组,多个组以空格隔开。

# no default banner path
#Banner /some/path

# override default of no subsystems
Subsystem       sftp    /usr/libexec/openssh/sftp-server
ClientAliveInterval 3600
ClientAliveCountMax 0
1.3.2 使用秘钥对及免交互验证登录

原理:

  • 用户/密码

  • 基于秘钥

用户/密码:

1.生成公钥和私钥

2.将公钥导给对面

ssh 远程登录协议_第3张图片

  1. 客户端发起ssh请求,服务器会把自己的公钥发送给用户

  2. 用户会根据服务器发来的公钥对密码进行加密

  3. 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功

基于密钥的登录方式

ssh 远程登录协议_第4张图片

  1. 首先在客户端生成一对密钥(ssh-keygen)

  2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

  3. 当客户端再次发送一个连接请求,包括ip、用户名

  4. 服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc

  5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

  6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

  7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

[lisi@ky15-1 root]$ ssh-keygen  --help
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
[lisi@ky15-1 root]$ ssh-keygen -t ecdsa   
#生成密钥文件     ecdsa    hasha512   
Generating public/private ecdsa key pair.
Enter file in which to save the key (/home/lisi/.ssh/id_ecdsa): 
Created directory '/home/lisi/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Passphrases do not match.  Try again.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Passphrases do not match.  Try again.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/lisi/.ssh/id_ecdsa.
Your public key has been saved in /home/lisi/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:hbO1nsVS739lrS+T4lMg4NbYihnyx96e0eYFgqP6eK4 lisi@ky15-1
The key's randomart image is:
+---[ECDSA 256]---+
|                 |
|        ..       |
|       .o=o .    |
|    . . +*++..   |
|     o *S.+.+.. .|
|      +.+o * o. +|
|      .o .+ o.o+.|
|     o. . .=o.=..|
|    E=o  .o.oo ++|
+----[SHA256]-----+
[lisi@ky15-1 .ssh]$ cd ~ 
[lisi@ky15-1 .ssh]$ ssh-copy-id -i id_ecdsa.pub [email protected]
#将公钥文件导入对方用户的 注意路径

#到对面服务器
[root@ky15 home]#cd zhangsan/
[root@ky15 zhangsan]#ls -a
.   .bash_history  .bash_profile  .cache   .mozilla
..  .bash_logout   .bashrc        .config  .ssh
[root@ky15 zhangsan]#cd .ssh/
[root@ky15 .ssh]#ls
authorized_keys
[root@ky15 .ssh]#cat authorized_keys 
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKQSA9IyCq51N+pngvuFSwoBsWBlzBPn1/pI73wSB+onDfd9i81aTl+QBysQFrDfWUcxlCKniUOP0BewP5rxD+o= lisi@ky15-1

免交互登录
[lisi@ky15-1 .ssh]$ ssh-add 
Enter passphrase for /home/lisi/.ssh/id_ecdsa: 
Identity added: /home/lisi/.ssh/id_ecdsa (/home/lisi/.ssh/id_ecdsa)
#此处输入此前的密码
[lisi@ky15-1 .ssh]$ ssh [email protected]
Last login: Wed Sep 29 00:24:26 2021 from 192.168.91.101
[zhangsan@ky15 ~]$ 




ssh-keygen -t ecdsa
ssh-copy-id -i id_ecdsa.pub [email protected]
ssh-add 

#与用户密码无关
#IP地址无关
#只与密钥对有关



#免密登录脚本


#!/bin/bash
PASS=123123
#设置网段最后的地址,4-255之间,越小扫描越快
END=254

IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

1.4ssh客户端

scp命令 —— 远程安全复制

sftp命令 —— 安全FTP上下载

格式:sftp user@ip

安全性传输sftp
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。
sftp 与 ftp 有着几乎一样的语法和功能。SFTP 为 SSH的其中一部分,其实在SSH软件包中,已经包含了一个叫作SFTP(Secure File Transfer Protocol)的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作
所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP 

sftp [email protected]   #登陆到服务器

get下载
get anaconda-ks.cfg /home/

上传
put abc.txt  #默认时会上传的/root 
put abc.txt /home/


查看可用命令
help  #查看sftp可使用的命令和用途

打印服务器当前位置
pwd     #打印当前服务器所在位置
lpwd    #打印当前本地位置

切换目录、查看文件
cd     #切换服务器上的目录
ls     #查看当前目录下文件列表

下载文件、退出sftp
get         #下载文件
get -r      #下载目录
quit        #退出sftp
put         #上传文件
put -r      #上传文件夹
退出命令:quit、exit、bye都可以



[root@ky15-1 .ssh]# sftp  [email protected]


[root@ky15-1 .ssh]# sftp -oPort=220 [email protected]
#如果修改了固定端口





sftp用户权限设置
  对于服务器文件上传, 我们会创建sftp用户登陆服务器,禁止ssh登陆服务器;这样是为了安全性的考虑,避免外部访问服务器的其他路径,对其他路径上的文件进行访问、修改等。

  现在对外提供test用户,sftp访问服务器;创建过程如下:

1. 建立sftp用户 test 

    useradd test, 此时会在创建sftp用户目录/home/test

  chown -R root:test /home/test 
  chmod -R 750 /home/test   

2.创建上传目录file,赋予权限

  cd /home/test

    mkdir file

 chown -R test:test /home/test/file

 chmod -R 755 /home/test/file
 
 
 
说明:
sftp家目录属主必须是root,属组是test,该权限最高设置为755,否则sftp连不上;sftp登陆直接会进入file目录;对于文件上传或下载 不要使用绝对路径/home/test/file.
3. 修改sshd_config文件
     vim /etc/ssh/sshd_config
注释调   Subsystem      sftp    /usr/libexec/openssh/sftp-server
结尾添加
  Subsystem       sftp   internal-sftp
  Match User test01
          ChrootDirectory /home/test  (sftp用户的根目录)
          X11Forwarding no
          AllowTcpForwarding no
          ForceCommand internal-sftp
重启服务:
systemctl restart sshd.service





rsync工具可以基于ssh和rsync协议实现高效率的远程系统之间复制文件,使用安全的shell连接做为传
输方式,比scp更快,基于增量数据同步,即只复制两方不同的文件,此工具来自于rsync包
注意:通信两端主机都需要安装 rsy

rsync  -av /etc server1:/tmp #复制目录和目录下文件
rsync  -av /etc/ server1:/tmp #只复制目录下文件
常用选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留修改时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-u 如果接收者的文件比发送者的文件较新,将忽略同步
-z 压缩,节约网络带宽
-a 存档,相当于-rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
--delete 源数据删除,目标数据也自动同步删除

rsync -auv --delete /data/test 10.0.0.7:/data

2.TCP Wrappers

Linux 系统中,许多网络服务针对客户端提供了访问控制机制,如 Samba、BIND、 HTTPD、OpenSSH 等。本节将介绍另一种防护机制——TCP Wrappers(TCP 封套),以作 为应用服务与网络之间的一道特殊防线,提供额外的安全保障。TCP Wrappers 将 TCP 服务程序“包裹”起来,代为监听 TCP 服务程序的端口,增加了 一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正 的服务程序。TCP Wrappers 还可以记录所有企图访问被保护服务的行为, 为管理员提供丰富的安全分析资料。

ssh 远程登录协议_第5张图片

2.1策略的配置格式

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

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

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

(1)服务程序列表

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

ALL:代表所有的服务

单个服务程序:如“vsftpd“

多个服务程序组成的列表:如“vsftpd,sshd”

2)客户端地址列表

客户端地址列表可分为以下几类。

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

  2. LOCAL:代表本机地址。

  3. 单个 IP 地址:如“192.168.4.4”

  4. 网络段地址:如“192.168.4.0/255.255.255.0”

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

  6. 以“.”结束的网络地址:如“192.168.4.”匹配整个 192.168.4.0/24 网段

  7. 嵌入通配符“”“?”:前者代表任意长度字符,后者仅代表一个字符,如“10.0.8.2

  8. 匹配以 10.0.8.2 开头的所有 IP 地址。不可与以“.”开始或结束的模式混用

  9. 多个客户端地址组成的列表:如“192.168.1.,172.16.16.,.bdqn.com”

2.2访问控制的基本原则

#注意sshd_config的黑白名单
[root@ky15 ~]#vim /etc/ssh/sshd_config 



[root@ky15 ~]#ls /etc/host
host.conf    hostname     hosts        hosts.allow  hosts.deny
[root@ky15 ~]#vim /etc/hosts.allow 
#配置格式  服务:地址(客户端)
#添加
sshd:192.168.91.101


[root@ky15 ~]#vim /etc/hosts.deny
sshd:ALL

sshd: 192.168.0.0/255.255.255.0 EXCEPT 192.168.0.10


一些独立的进程sendmail  slapd  sshd   stunnel   xinetd   gdm   gnone-session    vsftpd    portmap
有些进程不受tcp_wrappers管理httpd   smb    squid 等

ssh 远程登录协议_第6张图片

3.轻量级自动化运维工具pssh

EPEL源中提供了多个自动化运维工具

  • pssh:基于python编写,可在多台服务器上执行命令的工具,也可实现文件复制,提供了基于ssh

    和scp的多个并行工具,项目:http://code.google.com/p/parallel-ssh/

  • pdsh:Parallel remote shell program,是一个多线程远程shell客户端,可以并行执行多个远程

    主机上的命令。 可使用几种不同的远程shell服务,包括rsh,Kerberos IV和ssh,项目:

    https://pdsh.googlecode.com/

  • mussh:Multihost SSH wrapper,是一个shell脚本,允许使用命令在多个主机上通过ssh执行命

    令。 可使用ssh-agent和RSA/DSA密钥,以减少输入密码,项目:

    MUltihost SSH Wrapper download | SourceForge.net

pssh 命令选项如下:

加强版的ssh
-H:主机字符串,内容格式”[user@]host[:port]” 
-h file:主机列表文件,内容格式”[user@]host[:port]” 
-A:手动输入密码模式
-i:每个服务器内部处理信息输出
-l:登录使用的用户名
-p:并发的线程数【可选】
-o:输出的文件目录【可选】
-e:错误输出文件【可选】
-t:TIMEOUT 超时时间设置,0无限制【可选】
-O:SSH的选项
-P:打印出服务器返回信息
-v:详细模式
--version:查看版本
安装需要配置开发源
[root@ky15-1 yum.repos.d]# cd /etc/yum.repos.d
[root@ky15-1 yum.repos.d]# vim CentOS-Base.repo
#最后一行添加
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
        https://mirrors.cloud.tencent.com/epel/$releasever/x86_64
        https://mirrors.huaweicloud.com/epel/$releasever/x86_64
        https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/x86_64
gpgcheck=0


yum install epel-release.noarch -y
#推荐

[root@ky15-1 yum.repos.d]#yum clean all
#清除缓存
[root@ky15-1 yum.repos.d]# pssh
[root@ky15-1 yum.repos.d]# ssh-keygen 
#一路回车
[root@ky15-1 yum.repos.d]# ssh-copy-id 192.168.91.102
[root@ky15-1 yum.repos.d]# ssh-copy-id 192.168.91.105
#上传秘钥对
[root@ky15-1 yum.repos.d]# pssh -H 192.168.91.102 hostname -i
[1] 02:10:10 [SUCCESS] 192.168.91.102



#管理多台,写入一个主机列表文件
[root@ky15-1 yum.repos.d]#vim hosts.txt
[root@ky15-1 yum.repos.d]#cat hosts.txt 
10.0.0.8
10.0.0.6
192.168.80.10:22
#写入需要控制的主机   可加端口号

[root@ky15-1 yum.repos.d]#pssh -h hosts.txt  -i   hostname
#对主机列表中的主机执行 hostname 命令。


#或者
[root@ky15-1 yum.repos.d]# pssh -H "192.168.91.102 192.168.91.105" -i cat /etc/passwd

你可能感兴趣的:(ssh,运维)