SSH的使用是很简单的,先说使用,从实践中理解。我用的比较多的是免密登录,所以放在前面了。

免密登录操作

流程如下:

  1. 本地生成密钥对

  2. 发送本地的公钥到服务器

  3. 添加自己的私钥

生成密钥对

可以通过使用 ssh-keygen 命令来生成,我们可以先使用 man 命令或者是 help 命令查看具体需要哪些参数以及具体信息。

通过执行命令 ssh-keygen -t rsa 来生成我们需要的密钥。默认是在~/.ssh/目录下

1
2
3
ssh-keygen -t rsa 
# 或者直接
ssh-keygen
image-20240612103804796

我们看到有几个文件,下面分别解释下每个文件是干什么用的。

  1. id_rsa: 生成的私钥文件,本机的私钥,不能泄露,很重要。

  2. id_rsa.pub: 生成的公钥文件,本机的公钥。

  3. known_hosts: 已知的主机公钥清单,它存储了用户曾经连接过的主机的公钥,用于验证服务器的身份

  4. known_hosts.old:旧的known_hosts

  5. authorized_keys: 存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥。这里没明白没关系,下面马上会介绍。我的机器上没有,因为我的win10不需要别人免密登录。

公钥复制

公钥需要复制到authorized_keys,这样这台服务器会在这个文件中查找,如果ssh客户端的公钥在这里,那么就会免密登录。

这里介绍最常用的三种方式,一是通过 ssh-copy-id 命令,二是通过 scp 命令,三是手工复制。

使用ssh-copy-id复制

方式一,通过 ssh-copy-id 命令设置。-i是指定公钥的路径,-p指定端口。最后一个参数是我们要免密钥登录的服务器 ip 地址。

1
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.1.100

如果你的端口改变了,那就需要指定端口

1
ssh-copy-id -p 48822 root@192.168.1.100

scp复制公钥

方式二,通过 scp 命令直接将该文件远程复制过去,使用这种方式需要注意,如果你之前已经配置了其它服务器上的密钥,这是使用这种方法,就会覆盖掉你原来的密钥,这时候是不建议使用这种方式的,如果你是先将该文件复制到服务器上的一个目录下,然后在使用追加的方式,将密钥追加到 authorized_keys 也是完全 OK 的。如果你只有两台服务器也是可以直接复制到文件。

1
scp -P 48822  ~/.ssh/id_rsa.pub root@192.168.1.100:~/.ssh/authorized_keys

手动复制公钥

方式三,通过手工复制。将本地 id_rsa.pub 文件的内容拷贝至远程服务器的 ~/.ssh/authorized_keys 文件中也完全可以的。先使用 cat 命令查看当前的公钥,然后复制,在到目标服务器上去粘贴。

添加私钥

以上操作是默认你使用win系统操作,如果你使用cmd连接,那么不必添加私钥信息。如果你使用ssh工具,需要添加私钥信息。

windterm(身份验证被拒绝是因为我把authorized_keys 的公钥删除了,否则免密登录太快了,根本不现实这个界面,我这里是为了显示这个界面)

image-20240612105543905

点击继续,即可免密登录。

如果你是Linux操作,那么这一步不必执行。

SSH原理

密码认证

简要概括如下:

  1. ssh登录时,为了最大程度保证账户、密码安全,使用非对称加密;

  2. 登录后,客户端、服务端之间的数据通信,采用随机口令,进行对称加密,因为速度快;

想象一下,客户端是一位想要进入一座高安全大楼的访客,而服务器则是大楼的保安。以下是这个过程的通俗解释和相应的流程图代码:

  1. 访客(SSH客户端)敲门请求进入(发起登录请求)。
  2. 保安(SSH服务端)通过窗口递出一张他的名片(公钥)。
    • 如果是访客第一次来访,保安会让访客确认他的身份(指纹信息确认)。
1
2
3
4
5
6
7
8
9
10
daokun@daokun ~/Desktop
$ ssh root@192.168.1.100
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:vjyKCLajbwDmNfuX7Ld9ycWYnad8oxxndE/aVLEH13Y.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.100' (ECDSA) to the list of known hosts.
root@192.168.1.100's password:
Last login: Thu Feb 10 17:05:25 2022 from 192.168.1.4
[root@daokun ~]#
[root@daokun ~]#
  1. 访客使用这张名片(公钥)将自己的密码变成一个谜(加密密码)。
  2. 保安用自己的钥匙(私钥)解开谜团(解密密码)。
  3. 保安核对访客的密码是否在访客名单上(对比/etc/shadow文件)。
  4. 如果一切顺利,保安会给访客一个访问卡(随机会话口令),以后访客就可以用这个卡自由进出了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
sequenceDiagram
participant 客户端 as 客户端
participant 服务器 as 服务器
Note over 客户端,服务器: SSH连接过程,非对称加密

客户端->>服务器: 1. 发起登录请求
服务器->>客户端: 2. 发送公钥
Note over 客户端: 首次连接,确认指纹信息
客户端->>服务器: 3. 使用公钥加密密码
服务器->>客户端: 4. 使用私钥解密密码
服务器->>客户端: 5. 核对密码与/etc/shadow
服务器->>客户端: 6. 返回登录成功与会话口令
Note over 服务器,客户端: 后续命令传输使用对称加密


基于密钥对的认证

基于密钥对认证,也就是所谓的免密码登录,理解免密登录原理

image-20240612114624708

SSH安装

SSH服务配置

1、搭建所有服务的套路

  • 关闭防火墙和selinux(实验环境都先关闭掉)
  • 配置yum源(公网源或者本地源)
  • 软件安装和检查
  • 了解并修改配置文件
  • 启动服务检查运行状态并设置开机自启动

2、搭建SSH服务

(一)关闭防火墙和selinux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 关闭firewalld防火墙
# 临时关闭
systemctl stop firewalld

# 关闭开机自启动
systemctl disable firewalld

# 关闭selinux
# 临时关闭
setenforce 0

# 修改配置文件 永久关闭
vim /etc/selinux/config
SELINUX=disabled

(二)配置yum源

注意:一般情况下使用网络源即可。

如果==没有网络==的情况下,才需要配置本地源

1
2
3
4
# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# yum clean all
# yum makecache

(三)yum安装

1
yum install openssh-server

(四)服务管理

1
2
3
4
5
6
7
8
9
10
11
12
# 重启服务
systemctl restart sshd

# 查看状态
systemctl status sshd
# 进程查看方式
ps aux |grep sshd
# 端口查看方式
netstat -lntp|grep sshd

# 开启自启动
systemctl enable sshd

创建用户和组

用户和用户组创建

①添加开发组

1
groupadd devgroup

②添加用户到用户组中

1
2
3
4
5
6
7
[root@jumpserver ~]# groupadd devgroup 
[root@jumpserver ~]#
[root@jumpserver ~]#
[root@jumpserver ~]# useradd -g devgroup devyu
[root@jumpserver ~]#
[root@jumpserver ~]# id devyu
uid=9662(devyu) gid=9663(devgroup) groups=9663(devgroup)

使用非交互式设置密码

1
2
3
[root@jumpserver ~]# echo 123456 |passwd --stdin devyu
Changing password for user devyu.
passwd: all authentication tokens updated successfully.

为开发人员创建数据目录并且设置相应的权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@jumpserver ~]# mkdir -p /devyu/data/
[root@jumpserver ~]#
[root@jumpserver ~]# ll -d /devyu/data
drwx-wx-wx 2 root root 6 Feb 10 18:15 /devyu/data

修改目录属组
[root@jumpserver ~]# chgrp -R devgroup /devyu/

查看权限
[root@jumpserver ~]# ll -d /devyu
drwx-wx-wx 3 root devgroup 18 Feb 10 18:15 /devyu


设置黏滞位,防止other用户,随便删除别人的数据

加上-R参数,递归该目录下所有的文件夹
[root@jumpserver ~]# chmod -R 1777 /devyu
[root@jumpserver ~]#
[root@jumpserver ~]# ll -d /devyu/*
drwxrwx--T 2 root devgroup 6 Feb 10 18:15 /devyu/data

参考资料

  1. linux云计算服务器网络安全之ssh原理解密-猿来教育官方网站 (apecome.com)