SSH原理与实践(三)安装和使用

主页

引言

在之前SSH原理与实践系列文章中,我们主要讲解了SSH协议的原理部分。作为该系列文章的最后一篇,本文将对SSH实践部分进行介绍。

好文回顾 😃

本文主要内容如下:

  • SSH安装和部署
  • SSH常用命令使用

SSH安装和部署

SSH采用了C-S架构,因此有客户端和服务端两个程序需要安装,其中被访问的实体需要安装SSH服务端程序, 我们叫做ssh-server, 发起访问请求的实体需要安装SSH客户端程序, 我们叫做ssh-client。 值得注意的是,一般情况下ssh-server会以守护进程sshd运行在服务端,ssh-client一般通过命令ssh发起访问。

安装SSH客户端

ssh-client安装

  1. 在Ubuntu或Debian上,执行以下命令安装SSH客户端
sudo apt update
sudo apt install openssh-client
  1. 在CentOS或Red Hat上,执行以下命令安装SSH客户端
sudo yum install openssh-clients
  1. 在macOS上
macOS通常已经预装了SSH客户端,您可以在终端中直接使用

ssh-client配置

客户端ssh程序会加载并使用在~/.ssh/config中的配置,如果文件不存在则使用默认配置。以下是一个SSH客户端配置文件示例:

# SSH Client Configuration

# 默认选项
Host *
    # SSH默认端口号是22,如果使用了非默认端口,可以在这里设置
    # Port 2222

    # 默认身份验证方式是通过密码认证,如果使用SSH密钥认证,可以在这里指定私钥文件路径
    # IdentityFile ~/.ssh/id_rsa

    # 设置连接超时时间,单位为秒
    # ConnectTimeout 30

    # 是否开启SSH数据压缩
    # Compression yes

# 主机别名为"example-server"
Host example-server
    # 实际的远程主机IP地址或主机名
    HostName 192.168.1.100

    # 远程登录使用的用户名
    User user1

    # 使用指定的私钥文件进行身份验证
    IdentityFile ~/.ssh/example_id_rsa

    # 自定义端口号
    Port 2222

# 主机别名为"another-server"
Host another-server
    HostName example.com
    User user2
    IdentityFile ~/.ssh/another_id_rsa

在上述配置文件示例中:

  • Host *: 用于设置默认的连接选项,所有主机都会应用这些选项,除非在后面针对特定主机设置了不同的选项。
  • Host example-server: 定义一个主机别名为"example-server",下面的配置选项仅适用于该主机。
  • HostName: 指定远程主机的IP地址或主机名。
  • User: 指定远程登录时使用的用户名。
  • IdentityFile: 指定SSH私钥文件的路径,用于密钥对身份验证。
  • Port: 指定远程SSH服务监听的端口号,默认是22。
  • ConnectTimeout: 设置连接超时时间,如果在指定时间内无法连接上远程主机,则连接会失败。
  • Compression: 是否启用SSH数据压缩,可以加快数据传输速度。

请注意,配置文件中的选项不仅限于上述示例,还可以根据需求设置其他选项,例如代理设置、跳板主机、端口转发等。在配置SSH客户端时,建议先备份原始配置文件,并根据需求谨慎调整配置,以免出现错误导致无法连接到远程主机。

安装 SSH 服务

ssh-server安装

  1. 在 Ubuntu/Debian 上,执行以下命令来安装 SSH 服务器
#安装
sudo apt update
sudo apt install openssh-server

# 查看状态
sudo service sshd status

# 启动
sudo service sshd start
  1. 在 CentOS/Red Hat 上,执行以下命令来安装 SSH 服务器
#安装
sudo yum install openssh-server

#查看状态
sudo systemctl status sshd

#启动
sudo systemctl start sshd
  1. macOS通常已经预装了OpenSSH服务端,但默认情况下它可能未启动。您可以通过系统偏好设置中的“共享”选项来启动SSH服务。也可以通过命令行方式启动,如下:
# 查看状态。 注:如果返回为空,说明未启动
sudo launchctl list | grep sshd

# 启动
 sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

# 关闭
sudo launchctl unload -w /System/Library/LaunchDaemons/ssh.plist

ssh-server配置

SSH服务端配置文件通常位于Linux系统中的/etc/ssh/sshd_config文件 (注:其他系统可能有差别)。注意,在修改此文件之前,最好先备份原始配置,并确保您具有管理员权限。以下是一个SSH服务端配置文件示例:

# SSH Server Configuration

# 端口号,SSH默认端口是22,您可以修改为其他端口,注意避免使用已经被其他服务占用的端口
Port 22

# 是否允许密码认证登录,建议使用SSH密钥认证
PasswordAuthentication yes

# 是否允许root用户通过SSH登录,一般情况下不建议直接使用root登录SSH
PermitRootLogin no

# 是否启用公钥认证,建议启用以提高安全性
PubkeyAuthentication yes

# 允许哪些用户组访问SSH服务(注:设置后只有属于sshusers用户组的用户可以使用ssh客户端访问该服务)
AllowGroups sshusers

# 允许哪些用户访问SSH服务(注:设置后只有user1和user2用户可以使用ssh客户端访问该服务)
AllowUsers user1 user2

# 是否允许TCP转发,默认为yes
AllowTcpForwarding yes

# 是否允许X11转发,默认为no
X11Forwarding yes

# 是否允许Agent转发,默认为no
AllowAgentForwarding yes

# 是否允许密码更改,默认为yes
AllowTcpForwarding yes

# 是否允许TCP转发,默认为yes
TCPKeepAlive yes

# 是否启用压缩,可以加快数据传输速度,默认为yes
Compression yes

# 登录时的Banner提示信息,可以自定义显示内容
Banner /etc/ssh/banner

# 允许的登录尝试次数,达到次数后会自动断开连接
MaxAuthTries 3

# 登录会话的超时时间,单位为秒,默认为900秒(15分钟)
ClientAliveInterval 900
ClientAliveCountMax 3

# 是否启用TCP Wrapper,默认为no (注:这里使用PAM对用户进行认证,本质上会使用/etc/passwd和/etc/shadow进行口令检查)
UsePAM yes

# 使用GSSAPI进行用户认证,默认为no
GSSAPIAuthentication no
GSSAPICleanupCredentials yes

# 是否启用SELinux支持,默认为no
SELinux no

# 是否启用系统登录限制,默认为no
UseLogin no

# 是否启用chroot目录,默认为no
ChrootDirectory none

上述示例是SSH服务端配置文件的一部分,其中包含了一些常见的配置选项。请注意,实际的配置选项可能因系统和需求而有所不同。在修改配置文件时,建议仔细阅读官方每个选项的说明和注释,确保理解其含义和影响,并根据实际需求进行设置。
修改配置文件后,需重启SSH服务以使更改生效。

SSH常用命令使用

OpenSSH提供了完善的SSH工具集,包括sshsshdsftp以及scp等等。其中ssh和sshd是ssh工具集的基础程序。ssh、sftp和scp都是客户端工具,它们的服务端都是sshd。
在安装完ssh-client后,除了ssh外,默认同时安装了sftp和scp工具。 后面我们将分开介绍这些常用的工具。

环境准备

启动ssh服务

由于本人使用的是MacOS系统,默认已安装ssh,现在我们通过命令方式启动ssh-server,使用系统默认配置 /etc/ssh/sshd_config (配置文件内容较为敏感,不易展示,略)

# 查看ssh服务状态 (注:未查询到,表示ssh服务未启动)
➜  ssh-server-dir sudo launchctl list | grep sshd

# 启动ssh服务
➜  ssh-server-dir  sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist

# 再次查看ssh服务状态
➜  ssh-server-dir sudo launchctl list | grep sshd
-	0	com.openssh.sshd

设置ssh客户端配置

为了后文演示方便,我们对ssh客户端进行简单配置

➜  ~ vim ~/.ssh/config

# host配置,这里的Host在使用时可以用作别名,不用每次输入ip地址
Host ssh-server
  HostName 127.0.0.1 # ssh服务器的ip地址
  User hxy                # 登陆ssh服务器时使用的用户名
  IdentityFile ~/.ssh/id_rsa #客户端本地ssh密钥(私钥文件),在公钥认证模式下使用。

SSH登陆

命令ssh常用来进行远程登陆

➜  ssh-server-dir ssh ssh-server
The authenticity of host '127.0.0.1 (127.0.0.1)' can't be established.
ED25519 key fingerprint is SHA256:MxBgZOViGL/iQAWzNs5L80lPeRNNNxt15e2km+Ee35U.
This host key is known by the following other names/addresses:
    ~/.ssh/known_hosts:20: localhost
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '127.0.0.1' (ED25519) to the list of known hosts.
(hxy@127.0.0.1) Password:
Last login: Fri Aug  4 16:39:10 2023

说明:

  • 由于我们对ssh客户端进行了配置,这里可以使用ssh-server这个别名进行登陆,用户名默认使用了hxy
  • 虽然我们配置了IdentityFile,但我们未开启免密登陆,这里需要输入用户hxy的口令。 使用ssh-copy-id开启免密登陆请参考 SSH原理与实践(一)
  • 最后的Last login表示我们登陆成功,并打印了登陆时间。

SCP文件复制

SCP: 是一个基于SSH协议的安全文件复制命令,用于在本地计算机和远程主机之间进行加密的文件传输。以下是一些常用的scp命令及其用法:

# 从本地计算机上传文件到远程主机
scp local_file username@hostname:remote_path
# 远程主机下载文件到本地计算机
scp username@hostname:remote_file local_path
# 复制整个目录
scp -r local_directory username@hostname:remote_path

以文件上传为例:

# 服务端工作目录
➜  ssh-server-dir ls
server_file
➜  ssh-server-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-server-dir
➜  ssh-server-dir cat server_file
ssh server
# 客户端工作目录
➜  ssh-client-dir ls
client_file
➜  ssh-client-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-client-dir
➜  ssh-client-dir cat client_file
ssh client

在ssh客户端的工作目录下

# 从本地计算机上传文件到远程主机
➜  ssh-client-dir scp ./client_file ssh-server:/Users/hxy/wkdir/ssh-test/ssh-server-dir
(hxy@127.0.0.1) Password:
client_file                                                                                 100%   11    19.4KB/s   00:00

我们登陆到服务器进行查看

➜  ssh-server-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-server-dir
➜  ssh-server-dir ls
client_file server_file #这里看到了刚才复制过来的client_file文件
➜  ssh-server-dir cat client_file
ssh client # 文件内容与客户端的一致

SFTP文件上传和下载

SFTP是一种基于SSH协议的安全文件传输协议,用于在本地计算机和远程主机之间进行加密的文件传输。类似scp,但更适用于文件列表查看、多文件上传下载的场景,目前许多文件上传下载的可视化工具基本都是基于sftp进行开发的。
以下是一些常用的SFTP命令及其用法:

# 连接到远程主机(注:username为您的用户名,hostname为远程主机的IP地址或域名)
sftp username@hostname

# 将本地文件上传到远程主机
put local_file remote_path

# 从远程主机下载文件到本地计算机
get remote_file local_path

# 列出远程目录内容
ls

# 退出SFTP会话
exit

以文件下载为例:

# 查看本地工作目录
➜  ssh-client-dir pwd
/Users/hxy/wkdir/ssh-test/ssh-client-dir
➜  ssh-client-dir ls 
client_file #只有client_file文件

# 连接远程主机ssh-server
➜  ssh-client-dir sftp ssh-server
(hxy@127.0.0.1) Password:
Connected to ssh-server.
# 进入远程目录
sftp> cd /Users/hxy/wkdir/ssh-test/ssh-server-dir
# 查看目录内容
sftp> ls
client_file   server_file
# 复制server_file文件,如果未指定本地文件名,则使用原始文件名
sftp> get server_file
Fetching /Users/hxy/wkdir/ssh-test/ssh-server-dir/server_file to server_file
server_file                                                                                 100%   11    13.3KB/s   00:00

# 退出会话
sftp> exit

# 查看本地文件
➜  ssh-client-dir ls
client_file server_file # server_file为刚才下载的服务端文件
➜  ssh-client-dir cat server_file
ssh server #文件内容无误

结论

本文详细介绍了ssh的安装和部署、介绍了ssh客户端和服务端程序使用的配置文件以及关键配置、最后针对ssh常见工具集进行了详细介绍。
在云计算时代,作为一名软件开发者,熟练配置和使用ssh工具,能够提高运维效率、和运维安全性,希望本文有所帮助。

参考资料

posted @ 2023-08-04 17:36  warm3snow  阅读(119)  评论(0编辑  收藏  举报