SSH(Secure Shell)协议
是一种安全通道协议。
对通信数据进行了加密处理,用于远程管理。
主要用来实现字符界面的远程登录、远程复制等功能。
SSH协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令。
因此SSH协议具有很好的安全性。
(基于传输层TCP,两边端口一样)
SSH服务端:OpenSSH(CentOS 7系统默认已安装openssh相关软件包,开机自启)
服务名称:sshd
SSH客户端:Putty、Xshell、CRT
服务端主程序:/usr/sbin/sshd
服务端配置文件:/etc/ssh/sshd_config
监听端口 Port 22
LoginGraceTime 2m # 登录验证时间为两分钟
PermitRootLogin yes #禁止root用户登录
MaxAuthTries 6 #最大重试次数为 6 (伪命题,可重复尝试)
SSH的组成
传输层协议
提供了服务期认证,保密性及完整性
此外还提供压缩功能
SSH-TRANS通常运行在TCP/IP连接上,也可能用于其他可靠数据流上。
用户认证协议
用于向服务器提供客户端用户鉴别功能
它运行在传输层协议SSH-TRANS上面
当SSH-USERAAUTH开始后,他从底层协议那接收会话标识符(从第一次密钥交换中的哈希H)
SSH的优点
SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议。
利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。
SSH在正确使用时可弥补网络中的漏洞。
客户端包含ssh程序以及像scp(远程拷贝)、slogin(远程登陆)、sftp(安全文件传输)等其他的应用程序。
数据传输的过程是加密的,具有安全稳定的特点
数据传输的方式是压缩的,可以提高传输速度
用户认证协议 [SSH-USERAUTH]
用于向服务器提供客户端用户鉴别功能。
它运行在传输层协议 SSH-TRANS 上面。
当SSH-USERAUTH 开始后,它从低层协议那里接收会话标识符(从第一次密钥交换中的交换哈希H )。
会话标识符唯一标识此会话并且适用于标记以证明私钥的所有权。 SSH-USERAUTH 也需要知道低层协议是否提供保密性保护。
连接协议 [SSH-CONNECT]
将多个加密隧道分成逻辑通道。
它运行在用户认证协议上。
它提供了交互式登录话路、远程命令执行、转发 TCP/IP 连接和转发 X11 连接。
SSH的密钥登录
密钥
密钥是一种参数
它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥和非对称密钥。ssh密钥是非对称。
ssh远程访问控制中不仅仅可以使用用户密码登录,还可以通过 密钥进行登录。
而密钥登录的产生是通过客户端与服务端进行一系列的操作过程产生的。
密钥登录的过程:
ssh客户端通过ssh-keygen生成自己的公钥和私钥,将公钥发送给ssh服务端,并且放在指定的位置。
公钥发送完毕后。ssh客户端再向ssh 服务端进行登录请求。
ssh服务端收到ssh客户端的登录请求后,ssh服务端用对应的公钥加密一些随机数返回给ssh客户端。
ssh客户端收加密的随机数后使用私钥对其进行解密,再将解密的结果发送给ssh服务端进行验证。
ssh服务端接收到ssh客户端发送过来的解密数据,将其与原数据进行比对,保持一致则允许用户进行登录
配置OpenSSH服务端
sshd_config配置文件的常用选项设置
vim /etc/ssh/sshd_config
Port 22 #监听端口为22 #生产中最好改一下
ListenAddress 0.0.0.0 #监听地址为任意网段,也可以指定OpenSSH服务器的具体IP
LoginGraceTime 2m #登录验证时间为2分钟
PermitRootLogin no #禁止root用户登录
MaxAuthTries 6 #最大重试次数为 6 #即使有6次,还是依旧可以无限尝试
PermitEmptyPasswords no #禁止空密码用户登录
UseDNS no #禁用 DNS 反向解析,以提高服务器的响应速度
#只允许zhangsan、lisi、wangwu用户登录,且其中wangwu用户仅能够从IP地址为192.168.179.20 的主机远程登录
AllowUsers zhangsan lisi wangwu@192.168.179.20 #多个用户以空格分隔
#禁止某些用户登录,用法于AllowUsers 类似(注意不要同时使用,同一用户即禁止又允许)
DenyUsers wangwu
scp远程复制
将远程主机的/etc/passwd文件复制到本机
[root@localhost opt]# scp root@192.168.179.20:/opt/yht.txt /opt/rh #复制文件
[root@localhost rh]# scp -r root@192.168.179.20:/opt/xxx/ /opt/ #复制目录
[root@localhost rh]# scp -rP 10086 root@192.168.179.20:/opt/xxx/ /opt/ #如果不是默认端口22,要加P 大写的P
[root@localhost ~]# scp root@192.168.179.20:/opt/xxx.txt /opt/rh
root@192.168.179.20's password:
xxx.txt 100% 0 0.0KB/s 00:00
[root@localhost ~]# scp -r root@192.168.179.20:/opt/rh/yyy /opt/
root@192.168.179.20's password:
[root@localhost ~]# cd /opt/
[root@localhost opt]# ls
111 rh yyy
[root@localhost opt]# scp -rP 10086 root@192.168.179.20:/opt/zzz /opt
root@192.168.179.20's password:
[root@localhost opt]# ls
111 rh yyy zzz
[root@localhost opt]#
sftp安全FTP
由于使用了加密/解密技术,所以传输效率比普通的FTP要低,但安全性更高。操作语法sftp与ftp几乎一样。
sftp root@192.168.233.22 -P 指定端口号
sftp> ls
sftp> get 文件名#下载文件到家目录
sftp> put 文件名#上传文件到链接服务器的目录
sftp> quit #退出
[root@xny opt]# sftp -P 10086 root@192.168.179.20
root@192.168.179.20's password:
Connected to 192.168.179.20.
sftp> ls
anaconda-ks.cfg initial-setup-ks.cfg original-ks.cfg
yyy
sftp> get yyy
Fetching /root/yyy/ to yyy
Cannot download non-regular file: /root/yyy/
sftp> get -r yyy
Fetching /root/yyy/ to yyy
Retrieving /root/yyy
sftp> cd /opt
sftp> ls
666 777.txt httpd-2.4.29
httpd-2.4.29.tar.bz2 rh
sftp> get 777.txt
Fetching /opt/777.txt to 777.txt
sftp> put -r 999
Uploading 999/ to /opt/999
Entering 999/
sftp> quit
sshd 服务支持两种验证方式:
1.密码验证
对服务器中本地系统用户的登录名称、密码进行验证。简便,但可能会被暴力破解,暴力破解可看之前博客有详细描述系统弱口令检测
2.密钥对验证
要求提供相匹配的密钥信息才能通过验证。通常先在客户端中创建一对密钥文件(公钥、私钥),
然后将公钥文件放到服务器中的指定位置。远程登录时,系统将使用公钥、私钥进行加密/解密关联验证。
能增强安全性,且可以免交互登录。
当密码验证、密钥对验证都启用时,服务器将优先使用密钥对验证。可根据实际情况设置验证方式。
vim /etc/ssh/sshd_config #编辑服务端主配置文件
PasswordAuthentication yes #启用密码验证
PubkeyAuthentication yes #启用密钥对验证
AuthorizedKeysFile .ssh/authorized_keys #指定公钥库文件
在客户端创建密钥对
实现密钥对交互
[root@localhost 666]# vim /etc/ssh/sshd_config
[root@localhost 666]# ssh-keygen -t ecdsa
Generating public/private ecdsa key pair.
Enter file in which to save the key (/root/.ssh/id_ecdsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_ecdsa.
Your public key has been saved in /root/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:T2b+l9OKcRpZpRwHuSMetlxLGT4cmM1hKPZH2+/JHTE root@localhost.localdomain
The key's randomart image is:
+---[ECDSA 256]---+
| *+o |
| o +.B. |
| . o +.Bo|
| =.%E.|
| S ++ B+++|
| * +o...|
| o + o++|
| . *+o+|
| +..o |
+----[SHA256]-----+
[root@localhost ~]# cd .ssh/
[root@localhost .ssh]# ls
id_ecdsa id_ecdsa.pub
[root@localhost .ssh]# ssh-copy-id -i id_ecdsa.pub root@192.168.179.23
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "id_ecdsa.pub"
The authenticity of host '192.168.179.23 (192.168.179.23)' can't be established.
ECDSA key fingerprint is SHA256:LUzVjmNwC8z4hqplMW7fPYuHqABhmKMwpSt9eOBTglQ.
ECDSA key fingerprint is MD5:fe:9c:3e:32:5b:a6:2b:09:47:49:13:31:f9:2d:6f:db.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.179.23's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.179.23'"
and check to make sure that only the key(s) you wanted were added.
实现免密交互:(永久性)
[root@localhost ~]# ssh-agent bash
[root@localhost ~]# ssh-add
Enter passphrase for /root/.ssh/id_ecdsa:
Identity added: /root/.ssh/id_ecdsa (/root/.ssh/id_ecdsa)
[root@localhost ~]# ssh root@192.168.179.23
Last login: Thu Mar 9 01:29:58 2023 from 192.168.179.20
[root@localhost ~]#
TCP Wrappers 访问控制
TCP Wrappers 将TCP服务程序“包裹”起来,
代为监听TCP服务程序的端口,
增加了一个安全检测过程,外来的连接请求必须先通过这层安全检测,
获得许可后才能访问真正的服务程序。
大多数 Linux 发行版,TCP Wrappers 是默认提供的功能。rpm -q tcp_wrappers
一、TCP Wrapper 保护机制的两种实现方式
1.直接使用 tcpd 程序对其他服务程序进行保护,需要运行 tcpd程序。
2.由其他网络服务程序调用 libwrap.so.链接库,不需要运行 tcpd 程序。此方式的应用更加广泛,也更有效率。
二、使用 ldd 命令可以查看程序的 libwrap.so.*链接库
ldd $(which ssh vsftpd)
TCP Wrappers 的访问策略
TCP Wrappers 机制的保护对象为各种网络服务程序,针对访问服务的客户端地址进行访问控制。
对应的两个策略文件为/etc/hosts.allow 和/etc/hosts.deny,分别用来设置允许和拒绝的策略。
格式:
<服务程序列表>:<客户端地址列表>
(1)服务程序列表
ALL:代表所有的服务。
单个服务程序:如“vsftpd”。
多个服务程序组成的列表:如“vsftpd,sshd”。
(2)客户端地址列表
ALL:代表任何客户端地址。
LOCAL:代表本机地址。
多个地址以逗号分隔
允许使用通配符 “*” 和 “?” ,前者代表任意长度字符,后者仅代表一个字符
网段地址,如 192.168.233. 或者 192.168.233.0/255.255.255.0
区域地址,如 “.benet.com”匹配 bdqn.com 域中的所有主机。
3、TCP Wrappers 机制的基本原则:
首先检查/etc/hosts.allow文件,如果找到相匹配的策略,则允许访问;
否则继续检查/etc/hosts.deny文件,如果找到相匹配的策略,则拒绝访问;
如果检查上述两个文件都找不到相匹配的策略,则允许访问。
“允许所有,拒绝个别”
只需在/etc/hosts.deny文件中添加相应的拒绝策略
“允许个别,拒绝所有”
除了在/etc/hosts.allow中添加允许策略之外,还需要在/etc/hosts.deny文件中设置“ALL:ALL”的拒绝策略。
若只希望从IP地址192.168.233.23网段的主机访问sshd服务,其他地址被拒绝。
vim /etc/hosts.allow
sshd:192.168.233.23 #多个ip用,隔开
vim /etc/hosts.deny
sshd:192.168.233.21