【Linux网络】SSH远程访问控制

文章详细介绍了SSH协议的原理和安全特性,包括SSH服务端的配置、端口和配置文件,以及如何通过OpenSSH实现用户登录控制和密码与密钥对验证。此外,讲解了使用ssh、scp和sftp命令进行安全文件传输,并探讨了TCPWrappers作为访问控制机制的角色和配置策略。


一、SSH远程管理

1.SSH协议

  SSH (Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。因此SSH协议具有很好的安全性。

TELNET与SSH的区别

  首先telnet和ssh都是连接远程计算机的连接协议,可以完成对计算机的控制,方便维护。其次,他们都是基于TCP/IP协议下的,所以连接时都需要知道目标机的网址或者域名,最后由于他们都是与远程主机连接的通道,完成的目的是一样的,只不过手段不一样而已。

  telnet连接的时候直接建立TCP连接,所有传输的数据都是明文传输,所以是一种不安全的方式。

  而ssh经过加密算法加密,收报文需要解密,发报文需要加密,导致其传输速度、效率较telnet低很多,然而,它却有telnet不具有的安全性。

2.SSH服务架构

  SSH分为SSH客户端和SSH服务端,SSH客户端时通过网络连接SSH服务端。

  SSH在数据传输过程中是加密传输,利用SSH协议可以有效防止远程管理过程中的信息泄露问题;同时由于SH数据传输的数据被压缩了,占用带宽就相应减小了,而占用带宽效率,传输速率就快了,所以数据传输被压缩是有效提高传输速度。

在这里插入图片描述

  SSH服务端的软件名称是OpenSSH,而支持SSH客户端的软件包含Putty(小型开源远程登录工具)、Xshell、CRT(SecureCRT,比较著名的远程连接工具)、Mobaxterm这几种。

SSH服务端——OpenSSH

  OpenSSH是实现SSH协议的开源软件项目,适用于各种UNIX、 Linux操作系统。Centos 7系统默认已安装OpenSSH相关软件包,并将sshd 服务添加为开机自启动。

  查看软件是否安装可以执行rpm -q openssh命令;执行systemctl start sshd命令即可启动sshd服务;查看服务状态执行systemctl status sshd命令。

查看开机自启动的方式

  可以执行systemctl status sshd查看,但由于数据太多,可以使用systemctl is-enabled sshd查看是否为enabled,若返回enabled则为开机自启。

3.SSH端口及配置文件

   sshd 服务默认使用的是TCP的22端口,安全协议版本sshv2。

配置文件

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

二、配置OpenSSH服务端

1.服务监听常用选项

[root@host ~]# vim /etc/ssh/sshd_config 

  Port 22:意思是监听端口号为22。一般情况下需要修改端口号,防止外来用户扫描22号端口来攻击主机。

  ListenAddress 0.0.0.0:意思是监听地址为任意网段,也可以指定OpenSSH服务器的具体IP地址。

LoginGraceTime 2m:意思是登录验证时间为2分钟。在用户远程连接过程中需要输入账号密码,系统不  能一直等待,所以需要给用户一个超时时间,如果在规定时间内用户还不能登录,那么就强制退出。

  PermitRootLogin yes:意思是允许root用户登录,默认情况下允许root用户登录。在配置服务器初始化操作时,需要做安全加固设置,其中就有一项需要修改ssh不允许root用户直接登录,将此选项更改为no即可实现。

  MaxAuthTries 6:意思是最大重试次数为6。ssh连接验证密码的最大次数为6次,如果验证超过规定的次数,则强制退出断开ssh连接。。可以用XShell测试,如果用ssh验证,则为3次,因为ssh客户端命令本身有次数限制。

  PermitEmptyPasswords no:意思时禁止空密 码用户登录。默认情况下禁止无密码登录,一般通过passwd -d给一个用户密码,如果要给用户禁止无密码远程登录,就可以将此选项设置为no,若不设置no风险很大

  UsePAM yes:意思是开启PAM认证,此选项默认开启。利用 PAM 认证SSH,由于SSH本身自带密码验证所以设置为no即可。

  UseDNS no:意思是禁止DNS反向解析,以提高服务器的响应速度。其他用户可以通过域名找到本主机,返回响应消息时用户会通过IP地址解析出发送方的主机名,然后通过主机名返回给发送方。一般情况下没有必要,通过DNS反向解析时会消耗服务器很多性能,所以默认将此项设置为no

  注意:在生产环境中,Port选项端口是肯定会需要修改的,不会使用22号端口。PermitRootLogin设置为no,禁止root用户登录。

2.用户登录控制

白名单设置

  只允许zhangsan、lisi、wangwu用户登录,且其中wangwu用户仅能够从IP地址为61.23.24.25的主机远程登录

AllowUsers zhangsan lisi wangwu@61.23.24.25			#多个用户以空格分隔

  即在/etc/ssh/sshd_config 文件中用AllowUsers命令设置的用户均可以远程登录,若不在此设置的用户中,则无法远程登录;AllowUsers命令还可以设置允许指定的主机使用指定的用户登录,若其他主机使用该用户则无法登录。

  简单来说,AllowUsers命令允许指定的用户登录,其余用户不可以登录

黑名单设置

  禁止某些用户登录,用法于AllowUsers 类似

DenyUsers wangwu@61.23.24.25	

  注意AllowUsersDenyUsers不能同时使用。

  简单来说,DenyUsers命令就是禁止规定的用户登录,其余用户可以登录。

3.登录验证方式

  sshd服务支持两种验证方式:密码验证、密钥对验证,可以设置只使用其中一个,也可以两种方式都启用。

3-1 密码验证

  服务器中本地系统用户的登录名称、密码进行验证。这种方式使用最为简便,但从客户机角度来看,正在连接的服务器有可能被假冒;从服务器角度来看,当遭遇密码穷举(暴力破解)攻击时防御能力比较弱。

3-2 密钥对验证

  要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证。能增强安全性,还可以实现免交互登录。

公钥和私钥的关系:

  • 公钥和私钥是成对生成的,这两个密钥互不相同,可以互相加密和解密。如果用公钥对数据进行加密,只有用相对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
  • 不能根据一个密钥来推算出另一个密钥。
  • 公钥对外公开,私钥只有私钥的持有人才知道。

密钥验证的过程:

   如果要想连接到带有公钥的SSH服务器,客户端SSH软件就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后把它和连接的客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公钥加密"质询"( challenge)并把它发送给SSH客户端。

密钥和密码的用法:

  当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。对于安全性要求较高的服务器,建议将密码验证方式禁用,只允许启用密钥对验证方式;若没有特殊要求,则两种方式都可启用。

[root@host ~]# vim etc/ ssh/ sshd_config
PasswordAuthentication yes					#启用密码验证
PubkeyAuthentication yes					#启用密钥对验证
AuthorizedKeysFile .ssh/authorized_keys	#指定公钥库文件

三、使用SSH客户端程序

1.ssh——远程登录

  通过ssh命令可以远程登录sshd服务,为用户提供一个安全的Shell环境,以便对服务器进行管理和维护。使用时应指定登录用户、目标主机地址作为参数。

ssh命令格式:

ssh  [远程主机用户名]@远程服务器主机名/IP地址  [-p  端口号]

  当用户第一次登录SSH服务器时,必须接受服务器发来的ECDSA密钥(根据提示输入"yes”〉后才能继续验证。接收的密钥信息将保存到~/.sh/known_hosts文件中。密码验证成功以后,即可登录目标服务器的命令行环境中了。

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

[root@localhost opt]# ssh 192.168.145.30
The authenticity of host '192.168.145.30 (192.168.145.30)' can't be established.
ECDSA key fingerprint is SHA256:GMe3A1jDRCRAG2PytICqL1xQvMeFhEyXqYzYboDGuKc.
ECDSA key fingerprint is MD5:55:31:a4:df:eb:76:a2:fb:55:34:51:52:63:10:a5:bb.
Are you sure you want to continue connecting (yes/no)? yes
root@192.168.145.30's password: 
Last login: Thu Apr 20 17:55:40 2023 from 192.168.145.1
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
[root@host ~]# 

补充:

ssh -p 端口号 目标主机ip地址 命令

  ssh登录目标主机并在目标主机执行相关命令,然后直接退出。

2.scp——远程复制

  安全性复制。scp是secure copy的简写,用于在Linux系统下进行跨主机拷贝文件的命令,而且scp传输是加密的。使用scp命令时,必须指定复制源、目标,还应指定目标主机地址、登录用户、执行后提示验证口令。

下行复制

  若本主机(Centos7-2)想要复制远程主机(Centos7-1)中的/opt/目录下的文件,可以在本主机(Centos7-2)执行以下操作:

[root@host opt]# ll
总用量 0
drwxr-xr-x. 2 root root 6 10月 31 2018 rh
[root@host opt]# ls
rh
[root@host opt]# scp root@192.168.145.15:/opt/a.txt ./
root@192.168.145.15's password: 
a.txt                                              100%    2     0.5KB/s   00:00    
[root@host opt]# ls
a.txt  rh
[root@host opt]# 

  其中想要复制的文件即:号后面的文件需要使用绝对路径;若文件存放路径就是当前的执行命令想要存放的路径可以使用./,若想要存放指定路径可以使用绝对路径。

上行复制

  若本主机(Centos7-1)的/opt/目录下的文件想要复制远程主机(Centos7-2)中,可以在本主机(Centos7-1)执行以下操作:

[root@host opt]# ls
abc  rh
[root@host opt]# ls abc/
a.txt  b.txt
[root@host opt]# scp -P 22 -r abc/ 192.168.145.30:/root
root@192.168.145.30's password: 
a.txt                                              100%    2     1.1KB/s   00:00    
b.txt                                              100%    2     1.0KB/s   00:00 

  在远程主机(Centos7-2)查看是否复制过去:

[root@host opt]# cd
[root@host ~]# ls
abc              initial-setup-ks.cfg  模板  图片  下载  桌面
anaconda-ks.cfg  公共                  视频  文档  音乐
[root@host ~]# ls abc/
a.txt  b.txt

  其中上行复制中若端口号不一致,需要使用-P选项指定端口号

  注意:若在复制文件时对方主机同目录下有同名文件会直接覆盖,系统不会提示。

补充:

[root@host network-scripts]# echo `pwd`
/etc/sysconfig/network-scripts

  其中``命令是一个shell命令,在执行脚本之前,会先执行这个命令,相当于函数调用。在此命令中即获取pwd命令中需要文件传输的路径,远程传输至对方主机的同目录下。

3.sftp——安全文件传输

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

在本主机测试常用命令

[root@localhost opt]# ls
rh
[root@localhost opt]# sftp -P 22 root@192.168.145.30
root@192.168.145.30's password: 
Connected to 192.168.145.30.
sftp> ls
abc                         anaconda-ks.cfg             initial-setup-ks.cfg        
下载                      公共                      图片                      
文档                      桌面                      模板                      
视频                      音乐                      
sftp> cd abc/
sftp> ls
a.txt  b.txt  
sftp> get a.txt 
Fetching /root/abc/a.txt to a.txt
/root/abc/a.txt                                    100%    2     1.5KB/s   00:00    
sftp> quit
[root@localhost opt]# ls
a.txt  rh
[root@localhost opt]# sftp -P22 zhangsan@192.168.145.15
zhangsan@192.168.145.15's password: 
Connected to 192.168.145.15.
sftp> put passwd 
Uploading passwd to /home/zhangsan/passwd
passwd 

在对方主机查看上传结果

[root@host network-scripts]# cd /home/zhangsan/
[root@host zhangsan]# ls
passwd

  总结:若想要传输文件可以通过sftp或者ftp相关命令进行传输。

四、构建密钥对验证的SSH体系

在客户端创建密钥对

  通过ssh-keygen工具为当前用户创建密钥对文件。可用的加密算法为RSAECDSADSA等(ssh-keygen命令的-t选项用于指定算法类型)。

客户端(192.168.145.45)

//切换到想要在服务端进行登录的用户test。
[root@localhost ~]# su - test
//查看隐藏文件.ssh,确认.ssh是700权限
[test@localhost ~]$ ll -A
总用量 12
-rw-r--r--. 1 test test  18 4月   1 2020 .bash_logout
-rw-r--r--. 1 test test 193 4月   1 2020 .bash_profile
-rw-r--r--. 1 test test 231 4月   1 2020 .bashrc
drwxrwxr-x. 3 test test  18 4月  20 21:49 .cache
drwxrwxr-x. 3 test test  18 4月  20 21:49 .config
drwxr-xr-x. 4 test test  39 3月  25 06:51 .mozilla
drwx------. 2 test test   6 4月  20 21:50 .ssh
//切换到默认密钥对文件生成的目录下
[test@localhost ~]$ cd .ssh/
[test@localhost .ssh]$ ll
总用量 0
//以rsa加密算法生成密钥对。
[test@localhost .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
//指定生成密钥对的位置,直接回车使用默认位置。
Enter file in which to save the key (/home/test/.ssh/id_rsa): 
//设置密钥的密码(直接回车设置为空可在登陆时免交互界面直接登录成功)
Enter passphrase (empty for no passphrase): 
//再次确认密钥的密码。
Enter same passphrase again: 
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Rnmno8bFVRxhQu6MhhWEs7QkX02KDFC5ERECiBIq0Fc test@localhost.localdomain
The key's randomart image is:
+---[RSA 2048]----+
|++..o+E= oo++.=o |
|* . ..+o=o.+.+.  |
|+  .   B==+ +    |
|.     ..+= B     |
|        S B o    |
|       o + .     |
|        +        |
|       .         |
|                 |
+----[SHA256]-----+
//id_ ecdsa是私钥文件,权限默认为600;id_ecdsa.pub是公钥文件,用来提供给SsH服务器。
[test@localhost .ssh]$ ll -A
总用量 8
-rw-------. 1 test test 1766 4月  20 21:52 id_rsa
-rw-r--r--. 1 test test  408 4月  20 21:52 id_rsa.pub
//查看公钥文件内容
[test@localhost .ssh]$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7atS4BC99c6x4la9po03IGGMsUKuPjuDPgi/OubVeI3G6bumXXEmbugnertow3JkwhP8V+xRR/x7pAzOteZ0NTMX8qX1spIgUfs0HkIbkrqmO0yRYeKQLEVfNEBiAvPvD1tBFxr7rYeVKNH9aBSDOdZRRGa184MleC62fK+iSvyGJhw2FAlPI7qh7oAMeFTJiZFE517XeoMnJRg39+JZabhetQNTcdR3yw4BMIQL/yKt+FLVuffCO4oveZJbFjOk2WZYCEJUCp3D8Knv/OluuPPyp8iXtdJ1HOPv63bPzYH6Vrfi/Zef4PIW2ngGLAGDp9VwH2/IyQgnj6TDCnmZD test@localhost.localdomain
//将生成的公钥文件传送给服务器端(默认传输到登陆的用户的家目录当中的.ssh/目录下)
[test@localhost .ssh]$ ssh-copy-id  -i id_rsa.pub test@192.168.145.15
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_rsa.pub"
The authenticity of host '192.168.145.15 (192.168.145.15)' can't be established.
ECDSA key fingerprint is SHA256:xCkXyzzjd/s4qiwn9WkTH5Dg7d8/Sl7wktX2cnMU5zw.
ECDSA key fingerprint is MD5:6e:42:84:ba:2c:fb:2e:c7:39:82:a8:4f:02:a7:e8:8b.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
test@192.168.145.15's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'test@192.168.145.15'"
and check to make sure that only the key(s) you wanted were added.

在服务端获取公钥文件

服务端(192.168.145.15)

//重启服务端的ssh服务
[root@host ~]# systemctl restart sshd
//查看服务状态
[root@host ~]# systemctl status sshd
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since 四 2023-04-20 21:55:37 CST; 14s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 60425 (sshd)
    Tasks: 1
   CGroup: /system.slice/sshd.service
           └─60425 /usr/sbin/sshd -D

4月 20 21:55:37 host systemd[1]: Starting OpenSSH server daemon...
4月 20 21:55:37 host sshd[60425]: Server listening on 0.0.0.0 port 22.
4月 20 21:55:37 host sshd[60425]: Server listening on :: port 22.
4月 20 21:55:37 host systemd[1]: Started OpenSSH server daemon.
//切换到test的目录
[root@host ~]# su - test
mount: 只有 root 能执行该操作
//查看家目录下自动生成的隐藏文件.ssh,权限是700,需要与客户端的权限保持一致
[test@host ~]$ ll -A
总用量 12
-rw-r--r--. 1 test test  18 4月   1 2020 .bash_logout
-rw-r--r--. 1 test test 193 4月   1 2020 .bash_profile
-rw-r--r--. 1 test test 231 4月   1 2020 .bashrc
drwxrwxr-x. 3 test test  18 4月  20 21:55 .cache
drwxrwxr-x. 3 test test  18 4月  20 21:55 .config
drwxr-xr-x. 4 test test  39 3月  22 19:45 .mozilla
drwx------. 2 test test  29 4月  20 21:54 .ssh
//切换到默认密钥对文件的目录下
[test@host ~]$ cd .ssh/
//查看传输过来的公钥认证文件
[test@host .ssh]$ ls
authorized_keys
//查看公钥认证文件的内容
[test@host .ssh]$ cat authorized_keys 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7atS4BC99c6x4la9po03IGGMsUKuPjuDPgi/OubVeI3G6bumXXEmbugnertow3JkwhP8V+xRR/x7pAzOteZ0NTMX8qX1spIgUfs0HkIbkrqmO0yRYeKQLEVfNEBiAvPvD1tBFxr7rYeVKNH9aBSDOdZRRGa184MleC62fK+iSvyGJhw2FAlPI7qh7oAMeFTJiZFE517XeoMnJRg39+JZabhetQNTcdR3yw4BMIQL/yKt+FLVuffCO4oveZJbFjOk2WZYCEJUCp3D8Knv/OluuPPyp8iXtdJ1HOPv63bPzYH6Vrfi/Zef4PIW2ngGLAGDp9VwH2/IyQgnj6TDCnmZD test@localhost.localdomain
//查看公钥认证文件的权限为600,与客户端生成的私钥文件的权限一致
[test@host .ssh]$ ll
总用量 4
-rw-------. 1 test test 408 4月  20 21:54 authorized_keys

在客户端测试密钥登录

客户端(192.168.145.45)

//以test用户登录客户端测试是否可以密钥登录
[test@localhost root]$ ssh test@192.168.145.15
Enter passphrase for key '/home/test/.ssh/id_rsa': 
Last login: Thu Apr 20 21:55:59 2023
mount: 只有 root 能执行该操作
//查看当前登录主机的ip地址是否是服务端的ip地址
[test@host ~]$ ifconfig 
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.15  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::e60f:ae87:40b7:a144  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:20:88:32  txqueuelen 1000  (Ethernet)
        RX packets 22968  bytes 30614741 (29.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11822  bytes 758158 (740.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 361  bytes 31516 (30.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 361  bytes 31516 (30.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:93:1a:66  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

  还有另一种方式就是客户端通过scp id_rsa.pub root@192.168.145.15:/opt将密钥文件复制到服务端的/opt目录下,然后在服务端用户的家目录中手动创建.ssh目录把并且将.ssh目录的权限设置700,接着在服务端通过cat id_rsa.pub >> ~/.ssh/authoried_keys重定向输出将公钥文件复制到服务端的家目录authorized_keys公钥认证文件里面并手动修改authorized_key文件的权限为600,最后实现密钥登录。这种方式比较麻烦,需要反复确认文件权限。

  总结:密钥对验证登录首先要确认客户端创建密钥对的用户与登录服务端的用户保持一致,其次确认客户端.ssh密钥存放目录的权限与服务端的为.ssh密钥存放目录的权限均为700,最接着确认客户端生成的私钥文件id_rsa的权限与服务端的公钥认证文件.ssh/authorized_keys保持一致为600。最终客户端才可以通过密钥对验证登录服务端。

密钥对免交互登录的方式

  • 使用没有密码的密钥对。
[root@localhost ~]# ssh-keygen -t rsa/edcdsa
一路回车,不设置密码
  • 若密钥对生成时设置密码,则可以创建ssh会话代理(该代理只在当前的会话有效)。
[root@localhost ~]# ssh-agent bash
[root@localhost ~]# ssh-add
//输入密钥对的密码
Enter passphrase for /root/.ssh/id_ecdsa:
Identity added:/root.ssh/id_ecdsa(/root.ssh/id_ecdsa)
  • 设置指定主机免密:
ssh-keygen	-f  ~/.ssh/id_ecdsa -P '' -q -t rsa/edcdsa

  其中ssh-keygen指的是创建密钥对文件;-f ~/.ssh/id_ecdsa指的是生成公私钥文件位置;-P' '指的是设置空密码;-q指的是静默模式,不输出信息,免交互;-t rsa/edcdsa指的是加密算法的方式。

五 、TCP Wrappers 访问控制

  在Linux系统中,许多网络服务针对客户端提供了访问控制机制,如Samba、BIND、HTTPD、OpenSSH 等。

1.TCP wrappers (TCP封套)

  将TCP服务程序“包裹”起来,代为监听TCP服务程序的端口,增加了一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正的服务程序。

大多数Linux 发行版,TCP Wrappers 是默认提供的功能。

[root@localhost ~]# rpm -q tcp_wrappers
tcp_wrappers-7.6-77.el7.x86_64

2.TCP Wrappers 保护机制的实现方式

第一种方式:
  直接使用tcpd程序对其他服务程序进行保护,需要运行tcpd程序。

第二种方式:
  由其他网络服务程序调用libwrap.so.*链接库,不需要运行tcpd程序。此方式的应用更加广泛,也更有效率。

  可以使用 ldd 命令可以查看程序是否在TCP Wrappers 保护机制内

//使用ldd 命令可以查看程序的libwrap.so.*链接库
[root@localhost ~]# ldd $(which sshd) | grep wrap
	libwrap.so.0 => /lib64/libwrap.so.0 (0x00007fb673cbe000)
[root@localhost ~]# ldd `which sshd` | grep wrap
	libwrap.so.0 => /lib64/libwrap.so.0 (0x00007efd25225000)

  其中$()和``两个选项的作用都是调用选中的命令的结果作为参数.

3.TCP Wrappers的访问策略

  TCP Wrappers机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制。

  对应的两个策略文件为/etc/hosts.allow/etc/hosts.deny,分别用来设置允许和拒绝的策略。
策略的配置格式:

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

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

服务程序列表的选项设置

  • ALL:代表所有的服务。
  • 单个服务程序:如"vsftpd"。
  • 多个服务程序组成的列表:如"vsftpd, sshd"。

客户端地址列表的选项设置

  • ALL:代表任何客户端地址。
  • LOCAL:代表本机地址。

  其中客户端地址允许使用通配符*?,前者代表任意长度字符,后者仅代表一个字符。

  比如客户端地址是网段地址,可以有以下几种方式设置成网段地址:192.168.80.*192.168.80.0/255.255.255.0192.168.80.。而.benet.com*.benet.com这两种区域地址设置的方式都表示benet.com 域名中的所有主机都可以使用。

4.TCP Wrappers机制的基本原则

  首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问;否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;如果检查上述两个文件都找不到相匹配的策略,则允许访问。

允许所有,拒绝个别
  只需在/etc/hosts.deny文件中添加相应的拒绝策略。

服务端(192.168.145.15)设置192.168.145.30这台客户端拒绝访问本服务端

[root@host ~]# vim /etc/hosts.deny 
sshd:192.168.145.30

客户端(192.168.145.30)测试

[root@host ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.30  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::8d77:d8ec:a48a:8b55  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:97:ff:e9  txqueuelen 1000  (Ethernet)
        RX packets 298  bytes 25856 (25.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 251  bytes 27123 (26.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@host ~]# ssh root@192.168.154.15
ssh: connect to host 192.168.154.15 port 22: Connection refused
[root@host ~]# ssh root@192.168.154.15
ssh: connect to host 192.168.154.15 port 22: Connection refused
[root@host ~]# ssh root@192.168.154.15
ssh: connect to host 192.168.154.15 port 22: Connection refused

客户端(192.168.145.45)测试

[root@localhost ~]# ssh root@192.168.145.15
root@192.168.145.15's password: 
Last login: Thu Apr 20 20:56:32 2023 from 192.168.145.45
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
[root@host ~]# ifconfig 
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.15  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::e60f:ae87:40b7:a144  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:20:88:32  txqueuelen 1000  (Ethernet)
        RX packets 24575  bytes 30735984 (29.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12410  bytes 825056 (805.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

允许个别,拒绝所有
  除了在/etc/hosts.allow中添加允许策略之外,还需要在/etc/hosts.deny文件中设置"ALL:ALL"的拒绝策略。

服务端(192.168.145.15)设置仅允许192.168.145.30这台客户端访问本服务端,其他主机均不能访问

[root@host ~]# vim /etc/hosts.allow 
sshd:192.168.145.30

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

客户端(192.168.145.30)测试

[root@host ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.30  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::8d77:d8ec:a48a:8b55  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:97:ff:e9  txqueuelen 1000  (Ethernet)
        RX packets 298  bytes 25856 (25.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 251  bytes 27123 (26.4 KiB)
[root@host ~]# ssh root@192.168.154.15
Last login: Thu Apr 21 00:12:32 2023 from 192.168.145.30
mount: /dev/sr0 写保护,将以只读方式挂载
mount: /dev/sr0 已经挂载或 /mnt 忙
       /dev/sr0 已经挂载到 /mnt 上
[root@host ~]# ifconfig 
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.15  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::e60f:ae87:40b7:a144  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:20:88:32  txqueuelen 1000  (Ethernet)
        RX packets 24575  bytes 30735984 (29.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 12410  bytes 825056 (805.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

客户端(192.168.145.45)测试

[root@localhost ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.145.45  netmask 255.255.255.0  broadcast 192.168.145.255
        inet6 fe80::840c:65a:e5f6:7b2f  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:a8:5e:5a  txqueuelen 1000  (Ethernet)
        RX packets 4874  bytes 391500 (382.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2141  bytes 205101 (200.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
[root@localhost ~]# ssh root@192.168.145.15
ssh_exchange_identification: read: Connection reset by peer
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的宝贝大唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值