一.连接服务器的方式
不安全登录telnet
1.准备好客户端、服务端
客户端只要可以提供telnet命令即可,默认连接服务器的23端口号
windows
telnet 10.0.0.61
2.服务端要运行远程连接服务,telnet走的是telnet-server服务端,走的是23端口通信,而不是ssd服务端
运行telnet-server服务
yum install telnet-server telnet -y
启动telnet服务端
[root@m-61 ~]#systemctl start telnet.socket
3.使用telnet命令,登录linux服务端
[C:\~]$ telnet 10.0.0.61
Connecting to 10.0.0.61:23...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Kernel 3.10.0-862.el7.x86_64 on an x86_64
m-61 login:
Password:
^CLogin incorrect
m-61 login: root
Password:
Last login: Wed Apr 27 09:37:46 from 10.0.0.1
[root@m-61 ~]#
1.关于root ,账户密码连接的加密,解密流程
[email protected]
123123
2.关于root,公私钥连接的加密,解密流程
3. 配置ssh的免密登录(生成公私钥)
4. 学习修改sshd的服务端配置文件修改(修改端口,禁止密码登录,只允许公钥登录)
(重点)SSH基于用户名密码认证原理
问题来了,我该如何确认,找到这个公私钥在哪呢?
要测试基于账户密码认证的登录形式,需要准备2个机器
客户端(windows,linux)
windows
打开cmd,xshell,只识别windows提供的dos命令
还提供了一个工具,叫做git-bash工具,利用这个工具,打开的终端,能识别部分的linux命令,去操作你的windows
# 输入如下命令,首次连接某个linux机器
#1.首次连接,需要用户自己确认机器的指纹信息,输入yes确认后
服务端会发送公钥给客户端,记录到客户端的 ~/.ssh/knows_hosts
ssh [email protected]
2.查看客户端记录的 cat ~/.ssh/known_hosts ,记录了服务端的公钥信息
yu@DESKTOP-1TDLFH9 MINGW64 ~/Desktop
$ cat ~/.ssh/known_hosts
10.0.0.61 ecdsa-sha2-nistp256
AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
这个字符串,就是你要连接的linux机器的公钥信息
服务端(linux)
10.0.0.61
此时去你的服务端, 配置文件下寻找 ecdsa该算法的公钥文件
[root@m-61 ~]#ls /etc/ssh/
moduli sshd_config ssh_host_ecdsa_key.pub ssh_host_ed25519_key.pub ssh_host_rsa_key.pub
ssh_config ssh_host_ecdsa_key ssh_host_ed25519_key ssh_host_rsa_key
过滤该算法提供的公私钥文件
[root@m-61 ~]#ls /etc/ssh/ |grep ecdsa
ssh_host_ecdsa_key
ssh_host_ecdsa_key.pub
查看公钥
[root@m-61 ~]#cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
证明,在linux服务端,看到了基于ssh 密码认证的,公私钥文件信息
[root@m-61 ~]#cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
[root@m-61 ~]#cat /etc/ssh/ssh_host_ecdsa_key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIFRG97Nad3sFsLBv5rL/76jHuc1SUsUikqttZdn2j1FroAoGCCqGSM49
AwEHoUQDQgAEv9LHdsBo1wqqjukLgVNiTeDJnqF3UP8MpRZV853iBlv/xfCUDFZq
5x4d78ECxblnykSYboCNLIczxyQ6z3hztg==
-----END EC PRIVATE KEY-----
[root@m-61 ~]#
既然看懂了公私钥,非对称验证形式,我们也就可以利用该特性,完成公钥登录,代替密码登录。(利用客户端的公钥表示自己的身份,而不是用服务端的密码去验证了)
如何确认目标机器的正确性(了解)
首次连接,服务端是让你输入yes,确认该机器的指纹是否正确
指纹信息,是通过公钥,基于sha256加密而来
1.看指纹是什么
yu@DESKTOP-1TDLFH9 MINGW64 ~/Desktop
$ ssh [email protected]
The authenticity of host '10.0.0.61 (10.0.0.61)' can't be established.
ECDSA key fingerprint is
SHA256:Csqwr63+SZRFFOug/IGoFTgRe8hDSI/QalSMBcC6IaU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
2.根据你获取到的公钥信息,通过sha256计算下,得到指纹,在对比这俩指纹是否一致,就明确该机器是你想连接的机器了
你可以在服务端敲
ssh-keygen -E SHA256 -lf /etc/ssh/ssh_host_ecdsa_key.pub
如何再客户端验证该指纹
在客户端,获取到该机器的公钥
yu@DESKTOP-1TDLFH9 MINGW64 ~/Desktop
$ ssh-keyscan 10.0.0.61 |grep ecdsa
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
10.0.0.61 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
vim 61.pub
对公钥加密256加密,得到指纹
ssh-keygen -E SHA256 -lf 61.pub
在客户端,去验证,你连接的机器,是否是你想连接的,ssh [email protected] ,基于公钥确认,先得知该机器的公钥信息
两个办法,获取到机器公钥信息
1.在客户端扫描该机器的公钥
yu@DESKTOP-1TDLFH9 MINGW64 ~/Desktop
$ ssh-keyscan 10.0.0.61 |grep ecdsa
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
10.0.0.61 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
2.在服务端
[root@m-61 ~]#cat /etc/ssh/ssh_host_ecdsa_key.pub
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
我们在进行指纹认证的时候是直接输入yes,并未做确认证明,你yes确认的机器的确是目标的机器
你yes确认的那个指纹,是通过公钥文件,加密而来,用同样的算法,对该文件加密,就可以看到一样的指纹了
1.首次连接,指纹确认
yu@DESKTOP-1TDLFH9 MINGW64 ~/Desktop
$ ssh [email protected]
The authenticity of host '10.0.0.61 (10.0.0.61)' can't be established.
ECDSA key fingerprint is SHA256:Csqwr63+SZRFFOug/IGoFTgRe8hDSI/QalSMBcC6IaU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
ECDSA key fingerprint is SHA256:Csqwr63+SZRFFOug/IGoFTgRe8hDSI/QalSMBcC6IaU.
2.服务端发给客户端自己的公钥,客户端记录到本地~/.ssh/known_hosts(通用语windows,linux),表示已知的服务器公钥信息
cat ~/.ssh/known_hosts
此时客户端,还未确认该指纹,就不会把服务端的公钥,写入到该文件中
你现在可以去比对,指纹是否一致
ssh-keygen扫描公钥
ssh-keyscan命令,可以获取目标机器的公钥信息,扫描目标机器的公钥
在客户端操作
ssh-keyscan 10.0.0.61
yu@DESKTOP-1TDLFH9 MINGW64 ~/Desktop
$ ssh-keyscan 10.0.0.61
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
10.0.0.61 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC/a19vEmUMzhzEM8Hbqy2Cd2KL838ojWDO/TDiMOpaKZ6okJ7kBsy8eK0ukYqMj/xBgco8rlc8nz171rul3HN1uUgu7+c8TNbAyggyiWNmaZzYMbWYwC5ZhhlPA8RU+39Znw4BpwKqEC76h2dAj/OOwEADIJK4GuwEnsTmCy2CSh4hqL7M1MWlsV7Kkc0ZBA4tYmz/qAYakl8PFF+CY7YWMJFWDvqLxGdEcqBkvIJ1hEuB21UDhXCOimYgp94frzcyeFoGv4WKcKw7Dq3lPh9gT038v6bw/EA5PC4ubjmly3XJUKZoRVcg773Oa/TcBOeZfTW2zPK83X0hQNk9T1KJ
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
10.0.0.61 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
10.0.0.61 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIC9lqWZdqpEGg6hV4PbSf/n0NI33oaedK/KFP5YWxF6A
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
提取服务端远程连接的公钥
# 10.0.0.61:22 SSH-2.0-OpenSSH_7.4
10.0.0.61 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL/Sx3bAaNcKqo7pC4FTYk3gyZ6hd1D/DKUWVfOd4gZb/8XwlAxWauceHe/BAsW5Z8pEmG6AjSyHM8ckOs94c7Y=
通过命令,对该公钥进行加密,得到指纹
ssh-keygen -E SHA256 -lf /etc/ssh/ssh_host_ecdsa_key.pub
3.你可以去服务端查看公钥信息/etc/ssh/ssh_host_ecdsa_key.pub
和你客户端的known_hosts做对比,是否一致
机器指纹信息
ssh-keygen扫描公钥
ssh-keyscan命令,可以获取目标机器的公钥信息,通过web-7扫描 rsync-41机器的公钥
查看机器公钥
直接去rsync-41机器上检查公钥信息
指纹是公钥加密而来(sha256算法)
计算rsync-41机器的指纹,再和我们第一次ssh连接的命令比较是否一致
ssh密码认证小结
- SSH是Linux下远程管理的工具,相比Telnet安全,运维人员必备的神器!
- SSH的全称Secure Shell,安全的shell,是Client/Server架构,默认端口号为22,TCP协议
- 必须搞懂SSH通信加密的原理、过程
需要总结
- ssh密码认证的原理,与配置文件,涉及的linux命令
- ssh指纹确认与公钥的原理,与配置文件,涉及的linux命令
- ssh密码认证涉及的所有配置文化(服务端,客户端)
二.(服务器安全)sshd服务部署
软件安装
修改配置文件
启动
使用
搭建所有服务的套路
- 关闭防火墙和selinux(实验环境都先关闭掉)
- 配置yum源(公网源或者本地源)
- 软件安装和检查
- 了解并修改配置文件
- 启动服务检查运行状态并设置开机自启动
搭建SSH服务
1.关闭防火墙和selinux
2.配置yum源
3.软件安装
确认是否安装openssh
由于每一台机器都是默认安装了sshd服务的,可以随便用任何一台机器测试
[root@master-61 ~]#rpm -qa openssh
openssh-7.4p1-21.el7.x86_64
openssl 命令,给你用去基于不同的算法,创建证书的命令
安装openssh服务,提供远程sshd服务
[root@m-61 ~]#rpm -qa openssh-server
openssh-server-7.4p1-21.el7.x86_64
# 默认yum有2个功能,1是安装,2是升级
yum install openssh-server openssh -y
ssh基本安全配置
提升服务器ssh安全,就是来修改该配置文件了,先来看简单的配置;
1.禁用root用户登录、降低权限(只能通过普通用户登录,提前创建好可登录的普通普通户)
[root@master-61 ~]#useradd yiyuan
[root@master-61 ~]#pwgen -sn|head -1
S611sFsG
[root@master-61 ~]#pwgen -sn|head -1 > random-pw.txt
[root@master-61 ~]#cat random-pw.txt
pfjFWaE6
[root@master-61 ~]#cat random-pw.txt | passwd --stdin yiyuan
Changing password for user yiyuan.
passwd: all authentication tokens updated successfully.
修改
[root@master-61 ~]#cat /etc/ssh/sshd_config
#PermitRootLogin yes
PermitRootLogin no
2.修改端口,22666
Port 22666
3.查看这俩配置参数
grep -Ei '^permitRootLogin|^port' /etc/ssh/sshd_config
grep -Ei '^(permitRootLogin|port)' /etc/ssh/sshd_config
pwgen随机密码生成工具
必须配置epel源,不然无法安装该命令
yum install pwgen -y
服务管理
[root@master-61 ~]#netstat -tunlp |grep sshd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4643/sshd
tcp6 0 0 :::22 :::* LISTEN 4643/sshd
[root@master-61 ~]#systemctl restart sshd
[root@master-61 ~]#netstat -tunlp |grep sshd
tcp 0 0 0.0.0.0:22666 0.0.0.0:* LISTEN 5678/sshd
tcp6 0 0 :::22666 :::* LISTEN 5678/sshd
登录测试
加上端口
默认不让root登录了
[C:\~]$ ssh [email protected] 22666
恢复默认配置
sed改回去
permitRootLogin yes
port 22
先看看参数
sed多次处理
看到该参数
sed -e '/^permitRootLogin/Ip' -e '/^port/Ip' /etc/ssh/sshd_config -n
Port 22
PermitRootLogin yes
整行内容替换,写入文件内容
sed -i.ori -e '/^permitRootLogin/Ic PermitRootLogin yes' -e '/^port/Ic Port 22' /etc/ssh/sshd_config
替换方案
sed -i.bak -e 's#PermitRootLogin no#PermitRootLogin yes#' -e 's#Port 22999#Port 22#' /etc/ssh/sshd_config