大家好呀!这里是码农后端。上一篇介绍了SSH服务搭建之YUM源配置与静态IP配置,本篇将介绍SSH服务搭建的软件安装、相关服务补充以及SSH免密登录的实现。

1、安装openssh

1)openssh概述

SSH服务底层的软件名称叫做openssh,open即开源,ssh即ssh服务。

openssh属于C/S架构软件,拥有客户端与服务器端。

客户端:ssh
服务端:openssh-server

2)安装:

1
yum install openssh -y

3)查看openssh是否安装成功

1
2
3
4
# 使用管道结合grep命令
rpm -qa |grep openssh
#或列出已安装的openssh
yum list installed |grep openssh

4)获取openssh生成的文件列表

服务器端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rpm -ql openssh-server

# 配置文件
/etc/ssh/sshd_config => ssh服务的主配置文件
/etc/sysconfig/sshd
# 服务管理脚本
/usr/lib/systemd/system/sshd.service => systemctl start sshd
# 文件共享服务 提供文件上传下载的服务
/usr/libexec/openssh/sftp-server
# 二进制文件程序文件
/usr/sbin/sshd
# 公钥生成工具
/usr/sbin/sshd-keygen
# man手册
/usr/share/man/man5/sshd_config.5.gz
/usr/share/man/man8/sftp-server.8.gz
/usr/share/man/man8/sshd.8.gz

客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
rpm -ql openssh-clients

# 客户端配置文件
/etc/ssh/ssh_config
# 远程copy命令 服务器间进行文件传输
/usr/bin/scp
# sftp客户端 上传下载文件操作
/usr/bin/sftp
/usr/bin/slogin
/usr/bin/ssh
/usr/bin/ssh-add
/usr/bin/ssh-agent
/usr/bin/ssh-copy-id
/usr/bin/ssh-keyscan
# 客户端man手册
/usr/share/man/man1/scp.1.gz
/usr/share/man/man1/sftp.1.gz
/usr/share/man/man1/slogin.1.gz
/usr/share/man/man1/ssh-add.1.gz
/usr/share/man/man1/ssh-agent.1.gz
/usr/share/man/man1/ssh-copy-id.1.gz
/usr/share/man/man1/ssh-keyscan.1.gz
/usr/share/man/man1/ssh.1.gz
/usr/share/man/man5/ssh_config.5.gz
/usr/share/man/man8/ssh-pkcs11-helper.8.gz

2、查看并修改ssh服务端配置文件

需求:禁止root账号远程登录(RealServer服务器端)

1)使用man 5命令查看文档

1
man 5 sshd_config

PermitRootLogin => yes or no,默认为yes 代表允许通过root账号远程登录此服务器

1
2
3
4
# 打开服务器端配置文件
vim /etc/ssh/sshd_config
# 修改第38行
PermitRootLogin no

3、sshd服务管理

1
2
3
4
5
6
7
8
9
10
11
12
13
systemctl restart sshd	=>   重启
systemctl status sshd => 状态
systemctl stop sshd => 停止
systemctl start sshd => 启动

systemctl enable sshd => 开机自启动
systemctl disable sshd => 开机不自启

ps -ef |grep sshd => 进程
# 或
netstat -tnlp |grep sshd => 端口
# 或
ss -naltp |grep sshd

4、SSH服务任务解决方案

4.1 创建用户并授权

JumpServer跳板机创建用户并授权

1)创建用户与用户组

1
2
3
4
5
6
# 创建html前端组
groupadd html

# 创建组内用户tom与jerry
useradd -g html tom
useradd -g html jerry

2)为用户设置密码

1
2
echo 123456 |passwd --stdin tom
echo 123456 |passwd --stdin jerry

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

① 创建用户的数据目录:

1
2
mkdir -p /code/html		=> 前端组
ll -d /code/html

drwxr-xr-x. 2 root root 6 May 24 10:36 /code/html

② 更改目录的文件所属组(更改为html,代表html组内成员可以对这个目录进行管理)

1
chgrp -R html /code/html

drwxr-xr-x. 2 root html 6 May 24 10:36 /code/html

给该组追加一个写权限

1
chmod -R g+w /code/html

drwxrwxr-x. 2 root html 6 May 24 10:36 /code/html

③ 添加粘滞位权限,防止误删除操作

1
chmod 1770 /code/html

drwxrwx--T. 2 root html 6 May 24 10:36 /code/html

4.2 禁用root登录

RealServer服务器端:

1
2
3
4
# 打开服务器端配置文件
vim /etc/ssh/sshd_config
# 修改第38行
PermitRootLogin no

4.3 更改SSH默认端口

RealServer服务器端:

1
2
3
4
# 打开服务器端配置文件
vim /etc/ssh/sshd_config
# 修改第17行,如修改端口为3712
Port 3712

4.4 重启SSH服务

1
2
3
systemctl restart sshd
# 或
systemctl reload sshd

restart与reload的区别:

① restart相当于stop然后在start

② reload不停止现有业务,只是重新加载sshd对应的配置文件

4.5 远程连接测试

在RealServer创建一个code账号

1
2
3
4
# 创建账号
useradd code
# 设置密码
echo 123456 |passwd --stdin code

测试:在JumpServer远程连接RealServer(IP:192.168.91.128)

1
ssh -p 3721 code@192.168.91.128

4.6 SSH客户端不验证指纹

第一次连接远程服务器时,会验证指纹信息:

1
2
3
4
5
The authenticity of host '192.168.91.128 (192.168.91.128)' can't be established.
ECDSA key fingerprint is SHA256:Y/cQNWWkX15o2MsJ5HOQBI2m8S33qIA+x3zys8J4pOY.
ECDSA key fingerprint is MD5:76:61:86:8b:d5:ee:bf:9c:60:e6:12:fa:f6:f0:74:36.
Are you sure you want to continue connecting (yes/no)?yes
Warning: Permanently added '192.168.91.128' (ECDSA) to the list of known hosts.

如果不想验证指纹,可以更改SSH客户端的配置文件

JumpServer客户端:

1
2
3
4
# 打开客户端配置文件
vim /etc/ssh/ssh_config
# 修改第35行
StrictHostKeyChecking no

4.7 pwgen工具生成用户密码

在实际生产环境中,用户密码建议使用专业的密码生成工具如pwgen设置,要避免手工设置。

① 安装随机密码生成工具pwgen

② 使用pwgen工具生成随机密码

③ 给账号code设置密码

1)创建code开发者账号

1
useradd code

2)配置EPEL扩展源,安装pwgen工具

1
2
3
4
5
# 使用wget获取epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all
yum makecache

3)安装pwgen密码生成工具

1
yum install pwgen -y

4)使用pwgen生成随机密码

1
pwgen

扩展:pwgen密码生成器的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 使用帮助
pwgen --help

# 用法: pwgen 选项参数 长度 生成个数
Usage: pwgen [ OPTIONS ] [ pw_length ] [ num_pw ]

# 密码中至少包含一个大写字母
-c or –capitalize

# 密码中不包含大写字母
-A or –no-capitalize

# 密码中至少包含一个数字
-n or –numerals

# 密码中不包含数字
-0 or –no-numerals

# 密码中至少包含一个特殊符号
-y or –symbols

# 生成完全随机密码
-s or –secure

# 密码中不包含歧义字符(例如1,l,O,0)
-B or –ambiguous

# 使用SHA1 hash给定的文件作为一个随机种子
-H or –sha1=path/to/file[#seed]

# 在列中打印生成的密码
-C

# 不要在列中打印生成的密码,即一行一个密码
-1

# 不要使用任何元音,以避免偶然的脏话
-v orno-vowels

eg:生成长度为10,包含大写、数字、不包含模糊字符完全随机的3个密码

1
pwgen -cnBs1 10 3

5、SSH服务补充

5.1 scp命令

用于Linux与Linux系统之间进行文件的传输(上传、下载)

1)上传:

1
2
3
4
scp [选项] 本地文件路径 远程用户名@远程服务器的IP地址:远程文件存储路径
# 选项说明
-r : 递归上传,主要针对文件夹
-P : 若更换了SSH服务的默认端口,必须使用-P选项

2)下载:

1
2
3
4
scp [选项] 远程用户名@远程服务器的IP地址:远程文件路径 本地文件存储路径
# 选项说明
-r : 递归上传,主要针对文件夹
-P : 若更换了SSH服务的默认端口,必须使用-P选项

5.2 移除用户

1
2
3
4
# 查看当前在线用户
w
# 移除某个账号
pkill -kill -t 要移除的账号

6、SSH免密登录

使用密码SSH登录的方式比较麻烦,如每次登录都要输入密码,不仅难记而且容易泄露。为了安全和方便,实现免密登录。

6.1 SSH认证原理

基于用户名密码基于密钥对两种认证方式。

1)基于用户名密码的认证

JumpServer =>ssh code@RealServer的IP地址

2)基于密钥对(公钥与私钥)的认证方式 => 免密登录

A主机 => JumpServer,B主机 => RealServer

6.2 实现

SSH免密的实现一般分为三步:

1)在A主机针对某个账号(tom或jerry)生成公钥与私钥

2)使用某些方法把公钥发送到B主机中,然后追加到authorized_keys文件中

3)测试是否实现免密登录

方法一(较常用)

① 在A主机针对某个账号生成公钥与私钥

1
ssh-keygen

注:如不想一路确认,可使用ssh-keygen -P “”,直接生成公私钥

② 使用ssh-copy-id把公钥文件中的内容传输到服务器端的~/.ssh/authorized_keys文件中

1
2
3
ssh-copy-id -p 3712 code@192.168.91.128
# 输入密码
code@192.168.91.128's password:123456

③ 在JumpServer客户端测试免密登录是否成功

1
ssh -p 3721 code@192.168.91.128

方法二(集群常用)

① 生成公钥与私钥

1
ssh-keygen

② 把id_rsa.pub文件,scp到RealServer服务器端

1
scp -P 3721 ~/.ssh/id_rsa.pub code@192.168.91.128:/home/code/

③ 在RealServer服务器端,把id_rsa.pub文件中的内容追加到~/.ssh/authorized_keys文件中

1
2
3
4
# 回到家目录
cd ~
# 追加
cat id_rsa.pub >> ~/.ssh/authorized_keys

注:上述配置虽然比较简单,但是实际应用时要注意文件的权限

RealServer对应权限:

1
2
~/.ssh : 700
~/.ssh/authorized_keys : 600

④ 测试免密是否成功

1
ssh -p 3721 code@192.168.91.128