Linux远程访问及控制SSH

250 阅读7分钟

1. SSH远程管理

1.1 什么是SSH

SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。

SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。因此SSH协议具有很好的安全性。

1.2 SSH服务和配置

image.png

SSH客户端: Putty、 Xshell、CRT

SSH服务端: openSSH

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

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

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

sshd服务默认使用的是TCP的22端口

image.png

sshd服务的默认配置文件是/etc/ssh/sshd_config

  1. /etc/ssh/ssh_config 客户端的配置文件
  2. /etc/ssh/sshd_config 服务端的配置文件

1.3 配置openSSH服务端

1.3.1 sshd_config配置文件的常用选项设置

[root@localhost ~]#  vim /etc/ssh/sshd_ config
Port 22                   #监听端口为22
ListenAddress 0.0.0.0     #监听地址为任意网段,也可以指定openSSH服务器的具体IP
LoginGraceTime 2m         #登录验证时间为2分钟
PermitRootLogin no        #禁止root 用户登录
MaxAuthTries 6            #最大重试次数为6
PasswordAuthentication no #禁止空密码用户登录
UseDNS no                 #禁用DNS反向解析,以提高服务器的响应速度


只允许zhangsan、lisi、can用户登录,且其中can用户仅能够从IP地址为192.168.200.100的主机远程登录
AllowUsers zhangsan lisi can@192.168.200.100   #多个用户以空格分隔
DenyUsers zhangsan   #禁止某些用户登录,用法于AllowUsers类似(注意不要同时使用)

1.3.2sshd服务支持两种验证方式

  • 密码验证

对服务器中本地系统用户的登录名称、密码进行验证。简便,但可能会被暴力破解

  • 密钥对验证

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

  • 公钥和私钥的关系

公钥和私钥是成对生成的,这两个密钥互不相同,可以互相加密和解密。

公钥对外公开,私钥只有私钥的持有人才知道。

当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。可根据实际情况设置验证方式。

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

2 SSH登录

2.1 登录方式

ssh [-p 端口] [远程主机用户]@[服务端IP]

  • 举例一

linux一台主机连接另一台主机,使用root,不加指定用户,登陆上以后也是root

image.png

  • 举例二

使用root用户指定can用户登录

image.png

  • 举例三

修改主机一的端口

image.png

指定端口登录 image.png

2.2 scp命令(远程传输文件)

scp 命令是用于通过 SSH 协议安全地将文件复制到远程系统和从远程系统复制文件到本地的命令。使用 SSH 意味着它享有与 SSH 相同级别的数据加密,因此被认为是跨两个远程主机传输文件的安全方式。

  • 以下是scp命令常用的几个选项:
    • -C:这会在复制过程中压缩文件或目录。
    • -P(大写):如果默认 SSH 端口不是 22,则使用此选项指定 SSH 端口。
    • -r :此选项递归复制目录及其内容。
    • -p(小写):保留文件的访问和修改时间。
  • 推送(上行复制)

scp [-r 目录] 文件 [用户]@服务端IP:保存路径 image.png

image.png

  • 拉取(下行复制)

scp [-P] [用户]@服务端IP:保存路径 本地路径 image.png

4.2 sftp命令

SFTP是SSH File Transfer Protocol的缩写,安全文件传送协议。SFTP与FTP有着几乎一样的语法和功能。SFTP为SSH的其中一部分,是一种传输档案至 Blogger 伺服器的安全方式。其实在SSH软件包中,已经包含了一个叫作SFTP的安全文件信息传输子系统,SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接和答复操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。

sftp命令格式:

 sftp  [用户名@]IP地址
 sftp -oPort=220 [用户名@]IP地址     //修改了默认端口的情况下,需要指定端口号

 例:
 sftp 192.168.200.100
 sftp root@192.168.200.100

 #sftp连接后,进入的是当前登录用户的家目录。例如使用root登录,则sftp连接后进入的是/root/目录.
 #文件的上传和下载,不能使用绝对路径。文件必须位于当前目录下。

sftp连接后的常用命令:

 get        #下载文件
 get -r     #下载目录
 put        #上传文件
 put -r     #上传目录
 quit、exit、bye      #退出
  • sftp和ftp的区别:

    • 连接方式:FTP使用TCP端口21上的控制连接建立连接。而,SFTP是在客户端和服务器之间通过SSH协议(TCP端口22)建立的安全连接来传输文件。
    • 安全性:SFTP使用加密传输认证信息和传输的数据,所以使用SFTP相对于FTP是非常安全。
    • 效率:SFTP这种传输方式使用了加密解密技术,所以传输效率比普通的FTP要低得多。

2.3 创建密钥对验证

  • 在客户端创建密钥对

[root@localhost ~]# ssh-keygen -t [rsa|ecdsa|dsa] image.png

  • 把公钥文件导到ssh服务端
    • 手动 :复制客户端公钥文件 id_rsa.pub的内容,在服务端 用户的家目录中的 .ssh目录中创建 authorized_keys文件并把客户端公钥文件内容粘贴到这个文件中
    • 自动 :在客户端 ssh-copy-id -i 公钥文件 用户@服务端 IP

手动

[root@localhost ~]# ssh-copy-id root@192.168.200.100 image.png

  • 在客户端使用:[ssh 用户@服务端IP] 登录服务端,使用密钥对私钥的密码进行验证
[root@localhost .ssh]# ssh 192.168.200.100

image.png

2.4 实现免交互登录

  • 直接创建空密码的密钥对来使用

image.png

  • 在导入公钥文件后,在客户端 [ssh-agent bash ssh-add] (此方式只能在当前连接中有效)
[root@localhost .ssh]# ssh-agent bash
[root@localhost .ssh]# ssh-add
Enter passphrase for /root/.ssh/id_rsa: 
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@localhost .ssh]# ssh root@192.168.200.100
Last login: Wed Aug 17 18:51:35 2022 from 192.168.200.102
[root@localhost ~]# 

image.png

image.png

3 TCP Wrappers 访问控制

TCP_Wrappers是一个工作在第四层(传输层)的的安全工具,对有状态连接的特定服务进行安全检测并实现访问控制,凡是包含有libwrap.so库文件的的程序就可以受TCP_Wrappers的安全控制。它的主要功能就是控制谁可以访问,常见的程序有 rpcbind、vsftpd、sshd、telnet。

有些进程不受tcp_wrappers管理,例如 httpd、smb、squid等。

3.1 工作原理

TCP_Wrappers有一个TCP的守护进程叫作tcpd。以ssh为例,每当有ssh的连接请求时,tcpd即会截获请求,先读取系统管理员所设置的访问控制文件,符合要求,则会把这次连接原封不动的转给真正的ssh进程,由ssh完成后续工作;如果这次连接发起的ip不符合访问控制文件中的设置,则会中断连接请求,拒绝提供ssh服务。

微信图片_20220323131104.png

  • 保护机制实现方式:
    • 方式1:通过tcpd程序对其他服务程序进行包装
    • 方式2:由其他服务程序调用libwrap.so.*链接库

3.2 访问控制策略的配置文件

白名单:/etc/hosts.allow

黑名单:/etc/hosts.deny

  • 示例:

设置白名单

 [root@192 ~]# vim /etc/hosts.allow
 ---------------
 sshd:192.168.72.10192.168.72.20    //允许这两个地址使用sshd服务进行访问
 sshd:192.168.4.0/255.255.255.0      //允许该网段的所有地址使用sshd服务进行访问

设置黑名单

 [root@192 ~]# vim /etc/hosts.deny
 sshd:ALL            //禁止所有地址使用sshd服务进行访问

 sshd:192.168.0.0/255.255.255.0  EXCEPT 192.168.0.10   //禁止该网段的所有地址使用sshd服务进行访问,除了192.168.0.10 
  • 注:
  1. 白名单的优先级高于黑名单,如果一个地址既在白名单也在黑名单中,该地址是可以访问的。
  2. 实际工作中一般通过防火墙的方式来实现同样功能。
  3. 先看 hosts.allow 文件中的策略,匹配上则直接放通,如果没有匹配则 再去看 hosts.deny 文件中的策略,匹配上则禁止/拒绝访问指定的tcp服务程序,如果也没有匹配上则默认允许放通